diff options
Diffstat (limited to 'archaeological_warehouse/models.py')
-rw-r--r-- | archaeological_warehouse/models.py | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 5cadc46da..6341db8b8 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -380,6 +380,7 @@ class WarehouseDivisionLinkManager(models.Manager): container_type__txt_idx=container_type) + class ContainerType(GeneralType): stationary = models.BooleanField( _("Stationary"), default=False, @@ -426,6 +427,7 @@ class WarehouseDivisionLink(models.Model): return self.warehouse.uuid, self.container_type.txt_idx + class ContainerTree(models.Model): CREATE_SQL = """ CREATE VIEW containers_tree AS @@ -739,6 +741,7 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem, DISABLE_POLYGONS = False MERGE_ATTRIBUTE = "get_cached_division" + MERGE_STRING_FIELDS = ["old_reference"] class Meta: verbose_name = _("Container") @@ -810,19 +813,24 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem, def _get_base_image_path(self): return self.location._get_base_image_path() + "/" + self.external_id - def merge(self, item, keep_old=False): - # TODO: change localisation management - locas = [ - cl.division.division.txt_idx - for cl in ContainerLocalisation.objects.filter(container=self).all() - ] - for loca in ContainerLocalisation.objects.filter(container=item).all(): - if loca.division.division.txt_idx not in locas: - loca.container = self - loca.save() + def merge(self, item, keep_old=False, exclude_fields=None): + # merge child containers + child_references = {} + for child in Container.objects.filter(parent=self).all(): + key = (child.reference, child.container_type.pk) + child_references[key] = child + for child in Container.objects.filter(parent=item).all(): + key = (child.reference, child.container_type.pk) + if key in child_references.keys(): + # parent field can cause integrity error before the end of + # the merge + child_references[key].index = None + child_references[key].merge(child, exclude_fields=["parent"]) else: - loca.delete() - super(Container, self).merge(item, keep_old=keep_old) + child.parent = self + child.save() + super(Container, self).merge(item, keep_old=keep_old, + exclude_fields=exclude_fields) @classmethod def get_query_owns(cls, ishtaruser): @@ -1176,10 +1184,10 @@ m2m_changed.connect(document_attached_changed, class ContainerLocalisationManager(models.Manager): #TODO: to be deleted.... - def get_by_natural_key(self, container, warehouse, division): + def get_by_natural_key(self, container, warehouse, container_type): return self.get(container__uuid=container, division__warehouse__uuid=warehouse, - division__division__txt_idx=division) + division__container_type__txt_idx=container_type) class ContainerLocalisation(models.Model): @@ -1190,6 +1198,7 @@ class ContainerLocalisation(models.Model): verbose_name=_("Division")) reference = models.CharField(_("Reference"), max_length=200, default='') objects = ContainerLocalisationManager() + TO_BE_DELETED = True class Meta: verbose_name = _("Container localisation") @@ -1204,7 +1213,7 @@ class ContainerLocalisation(models.Model): def natural_key(self): return self.container.uuid, self.division.warehouse.uuid,\ - self.division.division.txt_idx + self.division.container_type.txt_idx def save(self, *args, **kwargs): super(ContainerLocalisation, self).save(*args, **kwargs) |