summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit8d5caabe7159a0e8982b58952689413f73958dc8 (patch)
tree1cd2d1c499a8e595b7929f176b08806f2db372cb
parent99b03a18a8d8a4d8ee9f9b78b927d8b5c9fb4004 (diff)
downloadChimère-8d5caabe7159a0e8982b58952689413f73958dc8.tar.bz2
Chimère-8d5caabe7159a0e8982b58952689413f73958dc8.zip
Import/export: KML route import - KML, CSV, ShapeFile route export
-rw-r--r--chimere/admin.py2
-rw-r--r--chimere/models.py19
-rw-r--r--chimere/templates/chimere/export.csv (renamed from chimere/templates/chimere/export_marker.csv)0
-rw-r--r--chimere/templates/chimere/export.kml3
-rw-r--r--chimere/tests.py2
-rw-r--r--chimere/tests/sample.kml10
-rw-r--r--chimere/utils.py21
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)