summaryrefslogtreecommitdiff
path: root/chimere_rss/feeds.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere_rss/feeds.py')
-rw-r--r--chimere_rss/feeds.py230
1 files changed, 230 insertions, 0 deletions
diff --git a/chimere_rss/feeds.py b/chimere_rss/feeds.py
new file mode 100644
index 0000000..18a4259
--- /dev/null
+++ b/chimere_rss/feeds.py
@@ -0,0 +1,230 @@
+#!/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.utils.translation import ugettext as _
+from django.contrib.syndication.feeds import Feed
+from django.contrib.syndication.feeds import FeedDoesNotExist
+from chimere.main.models import Category, SubCategory, Marker, Area
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.gis.geos import *
+
+from chimere import settings
+
+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 settings.BASE_URL + '?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, bits):
+ """
+ Get extra url, after rss/category/ id of category
+ """
+ if len(bits) != 1:
+ raise ObjectDoesNotExist
+ return Category.objects.get(id__exact=bits[0])
+
+ 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 settings.BASE_URL + 'rss/category/' + str(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, bits):
+ if len(bits) != 1:
+ raise ObjectDoesNotExist
+ return SubCategory.objects.get(id__exact=bits[0])
+
+ 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 settings.BASE_URL + 'rss/subcategory/' + str(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 settings.BASE_URL + 'rss/categories/'
+
+ 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, bits):
+ """
+ Get the extra url. Parameters are the coordinates of the zone (the
+ upper left and lower right points)
+ """
+ if len(bits) != 1:
+ raise ObjectDoesNotExist
+ # Then define the upper right and lower left points
+ coordinates = str(bits[0]).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.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
+ return settings.BASE_URL + 'rss/area/' \
+ + str(self.upper_left_lat) + '_' + str(self.upper_left_lon) + \
+ '_' + str(self.lower_right_lat) + '_' + str(self.lower_right_lon)
+
+ 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, bits):
+ if len(bits) != 1:
+ raise ObjectDoesNotExist
+ return Area.objects.get(id__exact=bits[0])
+
+ 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 settings.BASE_URL + 'rss/areaid/' + str(obj.id)
+
+ def items(self, obj):
+ sql = 'select * from "main_marker" where ' + obj.getIncludeSql()
+ sql += ' and "main_marker".available_date is not null'
+ sql += ' and "main_marker".status=\'A\''
+ sql += ' order by "main_marker".available_date desc limit 15'
+ q = Marker.objects.raw(sql)
+ return q