diff options
-rw-r--r-- | archaeological_finds/serializers.py | 2 | ||||
-rw-r--r-- | archaeological_warehouse/models.py | 24 | ||||
-rw-r--r-- | archaeological_warehouse/serializers.py | 67 | ||||
-rw-r--r-- | archaeological_warehouse/tests.py | 208 |
4 files changed, 297 insertions, 4 deletions
diff --git a/archaeological_finds/serializers.py b/archaeological_finds/serializers.py index 56d113636..7ce17c924 100644 --- a/archaeological_finds/serializers.py +++ b/archaeological_finds/serializers.py @@ -6,7 +6,7 @@ FIND_MODEL_LIST = [ models.BaseFind, models.Find ] -# TODO: associated documents, property, findbasket +# TODO: associated documents, property, findbasket, treatments def find_serialization(archive=False, return_empty_types=False, diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 31588cde2..336046a86 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -126,7 +126,7 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem, def __str__(self): return self.name - def naturel_key(self): + def natural_key(self): return (self.external_id, ) def _get_base_image_path(self): @@ -364,6 +364,12 @@ post_save.connect(post_save_cache, sender=WarehouseDivision) post_delete.connect(post_save_cache, sender=WarehouseDivision) +class WarehouseDivisionLinkManager(models.Manager): + def get_by_natural_key(self, warehouse, division): + return self.get(warehouse__external_id=warehouse, + division__txt_idx=division) + + class WarehouseDivisionLink(models.Model): RELATED_SET_NAME = "divisions" RELATED_ATTRS = ["order"] @@ -371,6 +377,7 @@ class WarehouseDivisionLink(models.Model): warehouse = models.ForeignKey(Warehouse, related_name='divisions') division = models.ForeignKey(WarehouseDivision) order = models.IntegerField(_("Order"), default=10) + objects = WarehouseDivisionLinkManager() class Meta: ordering = ('warehouse', 'order') @@ -379,6 +386,9 @@ class WarehouseDivisionLink(models.Model): def __str__(self): return u"{} - {}".format(self.warehouse, self.division) + def natural_key(self): + return self.warehouse.external_id, self.division.txt_idx + class ContainerType(GeneralType): length = models.IntegerField(_(u"Length (mm)"), blank=True, null=True) @@ -865,12 +875,20 @@ m2m_changed.connect(document_attached_changed, sender=Container.documents.through) +class ContainerLocalisationManager(models.Manager): + def get_by_natural_key(self, container, warehouse, division): + return self.get(container__external_id=container, + division__warehouse__external_id=warehouse, + division__division__txt_idx = division) + + class ContainerLocalisation(models.Model): container = models.ForeignKey(Container, verbose_name=_(u"Container"), related_name='division') division = models.ForeignKey(WarehouseDivisionLink, verbose_name=_(u"Division")) reference = models.CharField(_(u"Reference"), max_length=200, default='') + objects = ContainerLocalisationManager() class Meta: verbose_name = _(u"Container localisation") @@ -883,6 +901,10 @@ class ContainerLocalisation(models.Model): str(self.division), self.reference)) return lbl + def natural_key(self): + return self.container.external_id, self.division.warehouse.external_id,\ + self.division.division.txt_idx + def save(self, *args, **kwargs): super(ContainerLocalisation, self).save(*args, **kwargs) self.container.skip_history_when_saving = True diff --git a/archaeological_warehouse/serializers.py b/archaeological_warehouse/serializers.py new file mode 100644 index 000000000..888c7d33f --- /dev/null +++ b/archaeological_warehouse/serializers.py @@ -0,0 +1,67 @@ +from ishtar_common.serializers import generic_get_results, archive_serialization +from archaeological_warehouse import models + + +WAREHOUSE_MODEL_LIST = [ + models.Warehouse, models.Container, + models.WarehouseDivisionLink, + models.ContainerLocalisation +] + +# TODO: associated documents + + +def warehouse_serialization(archive=False, return_empty_types=False, + archive_name=None, operation_queryset=None, + site_queryset=None, cr_queryset=None, + find_queryset=None): + result_queryset = {} + """ + if operation_queryset: + operation_ids = operation_queryset.values_list("id", flat=True) + 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), + } + elif site_queryset: + sites = site_queryset.values_list("id", flat=True) + f_q = { + "base_finds__context_record__operation__archaeological_site_id__in": sites + } + result_queryset = { + models.BaseFind.__name__: + models.BaseFind.objects.filter( + context_record__operation__archaeological_site_id__in=sites + ), + models.Find.__name__: + models.Find.objects.filter(**f_q), + } + elif cr_queryset: + cr_ids = cr_queryset.values_list("id", flat=True) + result_queryset = { + models.BaseFind.__name__: + models.BaseFind.objects.filter( + context_record__in=cr_ids), + models.Find.__name__: + models.Find.objects.filter( + base_finds__context_record__in=cr_ids), + } + elif find_queryset: + find_ids = find_queryset.values_list("id", flat=True) + result_queryset = { + models.BaseFind.__name__: models.BaseFind.objects.filter( + 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( + result, archive_dir="warehouse", archive=archive, + return_empty_types=return_empty_types, archive_name=archive_name, + ) + return full_archive diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py index 07171ebb4..2431dc9a5 100644 --- a/archaeological_warehouse/tests.py +++ b/archaeological_warehouse/tests.py @@ -17,13 +17,217 @@ # See the file COPYING for details. +import json + from archaeological_finds.tests import FindInit from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \ - TestCase, WAREHOUSE_FIXTURES + TestCase, WAREHOUSE_FIXTURES, GenericSerializationTest, COMMON_FIXTURES from ishtar_common.models import IshtarSiteProfile, SpatialReferenceSystem -from archaeological_warehouse import models, views, forms +from archaeological_operations.models import Operation +from archaeological_context_records.models import ContextRecord + +from archaeological_warehouse import models, views, forms, serializers + + +class SerializationTest(GenericSerializationTest, FindInit, TestCase): + fixtures = COMMON_FIXTURES + WAREHOUSE_FIXTURES + + def setUp(self): + ope1 = self.create_operation()[0] + ope2 = self.create_operation()[1] + cr = self.create_context_record( + data={"label": u"CR 1", "operation": ope1} + )[0] + 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] + w1 = models.Warehouse.objects.create( + name="Test1", + external_id="test", + warehouse_type=models.WarehouseType.objects.all()[0], + ) + w2 = models.Warehouse.objects.create( + name="Test2", + external_id="test", + warehouse_type=models.WarehouseType.objects.all()[0], + ) + c1 = models.Container.objects.create( + location=w1, + responsible=w1, + container_type=models.ContainerType.objects.all()[0], + reference="Réf1", + index=1, + external_id="ref1-1" + ) + c2 = models.Container.objects.create( + location=w2, + responsible=w1, + container_type=models.ContainerType.objects.all()[0], + reference="Réf2", + index=2, + external_id="ref2-2" + ) + f0 = self.finds[0] + f0.container = c1 + f0.container_ref = c2 + f0.save() + c3 = models.Container.objects.create( + location=w1, + responsible=w2, + container_type=models.ContainerType.objects.all()[0], + reference="Réf3", + index=1, + external_id="ref3-1" + ) + c4 = models.Container.objects.create( + location=w2, + responsible=w2, + container_type=models.ContainerType.objects.all()[0], + reference="Réf4", + index=2, + external_id="ref4-2" + ) + f1 = self.finds[1] + f1.container = c3 + f1.container_ref = c4 + f1.save() + wd1 = models.WarehouseDivision.objects.create( + label="Étagère", txt_idx="etagere" + ) + wd2 = models.WarehouseDivision.objects.create( + label="Allée", txt_idx="allee" + ) + wl1 = models.WarehouseDivisionLink.objects.create( + warehouse=w1, + division=wd1 + ) + wl2 = models.WarehouseDivisionLink.objects.create( + warehouse=w1, + division=wd2 + ) + models.ContainerLocalisation.objects.create( + container=c1, + division=wl1, + reference="A1" + ) + models.ContainerLocalisation.objects.create( + container=c1, + division=wl2, + reference="A2" + ) + + def test_serialization(self): + res = self.generic_serialization_test( + serializers.warehouse_serialization) + warehouse_json = json.loads( + res[('warehouse', "archaeological_warehouse__Warehouse")] + ) + self.assertEqual(len(warehouse_json), 2) + container_json = json.loads( + res[('warehouse', "archaeological_warehouse__Container")] + ) + self.assertEqual(len(container_json), 4) + + """ + result_queryset = Operation.objects.filter(uuid=self.operations[0].uuid) + res = self.generic_serialization_test( + serializers.find_serialization, no_test=True, + kwargs={"operation_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) + + result_queryset = ContextRecord.objects.filter( + uuid=self.context_records[0].uuid) + res = self.generic_serialization_test( + serializers.find_serialization, no_test=True, + kwargs={"cr_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) + + result_queryset = models.Find.objects.filter( + uuid=self.finds[0].uuid) + res = self.generic_serialization_test( + serializers.find_serialization, no_test=True, + kwargs={"find_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_ope_serialization_with_find_filter(self): + res = self.generic_serialization_test( + operation_serialization, no_test=True, + ) + ope_json = json.loads( + res[('operations', 'archaeological_operations__Operation')] + ) + self.assertEqual(len(ope_json), 2) + + result_queryset = models.Find.objects.filter( + uuid=self.finds[0].uuid) + res = self.generic_serialization_test( + operation_serialization, no_test=True, + kwargs={"find_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): + res = self.generic_serialization_test( + cr_serialization, no_test=True, + ) + cr_json = json.loads( + res[('context_records', + 'archaeological_context_records__ContextRecord')] + ) + self.assertEqual(len(cr_json), 2) + + result_queryset = models.Find.objects.filter( + uuid=self.finds[0].uuid) + res = self.generic_serialization_test( + cr_serialization, no_test=True, + kwargs={"find_queryset": result_queryset} + ) + cr_json = json.loads( + res[('context_records', + 'archaeological_context_records__ContextRecord')] + ) + self.assertEqual(len(cr_json), 1) + """ + + def test_restore(self): + current_number, zip_filename = self.generic_restore_test_genzip( + serializers.WAREHOUSE_MODEL_LIST, + serializers.warehouse_serialization) + self.generic_restore_test(zip_filename, current_number, + serializers.WAREHOUSE_MODEL_LIST) class WarehouseWizardCreationTest(WizardTest, FindInit, TestCase): |