summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/models.py37
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)