summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/models.py24
-rw-r--r--archaeological_warehouse/serializers.py67
-rw-r--r--archaeological_warehouse/tests.py208
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):