diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-07-07 01:44:47 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-07-07 01:44:47 +0200 |
commit | e887e4b338997c06cce1dfc60cd76d467ca9750d (patch) | |
tree | 31211012c33bcf6d899c600efd91b0cd0482c70f /archaeological_operations/models.py | |
parent | e2987bad62b6571fcfcebbbc24dea6cbd56d224d (diff) | |
download | Ishtar-e887e4b338997c06cce1dfc60cd76d467ca9750d.tar.bz2 Ishtar-e887e4b338997c06cce1dfc60cd76d467ca9750d.zip |
Fix parcel management: merge parcels from operation and from file when needed (refs #1612)
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r-- | archaeological_operations/models.py | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 922c51271..3c796a169 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -428,6 +428,24 @@ class Operation(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem, # put a default year if start_date is defined if self.start_date and not self.year: self.year = self.start_date.year + # manage parcel association + if FILES_AVAILABLE and self.associated_file: + for parcel in self.associated_file.parcels.exclude( + operation=self).all(): + parcel.operation = self + parcel.save() + for parcel in self.parcels.exclude( + associated_file=self.associated_file).all(): + parcel.associated_file = self.associated_file + parcel.save() + parcels = {} + for parcel in self.parcels.all(): + keys = (parcel.town, parcel.section, parcel.parcel_number) + if keys in parcels.keys(): + parcel.merge(parcels[keys]) + else: + parcels[keys] = parcel + return super(Operation, self).save(*args, **kwargs) m2m_changed.connect(cached_label_changed, sender=Operation.towns.through) @@ -696,6 +714,29 @@ class Parcel(LightHistorizedItem): def __unicode__(self): return self.short_label + def merge(self, parcel): + # cannot automatically merge + if self.address and parcel.address and self.address != parcel.address: + return + if self.external_id and parcel.external_id and \ + self.external_id != parcel.external_id: + return + if self.year and parcel.year and \ + self.year != parcel.year: + return + self.address = self.address or parcel.address + self.external_id = self.external_id or parcel.external_id + self.year = self.year or parcel.year + self.save() + for owner in parcel.owners.all(): + owner.parcel = self + owner.save() + if hasattr(parcel, 'context_record'): + for cr in parcel.context_record.all(): + cr.parcel = self + cr.save() + parcel.delete() + @classmethod def grouped_parcels(cls, parcels): sortkeyfn = lambda s:(getattr(s, 'town_id'), @@ -768,7 +809,8 @@ post_save.connect(parcel_post_save, sender=Parcel) class ParcelOwner(LightHistorizedItem): owner = models.ForeignKey(Person, verbose_name=_(u"Owner"), related_name="parcel_owner") - parcel = models.ForeignKey(Parcel, verbose_name=_(u"Parcel")) + parcel = models.ForeignKey(Parcel, verbose_name=_(u"Parcel"), + related_name='owners') start_date = models.DateField(_(u"Start date")) end_date = models.DateField(_(u"End date")) |