diff options
Diffstat (limited to 'chimere/utils.py')
-rw-r--r-- | chimere/utils.py | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/chimere/utils.py b/chimere/utils.py index 55fc45c..790fd56 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -24,10 +24,12 @@ Utilitaries import csv import datetime import feedparser +import simplejson as json import os import re import StringIO import tempfile +from urllib import urlencode import urllib2 import unicodedata import zipfile @@ -510,10 +512,18 @@ class CSVManager(ImportManager): if msg: return (0, 0, msg) reader = csv.reader(source, delimiter=';', quotechar='"') - prop_cols = [] - for pm in Marker.all_properties(): + prop_cols, nominatim_fields = [], {} + reverse_nominatim_dct = dict((v, k) + for k, v in settings.CHIMERE_NOMINATIM_FIELDS.iteritems()) + nominatim_default_query = settings.CHIMERE_NOMINATIM_FIELDS + for idx, pm in enumerate(Marker.all_properties()): prop_cols.append((pm.name, pm.getAttrName(), pm.getAttrName()+'_set')) + if settings.CHIMERE_NOMINATIM_FIELDS and \ + pm.slug in reverse_nominatim_dct: + nominatim_fields[idx+len(self.COLS)] = \ + reverse_nominatim_dct[pm.slug] + nominatim_default_query.pop(reverse_nominatim_dct[pm.slug]) cols = list(self.COLS) + prop_cols datas = [] for idx, row in enumerate(reader): @@ -521,7 +531,8 @@ class CSVManager(ImportManager): try: assert(len(row) >= len(cols)) except AssertionError: - return (0, 0, _(u"Invalid CSV format")) + return (0, 0, _(u"Invalid CSV format - not enough columns " + u"check a reference CSV file")) continue if len(row) < len(cols): continue @@ -542,6 +553,22 @@ class CSVManager(ImportManager): elif 'LINE' in geom: cls = Route dct['route'] = geom + elif settings.CHIMERE_NOMINATIM_FIELDS: + nominatim_query = settings.NOMINATIM_URL + "?" + nominatim_keys = nominatim_default_query.copy() + nominatim_keys['format'] = 'json' + for idx in nominatim_fields: + nominatim_keys[nominatim_fields[idx]] = row[idx] + nominatim_query += urlencode(nominatim_keys) + remotehandle = urllib2.urlopen(nominatim_query) + result = StringIO.StringIO(remotehandle.read()) + remotehandle.close() + result = json.load(result) + if not result: + continue + result = result[0] + cls = Marker + dct['point'] = "POINT(%s %s)" % (result['lon'], result['lat']) else: continue import_key = pk if pk else name.decode('utf-8') @@ -559,12 +586,14 @@ class CSVManager(ImportManager): return (new_item, updated_item, msg) @classmethod - def export(cls, queryset): + def export(cls, queryset, cols=[]): dct = {'description':unicode(datetime.date.today()), 'data':[]} cls_name = queryset.model.__name__.lower() - cols = list(cls.COLS) - for pm in queryset.model.all_properties(): - cols.append((pm.name, pm.getAttrName(), pm.getAttrName()+'_set')) + if not cols: + cols = list(cls.COLS) + if hasattr(queryset.model, 'all_properties'): + for pm in queryset.model.all_properties(): + cols.append((pm.name, pm.getAttrName(), pm.getAttrName()+'_set')) header = [col[0] for col in cols] dct['data'].append(header) for item in queryset.all(): @@ -573,7 +602,10 @@ class CSVManager(ImportManager): if callable(attr): data.append(attr(item)) else: - data.append(getattr(item, attr)) + v = getattr(item, attr) + if v == None: + v = '' + data.append(v) dct['data'].append(data) filename = unicode_normalize(settings.PROJECT_NAME + dct['description']\ + '.csv') |