diff options
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 |
commit | e75781247b085311d75ba380ead2b523b8dba097 (patch) | |
tree | d0dd22cc3b923ca8a2270c121f5b94bdb19dd4c1 /archaeological_context_records | |
parent | 21fe72642e7b7e9847a178794a1cd9f771f23c0a (diff) | |
download | Ishtar-e75781247b085311d75ba380ead2b523b8dba097.tar.bz2 Ishtar-e75781247b085311d75ba380ead2b523b8dba097.zip |
Serializers: manage context records - uuid for context records
Diffstat (limited to 'archaeological_context_records')
-rw-r--r-- | archaeological_context_records/migrations/0051_auto_20190904_1509.py | 36 | ||||
-rw-r--r-- | archaeological_context_records/models.py | 10 | ||||
-rw-r--r-- | archaeological_context_records/serializers.py | 41 | ||||
-rw-r--r-- | archaeological_context_records/tests.py | 37 |
4 files changed, 120 insertions, 4 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 |