diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-14 20:32:08 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-14 20:32:08 +0200 |
commit | f2a7d925feeaa8d3a27d61b0fb9fcacca7ca3837 (patch) | |
tree | 5e4416d9e100db2dad378051c1a14013b65d2b5b /chimere/models.py | |
parent | e57a53facf1586f855195f8cce75559aef8e50f1 (diff) | |
download | Chimère-f2a7d925feeaa8d3a27d61b0fb9fcacca7ca3837.tar.bz2 Chimère-f2a7d925feeaa8d3a27d61b0fb9fcacca7ca3837.zip |
Route are now managed like Markers (database and python)
Diffstat (limited to 'chimere/models.py')
-rw-r--r-- | chimere/models.py | 108 |
1 files changed, 7 insertions, 101 deletions
diff --git a/chimere/models.py b/chimere/models.py index a1e00f9..ae1e014 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -36,10 +36,10 @@ from django.conf import settings from django.contrib.auth.models import User, Permission, ContentType, Group from django.contrib.gis.db import models from django.core.files import File -from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse from django.db.models import Q, Count -from django.db.models.signals import post_save, pre_save, m2m_changed +from django.db.models.signals import post_save, pre_save from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ @@ -467,8 +467,6 @@ class Importer(models.Model): SubCategory, blank=True, null=True, verbose_name=_(u"Associated subcategories")) state = models.TextField(_(u"State"), blank=True, null=True) - associate_marker_to_way = models.BooleanField( - _(u"Automatically associate a marker to a way"), default=False) automatic_update = models.BooleanField(_(u"Automatically updated"), default=False) default_status = models.CharField(_(u"Default status"), max_length=1, @@ -792,13 +790,7 @@ def weighted_post_save(sender, **kwargs): def property_setter(cls, propertymodel): def setter(self, value): - item = self - if cls == Route: - # TODO v3 - if not self.associated_marker.objects.count(): - return - item = self.associated_marker.objects.all()[0] - item.setProperty(propertymodel, value) + self.setProperty(propertymodel, value) return setter GEOM_TO_GEOM_ITEM = { @@ -818,8 +810,6 @@ class Marker(GeographicItem): srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION) available_date = models.DateTimeField(_(u"Available Date"), blank=True, null=True) # used by feeds - route = models.ForeignKey(u"Route", blank=True, null=True, - related_name='associated_marker') description = models.TextField(_(u"Description"), blank=True, null=True) is_front_page = models.NullBooleanField(_(u"Is front page"), blank=True, null=True) @@ -1217,6 +1207,8 @@ class MultimediaFile(models.Model): default=settings.CHIMERE_MINIATURE_BY_DEFAULT) marker = models.ForeignKey(Marker, related_name='multimedia_files', blank=True, null=True) + route = models.ForeignKey('Route', related_name='multimedia_files', + blank=True, null=True) polygon = models.ForeignKey(Polygon, related_name='multimedia_files', blank=True, null=True) @@ -1294,6 +1286,8 @@ class PictureFile(models.Model): order = models.IntegerField(_(u"Order"), default=1) marker = models.ForeignKey(Marker, related_name='pictures', blank=True, null=True) + route = models.ForeignKey('Route', related_name='pictures', + blank=True, null=True) polygon = models.ForeignKey(Polygon, related_name='pictures', blank=True, null=True) @@ -1469,8 +1463,6 @@ class Route(GeographicItem): height_field='height', width_field='width') height = models.IntegerField(_(u"Height"), blank=True, null=True) width = models.IntegerField(_(u"Width"), blank=True, null=True) - has_associated_marker = models.BooleanField(_(u"Has an associated marker"), - default=True) color = models.CharField( _(u"Color"), max_length=200, help_text=_(u"HTML code/name"), blank=True, null=True) @@ -1480,48 +1472,10 @@ class Route(GeographicItem): ordering = ('status', 'name') verbose_name = _(u"Route") - def __init__(self, *args, **kwargs): - super(Route, self).__init__(*args, **kwargs) - self.description = '' - try: - associated_marker = Marker.objects.get(route=self) - self.description = associated_marker.description - except: - associated_marker = None - # add read attributes for properties - for pm in self.properties(): - attr_name = pm.getAttrName() - if not hasattr(self, attr_name): - val = '' - if associated_marker: - property = associated_marker.getProperty(pm) - if property: - val = property.python_value - setattr(self, attr_name, val) - if not hasattr(self, attr_name + '_set'): - setattr(self, attr_name + '_set', - property_setter(self.__class__, pm)) - @property def geom_attr(self): return 'route' - def get_init_multi(self): - if not self.associated_marker.count(): - return [] - multis = [ - forms.model_to_dict(multi) - for multi in self.associated_marker.all()[0].multimedia_files.all() - ] - return multis - - def get_init_picture(self): - if not self.associated_marker.count(): - return [] - picts = [forms.model_to_dict(pict) - for pict in self.associated_marker.all()[0].pictures.all()] - return picts - def getGeoJSON(self, color="#000"): '''Return a GeoJSON string ''' @@ -1557,58 +1511,10 @@ def route_post_save(sender, **kwargs): return geometry_post_save(pre_save_route_values)(sender, **kwargs) weighted_post_save(sender, **kwargs) - instance = kwargs['instance'] - - # manage associated marker - if instance.has_associated_marker: - 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]) - try: - marker, created = Marker.objects.get_or_create(route=instance, - defaults=marker_dct) - except MultipleObjectsReturned: - # db error - trying to continue... - marker = Marker.objects.filter(route=instance).all()[0] - created = False - if not created: - marker.status = instance.status - marker.point = marker_dct['point'] - 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(): ''' Return an SQL condition for apparition of dates |