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): | 
