summaryrefslogtreecommitdiff
path: root/chimere/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-05-13 19:42:46 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-05-13 19:42:46 +0200
commit032878b18fbf65a00b2ec2aca14f9a4635b2c2f4 (patch)
treeb5a8a50d3f2fbf51406263957fb5653ebedff9cc /chimere/models.py
parentcec7dd6286f4a6f378ccde077bb6c47e1a1bc0f5 (diff)
downloadChimère-032878b18fbf65a00b2ec2aca14f9a4635b2c2f4.tar.bz2
Chimère-032878b18fbf65a00b2ec2aca14f9a4635b2c2f4.zip
Models: manage property for polygons - add a slug for property model
Diffstat (limited to 'chimere/models.py')
-rw-r--r--chimere/models.py49
1 files changed, 36 insertions, 13 deletions
diff --git a/chimere/models.py b/chimere/models.py
index 2c27644..8dacdb7 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -555,15 +555,24 @@ class GeographicItem(models.Model):
def geometry(self):
return getattr(self, self.geom_attr).wkt
+ def _get_geom_item_fk_name(self):
+ geom_attr = self.geom_attr
+ if self.geom_attr == 'route':
+ # # TODO v3 - backport routes
+ geom_attr = 'point'
+ return GEOM_TO_GEOM_ITEM[geom_attr].lower()
+
def getProperty(self, propertymodel, safe=None):
"""Get the property of an associated property model.
If safe set to True, verify if the property is available
"""
if safe and not propertymodel.available:
return
+ geom_item = self._get_geom_item_fk_name()
try:
- property = Property.objects.get(propertymodel=propertymodel,
- marker=self)
+ d = {'propertymodel': propertymodel,
+ geom_item: self}
+ property = Property.objects.get(**d)
except Property.DoesNotExist:
return
return property
@@ -582,8 +591,12 @@ class GeographicItem(models.Model):
u"""
Set a property
"""
- properties = Property.objects.filter(marker=self,
- propertymodel=pm).all()
+ if not hasattr(pm, 'pk'):
+ pm = PropertyModel.objects.get(slug=pm)
+ geom_item = self._get_geom_item_fk_name()
+ d = {'propertymodel': pm, geom_item: self}
+ q = Property.objects.filter(**d)
+ properties = q.all()
# in case of multiple edition as the same time delete arbitrary
# the others
if len(properties) > 1:
@@ -603,8 +616,8 @@ class GeographicItem(models.Model):
value = choice.pk
# new property
if not properties:
- new_property = Property.objects.create(
- marker=self, propertymodel=pm, value=value)
+ d = {'propertymodel': pm, geom_item: self, 'value': value}
+ new_property = Property.objects.create(**d)
new_property.save()
else:
property = properties[0]
@@ -677,14 +690,21 @@ class GeographicItem(models.Model):
def property_setter(cls, propertymodel):
def setter(self, value):
- marker = self
+ item = self
if cls == Route:
+ # TODO v3
if not self.associated_marker.objects.count():
return
- marker = self.associated_marker.objects.all()[0]
- marker.setProperty(propertymodel, value)
+ item = self.associated_marker.objects.all()[0]
+ item.setProperty(propertymodel, value)
return setter
+GEOM_TO_GEOM_ITEM = {
+ "point": "Marker",
+ "route": "Route",
+ "polygon": "Polygon"
+}
+
class Marker(GeographicItem):
'''Marker for a POI
@@ -1720,6 +1740,7 @@ def area_post_save(sender, **kwargs):
group.permissions.add(perm)
for app_label, model in (('chimere', 'marker'),
('chimere', 'route'),
+ ('chimere', 'polygon'),
('chimere', 'multimediafile'),
('chimere', 'picturefile'),
('chimere', 'routefile')):
@@ -1772,6 +1793,7 @@ class PropertyModel(models.Model):
'''Model for a property
'''
name = models.CharField(_(u"Name"), max_length=150)
+ slug = models.SlugField(_(u"Slug"), blank=True, null=True)
order = models.IntegerField(_(u"Order"))
available = models.BooleanField(_(u"Available"))
mandatory = models.BooleanField(_(u"Mandatory"))
@@ -1804,9 +1826,7 @@ class PropertyModel(models.Model):
return self.name
def getAttrName(self):
- attr_name = defaultfilters.slugify(self.name)
- attr_name = re.sub(r'-', '_', attr_name)
- return attr_name
+ return self.slug
def getNamedId(self):
'''Get the name used as named id (easily sortable)
@@ -1832,7 +1852,10 @@ class PropertyModelChoice(models.Model):
class Property(models.Model):
'''Property for a POI
'''
- marker = models.ForeignKey(Marker, verbose_name=_(u"Point of interest"))
+ marker = models.ForeignKey(
+ Marker, verbose_name=_(u"Point of interest"), blank=True, null=True)
+ polygon = models.ForeignKey(
+ Polygon, verbose_name=_(u"Polygon"), blank=True, null=True)
propertymodel = models.ForeignKey(PropertyModel,
verbose_name=_(u"Property model"))
value = models.TextField(_(u"Value"))