diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-09-19 20:30:28 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-09-19 20:30:28 +0200 | 
| commit | fb822636db2aa37b09c97ddcdaa1d4714e61159d (patch) | |
| tree | c478beceea2ec2c1d52bdb8c4f98a0e7a4308c41 | |
| parent | a4a2f071eda97ea6c1b0c6cb43e09aaf29cb11f5 (diff) | |
| download | Chimère-fb822636db2aa37b09c97ddcdaa1d4714e61159d.tar.bz2 Chimère-fb822636db2aa37b09c97ddcdaa1d4714e61159d.zip  | |
Improve route save: manage with signals the affectation of a reference marker
| -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():      '''  | 
