diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 70 |
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): |