summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-01-06 12:54:39 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2020-01-06 12:54:39 +0100
commita70a684f397076e9c8eeb52ef875f1749a7a513b (patch)
tree3440ed45835aacc3ec6c48b1ffa7306ce11c491b /archaeological_warehouse
parentf71baffa929ec801b95aefd3cb21bb418759fb31 (diff)
downloadIshtar-a70a684f397076e9c8eeb52ef875f1749a7a513b.tar.bz2
Ishtar-a70a684f397076e9c8eeb52ef875f1749a7a513b.zip
Warehouse: on location change if division exists in the new warehouse container division are copied
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/models.py21
-rw-r--r--archaeological_warehouse/tests.py97
2 files changed, 83 insertions, 35 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index 64a766cea..89c208df8 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -20,7 +20,6 @@
import datetime
import uuid
-from django.conf import settings
from django.contrib.gis.db import models
from django.contrib.postgres.indexes import GinIndex
from django.core.urlresolvers import reverse
@@ -909,7 +908,25 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,
loca.delete()
-post_save.connect(cached_label_and_geo_changed, sender=Container)
+def container_post_save(sender, **kwargs):
+ cached_label_and_geo_changed(sender=sender, **kwargs)
+ if not kwargs.get('instance'):
+ return
+ instance = kwargs.get('instance')
+ for loca in ContainerLocalisation.objects.filter(
+ container=instance).exclude(
+ division__warehouse=instance.location).all():
+ q = WarehouseDivisionLink.objects.filter(
+ warehouse=instance.location,
+ division=loca.division.division
+ )
+ if not q.count():
+ continue
+ loca.division = q.all()[0]
+ loca.save()
+
+
+post_save.connect(container_post_save, sender=Container)
m2m_changed.connect(document_attached_changed,
sender=Container.documents.through)
diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py
index 72124e685..37c342ef7 100644
--- a/archaeological_warehouse/tests.py
+++ b/archaeological_warehouse/tests.py
@@ -527,15 +527,23 @@ class WarehouseTest(TestCase):
class ContainerTest(FindInit, TestCase):
fixtures = WAREHOUSE_FIXTURES
- def test_form_creation(self):
- main_warehouse = models.Warehouse.objects.create(
+ def setUp(self):
+ self.main_warehouse = models.Warehouse.objects.create(
name="Main",
warehouse_type=models.WarehouseType.objects.all()[0]
)
+ self.division = models.WarehouseDivision.objects.create(
+ label='division')
+ self.alt_division = models.WarehouseDivision.objects.create(
+ label='division2')
+ self.div_link = models.WarehouseDivisionLink.objects.create(
+ warehouse=self.main_warehouse, division=self.division)
+
+ def test_form_creation(self):
data = {
'reference': 'hop-ref',
- "responsible": main_warehouse.pk,
- "location": main_warehouse.pk,
+ "responsible": self.main_warehouse.pk,
+ "location": self.main_warehouse.pk,
"container_type": models.ContainerType.objects.all()[0].pk
}
form = forms.ContainerForm(data=data)
@@ -547,29 +555,21 @@ class ContainerTest(FindInit, TestCase):
self.container_number + 1)
def test_change_location(self):
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
- warehouse_type=models.WarehouseType.objects.all()[0]
- )
- div = models.WarehouseDivision.objects.create(label='division')
- div_link = models.WarehouseDivisionLink.objects.create(
- warehouse=main_warehouse, division=div)
-
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
container = models.Container.objects.get(pk=container.pk)
- self.assertIn(main_warehouse.name, container.cached_location)
+ self.assertIn(self.main_warehouse.name, container.cached_location)
models.ContainerLocalisation.objects.create(
- container=container, division=div_link,
+ container=container, division=self.div_link,
)
self.assertTrue(models.ContainerLocalisation.objects.filter(
- division__warehouse=main_warehouse).count())
+ division__warehouse=self.main_warehouse).count())
# changing location remove irrelevant localisation
other_warehouse = models.Warehouse.objects.create(
name="Other",
@@ -578,23 +578,58 @@ class ContainerTest(FindInit, TestCase):
container.location = other_warehouse
container.save()
self.assertFalse(models.ContainerLocalisation.objects.filter(
- division__warehouse=main_warehouse).count())
+ division__warehouse=self.main_warehouse).count())
- def test_update_containers_on_warehouse_update(self):
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
+ def test_reassign_existing_division_on_warehouse_change(self):
+ container = models.Container.objects.create(
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
+ container_type=models.ContainerType.objects.all()[0]
+ )
+ container_loca = models.ContainerLocalisation.objects.create(
+ container=container, division=self.div_link,
+ )
+
+ alt_warehouse = models.Warehouse.objects.create(
+ name="Alternative",
warehouse_type=models.WarehouseType.objects.all()[0]
)
+ new_div_link = models.WarehouseDivisionLink.objects.create(
+ warehouse=alt_warehouse, division=self.division)
+
+ nb_container_loca = models.ContainerLocalisation.objects.count()
+
+ container.location = alt_warehouse
+ container.save()
+
+ # no new container localisation
+ self.assertEqual(nb_container_loca,
+ models.ContainerLocalisation.objects.count())
+ # but the new one is reaffected
+ container_loca = models.ContainerLocalisation.objects.get(
+ pk=container_loca.pk)
+ self.assertEqual(container_loca.division, new_div_link)
+
+ # reaffect first division link
+ self.div_link.division = self.alt_division
+ self.div_link.save()
+ container.location = self.main_warehouse
+ container.save()
+ # cannot reaffect -> the location is not preserved
+ self.assertEqual(nb_container_loca,
+ models.ContainerLocalisation.objects.count() + 1)
+
+ def test_update_containers_on_warehouse_update(self):
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
container = models.Container.objects.get(pk=container.pk)
- self.assertIn(main_warehouse.name, container.cached_location)
- main_warehouse.name = "New name"
- main_warehouse.save()
+ self.assertIn(self.main_warehouse.name, container.cached_location)
+ self.main_warehouse.name = "New name"
+ self.main_warehouse.save()
self.assertEqual(
models.Container.objects.filter(
need_update=True
@@ -619,19 +654,15 @@ class ContainerTest(FindInit, TestCase):
profile.locate_warehouses = True
profile.save()
wgs84 = SpatialReferenceSystem.objects.get(srid=4326)
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
- warehouse_type=models.WarehouseType.objects.all()[0],
- )
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
self.assertEqual(container.x, None)
- main_warehouse = models.Warehouse.objects.get(pk=main_warehouse.pk)
+ main_warehouse = models.Warehouse.objects.get(pk=self.main_warehouse.pk)
main_warehouse.x, main_warehouse.y = 33, 42
main_warehouse.spatial_reference_system = wgs84
main_warehouse.save()