From 1fb2e15806feb68f5d44eb58cd5b3b45cf7a4441 Mon Sep 17 00:00:00 2001 From: Bastien Abadie <bastien@nextcairn.com> Date: Mon, 6 Aug 2018 09:03:34 +0000 Subject: [PATCH] Move transcriptions in separate table --- MANIFEST.in | 1 + Makefile | 4 +- arkindex/documents/admin.py | 6 +- arkindex/documents/api.py | 24 +- arkindex/documents/fixtures/data.json | 905 +++++++----------- .../management/commands/build_fixtures.py | 9 +- .../documents/management/commands/reindex.py | 4 +- .../migrations/0021_move_transcriptions.py | 85 ++ arkindex/documents/models.py | 47 +- arkindex/documents/search.py | 6 +- arkindex/documents/serializers.py | 81 +- arkindex/documents/tasks.py | 15 +- arkindex/documents/tests/test_search_post.py | 9 +- .../tests/test_transcription_create.py | 26 +- arkindex/images/importer.py | 77 +- arkindex/images/tests.py | 26 +- 16 files changed, 596 insertions(+), 729 deletions(-) create mode 100644 arkindex/documents/migrations/0021_move_transcriptions.py diff --git a/MANIFEST.in b/MANIFEST.in index dc986c52da..bef1560b93 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,4 @@ include requirements.txt include tests-requirements.txt include arkindex/documents/*.xsl recursive-include arkindex/templates *.html +recursive-include arkindex/templates *.json diff --git a/Makefile b/Makefile index 7f050fb7b9..7271bf5626 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,6 @@ ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) VERSION=$(shell git rev-parse --short HEAD) TAG=arkindex-app - .PHONY: build all: clean build @@ -32,7 +31,8 @@ worker: celery worker -A arkindex.project -l INFO --purge test-fixtures: - export PGPASSWORD=devdata + $(eval export PGPASSWORD=devdata) + psql -h 127.0.0.1 -p 9100 -U devuser -c 'DROP DATABASE IF EXISTS arkindex_tmp_fixtures' template1 psql -h 127.0.0.1 -p 9100 -U devuser -c 'ALTER DATABASE arkindex_dev RENAME TO arkindex_tmp_fixtures' template1 psql -h 127.0.0.1 -p 9100 -U devuser -c 'CREATE DATABASE arkindex_dev' template1 arkindex/manage.py migrate diff --git a/arkindex/documents/admin.py b/arkindex/documents/admin.py index a8f4b8f386..2f9d2c5734 100644 --- a/arkindex/documents/admin.py +++ b/arkindex/documents/admin.py @@ -57,9 +57,11 @@ class ActAdmin(admin.ModelAdmin): class TranscriptionAdmin(admin.ModelAdmin): - list_display = ('id', 'line', 'text', 'score') - fields = ('id', 'line', 'text', 'score') + list_display = ('id', 'text', 'score', 'element', ) + list_filter = [('type', EnumFieldListFilter), ] + fields = ('id', 'text', 'score', 'element', 'zone', ) readonly_fields = ('id', ) + raw_id_fields = ('element', 'zone', ) admin.site.register(Corpus, CorpusAdmin) diff --git a/arkindex/documents/api.py b/arkindex/documents/api.py index b562625e6f..786dfbb94b 100644 --- a/arkindex/documents/api.py +++ b/arkindex/documents/api.py @@ -16,7 +16,7 @@ from arkindex.documents.serializers import \ ActSerializer, SurfaceSerializer, \ TranscriptionCreateSerializer, TranscriptionsSerializer from arkindex.documents.models import \ - Element, ElementType, Page, Act, Transcription, Corpus + Element, ElementType, Page, Act, Transcription, Corpus, TranscriptionType from arkindex.documents.search import \ search_transcriptions_post, search_acts_post, search_transcriptions_filter_post from arkindex.documents.indexer import Indexer @@ -110,11 +110,7 @@ class ActEdit(RetrieveAPIView): def get_object(self): act = super().get_object() act.parent_elements = Element.objects.get_ascending_paths(act.id) - act.child_elements = Element.objects.get_descending(act.id) \ - .exclude(type=ElementType.Paragraph) \ - .exclude(type=ElementType.Line) \ - .exclude(type=ElementType.Word) \ - .exclude(type=ElementType.Character) + act.child_elements = Element.objects.get_descending(act.id) return act @@ -160,13 +156,8 @@ class TranscriptionCreate(CreateAPIView): permission_classes = (IsAuthenticated, ) def perform_create(self, serializer): - element_type = serializer.validated_data['type'] - if element_type not in ( - ElementType.Page, - ElementType.Paragraph, - ElementType.Line, - ElementType.Word, - ElementType.Character): + transcription_type = serializer.validated_data['type'] + if transcription_type not in TranscriptionType: raise ValidationError("This endpoint can only import transcriptions.") element = serializer.validated_data['element'] @@ -186,8 +177,8 @@ class TranscriptionCreate(CreateAPIView): ).first() ts, created = Transcription.objects.get_or_create( - corpus=element.corpus, - type=serializer.validated_data['type'], + element=element, + type=transcription_type, zone=ts_zone, text=serializer.validated_data['text'], defaults={ @@ -198,9 +189,6 @@ class TranscriptionCreate(CreateAPIView): ts.score = serializer.validated_data['score'] ts.save() - # Create element paths - ts.add_parent(element) - # Index in ES Indexer().run_index( settings.ES_INDEX_TRANSCRIPTIONS, diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 3bfd00dbe3..331c405def 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -15,442 +15,289 @@ }, { "model": "documents.elementpath", - "pk": "06592ee7-fc2d-4477-aa47-1ce06268dd8e", + "pk": "13148923-6c36-43b1-aa8b-83d09036d887", "fields": { - "element": "ba22e17c-b93f-4683-b869-40588b483558", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 2 - } -}, -{ - "model": "documents.elementpath", - "pk": "09586b91-fed7-4a91-a4be-00a12d6b9b83", - "fields": { - "element": "cfd4952d-41ff-45f0-abe4-a904acf5350b", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 0 + "element": "6a91e3b1-35e7-4158-a7ff-c312f4ea29ce", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "11eb3635-8c5a-4dc4-97d9-906467d92cb9", + "pk": "1b10828f-3f58-4fc7-a667-560f7e7d66eb", "fields": { - "element": "c6b3f72f-1373-45c7-a218-c9b0bcf1c70f", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\"]", - "ordering": 0 + "element": "cc28e0c6-1db4-4746-b224-8165cb59f604", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "157cfbab-6a6f-49cf-8dd3-212f5f277e68", + "pk": "2c8a68bd-a8f6-47e4-bee7-e54d24a6a4de", "fields": { - "element": "bc9f1cbd-0202-4075-9150-7e256bdbd485", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"a83083ae-6db0-4d3f-9dcb-c49e2a232696\"]", + "element": "7b643542-004d-4276-84d7-4cf37872be50", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"c0bd8efc-42a8-41be-834d-9e6df6b16b69\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "4391ca9f-fa02-4540-aacd-8eb81dc19b29", + "pk": "313fab14-a134-45b9-b229-4ddda660ab82", "fields": { - "element": "a83083ae-6db0-4d3f-9dcb-c49e2a232696", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 4 + "element": "c0bd8efc-42a8-41be-834d-9e6df6b16b69", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "4daddfe1-b994-4609-a7df-3119980c1b66", + "pk": "31fc904f-0a21-4d28-916c-73e27b14540f", "fields": { - "element": "f52d8907-aeac-45b1-b584-99c76a31f77b", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ca3fa6e6-838b-4683-8cf9-f6ff75fa8e36\"]", + "element": "890f289f-6d23-4b06-942a-1c4bd930bdea", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "5039aafb-c74e-4658-9527-08f474fa1dd8", + "pk": "42d56c43-748a-4cde-8bbb-1a47dc6114c7", "fields": { - "element": "bb32de06-561c-4c0d-94e0-c43720079cc3", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ba22e17c-b93f-4683-b869-40588b483558\"]", + "element": "1b1444a9-5171-4de9-9520-089978fd5c9e", + "path": "[\"364ac256-9c76-4849-903f-9893530aa73e\", \"1123645c-069e-4b82-ba2a-dfabc4659e91\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "59e8a09c-865c-4846-af27-665c7501d74c", + "pk": "473e3d02-928f-4d1c-b246-cfc7449842c5", "fields": { - "element": "6bf20744-97fa-4372-bcc0-5458bb5de3ce", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"c21ff1e2-694d-4310-97b6-d4a31cf0bfa3\"]", - "ordering": 2 - } -}, -{ - "model": "documents.elementpath", - "pk": "613d75de-cdf0-4303-90d0-98552d2fa2c6", - "fields": { - "element": "ca3fa6e6-838b-4683-8cf9-f6ff75fa8e36", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 2 - } -}, -{ - "model": "documents.elementpath", - "pk": "6373dce1-99c2-4405-8335-d5badae67780", - "fields": { - "element": "c31fa532-b498-4b22-9b81-5110ef02971d", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"c21ff1e2-694d-4310-97b6-d4a31cf0bfa3\"]", + "element": "c932cf9f-4305-4157-b723-31ba8d433941", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"6a91e3b1-35e7-4158-a7ff-c312f4ea29ce\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "671a39a9-a6c8-491b-a5fa-6ccec6b78358", - "fields": { - "element": "59741867-4b09-4874-afab-86f931d2e223", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"c21ff1e2-694d-4310-97b6-d4a31cf0bfa3\"]", - "ordering": 0 - } -}, -{ - "model": "documents.elementpath", - "pk": "7426e036-a6f5-462e-bb3b-52a8d6750a56", + "pk": "4ef6cd94-7921-40df-82fe-a4efad26088e", "fields": { - "element": "4d9be55f-e873-4e21-81e8-144414dc4668", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"3901fbac-ab69-4fa5-9e8e-e973ec684873\"]", - "ordering": 0 - } -}, -{ - "model": "documents.elementpath", - "pk": "83f8aa10-f2df-446e-8c79-a185f08ad499", - "fields": { - "element": "c6d1ae4d-5bf1-4167-ae28-6518c1b572c2", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ab6fa45a-f1fc-4b95-a0fb-db59b5edd717\"]", - "ordering": 2 - } -}, -{ - "model": "documents.elementpath", - "pk": "978cc83e-2a8e-4416-9db1-8d820007795e", - "fields": { - "element": "8069f69b-3f46-47bf-9492-4aeaca1d3a50", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ba22e17c-b93f-4683-b869-40588b483558\"]", + "element": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "9d6e58d9-b44c-4764-ba98-f7b592c03a35", + "pk": "4fed58f1-732a-4fe4-876f-71e74952d55d", "fields": { - "element": "3901fbac-ab69-4fa5-9e8e-e973ec684873", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 3 + "element": "ba3d6cf3-7041-4acc-8c3e-8369e54f3061", + "path": "[\"364ac256-9c76-4849-903f-9893530aa73e\", \"1123645c-069e-4b82-ba2a-dfabc4659e91\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "a5416544-7779-4e08-973e-67f7f241b8a5", + "pk": "500d1d39-33c6-4198-8e23-408f9feb3900", "fields": { - "element": "280577a2-37ea-4283-bb8a-5a41bd4158be", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"fd3ee4b9-edd2-4f82-9216-a1160bf890d4\"]", - "ordering": 1 + "element": "1123645c-069e-4b82-ba2a-dfabc4659e91", + "path": "[\"364ac256-9c76-4849-903f-9893530aa73e\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "ae129f4d-44cd-4521-a366-f1e6308c2c0e", + "pk": "5472bb04-45c1-4ce8-9a27-079fd8c0a74f", "fields": { - "element": "6c17e8e6-71af-4a7d-8bdb-f21532fc024d", - "path": "[\"1b2ea32f-6009-4a4f-aa78-fafebbbcbacb\", \"0a47d859-a5ac-41c6-97d8-878da5fefbf1\"]", - "ordering": 1 + "element": "db398086-e6f9-45d1-bf4f-37bb9a8aab3c", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"715b595a-54ed-4dd9-9109-f076683899d1\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "b493410b-c0fa-4a80-87b0-5ba50bff6440", + "pk": "6202ff54-e44d-425d-9494-52a24139cf2f", "fields": { - "element": "c21ff1e2-694d-4310-97b6-d4a31cf0bfa3", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", + "element": "62313e7d-b189-4f9b-9e3e-4d77a5ba4615", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"6a91e3b1-35e7-4158-a7ff-c312f4ea29ce\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "b92d349a-df0b-4451-8e28-8d6790af5e46", + "pk": "7687c99b-549e-40c4-91a1-a6cf304e7721", "fields": { - "element": "fd3ee4b9-edd2-4f82-9216-a1160bf890d4", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", + "element": "16204e20-9e67-4305-b48c-c836ca88a523", + "path": "[\"364ac256-9c76-4849-903f-9893530aa73e\", \"1123645c-069e-4b82-ba2a-dfabc4659e91\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "ba4f90af-9d39-45f9-b2ba-6ac06780563e", + "pk": "85eefd92-e8a6-4221-ac05-acc2ebf4ce5b", "fields": { - "element": "9b857bbf-c8b6-4e8c-8783-18bf1f033290", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"fd3ee4b9-edd2-4f82-9216-a1160bf890d4\"]", + "element": "ca5ae7e4-80d4-48fb-8ae8-ee0908b4ce82", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"ec08f852-b5fc-4c00-9237-3e246d6aa11f\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "c256c25c-16d0-4ce1-9967-e95799b2c3c8", + "pk": "89f1d52c-3caa-4937-a71e-2d3876b75cca", "fields": { - "element": "478a271b-a93b-4730-89fc-8b486fd7b0f2", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"cfd4952d-41ff-45f0-abe4-a904acf5350b\"]", + "element": "5a7a8372-592c-46ce-adfb-c77484536eb8", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\", \"cc28e0c6-1db4-4746-b224-8165cb59f604\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "c8176f15-12da-4fbf-a643-6b9b97ff3b3d", + "pk": "aa876e8c-281d-4faf-9853-6a93a6d6349b", "fields": { - "element": "0a47d859-a5ac-41c6-97d8-878da5fefbf1", - "path": "[\"1b2ea32f-6009-4a4f-aa78-fafebbbcbacb\"]", - "ordering": 0 + "element": "715b595a-54ed-4dd9-9109-f076683899d1", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", + "ordering": 4 } }, { "model": "documents.elementpath", - "pk": "ce847918-cffc-4665-bb5c-df93ee05aff5", + "pk": "c015d35d-ed58-4f22-8200-695d2bd0d767", "fields": { - "element": "87f549c2-581d-4290-b641-75e73926968e", - "path": "[\"1b2ea32f-6009-4a4f-aa78-fafebbbcbacb\", \"0a47d859-a5ac-41c6-97d8-878da5fefbf1\"]", + "element": "ec08f852-b5fc-4c00-9237-3e246d6aa11f", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "d0d0e0c9-4712-420f-8026-c5994c476dd1", - "fields": { - "element": "ce80f464-5f47-4155-b596-bafe3465c102", - "path": "[\"1b2ea32f-6009-4a4f-aa78-fafebbbcbacb\", \"0a47d859-a5ac-41c6-97d8-878da5fefbf1\"]", - "ordering": 2 - } -}, -{ - "model": "documents.elementpath", - "pk": "eb6d5273-ee51-4ffe-8a07-7d4e92b41368", + "pk": "c4869066-1807-4e14-8173-424b553d150e", "fields": { - "element": "1327dc18-e5c7-44b0-91e6-9dfee3417ce9", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ab6fa45a-f1fc-4b95-a0fb-db59b5edd717\"]", + "element": "5d31c99a-1679-4010-bca2-7452bc7faae4", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "f00c6557-0585-4535-88fa-34a5262dc9c6", + "pk": "e37b5057-b065-4195-9c72-5c3118896c1c", "fields": { - "element": "58343ea9-176f-434c-a9ed-22f975b79968", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ba22e17c-b93f-4683-b869-40588b483558\"]", + "element": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", + "path": "[\"0e1a64e4-a981-4410-8cd6-2e916edbc406\", \"890f289f-6d23-4b06-942a-1c4bd930bdea\"]", "ordering": 2 } }, -{ - "model": "documents.elementpath", - "pk": "f230e413-de34-4d2b-9698-5816bc72eea5", - "fields": { - "element": "ab6fa45a-f1fc-4b95-a0fb-db59b5edd717", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\"]", - "ordering": 1 - } -}, -{ - "model": "documents.elementpath", - "pk": "f81727f5-1f9f-4d9b-b945-fd4b696bb1e1", - "fields": { - "element": "9ef69659-7f7c-4204-9ceb-dbdc2d8daec3", - "path": "[\"fa275cab-d830-4f08-a227-6dd4b70ee377\", \"c6b3f72f-1373-45c7-a218-c9b0bcf1c70f\", \"ab6fa45a-f1fc-4b95-a0fb-db59b5edd717\"]", - "ordering": 1 - } -}, { "model": "documents.element", - "pk": "0a47d859-a5ac-41c6-97d8-878da5fefbf1", + "pk": "0e1a64e4-a981-4410-8cd6-2e916edbc406", "fields": { - "created": "2018-07-24T08:18:54.839Z", - "updated": "2018-07-24T08:18:54.839Z", - "corpus": "test", - "type": "register", - "name": "Register 2", - "zone": null - } -}, -{ - "model": "documents.element", - "pk": "1327dc18-e5c7-44b0-91e6-9dfee3417ce9", - "fields": { - "created": "2018-07-24T08:18:54.980Z", - "updated": "2018-07-24T08:18:54.980Z", - "corpus": "test", - "type": "word", - "name": "", - "zone": "d94e1f63-584d-423f-9d66-966362e413a5" - } -}, -{ - "model": "documents.element", - "pk": "1b2ea32f-6009-4a4f-aa78-fafebbbcbacb", - "fields": { - "created": "2018-07-24T08:18:54.831Z", - "updated": "2018-07-24T08:18:54.831Z", + "created": "2018-07-30T09:17:42.437Z", + "updated": "2018-07-30T09:17:42.437Z", "corpus": "test", "type": "volume", - "name": "Volume 2", + "name": "Volume 1", "zone": null } }, { "model": "documents.element", - "pk": "280577a2-37ea-4283-bb8a-5a41bd4158be", - "fields": { - "created": "2018-07-24T08:18:55.109Z", - "updated": "2018-07-24T08:18:55.109Z", - "corpus": "test", - "type": "surface", - "name": "Surface C", - "zone": "ee7b9b2b-ee1d-49fc-8192-a03c16a03364" - } -}, -{ - "model": "documents.element", - "pk": "3901fbac-ab69-4fa5-9e8e-e973ec684873", + "pk": "1123645c-069e-4b82-ba2a-dfabc4659e91", "fields": { - "created": "2018-07-24T08:18:55.059Z", - "updated": "2018-07-24T08:18:55.059Z", + "created": "2018-07-30T09:17:42.458Z", + "updated": "2018-07-30T09:17:42.458Z", "corpus": "test", - "type": "act", - "name": "Act 4", + "type": "register", + "name": "Register 2", "zone": null } }, { "model": "documents.element", - "pk": "478a271b-a93b-4730-89fc-8b486fd7b0f2", - "fields": { - "created": "2018-07-24T08:18:55.103Z", - "updated": "2018-07-24T08:18:55.103Z", - "corpus": "test", - "type": "surface", - "name": "Surface A", - "zone": "b968bc1a-2c25-47e3-b49b-d6a05dc6d245" - } -}, -{ - "model": "documents.element", - "pk": "4d9be55f-e873-4e21-81e8-144414dc4668", - "fields": { - "created": "2018-07-24T08:18:55.114Z", - "updated": "2018-07-24T08:18:55.114Z", - "corpus": "test", - "type": "surface", - "name": "Surface E", - "zone": "8b777c07-2cf5-4b47-b407-a19dfc27fcc9" - } -}, -{ - "model": "documents.element", - "pk": "58343ea9-176f-434c-a9ed-22f975b79968", - "fields": { - "created": "2018-07-24T08:18:55.041Z", - "updated": "2018-07-24T08:18:55.041Z", - "corpus": "test", - "type": "word", - "name": "", - "zone": "c58b425e-1bdf-4c0d-860c-28e6793db75f" - } -}, -{ - "model": "documents.element", - "pk": "59741867-4b09-4874-afab-86f931d2e223", + "pk": "16204e20-9e67-4305-b48c-c836ca88a523", "fields": { - "created": "2018-07-24T08:18:54.945Z", - "updated": "2018-07-24T08:18:54.945Z", + "created": "2018-07-30T09:17:42.594Z", + "updated": "2018-07-30T09:17:42.594Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "cc592547-529e-4289-8351-53fe6a5cc55c" + "type": "page", + "name": "Volume 2, page 1v", + "zone": "4e68c190-0e58-41e9-91eb-682dc00ef026" } }, { "model": "documents.element", - "pk": "6bf20744-97fa-4372-bcc0-5458bb5de3ce", + "pk": "1b1444a9-5171-4de9-9520-089978fd5c9e", "fields": { - "created": "2018-07-24T08:18:54.968Z", - "updated": "2018-07-24T08:18:54.968Z", + "created": "2018-07-30T09:17:42.579Z", + "updated": "2018-07-30T09:17:42.579Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "af98c80b-e1b5-4b05-9771-d28e9e543c85" + "type": "page", + "name": "Volume 2, page 1r", + "zone": "b66aff77-3dc4-437c-b669-4934ee331baa" } }, { "model": "documents.element", - "pk": "6c17e8e6-71af-4a7d-8bdb-f21532fc024d", + "pk": "364ac256-9c76-4849-903f-9893530aa73e", "fields": { - "created": "2018-07-24T08:18:54.916Z", - "updated": "2018-07-24T08:18:54.916Z", + "created": "2018-07-30T09:17:42.445Z", + "updated": "2018-07-30T09:17:42.445Z", "corpus": "test", - "type": "page", - "name": "Volume 2, page 1v", - "zone": "1542f839-401b-4cf7-8ef1-afc02f6f3cc1" + "type": "volume", + "name": "Volume 2", + "zone": null } }, { "model": "documents.element", - "pk": "8069f69b-3f46-47bf-9492-4aeaca1d3a50", + "pk": "5a7a8372-592c-46ce-adfb-c77484536eb8", "fields": { - "created": "2018-07-24T08:18:55.029Z", - "updated": "2018-07-24T08:18:55.029Z", + "created": "2018-07-30T09:17:42.969Z", + "updated": "2018-07-30T09:17:42.969Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "c50126f5-682d-42ed-ab2d-f359717b81ad" + "type": "surface", + "name": "Surface D", + "zone": "a1243f0d-5b49-411c-9119-b103fdd372ae" } }, { "model": "documents.element", - "pk": "87f549c2-581d-4290-b641-75e73926968e", + "pk": "5d31c99a-1679-4010-bca2-7452bc7faae4", "fields": { - "created": "2018-07-24T08:18:54.913Z", - "updated": "2018-07-24T08:18:54.913Z", + "created": "2018-07-30T09:17:42.514Z", + "updated": "2018-07-30T09:17:42.514Z", "corpus": "test", "type": "page", - "name": "Volume 2, page 1r", - "zone": "0554b559-3f85-40d7-b531-9c4a159e06e2" + "name": "Volume 1, page 1r", + "zone": "6127b926-41af-41aa-b7cb-d7ebda2e7876" } }, { "model": "documents.element", - "pk": "9b857bbf-c8b6-4e8c-8783-18bf1f033290", + "pk": "62313e7d-b189-4f9b-9e3e-4d77a5ba4615", "fields": { - "created": "2018-07-24T08:18:55.106Z", - "updated": "2018-07-24T08:18:55.106Z", + "created": "2018-07-30T09:17:42.946Z", + "updated": "2018-07-30T09:17:42.946Z", "corpus": "test", "type": "surface", "name": "Surface B", - "zone": "26eb4783-b8c9-4768-b55f-0f61f3512659" + "zone": "4a69815f-fab3-4bd2-abe9-0c0162a0d589" } }, { "model": "documents.element", - "pk": "9ef69659-7f7c-4204-9ceb-dbdc2d8daec3", + "pk": "6a91e3b1-35e7-4158-a7ff-c312f4ea29ce", "fields": { - "created": "2018-07-24T08:18:54.992Z", - "updated": "2018-07-24T08:18:54.992Z", + "created": "2018-07-30T09:17:42.839Z", + "updated": "2018-07-30T09:17:42.839Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "2f0c6b20-89dc-45fe-9ce7-4b4cd6b3dd03" + "type": "act", + "name": "Act 2", + "zone": null } }, { "model": "documents.element", - "pk": "a83083ae-6db0-4d3f-9dcb-c49e2a232696", + "pk": "715b595a-54ed-4dd9-9109-f076683899d1", "fields": { - "created": "2018-07-24T08:18:55.062Z", - "updated": "2018-07-24T08:18:55.062Z", + "created": "2018-07-30T09:17:42.872Z", + "updated": "2018-07-30T09:17:42.872Z", "corpus": "test", "type": "act", "name": "Act 5", @@ -459,106 +306,82 @@ }, { "model": "documents.element", - "pk": "ab6fa45a-f1fc-4b95-a0fb-db59b5edd717", - "fields": { - "created": "2018-07-24T08:18:54.883Z", - "updated": "2018-07-24T08:18:54.883Z", - "corpus": "test", - "type": "page", - "name": "Volume 1, page 1v", - "zone": "1dff74fb-a607-4118-a8d3-e1137d4fe122" - } -}, -{ - "model": "documents.element", - "pk": "ba22e17c-b93f-4683-b869-40588b483558", + "pk": "7b643542-004d-4276-84d7-4cf37872be50", "fields": { - "created": "2018-07-24T08:18:54.886Z", - "updated": "2018-07-24T08:18:54.886Z", + "created": "2018-07-30T09:17:42.981Z", + "updated": "2018-07-30T09:17:42.982Z", "corpus": "test", - "type": "page", - "name": "Volume 1, page 2r", - "zone": "a8159284-10b7-423b-a199-8fe2abe949c8" - } -}, -{ - "model": "documents.element", - "pk": "bb32de06-561c-4c0d-94e0-c43720079cc3", - "fields": { - "created": "2018-07-24T08:18:55.017Z", - "updated": "2018-07-24T08:18:55.017Z", - "corpus": "test", - "type": "word", - "name": "", - "zone": "b01704a9-23ec-4a79-8ec3-476042697bb9" + "type": "surface", + "name": "Surface E", + "zone": "53284007-1295-4b13-8c0e-83f2710dc306" } }, { "model": "documents.element", - "pk": "bc9f1cbd-0202-4075-9150-7e256bdbd485", + "pk": "890f289f-6d23-4b06-942a-1c4bd930bdea", "fields": { - "created": "2018-07-24T08:18:55.117Z", - "updated": "2018-07-24T08:18:55.117Z", + "created": "2018-07-30T09:17:42.452Z", + "updated": "2018-07-30T09:17:42.452Z", "corpus": "test", - "type": "surface", - "name": "Surface F", - "zone": "e5b7b231-2071-4521-a413-5cda61dcf909" + "type": "register", + "name": "Register 1", + "zone": null } }, { "model": "documents.element", - "pk": "c21ff1e2-694d-4310-97b6-d4a31cf0bfa3", + "pk": "ba3d6cf3-7041-4acc-8c3e-8369e54f3061", "fields": { - "created": "2018-07-24T08:18:54.879Z", - "updated": "2018-07-24T08:18:54.879Z", + "created": "2018-07-30T09:17:42.605Z", + "updated": "2018-07-30T09:17:42.605Z", "corpus": "test", "type": "page", - "name": "Volume 1, page 1r", - "zone": "26be1b53-bd37-4c2c-9cba-47c2c82403ea" + "name": "Volume 2, page 2r", + "zone": "2c63963c-ee77-4098-b1df-bd3e9a2d3901" } }, { "model": "documents.element", - "pk": "c31fa532-b498-4b22-9b81-5110ef02971d", + "pk": "c0bd8efc-42a8-41be-834d-9e6df6b16b69", "fields": { - "created": "2018-07-24T08:18:54.957Z", - "updated": "2018-07-24T08:18:54.957Z", + "created": "2018-07-30T09:17:42.861Z", + "updated": "2018-07-30T09:17:42.861Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "286f8048-7b6e-4e4e-9664-22296303d47d" + "type": "act", + "name": "Act 4", + "zone": null } }, { "model": "documents.element", - "pk": "c6b3f72f-1373-45c7-a218-c9b0bcf1c70f", + "pk": "c932cf9f-4305-4157-b723-31ba8d433941", "fields": { - "created": "2018-07-24T08:18:54.835Z", - "updated": "2018-07-24T08:18:54.835Z", + "created": "2018-07-30T09:17:42.956Z", + "updated": "2018-07-30T09:17:42.957Z", "corpus": "test", - "type": "register", - "name": "Register 1", - "zone": null + "type": "surface", + "name": "Surface C", + "zone": "bc287bf4-d8a2-4c1d-8d6c-491088486298" } }, { "model": "documents.element", - "pk": "c6d1ae4d-5bf1-4167-ae28-6518c1b572c2", + "pk": "ca5ae7e4-80d4-48fb-8ae8-ee0908b4ce82", "fields": { - "created": "2018-07-24T08:18:55.004Z", - "updated": "2018-07-24T08:18:55.004Z", + "created": "2018-07-30T09:17:42.938Z", + "updated": "2018-07-30T09:17:42.938Z", "corpus": "test", - "type": "word", - "name": "", - "zone": "9833b904-5e2f-4642-a399-9c862068c734" + "type": "surface", + "name": "Surface A", + "zone": "9e6df567-4969-471d-bd2c-1beeeab1fc35" } }, { "model": "documents.element", - "pk": "ca3fa6e6-838b-4683-8cf9-f6ff75fa8e36", + "pk": "cc28e0c6-1db4-4746-b224-8165cb59f604", "fields": { - "created": "2018-07-24T08:18:55.057Z", - "updated": "2018-07-24T08:18:55.057Z", + "created": "2018-07-30T09:17:42.849Z", + "updated": "2018-07-30T09:17:42.849Z", "corpus": "test", "type": "act", "name": "Act 3", @@ -567,67 +390,55 @@ }, { "model": "documents.element", - "pk": "ce80f464-5f47-4155-b596-bafe3465c102", + "pk": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", "fields": { - "created": "2018-07-24T08:18:54.919Z", - "updated": "2018-07-24T08:18:54.919Z", + "created": "2018-07-30T09:17:42.525Z", + "updated": "2018-07-30T09:17:42.525Z", "corpus": "test", "type": "page", - "name": "Volume 2, page 2r", - "zone": "699eed11-e91a-448e-bd3e-4216765aa80e" - } -}, -{ - "model": "documents.element", - "pk": "cfd4952d-41ff-45f0-abe4-a904acf5350b", - "fields": { - "created": "2018-07-24T08:18:55.051Z", - "updated": "2018-07-24T08:18:55.051Z", - "corpus": "test", - "type": "act", - "name": "Act 1", - "zone": null + "name": "Volume 1, page 1v", + "zone": "54bdbe3d-c17d-46de-a1b9-866fce5d09d8" } }, { "model": "documents.element", - "pk": "f52d8907-aeac-45b1-b584-99c76a31f77b", + "pk": "db398086-e6f9-45d1-bf4f-37bb9a8aab3c", "fields": { - "created": "2018-07-24T08:18:55.112Z", - "updated": "2018-07-24T08:18:55.112Z", + "created": "2018-07-30T09:17:42.994Z", + "updated": "2018-07-30T09:17:42.994Z", "corpus": "test", "type": "surface", - "name": "Surface D", - "zone": "87869157-a183-4015-839b-9fce89cce4f0" + "name": "Surface F", + "zone": "9226e888-2f7e-4a4d-a010-4048a66760fe" } }, { "model": "documents.element", - "pk": "fa275cab-d830-4f08-a227-6dd4b70ee377", + "pk": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", "fields": { - "created": "2018-07-24T08:18:54.826Z", - "updated": "2018-07-24T08:18:54.826Z", + "created": "2018-07-30T09:17:42.534Z", + "updated": "2018-07-30T09:17:42.534Z", "corpus": "test", - "type": "volume", - "name": "Volume 1", - "zone": null + "type": "page", + "name": "Volume 1, page 2r", + "zone": "7b51bcec-ce5c-4121-a41b-4f29088b4a09" } }, { "model": "documents.element", - "pk": "fd3ee4b9-edd2-4f82-9216-a1160bf890d4", + "pk": "ec08f852-b5fc-4c00-9237-3e246d6aa11f", "fields": { - "created": "2018-07-24T08:18:55.054Z", - "updated": "2018-07-24T08:18:55.054Z", + "created": "2018-07-30T09:17:42.828Z", + "updated": "2018-07-30T09:17:42.828Z", "corpus": "test", "type": "act", - "name": "Act 2", + "name": "Act 1", "zone": null } }, { "model": "documents.page", - "pk": "6c17e8e6-71af-4a7d-8bdb-f21532fc024d", + "pk": "16204e20-9e67-4305-b48c-c836ca88a523", "fields": { "folio": "1v", "page_type": "page", @@ -638,7 +449,7 @@ }, { "model": "documents.page", - "pk": "87f549c2-581d-4290-b641-75e73926968e", + "pk": "1b1444a9-5171-4de9-9520-089978fd5c9e", "fields": { "folio": "1r", "page_type": "page", @@ -649,18 +460,18 @@ }, { "model": "documents.page", - "pk": "ab6fa45a-f1fc-4b95-a0fb-db59b5edd717", + "pk": "5d31c99a-1679-4010-bca2-7452bc7faae4", "fields": { - "folio": "1v", + "folio": "1r", "page_type": "page", "nb": 1, - "direction": "verso", + "direction": "recto", "complement": null } }, { "model": "documents.page", - "pk": "ba22e17c-b93f-4683-b869-40588b483558", + "pk": "ba3d6cf3-7041-4acc-8c3e-8369e54f3061", "fields": { "folio": "2r", "page_type": "page", @@ -671,18 +482,18 @@ }, { "model": "documents.page", - "pk": "c21ff1e2-694d-4310-97b6-d4a31cf0bfa3", + "pk": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", "fields": { - "folio": "1r", + "folio": "1v", "page_type": "page", "nb": 1, - "direction": "recto", + "direction": "verso", "complement": null } }, { "model": "documents.page", - "pk": "ce80f464-5f47-4155-b596-bafe3465c102", + "pk": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", "fields": { "folio": "2r", "page_type": "page", @@ -693,15 +504,15 @@ }, { "model": "documents.act", - "pk": "3901fbac-ab69-4fa5-9e8e-e973ec684873", + "pk": "6a91e3b1-35e7-4158-a7ff-c312f4ea29ce", "fields": { - "number": "4", - "folio": "2r" + "number": "2", + "folio": "1r-1v" } }, { "model": "documents.act", - "pk": "a83083ae-6db0-4d3f-9dcb-c49e2a232696", + "pk": "715b595a-54ed-4dd9-9109-f076683899d1", "fields": { "number": "5", "folio": "2r" @@ -709,106 +520,124 @@ }, { "model": "documents.act", - "pk": "ca3fa6e6-838b-4683-8cf9-f6ff75fa8e36", + "pk": "c0bd8efc-42a8-41be-834d-9e6df6b16b69", "fields": { - "number": "3", + "number": "4", "folio": "2r" } }, { "model": "documents.act", - "pk": "cfd4952d-41ff-45f0-abe4-a904acf5350b", + "pk": "cc28e0c6-1db4-4746-b224-8165cb59f604", "fields": { - "number": "1", - "folio": "1r" + "number": "3", + "folio": "2r" } }, { "model": "documents.act", - "pk": "fd3ee4b9-edd2-4f82-9216-a1160bf890d4", + "pk": "ec08f852-b5fc-4c00-9237-3e246d6aa11f", "fields": { - "number": "2", - "folio": "1r-1v" + "number": "1", + "folio": "1r" } }, { "model": "documents.transcription", - "pk": "1327dc18-e5c7-44b0-91e6-9dfee3417ce9", + "pk": "10d7b606-318b-4ff2-9ad4-2514adbc85d3", "fields": { - "line": null, - "text": "PARIS", + "element": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", + "type": "word", + "zone": "e25cf93b-bc98-43ac-88e5-bf3c872cd413", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "58343ea9-176f-434c-a9ed-22f975b79968", + "pk": "501017a8-e2e9-4b92-9520-916c4b5af26e", "fields": { - "line": null, + "element": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", + "type": "word", + "zone": "7d03474e-0dd9-4097-9cb7-1b7ca62ee493", "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "59741867-4b09-4874-afab-86f931d2e223", + "pk": "9de364d8-511d-404e-803c-7543436d38a2", "fields": { - "line": null, - "text": "PARIS", + "element": "5d31c99a-1679-4010-bca2-7452bc7faae4", + "type": "word", + "zone": "bc056616-4547-413a-a8f8-7f85f566f07b", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "6bf20744-97fa-4372-bcc0-5458bb5de3ce", + "pk": "9f196980-c158-46c2-8acf-35d24e238375", "fields": { - "line": null, - "text": "DATUM", + "element": "5d31c99a-1679-4010-bca2-7452bc7faae4", + "type": "word", + "zone": "3731d073-eff4-4dc5-bd20-eec4db942629", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "8069f69b-3f46-47bf-9492-4aeaca1d3a50", + "pk": "a25d097c-459b-42fa-9d0f-1066d4fed7f5", "fields": { - "line": null, + "element": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", + "type": "word", + "zone": "443f1d3b-3903-4fff-9b31-d2ce4398f3f7", "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "9ef69659-7f7c-4204-9ceb-dbdc2d8daec3", + "pk": "ab36ebb9-9a0a-4058-8273-990c370a0744", "fields": { - "line": null, - "text": "ROY", + "element": "d1f372a9-7fd7-45b2-8f2d-40e51c192900", + "type": "word", + "zone": "e19edfae-88c5-4812-862f-1a030d2c0624", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "bb32de06-561c-4c0d-94e0-c43720079cc3", + "pk": "cf58319b-48b5-4576-a202-39bb1f7bf77e", "fields": { - "line": null, - "text": "PARIS", + "element": "5d31c99a-1679-4010-bca2-7452bc7faae4", + "type": "word", + "zone": "714b9edc-9a90-4ff2-a898-e291dddf9ef3", + "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "c31fa532-b498-4b22-9b81-5110ef02971d", + "pk": "e5f10f7d-3d32-46f1-bd2d-d326063913a0", "fields": { - "line": null, - "text": "ROY", + "element": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", + "type": "word", + "zone": "96d371e1-1c9f-441f-9eac-fc250f3d390d", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "c6d1ae4d-5bf1-4167-ae28-6518c1b572c2", + "pk": "e6dc4d6f-bff4-4760-9b01-29651da68a30", "fields": { - "line": null, - "text": "DATUM", + "element": "e48098d8-4991-4770-93d8-ae2f9ce1cfaf", + "type": "word", + "zone": "bc875098-80dd-4d3c-8aeb-d079a273e341", + "text": "ROY", "score": 1.0 } }, @@ -818,18 +647,18 @@ "fields": { "name": "Test Server", "url": "http://server", - "created": "2018-07-24T08:18:54.795Z", - "updated": "2018-07-24T08:18:54.795Z" + "created": "2018-07-30T09:17:42.359Z", + "updated": "2018-07-30T09:17:42.359Z" } }, { "model": "images.image", - "pk": "195299b4-da0c-4499-a67c-7f926e63116f", + "pk": "30bcbdf5-24f7-4cc1-9f54-00f4e892458f", "fields": { - "created": "2018-07-24T08:18:54.800Z", - "updated": "2018-07-24T08:18:54.800Z", + "created": "2018-07-30T09:17:42.383Z", + "updated": "2018-07-30T09:17:42.383Z", "server": 1, - "path": "img2", + "path": "img4", "width": 1000, "height": 1000, "status": "unchecked" @@ -837,12 +666,12 @@ }, { "model": "images.image", - "pk": "2feedc50-07d5-41bd-b720-ba2a2ce85bb2", + "pk": "52d09138-39d6-4eed-a559-335867348387", "fields": { - "created": "2018-07-24T08:18:54.806Z", - "updated": "2018-07-24T08:18:54.806Z", + "created": "2018-07-30T09:17:42.367Z", + "updated": "2018-07-30T09:17:42.367Z", "server": 1, - "path": "img5", + "path": "img1", "width": 1000, "height": 1000, "status": "unchecked" @@ -850,12 +679,12 @@ }, { "model": "images.image", - "pk": "37762fff-fc51-4880-b1e0-5c7470e4a54b", + "pk": "6d165290-1e27-4b7f-85f4-3af79b41ec4b", "fields": { - "created": "2018-07-24T08:18:54.804Z", - "updated": "2018-07-24T08:18:54.804Z", + "created": "2018-07-30T09:17:42.387Z", + "updated": "2018-07-30T09:17:42.387Z", "server": 1, - "path": "img4", + "path": "img5", "width": 1000, "height": 1000, "status": "unchecked" @@ -863,12 +692,12 @@ }, { "model": "images.image", - "pk": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", + "pk": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", "fields": { - "created": "2018-07-24T08:18:54.798Z", - "updated": "2018-07-24T08:18:54.798Z", + "created": "2018-07-30T09:17:42.378Z", + "updated": "2018-07-30T09:17:42.378Z", "server": 1, - "path": "img1", + "path": "img3", "width": 1000, "height": 1000, "status": "unchecked" @@ -876,12 +705,12 @@ }, { "model": "images.image", - "pk": "c01f2ae6-abea-4a21-847f-6de9919cb91d", + "pk": "a1033e9d-774c-4dfd-925c-c291f5e54fe0", "fields": { - "created": "2018-07-24T08:18:54.802Z", - "updated": "2018-07-24T08:18:54.802Z", + "created": "2018-07-30T09:17:42.391Z", + "updated": "2018-07-30T09:17:42.391Z", "server": 1, - "path": "img3", + "path": "img6", "width": 1000, "height": 1000, "status": "unchecked" @@ -889,12 +718,12 @@ }, { "model": "images.image", - "pk": "f298ee15-f126-44bc-ae22-459d18537e6f", + "pk": "eeca89c5-5590-48b4-8409-86d79e27d7a4", "fields": { - "created": "2018-07-24T08:18:54.808Z", - "updated": "2018-07-24T08:18:54.808Z", + "created": "2018-07-30T09:17:42.372Z", + "updated": "2018-07-30T09:17:42.372Z", "server": 1, - "path": "img6", + "path": "img2", "width": 1000, "height": 1000, "status": "unchecked" @@ -902,219 +731,219 @@ }, { "model": "images.zone", - "pk": "0554b559-3f85-40d7-b531-9c4a159e06e2", + "pk": "2c63963c-ee77-4098-b1df-bd3e9a2d3901", "fields": { - "created": "2018-07-24T08:18:54.817Z", - "updated": "2018-07-24T08:18:54.817Z", - "image": "37762fff-fc51-4880-b1e0-5c7470e4a54b", + "created": "2018-07-30T09:17:42.424Z", + "updated": "2018-07-30T09:17:42.424Z", + "image": "a1033e9d-774c-4dfd-925c-c291f5e54fe0", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "1542f839-401b-4cf7-8ef1-afc02f6f3cc1", + "pk": "3731d073-eff4-4dc5-bd20-eec4db942629", "fields": { - "created": "2018-07-24T08:18:54.819Z", - "updated": "2018-07-24T08:18:54.819Z", - "image": "2feedc50-07d5-41bd-b720-ba2a2ce85bb2", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2018-07-30T09:17:42.674Z", + "updated": "2018-07-30T09:17:42.674Z", + "image": "52d09138-39d6-4eed-a559-335867348387", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "1dff74fb-a607-4118-a8d3-e1137d4fe122", + "pk": "443f1d3b-3903-4fff-9b31-d2ce4398f3f7", "fields": { - "created": "2018-07-24T08:18:54.813Z", - "updated": "2018-07-24T08:18:54.813Z", - "image": "195299b4-da0c-4499-a67c-7f926e63116f", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2018-07-30T09:17:42.748Z", + "updated": "2018-07-30T09:17:42.748Z", + "image": "eeca89c5-5590-48b4-8409-86d79e27d7a4", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "26be1b53-bd37-4c2c-9cba-47c2c82403ea", + "pk": "4a69815f-fab3-4bd2-abe9-0c0162a0d589", "fields": { - "created": "2018-07-24T08:18:54.810Z", - "updated": "2018-07-24T08:18:54.810Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2018-07-30T09:17:42.943Z", + "updated": "2018-07-30T09:17:42.943Z", + "image": "52d09138-39d6-4eed-a559-335867348387", + "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "26eb4783-b8c9-4768-b55f-0f61f3512659", + "pk": "4e68c190-0e58-41e9-91eb-682dc00ef026", "fields": { - "created": "2018-07-24T08:18:55.105Z", - "updated": "2018-07-24T08:18:55.105Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" + "created": "2018-07-30T09:17:42.418Z", + "updated": "2018-07-30T09:17:42.418Z", + "image": "6d165290-1e27-4b7f-85f4-3af79b41ec4b", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "286f8048-7b6e-4e4e-9664-22296303d47d", + "pk": "53284007-1295-4b13-8c0e-83f2710dc306", "fields": { - "created": "2018-07-24T08:18:54.955Z", - "updated": "2018-07-24T08:18:54.955Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2018-07-30T09:17:42.975Z", + "updated": "2018-07-30T09:17:42.975Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" } }, { "model": "images.zone", - "pk": "2f0c6b20-89dc-45fe-9ce7-4b4cd6b3dd03", + "pk": "54bdbe3d-c17d-46de-a1b9-866fce5d09d8", "fields": { - "created": "2018-07-24T08:18:54.990Z", - "updated": "2018-07-24T08:18:54.990Z", - "image": "195299b4-da0c-4499-a67c-7f926e63116f", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2018-07-30T09:17:42.402Z", + "updated": "2018-07-30T09:17:42.402Z", + "image": "eeca89c5-5590-48b4-8409-86d79e27d7a4", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "699eed11-e91a-448e-bd3e-4216765aa80e", + "pk": "6127b926-41af-41aa-b7cb-d7ebda2e7876", "fields": { - "created": "2018-07-24T08:18:54.821Z", - "updated": "2018-07-24T08:18:54.821Z", - "image": "f298ee15-f126-44bc-ae22-459d18537e6f", + "created": "2018-07-30T09:17:42.397Z", + "updated": "2018-07-30T09:17:42.397Z", + "image": "52d09138-39d6-4eed-a559-335867348387", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "87869157-a183-4015-839b-9fce89cce4f0", + "pk": "714b9edc-9a90-4ff2-a898-e291dddf9ef3", "fields": { - "created": "2018-07-24T08:18:55.110Z", - "updated": "2018-07-24T08:18:55.110Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((0,0), (300,0), (300,300), (0,300), (0,0))" + "created": "2018-07-30T09:17:42.691Z", + "updated": "2018-07-30T09:17:42.691Z", + "image": "52d09138-39d6-4eed-a559-335867348387", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "8b777c07-2cf5-4b47-b407-a19dfc27fcc9", + "pk": "7b51bcec-ce5c-4121-a41b-4f29088b4a09", "fields": { - "created": "2018-07-24T08:18:55.113Z", - "updated": "2018-07-24T08:18:55.113Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" + "created": "2018-07-30T09:17:42.406Z", + "updated": "2018-07-30T09:17:42.406Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "9833b904-5e2f-4642-a399-9c862068c734", + "pk": "7d03474e-0dd9-4097-9cb7-1b7ca62ee493", "fields": { - "created": "2018-07-24T08:18:55.001Z", - "updated": "2018-07-24T08:18:55.002Z", - "image": "195299b4-da0c-4499-a67c-7f926e63116f", + "created": "2018-07-30T09:17:42.811Z", + "updated": "2018-07-30T09:17:42.811Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "a8159284-10b7-423b-a199-8fe2abe949c8", + "pk": "9226e888-2f7e-4a4d-a010-4048a66760fe", "fields": { - "created": "2018-07-24T08:18:54.815Z", - "updated": "2018-07-24T08:18:54.815Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2018-07-30T09:17:42.988Z", + "updated": "2018-07-30T09:17:42.988Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "af98c80b-e1b5-4b05-9771-d28e9e543c85", + "pk": "96d371e1-1c9f-441f-9eac-fc250f3d390d", "fields": { - "created": "2018-07-24T08:18:54.966Z", - "updated": "2018-07-24T08:18:54.966Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" + "created": "2018-07-30T09:17:42.777Z", + "updated": "2018-07-30T09:17:42.777Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "b01704a9-23ec-4a79-8ec3-476042697bb9", + "pk": "9e6df567-4969-471d-bd2c-1beeeab1fc35", "fields": { - "created": "2018-07-24T08:18:55.014Z", - "updated": "2018-07-24T08:18:55.014Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2018-07-30T09:17:42.933Z", + "updated": "2018-07-30T09:17:42.933Z", + "image": "52d09138-39d6-4eed-a559-335867348387", + "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" } }, { "model": "images.zone", - "pk": "b968bc1a-2c25-47e3-b49b-d6a05dc6d245", + "pk": "a1243f0d-5b49-411c-9119-b103fdd372ae", "fields": { - "created": "2018-07-24T08:18:55.101Z", - "updated": "2018-07-24T08:18:55.101Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" + "created": "2018-07-30T09:17:42.963Z", + "updated": "2018-07-30T09:17:42.963Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((0,0), (300,0), (300,300), (0,300), (0,0))" } }, { "model": "images.zone", - "pk": "c50126f5-682d-42ed-ab2d-f359717b81ad", + "pk": "b66aff77-3dc4-437c-b669-4934ee331baa", "fields": { - "created": "2018-07-24T08:18:55.027Z", - "updated": "2018-07-24T08:18:55.027Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2018-07-30T09:17:42.411Z", + "updated": "2018-07-30T09:17:42.411Z", + "image": "30bcbdf5-24f7-4cc1-9f54-00f4e892458f", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "c58b425e-1bdf-4c0d-860c-28e6793db75f", + "pk": "bc056616-4547-413a-a8f8-7f85f566f07b", "fields": { - "created": "2018-07-24T08:18:55.038Z", - "updated": "2018-07-24T08:18:55.038Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", + "created": "2018-07-30T09:17:42.713Z", + "updated": "2018-07-30T09:17:42.713Z", + "image": "52d09138-39d6-4eed-a559-335867348387", "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "cc592547-529e-4289-8351-53fe6a5cc55c", + "pk": "bc287bf4-d8a2-4c1d-8d6c-491088486298", "fields": { - "created": "2018-07-24T08:18:54.943Z", - "updated": "2018-07-24T08:18:54.943Z", - "image": "42d18a7a-65d9-4b52-b42a-ed0b6c07bceb", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2018-07-30T09:17:42.951Z", + "updated": "2018-07-30T09:17:42.951Z", + "image": "eeca89c5-5590-48b4-8409-86d79e27d7a4", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "d94e1f63-584d-423f-9d66-966362e413a5", + "pk": "bc875098-80dd-4d3c-8aeb-d079a273e341", "fields": { - "created": "2018-07-24T08:18:54.978Z", - "updated": "2018-07-24T08:18:54.978Z", - "image": "195299b4-da0c-4499-a67c-7f926e63116f", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2018-07-30T09:17:42.794Z", + "updated": "2018-07-30T09:17:42.794Z", + "image": "98ff90e3-f6d2-4b15-bd85-b97103f9b4b1", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "e5b7b231-2071-4521-a413-5cda61dcf909", + "pk": "e19edfae-88c5-4812-862f-1a030d2c0624", "fields": { - "created": "2018-07-24T08:18:55.116Z", - "updated": "2018-07-24T08:18:55.116Z", - "image": "c01f2ae6-abea-4a21-847f-6de9919cb91d", - "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" + "created": "2018-07-30T09:17:42.729Z", + "updated": "2018-07-30T09:17:42.729Z", + "image": "eeca89c5-5590-48b4-8409-86d79e27d7a4", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "ee7b9b2b-ee1d-49fc-8192-a03c16a03364", + "pk": "e25cf93b-bc98-43ac-88e5-bf3c872cd413", "fields": { - "created": "2018-07-24T08:18:55.107Z", - "updated": "2018-07-24T08:18:55.107Z", - "image": "195299b4-da0c-4499-a67c-7f926e63116f", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2018-07-30T09:17:42.761Z", + "updated": "2018-07-30T09:17:42.761Z", + "image": "eeca89c5-5590-48b4-8409-86d79e27d7a4", + "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "users.user", "pk": 1, "fields": { - "password": "pbkdf2_sha256$100000$DcHO7CYPnlU5$gFLvCPAoUpyDhb785RnLm/VsgHhB523vxLvxsbF7W6k=", + "password": "pbkdf2_sha256$100000$EPuMv7ohgMmG$WBgllhmA/xqYBCjGfkACPPmtKalnbRnH3zNHKF+DylU=", "last_login": null, "email": "root@root.fr", "is_active": true, @@ -1125,7 +954,7 @@ "model": "users.user", "pk": 2, "fields": { - "password": "pbkdf2_sha256$100000$shjhRsQTakNR$Zbsbhx//3bR0juLcxyJF0+jbUC1+1+U6DN6HznIqTBc=", + "password": "pbkdf2_sha256$100000$EgJT1QJ5QDl8$13zvdc3+DOFsHyiulNWAkIhsJkfgVMPboyr3zuohypU=", "last_login": null, "email": "user@user.fr", "is_active": true, diff --git a/arkindex/documents/management/commands/build_fixtures.py b/arkindex/documents/management/commands/build_fixtures.py index fc4251c577..fa23cae0b4 100644 --- a/arkindex/documents/management/commands/build_fixtures.py +++ b/arkindex/documents/management/commands/build_fixtures.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from django.core.management.base import BaseCommand -from arkindex.documents.models import Corpus, Element, ElementType, Page, PageDirection, PageType, Act, Transcription +from arkindex.documents.models import Corpus, Element, ElementType, Page, PageDirection, PageType, \ + Act, Transcription, TranscriptionType from arkindex.images.models import ImageServer, Image, Zone from arkindex.users.models import User @@ -79,12 +80,12 @@ class Command(BaseCommand): for page in (p1_1, p1_2, p1_3): for word, pos in [("PARIS", 100), ("ROY", 400), ("DATUM", 700)]: Transcription.objects.create( - corpus=corpus, + element=page, text=word, - type=ElementType.Word, + type=TranscriptionType.Word, zone=makezone(page.zone.image, pos, pos + 100), score=1.0, - ).add_parent(page) + ) # Create 5 acts on volume 1 act1 = Act.objects.create(corpus=corpus, name="Act 1", number="1", folio="1r") diff --git a/arkindex/documents/management/commands/reindex.py b/arkindex/documents/management/commands/reindex.py index 61d077b0d2..657c9e09c8 100644 --- a/arkindex/documents/management/commands/reindex.py +++ b/arkindex/documents/management/commands/reindex.py @@ -56,6 +56,8 @@ class Command(BaseCommand): if options['drop']: indexer.drop_index(settings.ES_INDEX_TRANSCRIPTIONS) if volume: + reindex_transcriptions(volume_id=volume.id) + return tasks.append(reindex_transcriptions.si(volume_id=volume.id)) else: tasks.append(reindex_transcriptions.si()) @@ -69,5 +71,5 @@ class Command(BaseCommand): else: tasks.append(reindex_acts.si()) - task = chain(*tasks).delay() + task = chain(*tasks).delay(async=False) print("Task started with ID {}".format(task.id)) diff --git a/arkindex/documents/migrations/0021_move_transcriptions.py b/arkindex/documents/migrations/0021_move_transcriptions.py new file mode 100644 index 0000000000..8dae447a23 --- /dev/null +++ b/arkindex/documents/migrations/0021_move_transcriptions.py @@ -0,0 +1,85 @@ +# Generated by Django 2.0 on 2018-07-09 10:19 + +import arkindex.documents.models +from django.db import migrations, models +import django.db.models.deletion +import enumfields.fields +import uuid + + +POPULATE_TRANSCRIPTIONS = ''' +insert into documents_transcriptionnew +(id, type, zone_id, score, text, element_id) +select e.id, e.type, e.zone_id, t.score, t.text, parent.id as element_id +from documents_element as e +inner join documents_transcription as t on (t.element_ptr_id = e.id) +inner join documents_elementpath as ep on (e.id = ep.element_id) +inner join documents_element as parent on (parent.id = ep.path[array_length(ep.path, 1)]) +''' + +REMOVE_PATHS = ''' +delete from documents_elementpath +where element_id in ( + select id from documents_element + where type in ('paragraph', 'line', 'word', 'character') +) +''' + +REMOVE_ELEMENTS = ''' +delete from documents_element +where type in ('paragraph', 'line', 'word', 'character') +''' + + +class Migration(migrations.Migration): + + dependencies = [ + ('images', '0005_zone_polygon_tmp'), + ('documents', '0020_metadata_revision'), + ] + + operations = [ + # Create new Transcription model + migrations.CreateModel( + name='TranscriptionNew', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('type', enumfields.fields.EnumField( + db_index=True, + default='word', + enum=arkindex.documents.models.TranscriptionType, + max_length=50, + )), + ('text', models.TextField(blank=True, null=True)), + ('score', models.FloatField(blank=True, null=True)), + ('element', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='transcriptions', + to='documents.Element', + )), + ('zone', models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name='transcriptions', + to='images.Zone', + )), + ], + ), + + # Populate it with raw sql data + migrations.RunSQL(POPULATE_TRANSCRIPTIONS, ''), + + # Remove old data + migrations.DeleteModel( + name='Transcription', + ), + migrations.RunSQL(REMOVE_PATHS, ''), + migrations.RunSQL(REMOVE_ELEMENTS, ''), + + # Replace original model + migrations.RenameModel( + old_name='TranscriptionNew', + new_name='Transcription', + ), + ] diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py index 957dd36f43..7731497c54 100644 --- a/arkindex/documents/models.py +++ b/arkindex/documents/models.py @@ -1,6 +1,5 @@ from django.db import models, transaction from django.contrib.postgres.indexes import GinIndex -from django.urls import reverse from enumfields import EnumField, Enum from arkindex.project.models import IndexableModel from arkindex.project.celery import app as celery_app @@ -33,10 +32,6 @@ class ElementType(Enum): Act = 'act' Page = 'page' Surface = 'surface' - Paragraph = 'paragraph' - Line = 'line' - Word = 'word' - Character = 'character' class ElementPath(models.Model): @@ -74,11 +69,6 @@ class Element(IndexableModel): objects = ElementManager() - def build_absolute_url(self, request, name, id_argument='pk', **kwargs): - """Build an absolute URL for a specified view using the element ID.""" - kwargs[id_argument] = str(self.id) - return request.build_absolute_uri(reverse(name, kwargs=kwargs)) - def get_thumbnail(self): """Get an Image instance corresponding to a thumbnail for this element.""" if self.type == ElementType.Volume: @@ -373,22 +363,46 @@ class Act(Element): 'type': t.type.value, 'score': t.score, 'text': t.text, - 'corpus': t.corpus_id, + 'corpus': self.corpus_id, } for sublist in transcriptions for t in sublist ] } -class Transcription(Element): +class TranscriptionType(Enum): + Paragraph = 'paragraph' + Line = 'line' + Word = 'word' + Character = 'character' + + +class Transcription(models.Model): """ A transcription on: * a zone on an image """ INDEX_TYPE = 'transcription' - # Data - line = models.PositiveIntegerField(null=True, blank=True) + id = models.UUIDField(default=uuid.uuid4, primary_key=True) + element = models.ForeignKey( + Element, + on_delete=models.CASCADE, + related_name='transcriptions', + ) + type = EnumField( + TranscriptionType, + default=TranscriptionType.Word, + max_length=50, + db_index=True, + ) + zone = models.ForeignKey( + 'images.Zone', + on_delete=models.SET_NULL, + related_name='transcriptions', + null=True, + blank=True, + ) text = models.TextField(null=True, blank=True) score = models.FloatField(null=True, blank=True) @@ -400,12 +414,11 @@ class Transcription(Element): Structure indexed into Elastic Search """ return { - 'id': self.id, # TODO: Could be removed? (can use _id instead) + 'element': self.element_id, 'type': self.type.value, 'score': self.score, - 'line': self.line, 'text': self.text, - 'corpus': self.corpus_id, + 'corpus': self.element.corpus_id, } diff --git a/arkindex/documents/search.py b/arkindex/documents/search.py index 5cdbcc2b97..bef33f326f 100644 --- a/arkindex/documents/search.py +++ b/arkindex/documents/search.py @@ -15,10 +15,10 @@ def search_transcriptions_post(data): .order_by('-score') \ .prefetch_related('zone__image__server') # Recompute in case some transcriptions are not found in Postgres - transcription_ids = [t.id for t in ts] + transcription_ids = [t.element_id for t in ts] all_parent_paths = Element.objects.get_ascendings_paths(*transcription_ids) for trans in ts: - trans.parent_paths = all_parent_paths.get(trans.id, []) + trans.parent_paths = all_parent_paths.get(trans.element_id, []) return ts @@ -60,7 +60,7 @@ def search_acts_post(data): all_parents = Element.objects.get_ascendings_paths(*act_ids) for act in acts: - act.transcriptions = [transcriptions[tid] for tid in acts_tr_ids[act.id]] + act.transcriptions_results = [transcriptions[tid] for tid in acts_tr_ids[act.id]] act.surfaces = [surf.zone for surf in all_surfaces.get(act.id, [])] act.parents = all_parents.get(act.id, []) diff --git a/arkindex/documents/serializers.py b/arkindex/documents/serializers.py index 567359b392..e90d42207b 100644 --- a/arkindex/documents/serializers.py +++ b/arkindex/documents/serializers.py @@ -1,16 +1,23 @@ from abc import ABC, abstractmethod from django.conf import settings from rest_framework import serializers -from arkindex.documents.models import \ - Element, ElementType, Transcription, Page, PageType, PageDirection, Act, Corpus, MetaData, MetaType +from arkindex.documents.models import Element, ElementType, Transcription, Page, \ + PageType, PageDirection, Act, Corpus, MetaData, MetaType, TranscriptionType from arkindex.images.models import Image, Zone from arkindex.images.serializers import ZoneSerializer, ImageSerializer from arkindex.dataimport.serializers import RevisionSerializer from arkindex.project.serializer_fields import EnumField, ViewerURLField from arkindex.project.tools import sslify_url +from django.urls import reverse import urllib.parse +def build_absolute_url(element, request, name, id_argument='pk', **kwargs): + """Build an absolute URL for a specified view using the element ID.""" + kwargs[id_argument] = str(element.id) + return request.build_absolute_uri(reverse(name, kwargs=kwargs)) + + class MetaDataSerializer(serializers.ModelSerializer): """ Serialises some Metadata for any Element @@ -43,7 +50,6 @@ class TranscriptionSerializer(serializers.ModelSerializer): 'id', 'type', 'text', - 'line', 'score', ) @@ -174,7 +180,7 @@ class TranscriptionCreateSerializer(serializers.Serializer): ) text = serializers.CharField() score = serializers.FloatField(min_value=0, max_value=1) - type = EnumField(ElementType) + type = EnumField(TranscriptionType) class TranscriptionBulkSerializer(serializers.Serializer): @@ -193,7 +199,7 @@ class TranscriptionBulkSerializer(serializers.Serializer): ) text = serializers.CharField() score = serializers.FloatField(min_value=0, max_value=1) - type = EnumField(ElementType) + type = EnumField(TranscriptionType) class TranscriptionsSerializer(serializers.Serializer): @@ -225,7 +231,6 @@ class TranscriptionSearchResultSerializer(serializers.ModelSerializer): 'id', 'type', 'text', - 'line', 'score', 'zone', 'parents', @@ -236,7 +241,7 @@ class ActSearchResultSerializer(serializers.ModelSerializer): """ Serialize an act """ - transcriptions = TranscriptionSerializer(many=True) + transcriptions = TranscriptionSerializer(many=True, source='transcriptions_results') surfaces = ZoneSerializer(many=True) parents = serializers.ListField( child=serializers.ListField( @@ -310,7 +315,7 @@ class ElementCanvasManifestSerializer(serializers.BaseSerializer): assert isinstance(zone, Zone) assert 'request' in self.context, "A request is required to generate absolute URLs" return { - "@id": element.build_absolute_url(self.context['request'], 'api:canvas-manifest'), + "@id": build_absolute_url(element, self.context['request'], 'api:canvas-manifest'), "@type": "sc:Canvas", "label": element.name, "height": zone.polygon.height, @@ -319,7 +324,7 @@ class ElementCanvasManifestSerializer(serializers.BaseSerializer): { "@type": "oa:Annotation", "resource": ImageResourceManifestSerializer(zone.image, context=self.context).data, - "on": element.build_absolute_url(self.context['request'], 'api:canvas-manifest'), + "on": build_absolute_url(element, self.context['request'], 'api:canvas-manifest'), "motivation": "sc:painting" } ], @@ -344,7 +349,7 @@ class PageCanvasManifestSerializer(ElementCanvasManifestSerializer): else ("api:page-act-manifest", "Actes") return [ { - "@id": page.build_absolute_url(self.context['request'], annotation_list_endpoint), + "@id": build_absolute_url(page, self.context['request'], annotation_list_endpoint), "@type": "sc:AnnotationList", "label": annotation_list_name } @@ -362,7 +367,7 @@ class ActPageCanvasManifestSerializer(PageCanvasManifestSerializer): suffix = '?' + urllib.parse.urlencode({'q': query}) if query else '' return [ { - "@id": surface.build_absolute_url(self.context['request'], 'api:surface-manifest') + suffix, + "@id": build_absolute_url(surface, self.context['request'], 'api:surface-manifest') + suffix, "@type": "sc:AnnotationList", "label": surface.name } @@ -393,7 +398,7 @@ class ManifestSerializer(serializers.BaseSerializer): ).data return { "@context": settings.IIIF_PRESENTATION_CONTEXT, - "@id": element.build_absolute_url(self.context['request'], self.id_url_name), + "@id": build_absolute_url(element, self.context['request'], self.id_url_name), "@type": "sc:Manifest", "thumbnail": ImageThumbnailManifestSerializer(element.get_thumbnail()).data, "related": [], @@ -403,7 +408,7 @@ class ManifestSerializer(serializers.BaseSerializer): { "canvases": canvases, "label": "", - "@id": element.build_absolute_url(self.context['request'], 'api:sequence-manifest'), + "@id": build_absolute_url(element, self.context['request'], 'api:sequence-manifest'), "@type": "sc:Sequence" } ], @@ -419,7 +424,7 @@ class ManifestSerializer(serializers.BaseSerializer): return [{ "viewingHint": "top", "label": element.name, - "@id": element.build_absolute_url(self.context['request'], self.id_url_name), + "@id": build_absolute_url(element, self.context['request'], self.id_url_name), "ranges": [c['@id'] for c in canvases], "@type": "sc:Range" }] + [ @@ -451,7 +456,7 @@ class VolumeManifestSerializer(ManifestSerializer): serialized['service'] = [] serialized['service'].append({ "@context": settings.IIIF_SEARCH_CONTEXT, - "@id": volume.build_absolute_url(self.context['request'], 'api:ts-search-manifest'), + "@id": build_absolute_url(volume, self.context['request'], 'api:ts-search-manifest'), "profile": settings.IIIF_SEARCH_SERVICE_PROFILE, "label": "Search transcriptions" }) @@ -502,12 +507,13 @@ class AnnotationSerializer(ABC, serializers.BaseSerializer): def get_target(self, element): """Get the target canvas (`on` property) for a given element.""" + assert hasattr(element, 'zone') return "{0}#xywh={1.x},{1.y},{1.width},{1.height}".format( element.zone.image.get_thumbnail_url(max_width=None, max_height=None), element.zone.polygon) def to_representation(self, element): - assert isinstance(element, Element) + assert isinstance(element, (Element, Transcription)) assert 'request' in self.context, "A request is required to generate absolute URLs" return { "@id": self.get_url(element), @@ -518,26 +524,19 @@ class AnnotationSerializer(ABC, serializers.BaseSerializer): } -class SearchResultAnnotationMixin(object): - - def get_target(self, element): - return "{0}#xywh={1.x},{1.y},{1.width},{1.height}".format( - Page.objects.filter( - zone__polygon__contains=element.zone.polygon, - zone__image_id=element.zone.image_id - ).first().build_absolute_url(self.context['request'], 'api:canvas-manifest'), - element.zone.polygon) - - class TranscriptionAnnotationSerializer(AnnotationSerializer): """ Serialize a transcription into a IIIF annotation """ def get_url(self, ts): - return ts.build_absolute_url( - self.context['request'], 'api:transcription-manifest', - id_argument='page_pk', transcription_pk=ts.id) + return build_absolute_url( + ts, + self.context['request'], + 'api:transcription-manifest', + id_argument='page_pk', + transcription_pk=ts.id, + ) def get_resource(self, ts): return { @@ -548,10 +547,12 @@ class TranscriptionAnnotationSerializer(AnnotationSerializer): } -class TranscriptionSearchAnnotationSerializer( - SearchResultAnnotationMixin, - TranscriptionAnnotationSerializer): - pass +class TranscriptionSearchAnnotationSerializer(TranscriptionAnnotationSerializer): + + def get_target(self, element): + assert isinstance(element, Transcription) + url = build_absolute_url(element.element, self.context['request'], 'api:canvas-manifest') + return "{0}#xywh={1.x},{1.y},{1.width},{1.height}".format(url, element.zone.polygon) class SurfaceAnnotationSerializer(AnnotationSerializer): @@ -560,9 +561,13 @@ class SurfaceAnnotationSerializer(AnnotationSerializer): """ def get_url(self, surface): - return surface.build_absolute_url( - self.context['request'], 'api:surface-manifest', - id_argument='page_pk', surface_pk=surface.id) + return build_absolute_url( + surface, + self.context['request'], + 'api:surface-manifest', + id_argument='page_pk', + surface_pk=surface.id, + ) def get_resource(self, surface): act = Act.objects.get_ascending(surface.id)[0] @@ -610,7 +615,7 @@ class PageAnnotationListSerializer(AnnotationListSerializer): def get_elements(self, page): assert isinstance(page, Page) - return Transcription.objects.get_descending(page.id) + return page.transcriptions.all() class PageActAnnotationListSerializer(AnnotationListSerializer): diff --git a/arkindex/documents/tasks.py b/arkindex/documents/tasks.py index 4eb694479b..9dd5929b3f 100644 --- a/arkindex/documents/tasks.py +++ b/arkindex/documents/tasks.py @@ -20,10 +20,10 @@ def reindex_acts(bulk_size=100, volume_id=None): Reindex all acts ''' indexer = Indexer() - if not volume_id: - acts = Act.objects.all() - else: + if volume_id: acts = Act.objects.get_descending(volume_id) + else: + acts = Act.objects.all() indexer.run_index(settings.ES_INDEX_ACTS, Act.INDEX_TYPE, acts, bulk_size=bulk_size) @@ -33,10 +33,13 @@ def reindex_transcriptions(bulk_size=400, volume_id=None): Reindex all transcriptions ''' indexer = Indexer() - if not volume_id: - transcriptions = Transcription.objects.all() + if volume_id: + # Lookup all the transcriptions linked to a volume + transcriptions = Transcription.objects.filter( + element__in=Element.objects.get_descending(volume_id) + ).distinct() else: - transcriptions = Transcription.objects.get_descending(volume_id) + transcriptions = Transcription.objects.all() indexer.run_index(settings.ES_INDEX_TRANSCRIPTIONS, Transcription.INDEX_TYPE, transcriptions, bulk_size=bulk_size) diff --git a/arkindex/documents/tests/test_search_post.py b/arkindex/documents/tests/test_search_post.py index 56f16d44b6..527c3cd0e0 100644 --- a/arkindex/documents/tests/test_search_post.py +++ b/arkindex/documents/tests/test_search_post.py @@ -32,12 +32,7 @@ class TestSearchPostProcess(FixtureTestCase): ], "_index": "transcriptions", "_type": Transcription.INDEX_TYPE, - "_source": { - "id": str(ts.id), - "line": ts.line, - "score": ts.score, - "text": ts.text - } + "_source": ts.build_search_index() } def make_nested_transcription_hit(self, ts): @@ -89,7 +84,7 @@ class TestSearchPostProcess(FixtureTestCase): self.assertCountEqual(results, [act]) self.assertTrue(hasattr(results[0], 'transcriptions')) self.assertTrue(hasattr(results[0], 'surfaces')) - self.assertCountEqual(results[0].transcriptions, ts) + self.assertCountEqual(results[0].transcriptions_results, ts) self.assertCountEqual(results[0].surfaces, [surf]) def test_search_transcriptions_filter_post(self): diff --git a/arkindex/documents/tests/test_transcription_create.py b/arkindex/documents/tests/test_transcription_create.py index b9b2c59d41..51dd2f1224 100644 --- a/arkindex/documents/tests/test_transcription_create.py +++ b/arkindex/documents/tests/test_transcription_create.py @@ -3,7 +3,7 @@ from unittest.mock import patch from rest_framework import status from arkindex.project.tests import FixtureAPITestCase from arkindex.project.polygon import Polygon -from arkindex.documents.models import Page, Transcription, ElementPath, ElementType +from arkindex.documents.models import Page, Transcription, TranscriptionType import uuid @@ -33,27 +33,12 @@ class TestTranscriptionCreate(FixtureAPITestCase): "score": 0.83, }) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - new_ts = Transcription.objects.get(text="NEKUDOTAYIM", type=ElementType.Word) + new_ts = Transcription.objects.get(text="NEKUDOTAYIM", type=TranscriptionType.Word) self.assertEqual(new_ts.zone.polygon, Polygon.from_coords(0, 0, 100, 100)) self.assertEqual(new_ts.score, 0.83) - self.assertEqual(ElementPath.objects.filter(element_id=new_ts.id).count(), 1) - self.assertIn(self.page.id, ElementPath.objects.get(element=new_ts).path) + self.assertTrue(self.page.transcriptions.filter(pk=new_ts.id).exists()) self.assertTrue(indexer.return_value.run_index.called) - def test_check_element_type(self): - """ - Checks the view does not let other element types to be created - """ - self.client.force_login(self.user) - response = self.client.post(reverse('api:transcription-create'), format='json', data={ - "type": "register", - "element": str(self.page.id), - "polygon": [(0, 0), (0, 100), (100, 100), (100, 0), (0, 0)], - "text": "NEKUDOTAYIM", - "score": 0.83, - }) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - def test_unique_zone(self): """ Checks the view reuses zones when available @@ -152,11 +137,10 @@ class TestTranscriptionCreate(FixtureAPITestCase): ] }) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - new_ts = Transcription.objects.get(text="NEKUDOTAYIM", type=ElementType.Word) + new_ts = Transcription.objects.get(text="NEKUDOTAYIM", type=TranscriptionType.Word) self.assertEqual(new_ts.zone.polygon, Polygon.from_coords(0, 0, 100, 100)) self.assertEqual(new_ts.score, 0.83) - self.assertEqual(ElementPath.objects.filter(element_id=new_ts.id).count(), 1) - self.assertIn(self.page.id, ElementPath.objects.get(element=new_ts).path) + self.assertTrue(self.page.transcriptions.filter(pk=new_ts.id).exists()) # indexer called self.assertTrue(indexer.return_value.run_index.called) diff --git a/arkindex/images/importer.py b/arkindex/images/importer.py index e1beba8d0c..7dc2610f19 100644 --- a/arkindex/images/importer.py +++ b/arkindex/images/importer.py @@ -1,5 +1,5 @@ from arkindex.images.models import Zone, Image -from arkindex.documents.models import Transcription, ElementType, Element, Page, ElementPath +from arkindex.documents.models import Transcription, TranscriptionType, Element, Page, ElementType from arkindex.project.polygon import Polygon from collections import namedtuple from abc import ABC, abstractmethod @@ -68,14 +68,13 @@ def bulk_transcriptions(image, parent, items): # Link a transcription data with a Polygon # This is hashable (box is hashable) - TrPolygon = namedtuple('TrPolygon', 'type, polygon, line, text, score') + TrPolygon = namedtuple('TrPolygon', 'type, polygon, text, score') # Build all TrPolygon from items required = { TrPolygon( - i.get('type', ElementType.Word), + i.get('type', TranscriptionType.Word), Polygon.from_dict(i), - int(i.get('line', 0)), i['text'], float(i['score']), ) @@ -93,11 +92,10 @@ def bulk_transcriptions(image, parent, items): TrPolygon( tr.type, tr.zone.polygon, - tr.line, tr.text, tr.score, ) - for tr in Transcription.objects.filter(zone__image=image).prefetch_related('zone') + for tr in parent.transcriptions.all().prefetch_related('zone') } # Calc needed TrPolygon to build @@ -105,61 +103,32 @@ def bulk_transcriptions(image, parent, items): if not needed: return [] - with transaction.atomic(): - - # Raw elements - elements = Element.objects.bulk_create( - Element( - corpus=parent.corpus, - type=n.type, - name=n.text, - zone_id=uuid.uuid4() - ) - for n in needed + def new_transcription(tr_polygon): + zone = Zone( + id=uuid.uuid4(), + image=image, + polygon=tr_polygon.polygon.serialize(), + ) + tr = Transcription( + element_id=parent.id, + zone_id=zone.id, + type=tr_polygon.type, + text=tr_polygon.text, + score=tr_polygon.score, ) + return (tr, zone) + + with transaction.atomic(): # Build transcriptions & zones instances at the same time - transcriptions, zones = zip(*[ - ( - Transcription( - element_ptr_id=elt.id, - line=n.line, - text=n.text, - score=n.score, - ), - Zone( - id=elt.zone_id, - image=image, - polygon=n.polygon.serialize(), - ) - ) - for elt, n in zip(elements, needed) - ]) + transcriptions, zones = zip(*map(new_transcription, needed)) # Create zones in bulk Zone.objects.bulk_create(zones) - # Create transcriptions using a low-level bulk_create - # as multi table is not supported yet by Django - Transcription.objects.none()._batched_insert( - transcriptions, - - # Here is the magic: we need only to insert the fields from documents_transcription - fields=set(Transcription._meta.concrete_fields).difference(Element._meta.concrete_fields), - - # Default - batch_size=None, - ) - - # Support ElementPath - paths = ElementPath.objects.filter(element=parent).values_list('path', flat=True) - if not paths: - paths = [[]] # Wonderful hack to handle no parents case - ElementPath.objects.bulk_create( - ElementPath(element=elt, path=[parent.id, ] + path) - for elt in elements - for path in paths - ) + # Create transcriptions in bulk + # with assigned ids + Transcription.objects.bulk_create(transcriptions) return transcriptions diff --git a/arkindex/images/tests.py b/arkindex/images/tests.py index 377508318d..ec84420e8f 100644 --- a/arkindex/images/tests.py +++ b/arkindex/images/tests.py @@ -1,6 +1,6 @@ from arkindex.project.tests import FixtureTestCase from arkindex.project.polygon import Polygon -from arkindex.documents.models import Transcription, Element, ElementType +from arkindex.documents.models import Transcription, TranscriptionType from arkindex.images.models import Image from arkindex.images.importer import bulk_transcriptions @@ -21,7 +21,6 @@ class TestBulkTranscriptions(FixtureTestCase): 'y': 0, 'width': 100, 'height': 100, - 'line': '1', 'text': 'test 1', 'score': 0.1, }, @@ -30,23 +29,20 @@ class TestBulkTranscriptions(FixtureTestCase): 'y': 20, 'width': 100, 'height': 100, - 'line': '2', 'text': 'test 2', 'score': 0.2, }, ] bulk_transcriptions(self.img, self.page, items) - out = Transcription.objects.filter(zone__image=self.img).order_by('line') + out = Transcription.objects.filter(zone__image=self.img).order_by('score') self.assertEqual(len(out), 2) self.assertIsInstance(out[0], Transcription) self.assertIsInstance(out[1], Transcription) - self.assertEqual(out[0].line, 1) self.assertEqual(out[0].text, 'test 1') self.assertEqual(out[0].score, 0.1) - self.assertEqual(out[1].line, 2) self.assertEqual(out[1].text, 'test 2') self.assertEqual(out[1].score, 0.2) @@ -57,7 +53,7 @@ class TestBulkTranscriptions(FixtureTestCase): self.assertEqual(out[1].zone.polygon, Polygon.from_coords(20, 20, 100, 100)) # Check path - children = Element.objects.get_descending(self.page.id) + children = self.page.transcriptions.all() self.assertEqual(children.count(), 2) ids = children.values_list('id', flat=True) self.assertIn(out[0].id, ids) @@ -71,7 +67,6 @@ class TestBulkTranscriptions(FixtureTestCase): 'y': 0, 'width': 100, 'height': 100, - 'line': '1', 'text': 'test 1', 'score': 0.1, }, @@ -80,7 +75,6 @@ class TestBulkTranscriptions(FixtureTestCase): 'y': 20, 'width': 100, 'height': 100, - 'line': '2', 'text': 'test 2', 'score': 0.2, }, @@ -94,35 +88,31 @@ class TestBulkTranscriptions(FixtureTestCase): items = [ { 'polygon': [[0, 0], [0, 200], [200, 200], [200, 0], [250, 50], [0, 0]], - 'line': '1', 'text': 'test 1', 'score': 0.1, - 'type': ElementType.Word, + 'type': TranscriptionType.Word, }, { 'polygon': [[0, 0], [100, 0], [100, 100], [0, 100], [0, 0]], - 'line': '2', 'text': 'test 2', 'score': 0.2, - 'type': ElementType.Line, + 'type': TranscriptionType.Line, }, ] out = bulk_transcriptions(self.img, self.page, items) self.assertEqual(len(out), 2) - trs = Transcription.objects.filter(zone__image=self.img).order_by('line') + trs = Transcription.objects.filter(zone__image=self.img).order_by('score') self.assertEqual(trs.count(), 2) self.assertIsInstance(trs[0], Transcription) self.assertIsInstance(trs[1], Transcription) - self.assertEqual(trs[0].type, ElementType.Word) - self.assertEqual(trs[0].line, 1) + self.assertEqual(trs[0].type, TranscriptionType.Word) self.assertEqual(trs[0].text, 'test 1') self.assertEqual(trs[0].score, 0.1) - self.assertEqual(trs[1].type, ElementType.Line) - self.assertEqual(trs[1].line, 2) + self.assertEqual(trs[1].type, TranscriptionType.Line) self.assertEqual(trs[1].text, 'test 2') self.assertEqual(trs[1].score, 0.2) -- GitLab