summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_warehouse/serializers.py52
-rw-r--r--archaeological_warehouse/tests.py82
-rw-r--r--ishtar_common/serializers.py2
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,
)