diff options
| -rw-r--r-- | chimere/tests.py | 25 | ||||
| -rw-r--r-- | chimere/utils.py | 32 |
2 files changed, 53 insertions, 4 deletions
diff --git a/chimere/tests.py b/chimere/tests.py index 89c6ee3..f97afab 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -19,7 +19,7 @@ from django.test.client import Client from chimere.admin import managed_modified, MarkerAdmin from chimere.models import Icon, Importer, Category, SubCategory, Marker,\ - Route, News, Map, MapUsers, MapGroups + Route, News, Map, MapUsers, MapGroups, PropertyModel from chimere.forms import MarkerForm, MapAdminForm from chimere.templatetags.chimere_tags import display_news from chimere.utils import ShapefileManager @@ -133,6 +133,14 @@ def map_setup(): public_propose=False, public_write=False)) return maps +def propertymodel_setup(): + pms = [] + pms.append(PropertyModel.objects.create(name='Address', order=10, available=False, + mandatory=False, slug='address', type='T')) + pms.append(PropertyModel.objects.create(name='City', order=20, available=False, + mandatory=False, slug='town', type='T')) + return pms + def users_setup(): adminuser = User.objects.create_superuser('admin', 'admin@test.com', @@ -315,6 +323,21 @@ class GeoRSSImporterTest(TestCase, ImporterTest): self.marker_importers = [(importer1, 1), (importer2, 32)] +class CSVImporterTest(TestCase, ImporterTest): + def setUp(self): + subcategories = subcategory_setup() + pm = propertymodel_setup() + importer1 = Importer.objects.create(importer_type='CSV', + source=test_dir_path+'tests/test.csv') + importer1.categories.add(subcategories[0]) + self.old_settings = settings.CHIMERE_NOMINATIM_FIELDS + settings.CHIMERE_NOMINATIM_FIELDS = {'street':'address', + 'city':'town', 'country':u'Great Britain'} + self.marker_importers = [(importer1, 2)] + + def tearDown(self): + settings.CHIMERE_NOMINATIM_FIELDS = self.old_settings + class FeedsTest(TestCase): def setUp(self): self.areas = areas_setup() diff --git a/chimere/utils.py b/chimere/utils.py index 7463a50..a30d49a 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 @@ -505,10 +507,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): @@ -531,7 +541,23 @@ class CSVManager(ImportManager): 'origin':self.importer_instance.origin, 'license':self.importer_instance.license} cls = None - if 'POINT' in geom: + if 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']) + elif 'POINT' in geom: cls = Marker dct['point'] = geom elif 'LINE' in geom: |
