diff options
Diffstat (limited to 'chimere/utils.py')
| -rw-r--r-- | chimere/utils.py | 59 | 
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  | 
