summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-04 15:32:22 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-04 15:33:13 +0200
commite0ab9856d23d8c204fde6676b208231236ec6e30 (patch)
treed0dd22cc3b923ca8a2270c121f5b94bdb19dd4c1
parent303a95a0cdbeb2d64b8a3fdf5143bcdbcec22270 (diff)
downloadIshtar-e0ab9856d23d8c204fde6676b208231236ec6e30.tar.bz2
Ishtar-e0ab9856d23d8c204fde6676b208231236ec6e30.zip
Serializers: manage context records - uuid for context records
-rw-r--r--archaeological_context_records/migrations/0051_auto_20190904_1509.py36
-rw-r--r--archaeological_context_records/models.py10
-rw-r--r--archaeological_context_records/serializers.py41
-rw-r--r--archaeological_context_records/tests.py37
-rw-r--r--archaeological_operations/tests.py4
5 files changed, 122 insertions, 6 deletions
diff --git a/archaeological_context_records/migrations/0051_auto_20190904_1509.py b/archaeological_context_records/migrations/0051_auto_20190904_1509.py
new file mode 100644
index 000000000..d4a5562d6
--- /dev/null
+++ b/archaeological_context_records/migrations/0051_auto_20190904_1509.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-09-04 15:09
+from __future__ import unicode_literals
+
+import uuid
+
+from django.db import migrations, models
+
+from ishtar_common.utils_migrations import set_uuid_helper
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0050_dating_uuid'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='contextrecord',
+ name='uuid',
+ field=models.UUIDField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='historicalcontextrecord',
+ name='uuid',
+ field=models.UUIDField(default=uuid.uuid4),
+ ),
+ migrations.RunPython(set_uuid_helper('archaeological_context_records',
+ 'ContextRecord')),
+ migrations.AlterField(
+ model_name='contextrecord',
+ name='uuid',
+ field=models.UUIDField(default=uuid.uuid4),
+ ),
+ ]
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 4588e6465..1f79f663d 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -43,6 +43,7 @@ from ishtar_common.models import Document, GeneralType, \
DocumentItem
from archaeological_operations.models import Operation, Period, Parcel, \
ArchaeologicalSite
+from ishtar_common.model_managers import UUIDModelManager
class DatingType(GeneralType):
@@ -80,6 +81,7 @@ class Dating(models.Model):
blank=True, null=True)
precise_dating = models.TextField(_("Precise dating"), blank=True,
null=True)
+ objects = UUIDModelManager()
class Meta:
verbose_name = _("Dating")
@@ -92,6 +94,9 @@ class Dating(models.Model):
return str(self.period)
return "%s (%s-%s)" % (self.period, start_date, end_date)
+ def natural_key(self):
+ return self.uuid,
+
def get_values(self, prefix='', no_values=False):
return {
prefix + "period": str(self.period),
@@ -448,9 +453,10 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,
DOWN_MODEL_UPDATE = ["base_finds"]
history = HistoricalRecords(bases=[HistoryModel])
- objects = ExternalIdManager()
+ objects = UUIDModelManager()
# fields
+ uuid = models.UUIDField(default=uuid.uuid4)
external_id = models.TextField(_("External ID"), blank=True, null=True)
auto_external_id = models.BooleanField(
_("External ID is set automatically"), default=False)
@@ -552,7 +558,7 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,
ordering = ('cached_label',)
def natural_key(self):
- return (self.external_id, )
+ return (self.uuid, )
@property
def name(self):
diff --git a/archaeological_context_records/serializers.py b/archaeological_context_records/serializers.py
new file mode 100644
index 000000000..98f7d2226
--- /dev/null
+++ b/archaeological_context_records/serializers.py
@@ -0,0 +1,41 @@
+from ishtar_common.serializers import generic_get_results, archive_serialization
+from archaeological_context_records import models
+
+
+CR_MODEL_LIST = [
+ models.Dating, models.ContextRecord, models.RecordRelations
+]
+
+# TODO: associated documents
+
+
+def cr_serialization(archive=False, return_empty_types=False,
+ archive_name=None, operation_queryset=None,
+ site_queryset=None, cr_queryset=None):
+ result_queryset = {}
+ """
+ if operation_queryset:
+ result_queryset = {
+ models.ContextRecord.__name__: operation_queryset,
+ models.ArchaeologicalSite.__name__:
+ models.ArchaeologicalSite.objects.filter(
+ operations__id__in=operation_queryset.values_list(
+ "id", flat=True)
+ )
+ }
+ elif site_queryset:
+ result_queryset = {
+ models.ArchaeologicalSite.__name__: site_queryset,
+ models.Operation.__name__: models.Operation.objects.filter(
+ archaeological_sites__id__in=site_queryset.values_list(
+ "id", flat=True))
+ }
+ """
+
+ result = generic_get_results(CR_MODEL_LIST, "context_records",
+ result_queryset=result_queryset)
+ full_archive = archive_serialization(
+ result, archive_dir="operations", archive=archive,
+ return_empty_types=return_empty_types, archive_name=archive_name,
+ )
+ return full_archive
diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py
index 29670b1a3..024a8f338 100644
--- a/archaeological_context_records/tests.py
+++ b/archaeological_context_records/tests.py
@@ -42,9 +42,10 @@ from ishtar_common.utils import generate_relation_graph
from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \
create_superuser, create_user, TestCase, AutocompleteTestBase, AcItem, \
CONTEXT_RECORD_FIXTURES, CONTEXT_RECORD_TOWNS_FIXTURES, \
- OPERATION_TOWNS_FIXTURES
+ OPERATION_TOWNS_FIXTURES, GenericSerializationTest, COMMON_FIXTURES, \
+ WAREHOUSE_FIXTURES
-from archaeological_context_records import views
+from archaeological_context_records import views, serializers
class ImportContextRecordTest(ImportTest, TestCase):
@@ -205,6 +206,38 @@ class ContextRecordInit(OperationInitTest):
super(ContextRecordInit, self).tearDown()
+class SerializationTest(GenericSerializationTest, ContextRecordInit, TestCase):
+ fixtures = COMMON_FIXTURES + WAREHOUSE_FIXTURES
+
+ def setUp(self):
+ cr = self.create_context_record(data={"label": u"CR 1"})[0]
+ cr2 = self.create_context_record(data={"label": u"CR 2"})[1]
+ dating = models.Dating.objects.create(
+ period=models.Period.objects.all()[0],
+ )
+ cr.datings.add(dating)
+ rlt = models.RelationType.objects.create(
+ label="Test",
+ txt_idx="test",
+ symmetrical=False
+ )
+ models.RecordRelations.objects.create(
+ left_record=cr,
+ right_record=cr2,
+ relation_type=rlt
+ )
+
+ def test_serialization(self):
+ self.generic_serialization_test(serializers.cr_serialization)
+
+ def test_restore(self):
+ current_number, zip_filename = self.generic_restore_test_genzip(
+ serializers.CR_MODEL_LIST,
+ serializers.cr_serialization)
+ self.generic_restore_test(zip_filename, current_number,
+ serializers.CR_MODEL_LIST)
+
+
class ExportTest(ContextRecordInit, TestCase):
fixtures = CONTEXT_RECORD_TOWNS_FIXTURES
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index 82f30855c..9a1313424 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -790,7 +790,7 @@ class SerializationTest(GenericSerializationTest, TestCase):
)
self.assertEqual(len(site_json), 1)
rel_json = json.loads(
- res[('operations', 'archaeological_operations__RecordRelation')]
+ res[('operations', 'archaeological_operations__RecordRelations')]
)
self.assertEqual(len(rel_json), 0)
@@ -809,7 +809,7 @@ class SerializationTest(GenericSerializationTest, TestCase):
)
self.assertEqual(len(site_json), 0)
rel_json = json.loads(
- res[('operations', 'archaeological_operations__RecordRelation')]
+ res[('operations', 'archaeological_operations__RecordRelations')]
)
self.assertEqual(len(rel_json), 0)