diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-06 20:22:55 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-06 20:22:55 +0200 |
commit | f7420f6003fce4663c017633407b3044e81ce587 (patch) | |
tree | 1e4e3653789d36146acc02cc5838ac54f95a2e28 | |
parent | 2a70fa9be2d231cab962909b56277c81426f04a9 (diff) | |
download | Ishtar-f7420f6003fce4663c017633407b3044e81ce587.tar.bz2 Ishtar-f7420f6003fce4663c017633407b3044e81ce587.zip |
Serialization: warehouse filter
-rw-r--r-- | archaeological_context_records/serializers.py | 39 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 7 | ||||
-rw-r--r-- | archaeological_finds/serializers.py | 35 | ||||
-rw-r--r-- | archaeological_operations/serializers.py | 47 | ||||
-rw-r--r-- | archaeological_warehouse/serializers.py | 11 | ||||
-rw-r--r-- | archaeological_warehouse/tests.py | 46 | ||||
-rw-r--r-- | ishtar_common/serializers.py | 4 |
7 files changed, 167 insertions, 22 deletions
diff --git a/archaeological_context_records/serializers.py b/archaeological_context_records/serializers.py index 7bb9b6724..351b906f4 100644 --- a/archaeological_context_records/serializers.py +++ b/archaeological_context_records/serializers.py @@ -1,3 +1,5 @@ +from django.db.models import Q + from ishtar_common.serializers import generic_get_results, archive_serialization from archaeological_context_records import models @@ -9,9 +11,41 @@ CR_MODEL_LIST = [ # TODO: associated documents +def generate_warehouse_queryset(ids): + base_query_key = "base_finds__find" + + q_cr, q_record_relation = None, None + + for container_key in ("container", "container_ref"): + for warehouse_key in ("location", "responsible"): + q_c = Q(** + {"{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids}) + q_r = Q(** + {"left_record__{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids, + "right_record__{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids}) + if not q_cr: + q_cr = q_c + q_record_relation = q_r + else: + q_cr |= q_c + q_record_relation |= q_r + + result_queryset = { + models.ContextRecord.__name__: models.ContextRecord.objects.filter( + q_cr), + models.RecordRelations.__name__: + models.RecordRelations.objects.filter(q_r) + } + return result_queryset + + def cr_serialization(archive=False, return_empty_types=False, archive_name=None, operation_queryset=None, - site_queryset=None, cr_queryset=None, find_queryset=None): + site_queryset=None, cr_queryset=None, find_queryset=None, + warehouse_queryset=None): result_queryset = {} if operation_queryset: operation_ids = operation_queryset.values_list("id", flat=True) @@ -59,6 +93,9 @@ def cr_serialization(archive=False, return_empty_types=False, right_record__base_finds__find__id__in=find_ids, ) } + elif warehouse_queryset: + warehouse_ids = warehouse_queryset.values_list("id", flat=True) + result_queryset = generate_warehouse_queryset(warehouse_ids) result = generic_get_results(CR_MODEL_LIST, "context_records", result_queryset=result_queryset) diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 3dda2cdda..6914ff019 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1493,12 +1493,11 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem, datings = models.ManyToManyField(Dating, verbose_name=_(u"Dating"), related_name='find') container = models.ForeignKey( - "archaeological_warehouse.Container", verbose_name=_(u"Container"), - blank=True, null=True, - related_name='finds', on_delete=models.SET_NULL) + "archaeological_warehouse.Container", verbose_name=_("Container"), + blank=True, null=True, related_name='finds', on_delete=models.SET_NULL) container_ref = models.ForeignKey( "archaeological_warehouse.Container", - verbose_name=_(u"Reference container"), + verbose_name=_("Reference container"), blank=True, null=True, related_name='finds_ref', on_delete=models.SET_NULL) is_complete = models.NullBooleanField(_(u"Is complete?"), blank=True, diff --git a/archaeological_finds/serializers.py b/archaeological_finds/serializers.py index 7ce17c924..6e079f7ec 100644 --- a/archaeological_finds/serializers.py +++ b/archaeological_finds/serializers.py @@ -1,3 +1,5 @@ +from django.db.models import Q + from ishtar_common.serializers import generic_get_results, archive_serialization from archaeological_finds import models @@ -9,10 +11,37 @@ FIND_MODEL_LIST = [ # TODO: associated documents, property, findbasket, treatments +def generate_warehouse_queryset(ids): + q_find, q_basefind = None, None + + for container_key in ("container", "container_ref"): + for warehouse_key in ("location", "responsible"): + q_f = Q(** + {"{}__{}__id__in".format( + container_key, warehouse_key): ids}) + q_bf = Q(** + {"find__{}__{}__id__in".format( + container_key, warehouse_key): ids}) + if not q_find: + q_find = q_f + q_basefind = q_bf + else: + q_find |= q_f + q_basefind |= q_bf + + result_queryset = { + models.BaseFind.__name__: + models.BaseFind.objects.filter(q_basefind), + models.Find.__name__: + models.Find.objects.filter(q_find), + } + return result_queryset + + def find_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) @@ -54,6 +83,10 @@ def find_serialization(archive=False, return_empty_types=False, find__id__in=find_ids), models.Find.__name__: find_queryset, } + elif warehouse_queryset: + warehouse_ids = warehouse_queryset.values_list("id", flat=True) + result_queryset = generate_warehouse_queryset(warehouse_ids) + result = generic_get_results(FIND_MODEL_LIST, "finds", result_queryset=result_queryset) full_archive = archive_serialization( diff --git a/archaeological_operations/serializers.py b/archaeological_operations/serializers.py index 4dd6f106b..3093bf50a 100644 --- a/archaeological_operations/serializers.py +++ b/archaeological_operations/serializers.py @@ -1,3 +1,5 @@ +from django.db.models import Q + from ishtar_common.serializers import generic_get_results, archive_serialization from archaeological_operations import models @@ -10,10 +12,50 @@ OPERATION_MODEL_LIST = [ # TODO: administrativ acts, associated documents +def generate_warehouse_queryset(ids): + base_query_key = "context_record__base_finds__find" + + q_archaeological_site, q_operation, q_record_relation = None, None, None + + for container_key in ("container", "container_ref"): + for warehouse_key in ("location", "responsible"): + q_s = Q(** + {"operations__{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids}) + q_o = Q(** + {"{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids}) + q_r = Q(** + {"left_record__{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids, + "right_record__{}__{}__{}__id__in".format( + base_query_key, container_key, warehouse_key): ids}) + if not q_archaeological_site: + q_archaeological_site = q_s + q_operation = q_o + q_record_relation = q_r + else: + q_archaeological_site |= q_s + q_operation |= q_o + q_record_relation |= q_r + + result_queryset = { + models.ArchaeologicalSite.__name__: + models.ArchaeologicalSite.objects.filter( + q_archaeological_site + ), + models.Operation.__name__: models.Operation.objects.filter( + q_operation), + models.RecordRelations.__name__: + models.RecordRelations.objects.filter(q_record_relation), + } + return result_queryset + + def operation_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) @@ -72,6 +114,9 @@ def operation_serialization(archive=False, return_empty_types=False, find_ids, ), } + elif warehouse_queryset: + warehouse_ids = warehouse_queryset.values_list("id", flat=True) + result_queryset = generate_warehouse_queryset(warehouse_ids) result = generic_get_results(OPERATION_MODEL_LIST, "operations", result_queryset=result_queryset) diff --git a/archaeological_warehouse/serializers.py b/archaeological_warehouse/serializers.py index 2c44c9dcf..ed5a3f189 100644 --- a/archaeological_warehouse/serializers.py +++ b/archaeological_warehouse/serializers.py @@ -13,7 +13,7 @@ WAREHOUSE_MODEL_LIST = [ # TODO: associated documents -def generate_queryset(base_query_key, ids): +def generate_warehouse_queryset(base_query_key, ids): warehouse_division_q, warehouse_q, container_q = None, None, None container_loca_q = None for find_key in ("finds", "finds_ref"): @@ -63,20 +63,21 @@ def warehouse_serialization(archive=False, return_empty_types=False, if operation_queryset: operation_ids = operation_queryset.values_list("id", flat=True) base_query_key = "base_finds__context_record__operation_id__in" - result_queryset = generate_queryset(base_query_key, operation_ids) + result_queryset = generate_warehouse_queryset(base_query_key, + operation_ids) elif site_queryset: site_ids = site_queryset.values_list("id", flat=True) base_query_key = "base_finds__context_record__"\ "archaeological_site_id__in" - result_queryset = generate_queryset(base_query_key, site_ids) + result_queryset = generate_warehouse_queryset(base_query_key, site_ids) elif cr_queryset: cr_ids = cr_queryset.values_list("id", flat=True) base_query_key = "base_finds__context_record__id__in" - result_queryset = generate_queryset(base_query_key, cr_ids) + result_queryset = generate_warehouse_queryset(base_query_key, cr_ids) elif find_queryset: find_ids = find_queryset.values_list("id", flat=True) base_query_key = "id__in" - result_queryset = generate_queryset(base_query_key, find_ids) + result_queryset = generate_warehouse_queryset(base_query_key, find_ids) elif warehouse_queryset: warehouse_ids = warehouse_queryset.values_list("id", flat=True) result_queryset = { diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py index 52f1a96fc..6d6dbddc9 100644 --- a/archaeological_warehouse/tests.py +++ b/archaeological_warehouse/tests.py @@ -32,6 +32,8 @@ from archaeological_finds.models import Find from archaeological_warehouse import models, views, forms, serializers from archaeological_operations.serializers import operation_serialization +from archaeological_context_records.serializers import cr_serialization +from archaeological_finds.serializers import find_serialization class SerializationTest(GenericSerializationTest, FindInit, TestCase): @@ -280,7 +282,6 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): ) self.assertEqual(len(loca_json), 2) - """ def test_ope_serialization_with_warehouse_filter(self): res = self.generic_serialization_test( operation_serialization, no_test=True, @@ -290,18 +291,18 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): ) self.assertEqual(len(ope_json), 2) - result_queryset = models.Find.objects.filter( - uuid=self.finds[0].uuid) + result_queryset = models.Warehouse.objects.filter( + id=self.warehouses[0].pk) res = self.generic_serialization_test( operation_serialization, no_test=True, - kwargs={"find_queryset": result_queryset} + kwargs={"warehouse_queryset": result_queryset} ) ope_json = json.loads( res[('operations', 'archaeological_operations__Operation')] ) self.assertEqual(len(ope_json), 1) - def test_cr_serialization_with_find_filter(self): + def test_cr_serialization_with_warehouse_filter(self): res = self.generic_serialization_test( cr_serialization, no_test=True, ) @@ -311,18 +312,45 @@ class SerializationTest(GenericSerializationTest, FindInit, TestCase): ) self.assertEqual(len(cr_json), 2) - result_queryset = models.Find.objects.filter( - uuid=self.finds[0].uuid) + result_queryset = models.Warehouse.objects.filter( + id=self.warehouses[0].pk) res = self.generic_serialization_test( cr_serialization, no_test=True, - kwargs={"find_queryset": result_queryset} + kwargs={"warehouse_queryset": result_queryset} ) cr_json = json.loads( res[('context_records', 'archaeological_context_records__ContextRecord')] ) self.assertEqual(len(cr_json), 1) - """ + + def test_find_serialization_with_warehouse_filter(self): + res = self.generic_serialization_test( + find_serialization, no_test=True, + ) + find_json = json.loads( + res[('finds', 'archaeological_finds__Find')] + ) + self.assertEqual(len(find_json), 3) + bfind_json = json.loads( + res[('finds', 'archaeological_finds__BaseFind')] + ) + self.assertEqual(len(bfind_json), 3) + + result_queryset = models.Warehouse.objects.filter( + id=self.warehouses[0].pk) + res = self.generic_serialization_test( + find_serialization, no_test=True, + kwargs={"warehouse_queryset": result_queryset} + ) + find_json = json.loads( + res[('finds', 'archaeological_finds__Find')] + ) + self.assertEqual(len(find_json), 1) + bfind_json = json.loads( + res[('finds', 'archaeological_finds__BaseFind')] + ) + self.assertEqual(len(bfind_json), 1) def test_restore(self): current_number, zip_filename = self.generic_restore_test_genzip( diff --git a/ishtar_common/serializers.py b/ishtar_common/serializers.py index 36aff680b..034828835 100644 --- a/ishtar_common/serializers.py +++ b/ishtar_common/serializers.py @@ -13,9 +13,11 @@ from django.apps import apps from django.conf import settings from django.contrib.sites.models import Site from django.core.serializers import deserialize, serialize +from django.db.models import Q from version import get_version from . import models +from archaeological_warehouse import models as warehouse_models class PublicSerializer(serializers.BaseSerializer): @@ -330,4 +332,4 @@ def restore_serialized(archive_name, delete_existing=False): zip_file.extract("media.zip", tmp_dir_name) with zipfile.ZipFile( tmp_dir_name + os.sep + "media.zip", 'r') as media_zip: - media_zip.extractall(settings.MEDIA_ROOT)
\ No newline at end of file + media_zip.extractall(settings.MEDIA_ROOT) |