diff options
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 |
commit | 3e6246ea5796a23b3616fe2edba3fa882c85a6a4 (patch) | |
tree | edf3f4364d125eaa84e27bb6f4946297cc0ad57a | |
parent | fcdd3280d115ed330120a9e270780e736f5bb443 (diff) | |
download | Chimère-3e6246ea5796a23b3616fe2edba3fa882c85a6a4.tar.bz2 Chimère-3e6246ea5796a23b3616fe2edba3fa882c85a6a4.zip |
OSM export: Fix modification management
-rw-r--r-- | chimere/admin.py | 2 | ||||
-rw-r--r-- | chimere/models.py | 43 | ||||
-rw-r--r-- | chimere/tasks.py | 7 | ||||
-rw-r--r-- | chimere/utils.py | 3 |
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}) |