diff options
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r-- | archaeological_warehouse/models.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 281bac296..97898e5c1 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -22,7 +22,7 @@ import datetime from django.conf import settings from django.contrib.gis.db import models from django.core.urlresolvers import reverse -from django.db.models import Q +from django.db.models import Q, Max from django.db.models.signals import post_save, post_delete, m2m_changed from django.template.defaultfilters import slugify from django.utils.translation import ugettext_lazy as _, pgettext_lazy @@ -34,6 +34,7 @@ from ishtar_common.models import Document, GeneralType, get_external_id, \ DashboardFormItem, ShortMenuItem, \ document_attached_changed, SearchAltName, DynamicRequest, GeoItem, \ QRCodeItem, SearchVectorConfig, DocumentItem +from ishtar_common.model_merging import merge_model_objects from ishtar_common.utils import cached_label_changed, post_save_geo, task @@ -247,6 +248,40 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem, return self._get_or_set_stats('_number_of_containers_by_place', update, settings.CACHE_SMALLTIMEOUT) + def merge(self, item, keep_old=False): + # do not recreate missing divisions + available_divisions = [ + wd.division + for wd in WarehouseDivisionLink.objects.filter(warehouse=self) + ] + for container in list(item.containers.all()): + container.location = self + container.save() + for loca in ContainerLocalisation.objects.filter( + container=container).all(): + if loca.division.division in available_divisions: + div = WarehouseDivisionLink.objects.get( + warehouse=self, + division=loca.division.division + ) + ContainerLocalisation.objects.create( + container=container, division=div, + reference=loca.reference + ) + loca.delete() + container.save() # force label regeneration + for container in list(item.owned_containers.all()): + if Container.objects.filter(index=container.index, + responsible=self).count(): + container.index = Container.objects.filter( + responsible=self).all().aggregate( + Max("index"))["index__max"] + 1 + container.responsible = self + container.save() + for wdiv in WarehouseDivisionLink.objects.filter(warehouse=item).all(): + wdiv.delete() + merge_model_objects(self, item, keep_old=keep_old) + def save(self, *args, **kwargs): self.update_search_vector() super(Warehouse, self).save(*args, **kwargs) |