summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/forms.py18
-rw-r--r--chimere/models.py49
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():
'''