diff options
Diffstat (limited to 'chimere/models.py')
| -rw-r--r-- | chimere/models.py | 63 | 
1 files changed, 55 insertions, 8 deletions
diff --git a/chimere/models.py b/chimere/models.py index 30dda7c..20c598e 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -34,7 +34,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 _ @@ -208,7 +208,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)      dated = models.BooleanField(_(u"Is dated"), default=False)      TYPE = (('M', _(u'Marker')),              ('R', _(u'Route')), @@ -242,15 +242,19 @@ class SubCategory(models.Model):                  subcategories = subcategories.filter(id__in=sub_ids)              selected_cats = [subcat.pk                               for subcat in area.default_subcategories.all()] -        for sub_category in subcategories: +        for sub_category in subcategories.order_by('order'):              if sub_category.category not in sub_categories:                  sub_categories[sub_category.category] = []              if sub_category.id in selected_cats:                  sub_category.selected = True                  sub_category.category.selected = True              sub_categories[sub_category.category].append(sub_category) -        return [(category, sub_cats) for category, sub_cats \ -                                         in sub_categories.items()] + +        subcategories = [(cat, subcats) \ +                           for cat, subcats in sub_categories.items()] +        get_cat_order = lambda cat_tuple: cat_tuple[0].order +        subcategories = sorted(subcategories, key=get_cat_order) +        return subcategories      @classmethod      def getAvailableTuples(cls, area_name=None): @@ -673,8 +677,8 @@ class PictureFile(models.Model):      name = models.CharField(_(u"Name"), max_length=150)      picture = models.ImageField(_(u"Image"), upload_to='pictures',                                  height_field='height', width_field='width') -    height = models.IntegerField(_(u"Height")) -    width = models.IntegerField(_(u"Width")) +    height = models.IntegerField(_(u"Height"), blank=True, null=True) +    width = models.IntegerField(_(u"Width"), blank=True, null=True)      miniature = models.BooleanField(_(u"Display inside the description?"),                                    default=settings.CHIMERE_MINIATURE_BY_DEFAULT)      thumbnailfile = models.ImageField(_(u"Thumbnail"), upload_to='pictures', @@ -925,7 +929,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 and k not in ('id', 'ref_item_id')]) +    marker_dct['point'] = "SRID=%d;POINT(%f %f)" % (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():      '''  | 
