summaryrefslogtreecommitdiff
path: root/chimere/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/utils.py')
-rw-r--r--chimere/utils.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/chimere/utils.py b/chimere/utils.py
index 9398488..fb478dc 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -23,6 +23,7 @@ Utilitaries
import csv
import datetime
+import feedparser
import os
import re
import StringIO
@@ -71,6 +72,7 @@ class ImportManager:
def create_or_update_item(self, cls, values, import_key, version=None):
updated, created, item = False, False, None
+ import_key = unicode(import_key).replace(':', '^')
if import_key:
dct_import = {
'import_key__icontains':'%s:%s;' % (
@@ -475,6 +477,63 @@ class CSVManager(ImportManager):
result = render_to_response('chimere/export_%s.csv' % cls_name, dct)
return filename, result
+class GeoRSSManager(ImportManager):
+ u"""
+ RSS importer.
+ This manager only gets and do not produce GeoRSSFeed
+ """
+
+ def get(self):
+ u"""
+ Get data from a GeoRSS simple source
+
+ Return a tuple with:
+ - number of new item ;
+ - number of item updated ;
+ - error detail on error
+ """
+ from models import Marker
+ new_item, updated_item, msg = 0, 0, ''
+ feed = feedparser.parse(self.importer_instance.source)
+ if feed['bozo']:
+ return (0, 0, _(u"RSS feed is not well formed"))
+ for item in feed['items']:
+ if "georss_point" not in item and 'georss_line' not in item:
+ continue
+ cls = None
+ dct = {'origin':self.importer_instance.origin,
+ 'license':self.importer_instance.license}
+ if 'georss_point' in item:
+ cls = Marker
+ try:
+ y, x = item['georss_point'].split(' ')
+ except ValueError:
+ continue
+ dct['point'] = 'SRID=4326;POINT(%s %s)' % (x, y)
+ for k in ['description', 'summary', 'value']:
+ if k in item:
+ dct['description'] = item[k]
+ break
+ else:
+ cls = Route
+ points = item['georss_line'].split(' ')
+ reordered_points = []
+ # lat, lon -> x, y
+ for idx in xrange(len(points)/2):
+ reordered_points.append(points[idx*2+1])
+ reordered_points.append(points[idx*2])
+ dct['route'] = 'SRID=4326;LINESTRING(%s)' % \
+ ",".join(reordered_points)
+
+ dct['name'] = item['title']
+ pl_id = item['id'] if 'id' in item else item['title']
+ it, updated, created = self.create_or_update_item(cls, dct, pl_id)
+ if updated:
+ updated_item += 1
+ if created:
+ new_item += 1
+ return (new_item, updated_item, msg)
+
RE_HOOK = re.compile('\[([^\]]*)\]')
# TODO: manage deleted item from OSM