summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-10-01 02:40:45 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-10-01 02:40:45 +0200
commit3e6246ea5796a23b3616fe2edba3fa882c85a6a4 (patch)
treeedf3f4364d125eaa84e27bb6f4946297cc0ad57a
parentfcdd3280d115ed330120a9e270780e736f5bb443 (diff)
downloadChimère-3e6246ea5796a23b3616fe2edba3fa882c85a6a4.tar.bz2
Chimère-3e6246ea5796a23b3616fe2edba3fa882c85a6a4.zip
OSM export: Fix modification management
-rw-r--r--chimere/admin.py2
-rw-r--r--chimere/models.py43
-rw-r--r--chimere/tasks.py7
-rw-r--r--chimere/utils.py3
4 files changed, 42 insertions, 13 deletions
diff --git a/chimere/admin.py b/chimere/admin.py
index 173ff77..4c728e7 100644
--- a/chimere/admin.py
+++ b/chimere/admin.py
@@ -116,7 +116,7 @@ class MarkerAdmin(admin.ModelAdmin):
exclude = ['submiter_session_key', 'import_key', 'import_version',
'available_date']
readonly_fields = ['submiter_email', 'submiter_comment', 'import_source',
- 'ref_item']
+ 'ref_item', 'modified_since_import']
form = MarkerAdminForm
inlines = [MultimediaInline, PictureInline]
diff --git a/chimere/models.py b/chimere/models.py
index 1ca5db9..979ff43 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -368,6 +368,10 @@ class Marker(GeographicItem):
if settings.CHIMERE_DAYS_BEFORE_EVENT:
return self.start_date
+ @property
+ def geometry(self):
+ return self.point.wkt
+
class Meta:
ordering = ('status', 'name')
verbose_name = _(u"Point of interest")
@@ -463,21 +467,33 @@ class Marker(GeographicItem):
url = reverse('chimere:tiny', args=[area_name, urn])
return url
+def geometry_pre_save(cls, pre_save_geom_values):
+ def geom_pre_save(sender, **kwargs):
+ if not kwargs['instance'] or not kwargs['instance'].pk:
+ return
+ instance = kwargs['instance']
+ try:
+ instance = cls.objects.get(pk=instance.pk)
+ pre_save_geom_values[instance.pk] = (instance.name,
+ instance.geometry, instance.import_version)
+ except ObjectDoesNotExist:
+ pass
+ return geom_pre_save
+
pre_save_marker_values = {}
def marker_pre_save(sender, **kwargs):
if not kwargs['instance']:
return
- instance = kwargs['instance']
- pre_save_marker_values[instance.pk] = (instance.name, instance.point,
- instance.import_version)
+ geometry_pre_save(Marker, pre_save_marker_values)(sender, **kwargs)
pre_save.connect(marker_pre_save, sender=Marker)
def geometry_post_save(pre_save_geom_values):
def geom_post_save(sender, **kwargs):
- if not kwargs['instance']:
+ if not kwargs['instance'] \
+ or kwargs['instance'].pk not in pre_save_geom_values:
return
instance = kwargs['instance']
- name, geometry, import_version = pre_save_geom_values[instance]
+ name, geometry, import_version = pre_save_geom_values[instance.pk]
if (instance.import_version != import_version
and instance.modified_since_import):
instance.modified_since_import = False
@@ -487,8 +503,13 @@ def geometry_post_save(pre_save_geom_values):
return
if instance.name != name or instance.geometry != geometry:
instance.modified_since_import = True
+ instance.save()
return geom_post_save
-post_save.connect(geometry_post_save(pre_save_marker_values), sender=Marker)
+def marker_post_save(sender, **kwargs):
+ if not kwargs['instance']:
+ return
+ geometry_post_save(pre_save_marker_values)(sender, **kwargs)
+post_save.connect(marker_post_save, sender=Marker)
class MultimediaType(models.Model):
MEDIA_TYPES = (('A', _(u"Audio")),
@@ -779,6 +800,10 @@ class Route(GeographicItem):
ordering = ('status', 'name')
verbose_name = _(u"Route")
+ @property
+ def geometry(self):
+ return self.point.wkt
+
def get_init_multi(self):
if not self.associated_marker.count():
return []
@@ -836,15 +861,13 @@ pre_save_route_values = {}
def route_pre_save(sender, **kwargs):
if not kwargs['instance']:
return
- instance = kwargs['instance']
- pre_save_route_values[instance.pk] = (instance.name, instance.route,
- instance.import_version)
+ geometry_pre_save(Route, pre_save_route_values)(sender, **kwargs)
pre_save.connect(route_pre_save, sender=Route)
def route_post_save(sender, **kwargs):
if not kwargs['instance']:
return
- geometry_post_save(pre_save_route_values)
+ geometry_post_save(pre_save_route_values)(sender, **kwargs)
instance = kwargs['instance']
marker_fields = [f.attname for f in Marker._meta.fields]
route_fields = [f.attname for f in Route._meta.fields]
diff --git a/chimere/tasks.py b/chimere/tasks.py
index 2d55bfd..d457f6a 100644
--- a/chimere/tasks.py
+++ b/chimere/tasks.py
@@ -27,6 +27,7 @@ from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _
from chimere.models import Importer
+from external_utils import OsmApi
def single_instance_task(timeout):
@@ -110,7 +111,11 @@ def exporting(importer_pk):
return
importer.state = unicode(IMPORT_MESSAGES['export_process'][0])
importer.save()
- updated_item, error = importer.manager.put()
+ error = None
+ try:
+ updated_item, error = importer.manager.put()
+ except OsmApi.ApiError, error:
+ pass
if error:
importer.state = unicode(IMPORT_MESSAGES['export_failed'][0]) \
+ u" - " + unicode(IMPORT_MESSAGES['export_failed'][1]) % error
diff --git a/chimere/utils.py b/chimere/utils.py
index 423ea85..06dc1e3 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -621,7 +621,8 @@ class OSMManager(ImportManager):
for idx, item in enumerate(Marker.objects.filter(status='A',
point__contained=bbox,
categories=self.importer_instance.categories.all(),
- not_for_osm=False, modified_since_import=True).all()):
+ not_for_osm=False, modified_since_import=True,
+ route=None).all()):
dct = default_dct.copy()
dct.update({'lon':item.point.x,
'lat':item.point.y})