summaryrefslogtreecommitdiff
path: root/chimere/models.py
diff options
context:
space:
mode:
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
commitf2a7d925feeaa8d3a27d61b0fb9fcacca7ca3837 (patch)
tree5e4416d9e100db2dad378051c1a14013b65d2b5b /chimere/models.py
parente57a53facf1586f855195f8cce75559aef8e50f1 (diff)
downloadChimè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.py108
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