summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-10-30 10:23:12 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-10-30 10:23:12 +0100
commit11c428fdd9b68c8255f1aeb6890628425a5d8898 (patch)
treed81c85d1b433ed3c0a658f95b1841784789e7c8a /ishtar_common/models.py
parentd71ab9b6f0efc1ec27cc4dcafdad1f3119a2566a (diff)
parent47743d97e01345b7e39a18541100a020f6cfd94d (diff)
downloadIshtar-11c428fdd9b68c8255f1aeb6890628425a5d8898.tar.bz2
Ishtar-11c428fdd9b68c8255f1aeb6890628425a5d8898.zip
Merge branch 'develop' into develop-bootstrap
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py70
1 files changed, 66 insertions, 4 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index c3ba4fdd0..14869e2a5 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -85,6 +85,8 @@ def post_save_user(sender, **kwargs):
except DatabaseError: # manage when db is not synced
pass
IshtarUser.set_superuser(user)
+
+
post_save.connect(post_save_user, sender=User)
@@ -2636,6 +2638,7 @@ class Source(OwnPerms, ImageModel, models.Model):
if getattr(self, attr)]
return slugify(u"-".join(values))
+
if settings.COUNTRY == 'fr':
class Arrondissement(models.Model):
name = models.CharField(u"Nom", max_length=30)
@@ -2654,17 +2657,21 @@ if settings.COUNTRY == 'fr':
(self.name, unicode(self.arrondissement)))
+class TownManager(models.GeoManager):
+ def get_by_natural_key(self, numero_insee, year):
+ return self.get(numero_insee=numero_insee, year=year)
+
+
class Town(Imported, models.Model):
name = models.CharField(_(u"Name"), max_length=100)
surface = models.IntegerField(_(u"Surface (m2)"), blank=True, null=True)
center = models.PointField(_(u"Localisation"), srid=settings.SRID,
blank=True, null=True)
+ limit = models.MultiPolygonField(_(u"Limit"), blank=True, null=True)
if settings.COUNTRY == 'fr':
numero_insee = models.CharField(u"Numéro INSEE", max_length=6)
departement = models.ForeignKey(
Department, verbose_name=u"Département", null=True, blank=True)
- canton = models.ForeignKey(Canton, verbose_name=u"Canton", null=True,
- blank=True)
year = models.IntegerField(
_("Year of creation"), null=True, blank=True,
help_text=_(u"Filling this field is relevant to distinguish old towns "
@@ -2674,7 +2681,7 @@ class Town(Imported, models.Model):
related_name='parents')
cached_label = models.CharField(_(u"Cached name"), max_length=500,
null=True, blank=True, db_index=True)
- objects = models.GeoManager()
+ objects = TownManager()
class Meta:
verbose_name = _(u"Town")
@@ -2683,12 +2690,61 @@ class Town(Imported, models.Model):
ordering = ['numero_insee']
unique_together = (('numero_insee', 'year'),)
+ def natural_key(self):
+ return (self.numero_insee, self.year)
+
def __unicode__(self):
if self.cached_label:
return self.cached_label
self.save()
return self.cached_label
+ def generate_geo(self, force=False):
+ force = self.generate_limit(force=force)
+ self.generate_center(force=force)
+ self.generate_area(force=force)
+
+ def generate_limit(self, force=False):
+ if not force and self.limit:
+ return
+ parents = None
+ if not self.parents.count():
+ return
+ for parent in self.parents.all():
+ if not parent.limit:
+ return
+ if not parents:
+ parents = parent.limit
+ else:
+ parents = parents.union(parent.limit)
+ # if union is a simple polygon make it a multi
+ if 'MULTI' not in parents.wkt:
+ parents = parents.wkt.replace('POLYGON', 'MULTIPOLYGON(') + ")"
+ if not parents:
+ return
+ self.limit = parents
+ self.save()
+ return True
+
+ def generate_center(self, force=False):
+ if not force and (self.center or not self.limit):
+ return
+ self.center = self.limit.centroid
+ if not self.center:
+ return False
+ self.save()
+ return True
+
+ def generate_area(self, force=False):
+ if not force and (self.surface or not self.limit):
+ return
+ self.surface = self.limit.transform(settings.SURFACE_SRID,
+ clone=True).area
+ if not self.surface:
+ return False
+ self.save()
+ return True
+
def _generate_cached_label(self):
cached_label = self.name
if settings.COUNTRY == "fr":
@@ -2698,7 +2754,13 @@ class Town(Imported, models.Model):
return cached_label
-post_save.connect(cached_label_changed, sender=Town)
+def post_save_town(sender, **kwargs):
+ cached_label_changed(sender, **kwargs)
+ town = kwargs['instance']
+ town.generate_geo()
+
+
+post_save.connect(post_save_town, sender=Town)
class OperationType(GeneralType):