diff options
Diffstat (limited to 'archaeological_warehouse')
| -rw-r--r-- | archaeological_warehouse/models.py | 24 | ||||
| -rw-r--r-- | archaeological_warehouse/serializers.py | 67 | ||||
| -rw-r--r-- | archaeological_warehouse/tests.py | 208 | 
3 files changed, 296 insertions, 3 deletions
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):  | 
