diff options
-rw-r--r-- | chimere/forms.py | 18 | ||||
-rw-r--r-- | chimere/models.py | 49 |
2 files changed, 50 insertions, 17 deletions
diff --git a/chimere/forms.py b/chimere/forms.py index a2a721b..eccc7c5 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -301,21 +301,11 @@ class RouteForm(RouteAdminForm): file_pk = int(self.cleaned_data['associated_file_id']) new_route.associated_file = RouteFile.objects.get(pk=file_pk) new_route.save() - marker_fields = [f.attname for f in Marker._meta.fields] - marker_dct = dict([(k, self.cleaned_data[k]) for k in self.cleaned_data - if k in marker_fields]) - marker_dct['status'] = new_route.status - categories = [] - new_marker, created = Marker.objects.get_or_create(route=new_route, - defaults=marker_dct) - if not created: - for att in marker_dct.keys(): - setattr(new_marker, att, marker_dct[att]) + new_marker = Marker.objects.get(route=new_route) + # save description + if self.cleaned_data['description']: + new_marker.description = self.cleaned_data['description'] new_marker.save() - new_marker.categories.clear() - for category in self.cleaned_data['categories']: - new_marker.categories.add(category) - new_marker.save() # save properties properties = dict([(k.split('_')[-1], self.cleaned_data[k]) \ for k in self.cleaned_data.keys() if k.startswith('property_')]) diff --git a/chimere/models.py b/chimere/models.py index 6ff9d62..5305c86 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -33,7 +33,7 @@ from django.contrib import admin from django.core.files import File from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse -from django.db.models.signals import post_save, pre_save +from django.db.models.signals import post_save, pre_save, m2m_changed from django import forms from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ @@ -152,7 +152,7 @@ class SubCategory(models.Model): icon = models.ForeignKey(Icon, verbose_name=_(u"Icon")) color_theme = models.ForeignKey(ColorTheme, verbose_name=_(u"Color theme"), blank=True, null=True) - order = models.IntegerField(_(u"Order")) + order = models.IntegerField(_(u"Order"), default=1000) TYPE = (('M', _(u'Marker')), ('R', _(u'Route')), ('B', _(u'Both')),) @@ -832,7 +832,50 @@ def route_pre_save(sender, **kwargs): pre_save_route_values[instance.pk] = (instance.name, instance.route, instance.import_version) pre_save.connect(route_pre_save, sender=Route) -post_save.connect(geometry_post_save(pre_save_route_values), sender=Route) + +def route_post_save(sender, **kwargs): + if not kwargs['instance']: + return + geometry_post_save(pre_save_route_values) + instance = kwargs['instance'] + marker_fields = [f.attname for f in Marker._meta.fields] + route_fields = [f.attname for f in Route._meta.fields] + marker_dct = dict([(k, getattr(instance, k)) for k in marker_fields + if k in route_fields]) + marker_dct['point'] = "SRID=%d;POINT(%d %d)" % (instance.route.srid, + instance.route[0][0], instance.route[0][1]) + marker, created = Marker.objects.get_or_create(route=instance, + defaults=marker_dct) + if not created: + marker.status = instance.status + marker.save() + properties = {} + for pm in instance.properties(): + prop = instance.getProperty(pm) + if prop: + properties[pm.pk] = prop.python_value + # fix mis-initialized markers + if created: + for cat in instance.categories.all(): + marker.categories.add(cat) + marker.saveProperties(properties) + +post_save.connect(route_post_save, sender=Route) + +def sync_m2m_route(sender, **kwargs): + if kwargs['action'] not in ('post_add', 'post_clear', 'post_remove'): + return + route = kwargs['instance'] + marker = route.associated_marker + if not marker.count: + return + marker = marker.all()[0] + marker.categories.clear() + if kwargs['action'] == 'post_clear': + return + for cat in route.categories.all(): + marker.categories.add(cat) +m2m_changed.connect(sync_m2m_route, sender=Route.categories.through) def getDateCondition(): ''' |