summaryrefslogtreecommitdiff
path: root/chimere/feeds.py
blob: d5ae5ef9d2a8e5c56d9ac078240511a1ee996c31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2010 Pierre Clarenc <pierre.crc_AT_gmailDOTcom>,
#                    Samuel Renard <renard.samuel_AT_gmailDOTcom>,
#                    Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# See the file COPYING for details.

from django.conf import settings
from django.contrib.gis.geos import *
from django.contrib.syndication.views import Feed, FeedDoesNotExist
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _

from django.shortcuts import get_object_or_404

from chimere.models import Category, SubCategory, Marker, Area

class BaseFeed(Feed):
    """
    Base feed for Chimere objects
    """
    def item_link(self, item):
        ''' Return POI permalink '''
        coord = item.point
        cat = 0
        if item.categories.all() and item.categories.all()[0]:
            cat = item.categories.all()[0].pk
        return reverse('chimere:index') + '?zoom=16&lat=%d&lon=%d&'\
        'current_feature=%d&checked_categories=%d' % (coord.y, coord.x, item.id,
                                                      cat)

    def item_pubdate(self, item):
        """
        Date of the Marker when it has been available
        """
        return item.available_date

    def description(self, obj):
        return ""

class LatestPOIsByCategory(BaseFeed):
    '''
    Last Points of interests by category in Feeds
    '''
    title_template = "rss_title.html"
    description_template = "rss_descr.html"

    def get_object(self, request, category_id, area_name=''):
        return get_object_or_404(Category, id=category_id)

    def title(self, obj):
        """
        Define the title of the feed
        """
        return u"%s - %s" % (settings.PROJECT_NAME, obj.name)

    def link(self, obj):
        """
        Define the link of the feed.
        """
        if not obj:
            raise FeedDoesNotExist
        return reverse('chimere:feeds-cat', args=['', obj.id])

    def items(self, obj):
        """
        Requests to marker where its category match the category is requested
        and its status is available
        This returns a list of the 15 last markers/POIs ordering by date
        """
        q = Marker.objects.filter(status__exact='A',
            categories__category__id__exact=obj.id,
            available_date__isnull=False).order_by('-available_date')[:15]
        return q

class LatestPOIsBySubCategory(BaseFeed):
    '''
    Last Points of interests by SubCategory in Feeds
    '''
    title_template = "rss_title.html"
    description_template = "rss_descr.html"

    def get_object(self, request, category_id, area_name=''):
        return get_object_or_404(SubCategory, id=category_id)

    def title(self, obj):
        return u"%s - %s - %s" % (settings.PROJECT_NAME, obj.category.name,
                                  obj.name)

    def link(self, obj):
        if not obj:
            raise FeedDoesNotExist
        return reverse('chimere:feeds-subcat', args=['', obj.id])

    def items(self, obj):
        q = Marker.objects.filter(categories__id__exact=obj.id,
            available_date__isnull=False, status__exact='A').order_by(
                                                        '-available_date')[:15]
        return q

class LatestPOIs(BaseFeed):
    '''
    Last Points of interests
    '''
    title_template = "rss_title.html"
    description_template = "rss_descr.html"

    def title(self):
        return settings.PROJECT_NAME + u" - " + _(u"Last points of interest")

    def link(self):
        return reverse('chimere:feeds-global')

    def description(self):
        return _("Latest points of interest from ") + settings.PROJECT_NAME

    def items(self):
        q = Marker.objects.filter(status__exact='A',
                  available_date__isnull=False).order_by('-available_date')[:15]
        return q

class LatestPOIsByZone(BaseFeed):
    '''
    Last Points of interests by zone by coordinates
    '''
    title_template = "rss_title.html"
    description_template = "rss_descr.html"
    upper_left_lat = 0
    upper_left_lon = 0
    lower_right_lat = 0
    lower_right_lon = 0

    def get_object(self, request, area, area_name=''):
        """
        Get the extra url. Parameters are the coordinates of the zone (the
        upper left and lower right points)
        """
        if not area:
            raise ObjectDoesNotExist
        # Then define the upper right and lower left points
        coordinates = str(area).split('_')
        upper_left_lat = float(coordinates[0])
        upper_left_lon = float(coordinates[1])
        lower_right_lat = float(coordinates[2])
        lower_right_lon = float(coordinates[3])
        upper_right_lat = upper_left_lat
        upper_right_lon = lower_right_lon
        lower_left_lat = lower_right_lat
        lower_left_lon = upper_left_lon
        # Define a Polygon with the 4 points of the zone.
        areaBox = Polygon(((upper_left_lon, upper_left_lat),
                            (upper_right_lon, upper_right_lat),
                            (lower_right_lon, lower_right_lat),
                            (lower_left_lon, lower_left_lat),
                            (upper_left_lon, upper_left_lat)),
                            srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
        return areaBox

    def title(self, obj):
        return settings.PROJECT_NAME + u" - " +\
               _(u"Last points of interest by area")

    def link(self, obj):
        """
        Define the link of the feed. It's the same url as we get in the method
        get_object
        """
        if not obj:
            raise FeedDoesNotExist
        area = str(self.upper_left_lat) + '_' + str(self.upper_left_lon) + \
               '_' + str(self.lower_right_lat) + '_' + str(self.lower_right_lon)
        return reverse('chimere:feeds-area', args=['', area])

    def items(self, obj):
        """
        Request to return Markers WHERE there points are containes in the zone
        which is requested.
        This returns a list of the 15 last markers/POIs ordering by date
        """
        q = Marker.objects.filter(point__contained=obj, status__exact='A',
                  available_date__isnull=False).order_by('-available_date')[:15]
        return q

class LatestPOIsByZoneID(BaseFeed):
    '''
    Last Points of interests by zone by id
    '''
    title_template = "rss_title.html"
    description_template = "rss_descr.html"

    def get_object(self, request, area_id, area_name=''):
        return get_object_or_404(Area, id=area_id)

    def title(self, obj):
        return settings.PROJECT_NAME + u" - " + \
              _(u"Last points of interest") + u" - " + obj.name

    def link(self, obj):
        if not obj:
            raise FeedDoesNotExist
        return reverse('chimere:feeds-areaid', args=['', obj.id])

    def items(self, obj):
        sql = 'select * from "chimere_marker" where ' + obj.getIncludeSql()
        sql += ' and "chimere_marker".available_date is not null'
        sql += ' and "chimere_marker".status=\'A\''
        sql += ' order by "chimere_marker".available_date desc limit 15'
        q = Marker.objects.raw(sql)
        return q