diff options
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 |
commit | 032878b18fbf65a00b2ec2aca14f9a4635b2c2f4 (patch) | |
tree | b5a8a50d3f2fbf51406263957fb5653ebedff9cc /chimere/models.py | |
parent | cec7dd6286f4a6f378ccde077bb6c47e1a1bc0f5 (diff) | |
download | Chimè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.py | 49 |
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")) |