diff options
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 |
commit | 75e8c3694c62c289aa2a94d3ad3a8aaf501244c9 (patch) | |
tree | 3440ed45835aacc3ec6c48b1ffa7306ce11c491b | |
parent | c4eded177e78cbcbb2251d4caec143af06a2f8da (diff) | |
download | Ishtar-75e8c3694c62c289aa2a94d3ad3a8aaf501244c9.tar.bz2 Ishtar-75e8c3694c62c289aa2a94d3ad3a8aaf501244c9.zip |
Warehouse: on location change if division exists in the new warehouse container division are copied
-rw-r--r-- | archaeological_warehouse/models.py | 21 | ||||
-rw-r--r-- | archaeological_warehouse/tests.py | 97 |
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() |