diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-06 15:09:31 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-06 15:09:31 +0200 |
commit | 8d5caabe7159a0e8982b58952689413f73958dc8 (patch) | |
tree | 1cd2d1c499a8e595b7929f176b08806f2db372cb | |
parent | 99b03a18a8d8a4d8ee9f9b78b927d8b5c9fb4004 (diff) | |
download | Chimère-8d5caabe7159a0e8982b58952689413f73958dc8.tar.bz2 Chimère-8d5caabe7159a0e8982b58952689413f73958dc8.zip |
Import/export: KML route import - KML, CSV, ShapeFile route export
-rw-r--r-- | chimere/admin.py | 2 | ||||
-rw-r--r-- | chimere/models.py | 19 | ||||
-rw-r--r-- | chimere/templates/chimere/export.csv (renamed from chimere/templates/chimere/export_marker.csv) | 0 | ||||
-rw-r--r-- | chimere/templates/chimere/export.kml | 3 | ||||
-rw-r--r-- | chimere/tests.py | 2 | ||||
-rw-r--r-- | chimere/tests/sample.kml | 10 | ||||
-rw-r--r-- | chimere/utils.py | 21 |
7 files changed, 47 insertions, 10 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 159819a..42835a2 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -149,7 +149,7 @@ class RouteAdmin(admin.ModelAdmin): exclude = ['height', 'width'] form = RouteAdminForm readonly_fields = ('associated_file',) - actions = [validate] + actions = [validate, export_to_kml, export_to_shapefile, export_to_csv] def queryset(self, request): qs = self.model._default_manager.get_query_set() diff --git a/chimere/models.py b/chimere/models.py index 56f4055..6661a30 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -626,7 +626,6 @@ def multimediafile_post_save(sender, **kwargs): multimediafile.save() post_save.connect(multimediafile_post_save, sender=MultimediaFile) - class PictureFile(models.Model): name = models.CharField(_(u"Name"), max_length=150) picture = models.ImageField(_(u"Image"), upload_to='pictures', @@ -658,7 +657,6 @@ def scale_image(max_x, pair): new_y = (float(max_x) / x) * y return (int(max_x), int(new_y)) - IMAGE_EXIF_ORIENTATION_MAP = { 1: 0, 8: 2, @@ -824,6 +822,23 @@ class Route(GeographicItem): ordering = ('status', 'name') verbose_name = _(u"Route") + def __init__(self, *args, **kwargs): + super(Route, self).__init__(*args, **kwargs) + try: + associated_marker = Marker.objects.get(route=self) + except: + associated_marker = None + # add read attributes for properties + for pm in self.properties(): + attr_name = pm.getAttrName() + if not hasattr(self, attr_name): + val = '' + if associated_marker: + property = associated_marker.getProperty(pm) + if property: + val = property.python_value + setattr(self, attr_name, val) + @property def geometry(self): return self.route.wkt diff --git a/chimere/templates/chimere/export_marker.csv b/chimere/templates/chimere/export.csv index 619b872..619b872 100644 --- a/chimere/templates/chimere/export_marker.csv +++ b/chimere/templates/chimere/export.csv diff --git a/chimere/templates/chimere/export.kml b/chimere/templates/chimere/export.kml index 55d671d..b59bc7c 100644 --- a/chimere/templates/chimere/export.kml +++ b/chimere/templates/chimere/export.kml @@ -10,7 +10,8 @@ {% if location.description %}<description> <![CDATA[{{ location.description|safe }}]]> </description>{% endif %} - {{location.point.kml|safe}} + {% if location.point %}{{location.point.kml|safe}}{% endif %} + {% if location.route %}{{location.route.kml|safe}}{% endif %} </Placemark> {% endfor %} diff --git a/chimere/tests.py b/chimere/tests.py index 78655ea..ddd59b1 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -117,7 +117,7 @@ class KMLImporterTest(TestCase, ImporterTest): source=test_dir_path+'tests/sample.kml.zip', zipped=True) importer4.categories.add(subcategory_1) - self.marker_importers = [(importer1, 1), (importer2, 2), (importer3, 0), + self.marker_importers = [(importer1, 1), (importer2, 3), (importer3, 0), (importer4, 4)] class ShapefileImporterTest(TestCase, ImporterTest): diff --git a/chimere/tests/sample.kml b/chimere/tests/sample.kml index 665d861..cc9f108 100644 --- a/chimere/tests/sample.kml +++ b/chimere/tests/sample.kml @@ -35,6 +35,16 @@ <coordinates>-4.69242,48.57501,0</coordinates> </Point> </Placemark> + <Placemark id='4'> + <name>Place 22</name> + <Snippet>snippet</Snippet> + <description>Place 44 description</description> + <LineString> + <coordinates>-112.0814237830345,36.10677870477137,0 + -112.0870267752693,36.0905099328766,0 + </coordinates> + </LineString> + </Placemark> </Folder> </Folder> <Folder> diff --git a/chimere/utils.py b/chimere/utils.py index c89ec56..53834dc 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -194,7 +194,7 @@ class KMLManager(ImportManager): - number of item updated ; - error detail on error """ - from models import Marker + from models import Marker, Route new_item, updated_item, msg = 0, 0, '' source, msg = self.get_source_file(['.kml']) if msg: @@ -218,7 +218,7 @@ class KMLManager(ImportManager): if self.importer_instance.filtr else self.DEFAULT_XPATH for placemark in tree.xpath(xpath, namespaces={'kml':self.ns}): - name, point = None, None + name, point, line = None, None, None pl_id = placemark.attrib.get('id') pl_key = 'kml-%d' % self.importer_instance.pk ns = '{%s}' % self.ns @@ -235,6 +235,13 @@ class KMLManager(ImportManager): if coord.tag == ns + 'coordinates': x, y, z = coord.text.split(',') point = 'SRID=4326;POINT(%s %s)' % (x, y) + elif item.tag == ns + 'LineString': + for coord in item: + if coord.tag == ns + 'coordinates': + points = coord.text.replace('\n', ' ').split(' ') + points = ",".join([" ".join(p.split(',')[:2]) + for p in points if p]) + line = 'SRID=4326;LINESTRING(%s)' % points cls = None dct = {'description':description, 'name':name, @@ -243,6 +250,10 @@ class KMLManager(ImportManager): if point: dct['point'] = point cls = Marker + if line: + dct['route'] = line + dct.pop('description') + cls = Route if cls: item, updated, created = self.create_or_update_item( cls, dct, pl_id, key=pl_key) @@ -459,7 +470,7 @@ class CSVManager(ImportManager): dct['data'].append(data) filename = unicode_normalize(settings.PROJECT_NAME + dct['description']\ + '.csv') - result = render_to_response('chimere/export_%s.csv' % cls_name, dct) + result = render_to_response('chimere/export.csv', dct) return filename, result class GeoRSSManager(ImportManager): @@ -505,8 +516,8 @@ class GeoRSSManager(ImportManager): 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]) + reordered_points.append("%s %s" % (points[idx*2+1], + points[idx*2])) dct['route'] = 'SRID=4326;LINESTRING(%s)' % \ ",".join(reordered_points) |