diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-06 14:13:57 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-06 14:13:57 +0200 |
commit | 438bbe785549557c5c7f6073f486b5189808eb87 (patch) | |
tree | 4225584926880f883d52b320e3533ef0311ab428 | |
parent | a81fecad08c628e001357f085880cd10c918649d (diff) | |
download | Ishtar-438bbe785549557c5c7f6073f486b5189808eb87.tar.bz2 Ishtar-438bbe785549557c5c7f6073f486b5189808eb87.zip |
Serializers: manage operation filter for warehouse
-rw-r--r-- | archaeological_warehouse/serializers.py | 52 | ||||
-rw-r--r-- | archaeological_warehouse/tests.py | 82 | ||||
-rw-r--r-- | ishtar_common/serializers.py | 2 |
3 files changed, 112 insertions, 24 deletions
diff --git a/archaeological_warehouse/serializers.py b/archaeological_warehouse/serializers.py index 888c7d33f..9a49d5acf 100644 --- a/archaeological_warehouse/serializers.py +++ b/archaeological_warehouse/serializers.py @@ -1,4 +1,6 @@ -from ishtar_common.serializers import generic_get_results, archive_serialization +from django.db.models import Q +from ishtar_common.serializers import generic_get_results, \ + archive_serialization from archaeological_warehouse import models @@ -14,18 +16,49 @@ WAREHOUSE_MODEL_LIST = [ def warehouse_serialization(archive=False, return_empty_types=False, archive_name=None, operation_queryset=None, site_queryset=None, cr_queryset=None, - find_queryset=None): + find_queryset=None, warehouse_queryset=None): result_queryset = {} - """ if operation_queryset: operation_ids = operation_queryset.values_list("id", flat=True) + base_query_key = "base_finds__context_record__operation_id__in" + warehouse_division_q, warehouse_q, container_q = None, None, None + container_loca_q = None + for find_key in ("finds", "finds_ref"): + q = Q(**{"{}__{}".format(find_key, base_query_key): operation_ids}) + q_loca = Q( + **{"container__{}__{}".format(find_key, base_query_key): + operation_ids}) + if not container_q: + container_q = q + container_loca_q = q_loca + else: + container_q |= q + container_loca_q |= q_loca + for container_key in ("containers", "owned_containers"): + q = Q(** + {"{}__{}__{}".format(container_key, find_key, + base_query_key): operation_ids}) + q_div = Q(** + {"warehouse__{}__{}__{}".format( + container_key, find_key, base_query_key): + operation_ids}) + if not warehouse_q: + warehouse_q = q + warehouse_division_q = q_div + else: + warehouse_q |= q + warehouse_division_q |= q_div result_queryset = { - models.BaseFind.__name__: - models.BaseFind.objects.filter( - context_record__operation_id__in=operation_ids), - models.Find.__name__: - models.Find.objects.filter( - base_finds__context_record__operation_id__in=operation_ids), + models.Warehouse.__name__: + models.Warehouse.objects.filter(warehouse_q), + models.Container.__name__: + models.Container.objects.filter(container_q), + models.WarehouseDivisionLink.__name__: + models.WarehouseDivisionLink.objects.filter( + warehouse_division_q), + models.ContainerLocalisation.__name__: + models.ContainerLocalisation.objects.filter( + container_loca_q) } elif site_queryset: sites = site_queryset.values_list("id", flat=True) @@ -57,7 +90,6 @@ def warehouse_serialization(archive=False, return_empty_types=False, find__id__in=find_ids), models.Find.__name__: find_queryset, } - """ result = generic_get_results(WAREHOUSE_MODEL_LIST, "warehouse", result_queryset=result_queryset) full_archive = archive_serialization( diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py index 2431dc9a5..a14c0fb8c 100644 --- a/archaeological_warehouse/tests.py +++ b/archaeological_warehouse/tests.py @@ -43,8 +43,9 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): cr2 = self.create_context_record( data={"label": u"CR 2", "operation": ope2} )[1] - self.create_finds(data_base={"context_record": cr})[0] - self.create_finds(data_base={"context_record": cr2})[1] + self.create_finds(data_base={"context_record": cr}) + self.create_finds(data_base={"context_record": cr2}) + self.create_finds(data_base={"context_record": cr2}) w1 = models.Warehouse.objects.create( name="Test1", external_id="test", @@ -52,7 +53,12 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): ) w2 = models.Warehouse.objects.create( name="Test2", - external_id="test", + external_id="test2", + warehouse_type=models.WarehouseType.objects.all()[0], + ) + w3 = models.Warehouse.objects.create( + name="Test3", + external_id="test3", warehouse_type=models.WarehouseType.objects.all()[0], ) c1 = models.Container.objects.create( @@ -95,6 +101,18 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): f1.container = c3 f1.container_ref = c4 f1.save() + c5 = models.Container.objects.create( + location=w3, + responsible=w3, + container_type=models.ContainerType.objects.all()[0], + reference="Réf5", + index=1, + external_id="ref5-2" + ) + f2 = self.finds[2] + f2.container = c5 + f2.container_ref = c5 + f2.save() wd1 = models.WarehouseDivision.objects.create( label="Étagère", txt_idx="etagere" ) @@ -109,6 +127,14 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): warehouse=w1, division=wd2 ) + wl3 = models.WarehouseDivisionLink.objects.create( + warehouse=w2, + division=wd2 + ) + wl4 = models.WarehouseDivisionLink.objects.create( + warehouse=w3, + division=wd1 + ) models.ContainerLocalisation.objects.create( container=c1, division=wl1, @@ -119,6 +145,16 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): division=wl2, reference="A2" ) + models.ContainerLocalisation.objects.create( + container=c2, + division=wl3, + reference="A4" + ) + models.ContainerLocalisation.objects.create( + container=c3, + division=wl4, + reference="A5" + ) def test_serialization(self): res = self.generic_serialization_test( @@ -126,26 +162,46 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): warehouse_json = json.loads( res[('warehouse', "archaeological_warehouse__Warehouse")] ) - self.assertEqual(len(warehouse_json), 2) + self.assertEqual(len(warehouse_json), 3) container_json = json.loads( res[('warehouse', "archaeological_warehouse__Container")] ) - self.assertEqual(len(container_json), 4) + self.assertEqual(len(container_json), 5) + div_json = json.loads( + res[('warehouse', + "archaeological_warehouse__WarehouseDivisionLink")] + ) + self.assertEqual(len(div_json), 4) + loca_json = json.loads( + res[('warehouse', + "archaeological_warehouse__ContainerLocalisation")] + ) + self.assertEqual(len(loca_json), 4) - """ result_queryset = Operation.objects.filter(uuid=self.operations[0].uuid) res = self.generic_serialization_test( - serializers.find_serialization, no_test=True, + serializers.warehouse_serialization, no_test=True, kwargs={"operation_queryset": result_queryset} ) - find_json = json.loads( - res[('finds', 'archaeological_finds__Find')] + warehouse_json = json.loads( + res[('warehouse', "archaeological_warehouse__Warehouse")] ) - self.assertEqual(len(find_json), 1) - bfind_json = json.loads( - res[('finds', 'archaeological_finds__BaseFind')] + self.assertEqual(len(warehouse_json), 2) + container_json = json.loads( + res[('warehouse', "archaeological_warehouse__Container")] ) - self.assertEqual(len(bfind_json), 1) + self.assertEqual(len(container_json), 2) + div_json = json.loads( + res[('warehouse', + "archaeological_warehouse__WarehouseDivisionLink")] + ) + self.assertEqual(len(div_json), 3) + loca_json = json.loads( + res[('warehouse', + "archaeological_warehouse__ContainerLocalisation")] + ) + self.assertEqual(len(loca_json), 3) + """ result_queryset = ContextRecord.objects.filter( uuid=self.context_records[0].uuid) diff --git a/ishtar_common/serializers.py b/ishtar_common/serializers.py index 8dca370f5..36aff680b 100644 --- a/ishtar_common/serializers.py +++ b/ishtar_common/serializers.py @@ -128,7 +128,7 @@ def generic_get_results(model_list, dirname, no_geo=True, key = (dirname, model_name) result[key] = serialize( - "json", q.all(), + "json", q.distinct().all(), indent=2, use_natural_foreign_keys=True, use_natural_primary_keys=True, ) |