diff options
Diffstat (limited to 'archaeological_operations/models.py')
-rw-r--r-- | archaeological_operations/models.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 60bdd5f2d..7d0efe34c 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -104,6 +104,9 @@ class ArchaeologicalSite(BaseHistorizedItem): blank=True) towns = models.ManyToManyField(Town, verbose_name=_(u"Towns"), related_name='sites', blank=True) + top_operation = models.ForeignKey("Operation", blank=True, null=True, + verbose_name=_(u"Top operation"), + on_delete=models.SET_NULL) class Meta: verbose_name = _(u"Archaeological site") @@ -142,6 +145,55 @@ class ArchaeologicalSite(BaseHistorizedItem): return [u"{} ({})".format(town.name, town.numero_insee) for town in self.towns.all()] + def create_or_update_top_operation(self, create=False): + """ + Create a virtual operation to associate with the site. + A cluster operation is created for site with many operation. + This cluster operation can be used to attach context records + which are only attached to the site. + """ + if not self.top_operation: + if not create: + return + operation_type, created = OperationType.objects.get_or_create( + txt_idx='unknown', + defaults={'label': _(u"Unknown"), 'available': True, + 'order': 999}) + name = unicode( + _(u"Virtual operation of site: {}") + ).format(self.reference) + if self.towns.count(): + name += u' - ' + u", ".join([town.name + for town in self.towns.all()]) + self.top_operation = Operation.objects.create( + operation_type=operation_type, + common_name=name, + virtual_operation=True + ) + self.skip_history_when_saving = True + self.save() + current_operations = dict( + [(ope.pk, ope) + for ope in self.operations.exclude(pk=self.top_operation.pk).all() + ] + ) + q = RecordRelations.objects.filter( + left_record=self.top_operation, + relation_type__txt_idx='has_got' + ) + for relation in q.all(): + if relation.right_record.pk not in current_operations: + relation.delete() + else: + current_operations.pop(relation.right_record.pk) + rel_type = RelationType.get_cache('has_got') + for missing in current_operations: + RecordRelations.objects.create( + left_record=self.top_operation, + right_record=current_operations[missing], + relation_type=rel_type + ) + def get_values_town_related(item, prefix, values): values[prefix + 'parcellist'] = item.render_parcels() |