diff options
| -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)  | 
