diff --git a/README.md b/README.md index 53b7eb4ab562026f7ae17da2fdfb9ec3ebfc1684..bea7f5901075405c6be33d566a0853a7bcad35aa 100644 --- a/README.md +++ b/README.md @@ -79,12 +79,11 @@ Note that this local server will only work inside Docker. ### User groups -Two groups have a special meaning in Arkindex: The `Demo` group, for demo users, and the `Internal` group, for special users whose tokens are used by workers. Those groups are configured using the `INTERNAL_GROUP_ID` and `DEMO_GROUP_ID` settings. The development server will show warnings but let you start the server anyway if the group aren't there; you will be able to access the Django admin and create the groups from there. To create them using the shell: +One group has a special meaning in Arkindex: The `Internal` group, for special users whose tokens are used by workers. This groups is configured using the `INTERNAL_GROUP_ID` setting. The development server will show warnings but let you start the server anyway if the group isn't there; you will be able to access the Django admin and create the group from there. To create them using the shell: ``` backend/arkindex$ ./manage.py shell >>> from django.contrib.auth.models import Group ->>> Group.objects.create(id=1, name='Demo') >>> Group.objects.create(id=2, name='Internal') ``` diff --git a/arkindex/dataimport/api.py b/arkindex/dataimport/api.py index 75444192de9d3771e1875ef8b7437a5905e9a3d7..8cb7d3424849ff6d13d9e542d938e8e481c8ae21 100644 --- a/arkindex/dataimport/api.py +++ b/arkindex/dataimport/api.py @@ -1,4 +1,4 @@ -from django.db.models import Sum, Max +from django.db.models import Max from django.http.response import Http404 from django.shortcuts import get_object_or_404 from django.core.exceptions import PermissionDenied @@ -241,53 +241,6 @@ class CorpusWorkflow(CreateAPIView): ) -class DataImportDemo(CorpusACLMixin, CreateAPIView): - """ - Create, configure and start an Images workflow from a single DataFile - """ - - permission_classes = (IsAuthenticated, ) - serializer_class = DataImportSerializer - - def create(self, request, pk=None, **kwargs): - - # Get Datafile - corpora = Corpus.objects.writable(self.request.user) - datafile = get_object_or_404(DataFile, corpus__in=corpora, id=pk) - - # Get volume, defaults to demo one - volume_id = self.request.query_params.get('volume') - filters = { - 'corpus': datafile.corpus, - 'type': ElementType.Volume, - } - if volume_id: - filters['id'] = volume_id - else: - filters['name'] = 'Demo' - - volume = get_object_or_404(Element, **filters) - - assert self.has_write_access(volume.corpus), 'Corpus is not writable' - - import_mode = DataImportMode.PDF if datafile.content_type == 'application/pdf' else DataImportMode.Images - - # Start the import - dataimport = datafile.corpus.imports.create( - creator=self.request.user, - mode=import_mode, - payload={ - 'volume_id': str(volume.id), - 'folder_name': 'user-{}-demo'.format(self.request.user.id), - 'ml_tools': settings.DEMO_ML_TOOLS, - }, - ) - dataimport.files.add(datafile) - dataimport.start() - - return Response(data=self.get_serializer(dataimport).data, status=status.HTTP_201_CREATED) - - class DataFileList(CorpusACLMixin, ListAPIView): """ List uploaded files @@ -341,11 +294,6 @@ class DataFileUpload(CorpusACLMixin, APIView): file_obj = request.FILES['file'] - if self.request.user.groups.filter(name="Demo").exists() and \ - corpus.files.exists() and \ - corpus.files.aggregate(Sum('size'))['size__sum'] + file_obj.size > settings.DEMO_FILES_LIMIT: - raise ValidationError("Corpus total file size limit exceeded") - md5hash = hashlib.md5() for chunk in file_obj.chunks(): md5hash.update(chunk) diff --git a/arkindex/dataimport/tests/test_files.py b/arkindex/dataimport/tests/test_files.py index 59ea50f20101b11d3a5b5de139549b9629545e04..d90dad18693c6867f16247754c44c73b9409db54 100644 --- a/arkindex/dataimport/tests/test_files.py +++ b/arkindex/dataimport/tests/test_files.py @@ -8,11 +8,10 @@ from arkindex.dataimport.models import DataFile from arkindex.images.models import ImageServer from arkindex.project.tests import FixtureAPITestCase from arkindex.project.aws import S3FileStatus -from arkindex.users.models import User import uuid -@override_settings(DEMO_GROUP_ID=2, AWS_STAGING_BUCKET='staging') +@override_settings(AWS_STAGING_BUCKET='staging') class TestFiles(FixtureAPITestCase): """ Test file management @@ -21,8 +20,6 @@ class TestFiles(FixtureAPITestCase): @classmethod def setUpTestData(cls): super().setUpTestData() - cls.demo_user = User.objects.get(email='demo@demo.fr') - cls.demo_user.corpus_right.create(corpus=cls.corpus, can_write=True) cls.df = DataFile.objects.create( name='test.txt', size=42, @@ -169,16 +166,3 @@ class TestFiles(FixtureAPITestCase): self.assertEqual(s3_mock.Object.call_count, 1) self.assertEqual(s3_mock.Object().upload_fileobj.call_count, 1) - - def test_file_upload_demo_limit(self): - """ - Assert a file upload fails for demo users when its size exceeds the corpus limit - """ - self.client.force_login(self.demo_user) - # Create a file one byte under the allowed size - DataFile.objects.create( - name='image.jpg', size=52428799, hash='bbbb', content_type='text/plain', corpus=self.corpus) - # Another file of more than one byte in size - f = SimpleUploadedFile('test.txt', b'This is a text file') - response = self.client.post(reverse('api:file-upload', kwargs={'pk': self.corpus.id}), data={'file': f}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) diff --git a/arkindex/dataimport/tests/test_imports.py b/arkindex/dataimport/tests/test_imports.py index d3d2addc0d4e10b7b1ae4cb7633c0a0652b835e2..854292a7829e35cc193627a0f787c743b6e8c1ec 100644 --- a/arkindex/dataimport/tests/test_imports.py +++ b/arkindex/dataimport/tests/test_imports.py @@ -4,7 +4,7 @@ from rest_framework import status from arkindex_common.ml_tool import MLToolType from arkindex_common.enums import DataImportMode, DataImportPDFEngine from arkindex.dataimport.models import DataImport, DataFile -from arkindex.documents.models import Element, ElementType, Corpus +from arkindex.documents.models import Element, Corpus from arkindex.project.tests import FixtureAPITestCase from ponos.models import State import uuid @@ -21,11 +21,6 @@ class TestImports(FixtureAPITestCase): cls.creds = cls.user.credentials.get() cls.repo = cls.creds.repos.get() cls.rev = cls.repo.revisions.get() - cls.demo_volume = cls.corpus.elements.create( - type=ElementType.Volume, - new_type=cls.corpus.himanis_volume, - name='Demo', - ) cls.img_df = DataFile.objects.create( name='test.jpg', size=42, hash='aaaa', content_type='image/jpg', corpus=cls.corpus) cls.pdf_df = DataFile.objects.create( @@ -132,48 +127,6 @@ class TestImports(FixtureAPITestCase): data = response.json() self.assertEqual(data['id'], str(self.dataimport.id)) - def test_start_demo_requires_login(self): - response = self.client.post(reverse('api:import-demo', kwargs={'pk': self.img_df.id})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - @patch('arkindex_common.ml_tool.MLTool.get') - def test_start_demo(self, ml_get_mock): - classifier_mock, recognizer_mock = MagicMock(), MagicMock() - classifier_mock.slug = 'someclassifier' - recognizer_mock.slug = 'somerecognizer' - classifier_mock.get_task_recipe.return_value = {'image': 'some_image1', 'command': 'some_command1'} - recognizer_mock.get_task_recipe.return_value = {'image': 'some_image2', 'command': 'some_command2'} - ml_get_mock.side_effect = [classifier_mock, recognizer_mock] * 2 - self.client.force_login(self.user) - - with self.settings( - ML_CLASSIFIERS_DIR='/somewhere', - DEMO_ML_TOOLS=[ - {'type': 'classifier', 'slug': 'someclassifier'}, - {'type': 'recognizer', 'slug': 'somerecognizer'}, - ]): - response = self.client.post(reverse('api:import-demo', kwargs={'pk': self.img_df.id})) - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - data = response.json() - dataimport = DataImport.objects.get(id=data['id']) - self.assertEqual(dataimport.mode, DataImportMode.Images) - self.assertEqual(dataimport.workflow.state, State.Unscheduled) - self.assertListEqual(list(dataimport.files.all()), [self.img_df]) - self.assertDictEqual(dataimport.payload, { - 'volume_id': str(self.demo_volume.id), - 'folder_name': 'user-{}-demo'.format(self.user.id), - 'ml_tools': [ - {'type': 'classifier', 'slug': 'someclassifier'}, - {'type': 'recognizer', 'slug': 'somerecognizer'}, - ], - }) - self.assertEqual(ml_get_mock.call_count, 2) - self.assertListEqual(ml_get_mock.call_args_list, [ - call('/somewhere', MLToolType.Classifier, 'someclassifier'), - call('/somewhere', MLToolType.Recognizer, 'somerecognizer'), - ]) - def test_retry_requires_login(self): response = self.client.post(reverse('api:import-retry', kwargs={'pk': self.dataimport.id})) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) @@ -336,19 +289,20 @@ class TestImports(FixtureAPITestCase): def test_from_files_volume_id(self): self.client.force_login(self.user) + volume = self.corpus.elements.get(name='Volume 1') response = self.client.post( reverse('api:import-from-files'), { 'files': [str(self.pdf_df.id)], 'mode': 'pdf', - 'volume_id': str(self.demo_volume.id), + 'volume_id': str(volume.id), }, format='json', ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) data = response.json() dataimport = DataImport.objects.get(id=data['id']) - self.assertEqual(dataimport.payload['volume_id'], str(self.demo_volume.id)) + self.assertEqual(dataimport.payload['volume_id'], str(volume.id)) def test_from_files_volume_name(self): self.client.force_login(self.user) diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index fd4ad74c8e8f4008658ae4fdf0079cad91611726..326e72c2934b6cebc0a6164d3a44f0ddaad2416a 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -1,22 +1,22 @@ [ { "model": "dataimport.repository", - "pk": "8e75109a-2d56-408d-acaa-1dae53c591e8", + "pk": "a970f92a-d3aa-4226-b542-d676876d9398", "fields": { "url": "http://gitlab/repo", "hook_token": "hook-token", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "credentials": "63b9b740-aa84-4067-96bc-6d335ae02f0f", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "credentials": "864eaa71-394c-4a11-9c22-e43ac32a6fa1", "provider_name": "GitLabProvider" } }, { "model": "dataimport.revision", - "pk": "7edef340-736b-4e60-85f1-1ee63d33eca0", + "pk": "13b7f26e-4e50-464f-8d1f-e4c124bb35e4", "fields": { - "created": "2019-10-10T07:40:05.963Z", - "updated": "2019-10-10T07:40:05.963Z", - "repo": "8e75109a-2d56-408d-acaa-1dae53c591e8", + "created": "2019-10-10T13:51:52.497Z", + "updated": "2019-10-10T13:51:52.497Z", + "repo": "a970f92a-d3aa-4226-b542-d676876d9398", "hash": "42", "ref": "refs/heads/master", "message": "a", @@ -25,7 +25,7 @@ }, { "model": "documents.corpus", - "pk": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "pk": "8b2a738e-58da-4ea9-ae07-308d4600b313", "fields": { "name": "Unit Tests", "description": "", @@ -34,20 +34,20 @@ }, { "model": "documents.elementnewtype", - "pk": "2b867824-3982-49ab-9be7-b5e0daa2aec2", + "pk": "2653d07a-cd06-43d1-a52b-f56626e45d10", "fields": { - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "slug": "act", - "display_name": "Act", - "folder": false, + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "slug": "volume", + "display_name": "Volume", + "folder": true, "hidden": false } }, { "model": "documents.elementnewtype", - "pk": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", + "pk": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", "fields": { - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "slug": "page", "display_name": "Page", "folder": false, @@ -56,429 +56,429 @@ }, { "model": "documents.elementnewtype", - "pk": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", + "pk": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", "fields": { - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "slug": "surface", - "display_name": "Surface", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "slug": "act", + "display_name": "Act", "folder": false, - "hidden": true + "hidden": false } }, { "model": "documents.elementnewtype", - "pk": "e73d72d8-40fc-43e5-a61d-33bb8c65e565", + "pk": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", "fields": { - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "slug": "volume", - "display_name": "Volume", - "folder": true, - "hidden": false + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "slug": "surface", + "display_name": "Surface", + "folder": false, + "hidden": true } }, { "model": "documents.elementpath", - "pk": "0f3c9849-1250-4f6b-ae21-77d4f0218409", + "pk": "06f2d9b8-b35a-4b57-87a5-7e3265d91712", "fields": { - "element": "a1ea12fd-797b-4740-bb16-7e1007ba2c1f", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", + "element": "ccd0f568-2398-4ebe-98db-e2e881a97e87", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "16e838d5-1b88-41f0-bc04-04a7d35ad9b4", + "pk": "0878b7ef-e100-4c0a-9281-bd47367fa745", "fields": { - "element": "1574d1f3-c377-4c61-96ec-32eec29b7c72", - "path": "[\"cad2d9c0-b58c-4f6e-96e8-e69fb1125d03\"]", + "element": "f5d5860f-6549-421c-beeb-1a273ac9eab6", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"f733721a-a62f-4b3d-acf5-bebe36a2a83b\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "197f43e2-eb04-4247-bf40-e779a562000c", + "pk": "0e72adf3-2241-468d-b52c-3f74b81d257f", "fields": { - "element": "a9f496cb-ebf8-4ff3-b3ea-516dd29b8989", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", - "ordering": 4 + "element": "70db5a2d-ee0d-43fa-80d5-45c7f304e831", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"ccd0f568-2398-4ebe-98db-e2e881a97e87\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "19a03aa8-de3f-44c4-a3e5-a3be1f2adc36", + "pk": "17a28c7c-862d-4539-88f2-9f92f9525952", "fields": { - "element": "103fd0ec-3edf-458f-ba32-d7d9da387234", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"a9f496cb-ebf8-4ff3-b3ea-516dd29b8989\"]", - "ordering": 0 + "element": "56efc721-430c-4093-9a6a-06c8403582bb", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "61d44478-f66e-4642-9e29-f09ee05d4cc7", + "pk": "25b1ec5a-77f0-4385-bd9a-3d1ce5c3e7cc", "fields": { - "element": "47041a98-fcf6-4f1c-8335-c3864fd65470", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", - "ordering": 0 + "element": "25a8a0d3-4336-433d-a177-3723f8317cec", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "673be758-0fd9-4160-9b1d-3bbde5ff52ee", + "pk": "4b6a0b04-9318-461d-8c63-23b80764c1ab", "fields": { - "element": "9e23d130-d290-43bc-abf0-94b4031b9f4e", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", - "ordering": 1 + "element": "533ed99e-4143-4336-826e-690d2e19d704", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"56efc721-430c-4093-9a6a-06c8403582bb\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "6eb7e16a-6e67-45f2-802c-646d4f6c7cf7", + "pk": "542048b0-5fd6-4956-8c2e-1acbeb816d82", "fields": { - "element": "11728319-9a14-4932-8921-b73a89f51aa0", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", - "ordering": 3 + "element": "f733721a-a62f-4b3d-acf5-bebe36a2a83b", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", + "ordering": 4 } }, { "model": "documents.elementpath", - "pk": "75681750-a119-4c32-9412-2ec255f9a5f1", + "pk": "56e4b067-7293-482c-88e9-266fdf70678e", "fields": { - "element": "9606c234-8592-4643-8b8f-c53a81f4cf29", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"a1ea12fd-797b-4740-bb16-7e1007ba2c1f\"]", - "ordering": 0 + "element": "fc59eb28-d05a-4c4e-ad4a-c264440ea09e", + "path": "[\"7b001406-144e-4d0b-a9f0-8481ba92a036\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "7d083e8e-f813-4470-82a2-6ba01e84c95a", + "pk": "7dd2bebc-3c84-4afe-a7dc-a220e0ef4861", "fields": { - "element": "8e6aaa07-5a48-45c9-a112-52bca4900d10", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", + "element": "473a52e5-fd1c-41c3-b4b9-1f519bbab5dc", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "a1f7b5fb-2afb-41e2-87f1-bbe30dca8681", + "pk": "849da55e-9339-445c-9277-dc12cb5bd072", "fields": { - "element": "dc66d3a0-a17b-4a2a-a081-bab43ddfab92", - "path": "[\"cad2d9c0-b58c-4f6e-96e8-e69fb1125d03\"]", - "ordering": 2 + "element": "a0d53457-3ba5-4b2c-a394-783f96def8a2", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "a339c5ae-07d7-4cfc-b151-5d98922f9833", + "pk": "85766043-a8e3-49ed-83a4-bebd8fa3d6c0", "fields": { - "element": "60161357-74cc-4f3d-94ff-164e9017fcd0", - "path": "[\"cad2d9c0-b58c-4f6e-96e8-e69fb1125d03\"]", - "ordering": 1 + "element": "d8144dad-387e-495d-a1be-82bf432896c4", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"473a52e5-fd1c-41c3-b4b9-1f519bbab5dc\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "ad805965-0b41-421e-ba29-cf7c53207933", + "pk": "b1a33979-2528-4a59-b4ec-425c31f9ad3b", "fields": { - "element": "a23cd241-3555-4f92-a589-f36c8381bb84", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"8e6aaa07-5a48-45c9-a112-52bca4900d10\"]", + "element": "430007cf-d72d-436f-bcf3-dec67abf9622", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"51bcf16f-17db-4e46-9855-0c6b8f9387df\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "b0897041-e41f-4626-85fc-f2acf70dbf70", + "pk": "b527b997-0279-410d-b9a2-401b5c665670", "fields": { - "element": "d651379a-bcba-4bfc-b569-ae9b08657dfd", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", + "element": "99ecbf86-2def-4f49-8f89-eb90dac8f2cd", + "path": "[\"7b001406-144e-4d0b-a9f0-8481ba92a036\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "c46b90f5-6794-4af2-9eb3-9065ca0d17c5", + "pk": "d0861c4f-1b59-49f3-8654-9da7a16bb621", "fields": { - "element": "3ccc3aea-a276-4fa8-bab7-d050ecbe456a", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"47041a98-fcf6-4f1c-8335-c3864fd65470\"]", + "element": "51bcf16f-17db-4e46-9855-0c6b8f9387df", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "c5877ee2-d76f-42da-87b8-32ca0dbeaca2", + "pk": "f363d45e-e56b-4b31-9197-5cfd4468c1ba", "fields": { - "element": "08d2415d-6943-4e5e-9434-a876e10dfbbb", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"11728319-9a14-4932-8921-b73a89f51aa0\"]", - "ordering": 0 + "element": "94cff6b9-cfcc-49cb-8a5b-079875822cb2", + "path": "[\"7b001406-144e-4d0b-a9f0-8481ba92a036\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "fc6bc183-a2f0-41e1-92e4-fbd2830c61cb", + "pk": "f80c13ca-0f0d-4d57-a6af-2d1d9352f484", "fields": { - "element": "443ea887-8ab2-491b-bd8f-1ce1bb30ccd3", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\", \"a1ea12fd-797b-4740-bb16-7e1007ba2c1f\"]", - "ordering": 1 + "element": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "ff6a31e1-a729-4f29-97a7-deb93e67eae5", + "pk": "fa998d45-2835-4dc6-b834-ec2f055655da", "fields": { - "element": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", - "path": "[\"79a54840-74c1-4047-9e64-a28740741c6d\"]", - "ordering": 2 + "element": "baeead47-ca72-41a5-b752-2a08f02da0e5", + "path": "[\"12489680-5e6b-4576-8f26-cd432c90d31c\", \"ccd0f568-2398-4ebe-98db-e2e881a97e87\"]", + "ordering": 0 } }, { "model": "documents.element", - "pk": "08d2415d-6943-4e5e-9434-a876e10dfbbb", + "pk": "12489680-5e6b-4576-8f26-cd432c90d31c", "fields": { - "created": "2019-10-10T07:40:05.913Z", - "updated": "2019-10-10T07:40:05.913Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", - "name": "Surface E", - "zone": "e9e62a07-a15c-4aee-b1b8-094d563c1fe4" + "created": "2019-10-10T13:51:52.264Z", + "updated": "2019-10-10T13:51:52.264Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "volume", + "new_type": "2653d07a-cd06-43d1-a52b-f56626e45d10", + "name": "Volume 1", + "zone": null } }, { "model": "documents.element", - "pk": "103fd0ec-3edf-458f-ba32-d7d9da387234", + "pk": "25a8a0d3-4336-433d-a177-3723f8317cec", "fields": { - "created": "2019-10-10T07:40:05.915Z", - "updated": "2019-10-10T07:40:05.915Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.269Z", + "updated": "2019-10-10T13:51:52.269Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "page", + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", + "name": "Volume 1, page 2r", + "zone": "3ee8f69b-0a96-42fa-bab9-533cccf76432" + } +}, +{ + "model": "documents.element", + "pk": "430007cf-d72d-436f-bcf3-dec67abf9622", + "fields": { + "created": "2019-10-10T13:51:52.438Z", + "updated": "2019-10-10T13:51:52.439Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", - "name": "Surface F", - "zone": "81b398af-b60d-42e7-89a0-d734d081ddae" + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", + "name": "Surface A", + "zone": "533e2907-4cc6-43cb-a10d-74fe9f53aecf" } }, { "model": "documents.element", - "pk": "11728319-9a14-4932-8921-b73a89f51aa0", + "pk": "473a52e5-fd1c-41c3-b4b9-1f519bbab5dc", "fields": { - "created": "2019-10-10T07:40:05.842Z", - "updated": "2019-10-10T07:40:05.842Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.371Z", + "updated": "2019-10-10T13:51:52.371Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "act", - "new_type": "2b867824-3982-49ab-9be7-b5e0daa2aec2", - "name": "Act 4", + "new_type": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", + "name": "Act 3", "zone": null } }, { "model": "documents.element", - "pk": "1574d1f3-c377-4c61-96ec-32eec29b7c72", + "pk": "51bcf16f-17db-4e46-9855-0c6b8f9387df", "fields": { - "created": "2019-10-10T07:40:05.782Z", - "updated": "2019-10-10T07:40:05.782Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", - "name": "Volume 2, page 1r", - "zone": "b905e286-e1b1-4664-be53-f1bda517489d" + "created": "2019-10-10T13:51:52.370Z", + "updated": "2019-10-10T13:51:52.370Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "act", + "new_type": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", + "name": "Act 1", + "zone": null } }, { "model": "documents.element", - "pk": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", + "pk": "533ed99e-4143-4336-826e-690d2e19d704", "fields": { - "created": "2019-10-10T07:40:05.740Z", - "updated": "2019-10-10T07:40:05.740Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", - "name": "Volume 1, page 2r", - "zone": "29b7a5a2-2a02-4087-a1b7-d920c8428f47" + "created": "2019-10-10T13:51:52.446Z", + "updated": "2019-10-10T13:51:52.446Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "surface", + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", + "name": "Surface E", + "zone": "9fa227fa-ab53-41d6-9ac9-e46b9a081147" } }, { "model": "documents.element", - "pk": "3ccc3aea-a276-4fa8-bab7-d050ecbe456a", + "pk": "56efc721-430c-4093-9a6a-06c8403582bb", "fields": { - "created": "2019-10-10T07:40:05.906Z", - "updated": "2019-10-10T07:40:05.906Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", - "name": "Surface A", - "zone": "5b67f6a4-8038-406e-9d40-9ebeb72ea386" + "created": "2019-10-10T13:51:52.372Z", + "updated": "2019-10-10T13:51:52.372Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "act", + "new_type": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", + "name": "Act 4", + "zone": null } }, { "model": "documents.element", - "pk": "443ea887-8ab2-491b-bd8f-1ce1bb30ccd3", + "pk": "70db5a2d-ee0d-43fa-80d5-45c7f304e831", "fields": { - "created": "2019-10-10T07:40:05.910Z", - "updated": "2019-10-10T07:40:05.910Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.442Z", + "updated": "2019-10-10T13:51:52.442Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", "name": "Surface C", - "zone": "7e78c443-8b33-4655-adea-489a7bfad241" + "zone": "c7f77b49-692f-41ab-bca7-6dafec0df800" } }, { "model": "documents.element", - "pk": "47041a98-fcf6-4f1c-8335-c3864fd65470", + "pk": "7b001406-144e-4d0b-a9f0-8481ba92a036", "fields": { - "created": "2019-10-10T07:40:05.839Z", - "updated": "2019-10-10T07:40:05.839Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "act", - "new_type": "2b867824-3982-49ab-9be7-b5e0daa2aec2", - "name": "Act 1", + "created": "2019-10-10T13:51:52.265Z", + "updated": "2019-10-10T13:51:52.266Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "volume", + "new_type": "2653d07a-cd06-43d1-a52b-f56626e45d10", + "name": "Volume 2", "zone": null } }, { "model": "documents.element", - "pk": "60161357-74cc-4f3d-94ff-164e9017fcd0", + "pk": "94cff6b9-cfcc-49cb-8a5b-079875822cb2", "fields": { - "created": "2019-10-10T07:40:05.783Z", - "updated": "2019-10-10T07:40:05.783Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.312Z", + "updated": "2019-10-10T13:51:52.312Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", "name": "Volume 2, page 1v", - "zone": "7f9486f2-77fa-4fed-8806-2d98cadf95dd" + "zone": "050cf616-e41e-4471-b8a8-d94a21b1981f" } }, { "model": "documents.element", - "pk": "79a54840-74c1-4047-9e64-a28740741c6d", + "pk": "99ecbf86-2def-4f49-8f89-eb90dac8f2cd", "fields": { - "created": "2019-10-10T07:40:05.734Z", - "updated": "2019-10-10T07:40:05.734Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "volume", - "new_type": "e73d72d8-40fc-43e5-a61d-33bb8c65e565", - "name": "Volume 1", - "zone": null + "created": "2019-10-10T13:51:52.311Z", + "updated": "2019-10-10T13:51:52.311Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "page", + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", + "name": "Volume 2, page 1r", + "zone": "1bd04db8-1165-438f-9616-de20c3d1539b" } }, { "model": "documents.element", - "pk": "8e6aaa07-5a48-45c9-a112-52bca4900d10", + "pk": "a0d53457-3ba5-4b2c-a394-783f96def8a2", "fields": { - "created": "2019-10-10T07:40:05.841Z", - "updated": "2019-10-10T07:40:05.841Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "act", - "new_type": "2b867824-3982-49ab-9be7-b5e0daa2aec2", - "name": "Act 3", - "zone": null + "created": "2019-10-10T13:51:52.268Z", + "updated": "2019-10-10T13:51:52.268Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "page", + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", + "name": "Volume 1, page 1v", + "zone": "9d3020e8-9ec5-4229-a825-7b9a325f2499" } }, { "model": "documents.element", - "pk": "9606c234-8592-4643-8b8f-c53a81f4cf29", + "pk": "baeead47-ca72-41a5-b752-2a08f02da0e5", "fields": { - "created": "2019-10-10T07:40:05.908Z", - "updated": "2019-10-10T07:40:05.908Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.440Z", + "updated": "2019-10-10T13:51:52.440Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", "name": "Surface B", - "zone": "d9c4b25e-6a1e-48ca-a06c-826d528a20f6" + "zone": "10845be1-818b-412a-a544-319ab0072c86" } }, { "model": "documents.element", - "pk": "9e23d130-d290-43bc-abf0-94b4031b9f4e", + "pk": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", "fields": { - "created": "2019-10-10T07:40:05.739Z", - "updated": "2019-10-10T07:40:05.739Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.267Z", + "updated": "2019-10-10T13:51:52.267Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", - "name": "Volume 1, page 1v", - "zone": "a27df6df-8f8c-432f-917c-a43b312d6f10" + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", + "name": "Volume 1, page 1r", + "zone": "0c3eeb62-2902-4d50-9939-4350c3ad2bce" } }, { "model": "documents.element", - "pk": "a1ea12fd-797b-4740-bb16-7e1007ba2c1f", + "pk": "ccd0f568-2398-4ebe-98db-e2e881a97e87", "fields": { - "created": "2019-10-10T07:40:05.840Z", - "updated": "2019-10-10T07:40:05.840Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.370Z", + "updated": "2019-10-10T13:51:52.370Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "act", - "new_type": "2b867824-3982-49ab-9be7-b5e0daa2aec2", + "new_type": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", "name": "Act 2", "zone": null } }, { "model": "documents.element", - "pk": "a23cd241-3555-4f92-a589-f36c8381bb84", + "pk": "d8144dad-387e-495d-a1be-82bf432896c4", "fields": { - "created": "2019-10-10T07:40:05.911Z", - "updated": "2019-10-10T07:40:05.911Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.444Z", + "updated": "2019-10-10T13:51:52.444Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "surface", - "new_type": "da8f4d60-5e07-407b-bdb3-c0fad7bc69c1", + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", "name": "Surface D", - "zone": "c2cf121c-b619-449f-84f7-5b4a08a24718" + "zone": "c85cdbea-9d12-440e-ad88-26a5bacc409d" } }, { "model": "documents.element", - "pk": "a9f496cb-ebf8-4ff3-b3ea-516dd29b8989", + "pk": "f5d5860f-6549-421c-beeb-1a273ac9eab6", "fields": { - "created": "2019-10-10T07:40:05.843Z", - "updated": "2019-10-10T07:40:05.843Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "act", - "new_type": "2b867824-3982-49ab-9be7-b5e0daa2aec2", - "name": "Act 5", - "zone": null + "created": "2019-10-10T13:51:52.447Z", + "updated": "2019-10-10T13:51:52.447Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "surface", + "new_type": "fd7d9092-6e2b-4f72-add6-b8e8848d098b", + "name": "Surface F", + "zone": "6513c839-7ac7-4a22-a772-8e31660fe7aa" } }, { "model": "documents.element", - "pk": "cad2d9c0-b58c-4f6e-96e8-e69fb1125d03", + "pk": "f733721a-a62f-4b3d-acf5-bebe36a2a83b", "fields": { - "created": "2019-10-10T07:40:05.736Z", - "updated": "2019-10-10T07:40:05.736Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "volume", - "new_type": "e73d72d8-40fc-43e5-a61d-33bb8c65e565", - "name": "Volume 2", + "created": "2019-10-10T13:51:52.373Z", + "updated": "2019-10-10T13:51:52.373Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", + "type": "act", + "new_type": "f521a0cc-fa9a-4315-80cd-6a15ee03ee4c", + "name": "Act 5", "zone": null } }, { "model": "documents.element", - "pk": "d651379a-bcba-4bfc-b569-ae9b08657dfd", + "pk": "fc59eb28-d05a-4c4e-ad4a-c264440ea09e", "fields": { - "created": "2019-10-10T07:40:05.737Z", - "updated": "2019-10-10T07:40:05.737Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "created": "2019-10-10T13:51:52.313Z", + "updated": "2019-10-10T13:51:52.313Z", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", - "name": "Volume 1, page 1r", - "zone": "66040bb8-b8dc-4f28-891f-04d1e9e0ebcc" - } -}, -{ - "model": "documents.element", - "pk": "dc66d3a0-a17b-4a2a-a081-bab43ddfab92", - "fields": { - "created": "2019-10-10T07:40:05.784Z", - "updated": "2019-10-10T07:40:05.784Z", - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", - "type": "page", - "new_type": "34c4f115-9ee1-4c08-9c9c-23063bf4b72e", + "new_type": "9fda56f0-3597-40db-a4c7-ea9ece7ef833", "name": "Volume 2, page 2r", - "zone": "1c1faa35-6419-4a5b-930e-bf367dd41a1f" + "zone": "01262094-d82a-410d-b0ba-22f3133ae206" } }, { "model": "documents.datasource", - "pk": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", + "pk": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", "fields": { "type": "recognizer", "slug": "test", @@ -489,120 +489,120 @@ }, { "model": "documents.transcription", - "pk": "2625c040-063b-4c68-98d0-a2367fb2f9c7", + "pk": "01d3a60c-2159-4967-8de5-2bb18ad51ef3", "fields": { - "element": "9e23d130-d290-43bc-abf0-94b4031b9f4e", + "element": "25a8a0d3-4336-433d-a177-3723f8317cec", "type": "word", - "zone": "cd1fefd3-21f2-42ab-9192-7a9acbe37e41", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "ROY", + "zone": "468e770e-5d1c-4388-b743-dfcea7090f34", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "6684b8cf-d86e-4c36-9e8d-da7597ae2a1a", + "pk": "0a82cd8b-e73a-4bf0-9dc2-3879724fe6a1", "fields": { - "element": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", + "element": "a0d53457-3ba5-4b2c-a394-783f96def8a2", "type": "word", - "zone": "ec0fdf3f-34d4-4dd1-9850-d28dbdf09b46", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "PARIS", + "zone": "b7104abf-b865-4f51-96cf-e97056c6f23d", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "67b57abc-c5c6-4f41-95c9-fff1d21ed1a4", + "pk": "1acab671-24f1-4f9b-9a15-1a9e3eea31a9", "fields": { - "element": "9e23d130-d290-43bc-abf0-94b4031b9f4e", + "element": "25a8a0d3-4336-433d-a177-3723f8317cec", "type": "word", - "zone": "91beabb9-5e15-4f83-8ed1-aceb7cd7e5a3", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", + "zone": "8025c8a4-96aa-41ee-9129-5cd26dd28f80", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "a8770f12-5614-4ac1-9b95-5696334bb7b8", + "pk": "39a4c73a-6b90-4e11-8a32-0b52880ccd49", "fields": { - "element": "d651379a-bcba-4bfc-b569-ae9b08657dfd", + "element": "a0d53457-3ba5-4b2c-a394-783f96def8a2", "type": "word", - "zone": "4236d58b-b58c-42dd-aaf6-24321c84ec77", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "DATUM", + "zone": "e3cf5630-f35d-4103-87f8-99e914641e66", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "af544987-a320-4cab-8353-5ca032882e2a", + "pk": "44ad18b7-4a65-4411-ab32-b37356fe7ae6", "fields": { - "element": "d651379a-bcba-4bfc-b569-ae9b08657dfd", + "element": "a0d53457-3ba5-4b2c-a394-783f96def8a2", "type": "word", - "zone": "2e8c737b-bbdd-425e-922b-ce5ce8e5131c", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "ROY", + "zone": "b071ffe2-330a-4b02-abb5-d93b127ff437", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "e68bb1e9-6508-471e-babb-f13f84f9fa08", + "pk": "99ec1f90-fbbc-4cd7-a778-521224724c54", "fields": { - "element": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", + "element": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", "type": "word", - "zone": "9e93836b-0cfc-4b81-aff4-c9b5c588a77b", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "ROY", + "zone": "3fafe032-16a9-46ff-a18e-2781d4710e28", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "f3302460-b3c6-4605-88b3-b93368409b8d", + "pk": "9ca5598d-f99b-4bed-bd28-605d8c10dc71", "fields": { - "element": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", + "element": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", "type": "word", - "zone": "2e5d6231-d059-4e0f-ab49-aeebebbe3840", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "DATUM", + "zone": "4dd4d158-e63d-4aa7-943a-d3201eb07b08", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "f45a1d70-17f1-413d-9884-bf9e249bd0f6", + "pk": "bd36334c-9a6f-4e1f-8220-8c7b6e884483", "fields": { - "element": "9e23d130-d290-43bc-abf0-94b4031b9f4e", + "element": "25a8a0d3-4336-433d-a177-3723f8317cec", "type": "word", - "zone": "fa353f3d-8603-4472-8527-af2c51cbc6b7", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "DATUM", + "zone": "b362f834-e05e-4aaa-bb33-2a35cf474587", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "fe41c848-8691-449a-8478-6d942e112f36", + "pk": "c2d39042-ca36-4908-80ce-7e8cf99d7fec", "fields": { - "element": "d651379a-bcba-4bfc-b569-ae9b08657dfd", + "element": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", "type": "word", - "zone": "f27c52af-95b1-4f4d-b585-f0ba8b22cd0c", - "source": "ba2cab77-772c-4ac1-8e12-945a39bf3be7", - "text": "PARIS", + "zone": "65f0dbed-daae-44b6-9a20-ec1eeeb4eb1b", + "source": "92a32b45-04f2-4a24-b7b8-b04a17ea87fc", + "text": "ROY", "score": 1.0 } }, { "model": "documents.metadata", - "pk": "1a785084-00e4-40ef-8f6d-ba6e5d5ef2f4", + "pk": "096a120e-9a26-4a5f-9fb4-d32d322e9ff4", "fields": { - "element": "11728319-9a14-4932-8921-b73a89f51aa0", + "element": "51bcf16f-17db-4e46-9855-0c6b8f9387df", "name": "number", "type": "text", - "value": "4", + "value": "1", "revision": null, "index": 0, "entity": null @@ -610,12 +610,12 @@ }, { "model": "documents.metadata", - "pk": "1ba5d6b8-6d93-4de9-b3ec-9f1cc8b33c6a", + "pk": "357eefa3-fa8e-485b-bd00-becb413f8105", "fields": { - "element": "9e23d130-d290-43bc-abf0-94b4031b9f4e", - "name": "folio", + "element": "56efc721-430c-4093-9a6a-06c8403582bb", + "name": "number", "type": "text", - "value": "1v", + "value": "4", "revision": null, "index": 0, "entity": null @@ -623,12 +623,12 @@ }, { "model": "documents.metadata", - "pk": "71c797db-c26b-429f-8814-23d195e4a865", + "pk": "4e0646a2-266b-4611-b7c7-0d919ffcaa0c", "fields": { - "element": "8e6aaa07-5a48-45c9-a112-52bca4900d10", - "name": "number", + "element": "fc59eb28-d05a-4c4e-ad4a-c264440ea09e", + "name": "folio", "type": "text", - "value": "3", + "value": "2r", "revision": null, "index": 0, "entity": null @@ -636,12 +636,12 @@ }, { "model": "documents.metadata", - "pk": "b178dc73-1ee3-479f-a1bb-9015cd389ae2", + "pk": "63b0ef8b-8a8f-4095-80ca-4e01af3aadb4", "fields": { - "element": "d651379a-bcba-4bfc-b569-ae9b08657dfd", + "element": "25a8a0d3-4336-433d-a177-3723f8317cec", "name": "folio", "type": "text", - "value": "1r", + "value": "2r", "revision": null, "index": 0, "entity": null @@ -649,12 +649,12 @@ }, { "model": "documents.metadata", - "pk": "c32b2188-18c9-44f4-b03c-78e44f4887e7", + "pk": "6602c2ba-a0b4-4cf8-b574-ac782817f524", "fields": { - "element": "a9f496cb-ebf8-4ff3-b3ea-516dd29b8989", - "name": "number", + "element": "99ecbf86-2def-4f49-8f89-eb90dac8f2cd", + "name": "folio", "type": "text", - "value": "5", + "value": "1r", "revision": null, "index": 0, "entity": null @@ -662,12 +662,12 @@ }, { "model": "documents.metadata", - "pk": "c7c1c35f-66b6-4676-add0-d503b3284a89", + "pk": "6935c976-723d-4202-85c1-651b278f37be", "fields": { - "element": "1574d1f3-c377-4c61-96ec-32eec29b7c72", - "name": "folio", + "element": "ccd0f568-2398-4ebe-98db-e2e881a97e87", + "name": "number", "type": "text", - "value": "1r", + "value": "2", "revision": null, "index": 0, "entity": null @@ -675,12 +675,12 @@ }, { "model": "documents.metadata", - "pk": "d9dce97c-fa79-49f9-8d0c-60aa808768ce", + "pk": "71decc96-47c4-4577-8546-d5039e3f31ac", "fields": { - "element": "47041a98-fcf6-4f1c-8335-c3864fd65470", - "name": "number", + "element": "94cff6b9-cfcc-49cb-8a5b-079875822cb2", + "name": "folio", "type": "text", - "value": "1", + "value": "1v", "revision": null, "index": 0, "entity": null @@ -688,12 +688,12 @@ }, { "model": "documents.metadata", - "pk": "dbc38d48-5971-47df-ae76-ee0e2923f5f1", + "pk": "8a4960d8-685f-4a87-bc38-873b1db7556b", "fields": { - "element": "dc66d3a0-a17b-4a2a-a081-bab43ddfab92", + "element": "a0d53457-3ba5-4b2c-a394-783f96def8a2", "name": "folio", "type": "text", - "value": "2r", + "value": "1v", "revision": null, "index": 0, "entity": null @@ -701,12 +701,12 @@ }, { "model": "documents.metadata", - "pk": "e22e2af0-83d1-4094-aa66-c57122f12243", + "pk": "ba6fce00-dc16-4c2a-92bf-1fb4ee861c08", "fields": { - "element": "a1ea12fd-797b-4740-bb16-7e1007ba2c1f", + "element": "473a52e5-fd1c-41c3-b4b9-1f519bbab5dc", "name": "number", "type": "text", - "value": "2", + "value": "3", "revision": null, "index": 0, "entity": null @@ -714,12 +714,12 @@ }, { "model": "documents.metadata", - "pk": "e4d44b1a-36ff-4d9f-b5a3-71de05eb98ba", + "pk": "bfaa00a4-0cf3-478d-8a76-99ccd2c529fc", "fields": { - "element": "60161357-74cc-4f3d-94ff-164e9017fcd0", + "element": "c22c59a9-d30c-48e3-b12a-7612f4aa4793", "name": "folio", "type": "text", - "value": "1v", + "value": "1r", "revision": null, "index": 0, "entity": null @@ -727,12 +727,12 @@ }, { "model": "documents.metadata", - "pk": "f53273f6-efc8-4e6c-a511-3c9d9dcd0117", + "pk": "f718ec26-ce61-44a8-ba4c-e4c3ba49ae7c", "fields": { - "element": "21954ad6-81b8-40e7-bbd4-8eae3eaab5ed", - "name": "folio", + "element": "f733721a-a62f-4b3d-acf5-bebe36a2a83b", + "name": "number", "type": "text", - "value": "2r", + "value": "5", "revision": null, "index": 0, "entity": null @@ -746,21 +746,21 @@ "url": "http://server", "s3_bucket": "iiif", "s3_region": null, - "created": "2019-10-10T07:40:05.468Z", - "updated": "2019-10-10T07:40:05.468Z", + "created": "2019-10-10T13:51:52.004Z", + "updated": "2019-10-10T13:51:52.004Z", "validated": false, "read_only": false } }, { "model": "images.image", - "pk": "0ac62750-47da-4fb4-8259-23c23f64b0b2", + "pk": "37d7745b-790c-4264-8e5f-756de43a4828", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.472Z", - "updated": "2019-10-10T07:40:05.472Z", + "created": "2019-10-10T13:51:52.012Z", + "updated": "2019-10-10T13:51:52.012Z", "server": 1, - "path": "img2", + "path": "img6", "width": 1000, "height": 1000, "datafile": null, @@ -769,13 +769,13 @@ }, { "model": "images.image", - "pk": "1f4f1268-5bee-4435-8c43-c7b00d84c8d8", + "pk": "68370b5c-3243-4bc3-93d6-e76e5eb1f9b2", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.476Z", - "updated": "2019-10-10T07:40:05.476Z", + "created": "2019-10-10T13:51:52.010Z", + "updated": "2019-10-10T13:51:52.010Z", "server": 1, - "path": "img6", + "path": "img4", "width": 1000, "height": 1000, "datafile": null, @@ -784,13 +784,13 @@ }, { "model": "images.image", - "pk": "5fb141e9-c6af-4822-921a-cec28f43d486", + "pk": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.475Z", - "updated": "2019-10-10T07:40:05.475Z", + "created": "2019-10-10T13:51:52.008Z", + "updated": "2019-10-10T13:51:52.008Z", "server": 1, - "path": "img5", + "path": "img2", "width": 1000, "height": 1000, "datafile": null, @@ -799,13 +799,13 @@ }, { "model": "images.image", - "pk": "641d02db-29e1-46a2-bed5-8746126b978c", + "pk": "bb09c19b-b5f0-4ed2-bb5f-2fcffa9a86c4", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.474Z", - "updated": "2019-10-10T07:40:05.474Z", + "created": "2019-10-10T13:51:52.011Z", + "updated": "2019-10-10T13:51:52.011Z", "server": 1, - "path": "img4", + "path": "img5", "width": 1000, "height": 1000, "datafile": null, @@ -814,13 +814,13 @@ }, { "model": "images.image", - "pk": "b1763b26-4c92-432b-a3ad-08bc3515e707", + "pk": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.470Z", - "updated": "2019-10-10T07:40:05.470Z", + "created": "2019-10-10T13:51:52.009Z", + "updated": "2019-10-10T13:51:52.009Z", "server": 1, - "path": "img1", + "path": "img3", "width": 1000, "height": 1000, "datafile": null, @@ -829,13 +829,13 @@ }, { "model": "images.image", - "pk": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", + "pk": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", "fields": { "status": "unchecked", - "created": "2019-10-10T07:40:05.473Z", - "updated": "2019-10-10T07:40:05.473Z", + "created": "2019-10-10T13:51:52.006Z", + "updated": "2019-10-10T13:51:52.006Z", "server": 1, - "path": "img3", + "path": "img1", "width": 1000, "height": 1000, "datafile": null, @@ -844,212 +844,212 @@ }, { "model": "images.zone", - "pk": "1c1faa35-6419-4a5b-930e-bf367dd41a1f", + "pk": "01262094-d82a-410d-b0ba-22f3133ae206", "fields": { - "created": "2019-10-10T07:40:05.482Z", - "updated": "2019-10-10T07:40:05.482Z", - "image": "1f4f1268-5bee-4435-8c43-c7b00d84c8d8", + "created": "2019-10-10T13:51:52.018Z", + "updated": "2019-10-10T13:51:52.018Z", + "image": "37d7745b-790c-4264-8e5f-756de43a4828", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "29b7a5a2-2a02-4087-a1b7-d920c8428f47", + "pk": "050cf616-e41e-4471-b8a8-d94a21b1981f", "fields": { - "created": "2019-10-10T07:40:05.479Z", - "updated": "2019-10-10T07:40:05.479Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", + "created": "2019-10-10T13:51:52.017Z", + "updated": "2019-10-10T13:51:52.017Z", + "image": "bb09c19b-b5f0-4ed2-bb5f-2fcffa9a86c4", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "2e5d6231-d059-4e0f-ab49-aeebebbe3840", + "pk": "0c3eeb62-2902-4d50-9939-4350c3ad2bce", "fields": { - "created": "2019-10-10T07:40:05.838Z", - "updated": "2019-10-10T07:40:05.838Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", - "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" + "created": "2019-10-10T13:51:52.013Z", + "updated": "2019-10-10T13:51:52.013Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "2e8c737b-bbdd-425e-922b-ce5ce8e5131c", + "pk": "10845be1-818b-412a-a544-319ab0072c86", "fields": { - "created": "2019-10-10T07:40:05.825Z", - "updated": "2019-10-10T07:40:05.825Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2019-10-10T13:51:52.439Z", + "updated": "2019-10-10T13:51:52.439Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", + "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "4236d58b-b58c-42dd-aaf6-24321c84ec77", + "pk": "1bd04db8-1165-438f-9616-de20c3d1539b", "fields": { - "created": "2019-10-10T07:40:05.827Z", - "updated": "2019-10-10T07:40:05.827Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" + "created": "2019-10-10T13:51:52.016Z", + "updated": "2019-10-10T13:51:52.016Z", + "image": "68370b5c-3243-4bc3-93d6-e76e5eb1f9b2", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "5b67f6a4-8038-406e-9d40-9ebeb72ea386", + "pk": "3ee8f69b-0a96-42fa-bab9-533cccf76432", "fields": { - "created": "2019-10-10T07:40:05.906Z", - "updated": "2019-10-10T07:40:05.906Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" + "created": "2019-10-10T13:51:52.016Z", + "updated": "2019-10-10T13:51:52.016Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "66040bb8-b8dc-4f28-891f-04d1e9e0ebcc", + "pk": "3fafe032-16a9-46ff-a18e-2781d4710e28", "fields": { - "created": "2019-10-10T07:40:05.477Z", - "updated": "2019-10-10T07:40:05.477Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-10-10T13:51:52.357Z", + "updated": "2019-10-10T13:51:52.357Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", + "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "7e78c443-8b33-4655-adea-489a7bfad241", + "pk": "468e770e-5d1c-4388-b743-dfcea7090f34", "fields": { - "created": "2019-10-10T07:40:05.909Z", - "updated": "2019-10-10T07:40:05.909Z", - "image": "0ac62750-47da-4fb4-8259-23c23f64b0b2", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-10-10T13:51:52.368Z", + "updated": "2019-10-10T13:51:52.368Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "7f9486f2-77fa-4fed-8806-2d98cadf95dd", + "pk": "4dd4d158-e63d-4aa7-943a-d3201eb07b08", "fields": { - "created": "2019-10-10T07:40:05.481Z", - "updated": "2019-10-10T07:40:05.481Z", - "image": "5fb141e9-c6af-4822-921a-cec28f43d486", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-10-10T13:51:52.352Z", + "updated": "2019-10-10T13:51:52.353Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "81b398af-b60d-42e7-89a0-d734d081ddae", + "pk": "533e2907-4cc6-43cb-a10d-74fe9f53aecf", "fields": { - "created": "2019-10-10T07:40:05.914Z", - "updated": "2019-10-10T07:40:05.914Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", - "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" + "created": "2019-10-10T13:51:52.438Z", + "updated": "2019-10-10T13:51:52.438Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", + "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" } }, { "model": "images.zone", - "pk": "91beabb9-5e15-4f83-8ed1-aceb7cd7e5a3", + "pk": "6513c839-7ac7-4a22-a772-8e31660fe7aa", "fields": { - "created": "2019-10-10T07:40:05.829Z", - "updated": "2019-10-10T07:40:05.829Z", - "image": "0ac62750-47da-4fb4-8259-23c23f64b0b2", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-10-10T13:51:52.446Z", + "updated": "2019-10-10T13:51:52.446Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "9e93836b-0cfc-4b81-aff4-c9b5c588a77b", + "pk": "65f0dbed-daae-44b6-9a20-ec1eeeb4eb1b", "fields": { - "created": "2019-10-10T07:40:05.836Z", - "updated": "2019-10-10T07:40:05.836Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", + "created": "2019-10-10T13:51:52.355Z", + "updated": "2019-10-10T13:51:52.355Z", + "image": "ece91a54-bbf5-49eb-8122-f7d3d7d825d7", "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "a27df6df-8f8c-432f-917c-a43b312d6f10", + "pk": "8025c8a4-96aa-41ee-9129-5cd26dd28f80", "fields": { - "created": "2019-10-10T07:40:05.478Z", - "updated": "2019-10-10T07:40:05.478Z", - "image": "0ac62750-47da-4fb4-8259-23c23f64b0b2", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-10-10T13:51:52.364Z", + "updated": "2019-10-10T13:51:52.364Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "b905e286-e1b1-4664-be53-f1bda517489d", + "pk": "9d3020e8-9ec5-4229-a825-7b9a325f2499", "fields": { - "created": "2019-10-10T07:40:05.480Z", - "updated": "2019-10-10T07:40:05.480Z", - "image": "641d02db-29e1-46a2-bed5-8746126b978c", + "created": "2019-10-10T13:51:52.015Z", + "updated": "2019-10-10T13:51:52.015Z", + "image": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "c2cf121c-b619-449f-84f7-5b4a08a24718", + "pk": "9fa227fa-ab53-41d6-9ac9-e46b9a081147", "fields": { - "created": "2019-10-10T07:40:05.910Z", - "updated": "2019-10-10T07:40:05.910Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", - "polygon": "Polygon((0,0), (300,0), (300,300), (0,300), (0,0))" + "created": "2019-10-10T13:51:52.445Z", + "updated": "2019-10-10T13:51:52.445Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" } }, { "model": "images.zone", - "pk": "cd1fefd3-21f2-42ab-9192-7a9acbe37e41", + "pk": "b071ffe2-330a-4b02-abb5-d93b127ff437", "fields": { - "created": "2019-10-10T07:40:05.831Z", - "updated": "2019-10-10T07:40:05.831Z", - "image": "0ac62750-47da-4fb4-8259-23c23f64b0b2", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2019-10-10T13:51:52.363Z", + "updated": "2019-10-10T13:51:52.363Z", + "image": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", + "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "d9c4b25e-6a1e-48ca-a06c-826d528a20f6", + "pk": "b362f834-e05e-4aaa-bb33-2a35cf474587", "fields": { - "created": "2019-10-10T07:40:05.907Z", - "updated": "2019-10-10T07:40:05.907Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" + "created": "2019-10-10T13:51:52.366Z", + "updated": "2019-10-10T13:51:52.366Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "e9e62a07-a15c-4aee-b1b8-094d563c1fe4", + "pk": "b7104abf-b865-4f51-96cf-e97056c6f23d", "fields": { - "created": "2019-10-10T07:40:05.912Z", - "updated": "2019-10-10T07:40:05.912Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", - "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" + "created": "2019-10-10T13:51:52.361Z", + "updated": "2019-10-10T13:51:52.361Z", + "image": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "ec0fdf3f-34d4-4dd1-9850-d28dbdf09b46", + "pk": "c7f77b49-692f-41ab-bca7-6dafec0df800", "fields": { - "created": "2019-10-10T07:40:05.835Z", - "updated": "2019-10-10T07:40:05.835Z", - "image": "d1c8e1fd-2092-46ba-b6b7-bfe06c2e38cd", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-10-10T13:51:52.441Z", + "updated": "2019-10-10T13:51:52.441Z", + "image": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "f27c52af-95b1-4f4d-b585-f0ba8b22cd0c", + "pk": "c85cdbea-9d12-440e-ad88-26a5bacc409d", "fields": { - "created": "2019-10-10T07:40:05.823Z", - "updated": "2019-10-10T07:40:05.823Z", - "image": "b1763b26-4c92-432b-a3ad-08bc3515e707", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-10-10T13:51:52.443Z", + "updated": "2019-10-10T13:51:52.443Z", + "image": "c4e0ea85-d855-465f-8234-7333f8c2d6ea", + "polygon": "Polygon((0,0), (300,0), (300,300), (0,300), (0,0))" } }, { "model": "images.zone", - "pk": "fa353f3d-8603-4472-8527-af2c51cbc6b7", + "pk": "e3cf5630-f35d-4103-87f8-99e914641e66", "fields": { - "created": "2019-10-10T07:40:05.833Z", - "updated": "2019-10-10T07:40:05.833Z", - "image": "0ac62750-47da-4fb4-8259-23c23f64b0b2", - "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" + "created": "2019-10-10T13:51:52.359Z", + "updated": "2019-10-10T13:51:52.359Z", + "image": "bafa33ea-a53c-4b42-aae6-55a5b21f31ab", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { @@ -2404,7 +2404,7 @@ "model": "users.user", "pk": 1, "fields": { - "password": "pbkdf2_sha256$150000$UZV1KJC3tyBl$Gm72iZ6CQubtSn3A/kkadiJtOeNFNyTxvyoMSEYpt38=", + "password": "pbkdf2_sha256$150000$scEUthXzgpgB$lO4YIa9OfwA4+KosQYJHzSsTw1+f7jj3Z96LF7H/zqI=", "last_login": null, "email": "root@root.fr", "is_active": true, @@ -2417,7 +2417,7 @@ "model": "users.user", "pk": 2, "fields": { - "password": "pbkdf2_sha256$150000$ysUICBgyChgG$LYExCXOxn6ac73kZ/QbGgSD8d8U0oFF2983eyyeOFxY=", + "password": "pbkdf2_sha256$150000$N1LQxipdLh2v$1oR8ze1lNfJuKcS5XhLgeb5xGqFgdIvdD/54qVd8fgM=", "last_login": null, "email": "user@user.fr", "is_active": true, @@ -2426,24 +2426,9 @@ "groups": [] } }, -{ - "model": "users.user", - "pk": 3, - "fields": { - "password": "!Di9xZ9oTAZUT8hnB7e7N4vyj7alIC6dd7PMkAf0l", - "last_login": null, - "email": "demo@demo.fr", - "is_active": true, - "is_admin": false, - "verified_email": false, - "groups": [ - 1 - ] - } -}, { "model": "users.oauthcredentials", - "pk": "63b9b740-aa84-4067-96bc-6d335ae02f0f", + "pk": "864eaa71-394c-4a11-9c22-e43ac32a6fa1", "fields": { "user": 2, "provider_name": "gitlab", @@ -2460,7 +2445,7 @@ "pk": 1, "fields": { "user": 2, - "corpus": "5cc1ffca-df94-4f98-ab4c-803eb8d3c73f", + "corpus": "8b2a738e-58da-4ea9-ae07-308d4600b313", "can_write": true, "can_admin": true } diff --git a/arkindex/documents/management/commands/build_fixtures.py b/arkindex/documents/management/commands/build_fixtures.py index a0dd55756f3471a1b3df2056da51e2c3fa07594a..2913287df50ac65030a48eb2ac6399003a8c1a3c 100644 --- a/arkindex/documents/management/commands/build_fixtures.py +++ b/arkindex/documents/management/commands/build_fixtures.py @@ -42,12 +42,11 @@ class Command(BaseCommand): z5 = makezone(img5, 0, 1000) z6 = makezone(img6, 0, 1000) - # Create internal and demo user groups - # They may have already been created by users.0002_default_groups - Group.objects.get_or_create(id=1, name='Demo') + # Create internal user group + # It may have already been created by users.0002_default_groups Group.objects.get_or_create(id=2, name='Internal') - # Create an admin, a user and a demo user + # Create an admin and a normal user superuser = User.objects.create_superuser('root@root.fr', 'Pa$$w0rd') superuser.verified_email = True superuser.save() @@ -56,8 +55,6 @@ class Command(BaseCommand): user.verified_email = True user.save() - User.objects.create_demo_user('demo@demo.fr') - # Create 1 data source for transcriptions source = DataSource.objects.create( type=MLToolType.Recognizer, diff --git a/arkindex/documents/tests/test_elements_api.py b/arkindex/documents/tests/test_elements_api.py index f82900b1fd9d107196d486d6cf9890dbe4b4ae94..e21a5176daf2fb9bae8ec437d7e2313f353cc77a 100644 --- a/arkindex/documents/tests/test_elements_api.py +++ b/arkindex/documents/tests/test_elements_api.py @@ -91,7 +91,7 @@ class TestElementsAPI(FixtureAPITestCase): """ Check patching an element with an unverified email is not possible """ - user = User.objects.get_by_natural_key('demo@demo.fr') + user = User.objects.create_user('nope@nope.fr') self.assertFalse(user.verified_email) self.client.force_login(user) diff --git a/arkindex/project/api_v1.py b/arkindex/project/api_v1.py index d7ef1fcbcebf1682778d7c4f18abd3abbb83d42c..c603abe59d6cb77f3dae21072ce495f32830d71a 100644 --- a/arkindex/project/api_v1.py +++ b/arkindex/project/api_v1.py @@ -18,7 +18,7 @@ from arkindex.documents.api.entities import ( ) from arkindex.documents.api.iiif import FolderManifest, ElementAnnotationList, TranscriptionSearchAnnotationList from arkindex.dataimport.api import ( - DataImportsList, DataImportDetails, DataImportRetry, DataImportDemo, + DataImportsList, DataImportDetails, DataImportRetry, DataFileList, DataFileRetrieve, DataFileUpload, DataImportFromFiles, RepositoryList, RepositoryRetrieve, RepositoryStartImport, DataFileCreate, GitRepositoryImportHook, AvailableRepositoriesList, ElementHistory, MLToolList, @@ -115,7 +115,6 @@ api = [ path('imports/mltools/', MLToolList.as_view(), name='ml-tool-list'), path('imports/<uuid:pk>/', DataImportDetails.as_view(), name='import-details'), path('imports/<uuid:pk>/retry/', DataImportRetry.as_view(), name='import-retry'), - path('imports/demo/<uuid:pk>/', DataImportDemo.as_view(), name='import-demo'), path('imports/files/<uuid:pk>/', DataFileList.as_view(), name='file-list'), path('imports/files/create/', DataFileCreate.as_view(), name='file-create'), path('imports/file/<uuid:pk>/', DataFileRetrieve.as_view(), name='file-retrieve'), diff --git a/arkindex/project/checks.py b/arkindex/project/checks.py index 0060e1de760fa436e1ed6f843fbfb3c07490b975..ab5eda2fb9cab8c5dc7a116416a7aa6a34ab6376 100644 --- a/arkindex/project/checks.py +++ b/arkindex/project/checks.py @@ -1,7 +1,6 @@ from django.core.checks import register, Warning, Error from ponos.recipe import parse_recipe import os.path -import json import subprocess import yaml @@ -37,30 +36,18 @@ def api_urls_check(*args, **kwargs): @register() @only_runserver -def ml_default_tools_check(*args, **kwargs): +def ml_tools_check(*args, **kwargs): """ - Check that the default ML tools defined in settings actually exist + Check that the ML classifiers defined in settings actually exist """ from django.conf import settings - from arkindex.dataimport.serializers.ml_tool import MLToolTaskSerializer - errors = [] - if not os.path.isdir(settings.ML_CLASSIFIERS_DIR): - errors.append(Error( + return [Error( 'ML tools directory does not exist', hint='settings.ML_CLASSIFIERS_DIR = "{}"'.format(settings.ML_CLASSIFIERS_DIR), id='arkindex.E008', - )) - - serializer = MLToolTaskSerializer(data=settings.DEMO_ML_TOOLS, many=True) - if not serializer.is_valid(): - errors.append(Error( - # The easiest way to display Django REST framework serializer errors - 'Could not parse demo ML tools: {}'.format(json.dumps(serializer.errors)), - hint='settings.DEMO_ML_TOOLS = {!r}'.format(settings.DEMO_ML_TOOLS), - id='arkindex.E002', - )) - return errors + )] + return [] @register() @@ -175,30 +162,6 @@ def internal_group_check(*args, **kwargs): return [] -@register() -@only_runserver -def demo_group_check(*args, **kwargs): - from django.conf import settings - from django.contrib.auth.models import Group - try: - group_id = settings.DEMO_GROUP_ID - except AttributeError: - return [Warning( - 'Demo user group ID is not set; demo registration will fail.', - hint='settings.DEMO_GROUP_ID', - id='arkindex.W003', - )] - try: - Group.objects.get(id=group_id) - except Group.DoesNotExist: - return [Warning( - 'Demo user group does not exist; demo registration will fail.', - hint='settings.DEMO_GROUP_ID = "{}"'.format(group_id), - id='arkindex.W004', - )] - return [] - - @register() @only_runserver def gitlab_oauth_check(*args, **kwargs): diff --git a/arkindex/project/permissions.py b/arkindex/project/permissions.py index 27b042a83c308c8a77e80ba45a4ec514d59771bc..cf7bee79870c1f365778da97965a4a3cb0dd557e 100644 --- a/arkindex/project/permissions.py +++ b/arkindex/project/permissions.py @@ -12,14 +12,14 @@ class InternalGroupPermissionMixin(object): return super().has_permission(request, view) -class DemoGroupPermissionMixin(object): +class VerifiedEmailPermissionMixin(object): def has_permission(self, request, view): - if request.user.is_authenticated and not request.user.is_admin: - # If the user has registered from the demo, or has an unverified email, - # only allow HEAD, GET and OPTIONS. - if not request.user.verified_email or request.user.is_demo: - return super().has_permission(request, view) and request.method in permissions.SAFE_METHODS + if request.user.is_authenticated \ + and not request.user.is_admin \ + and not request.user.verified_email: + # If the user has an unverified email, only allow HEAD, GET and OPTIONS. + return super().has_permission(request, view) and request.method in permissions.SAFE_METHODS return super().has_permission(request, view) @@ -40,9 +40,9 @@ class IsAdminUser(InternalGroupPermissionMixin, permissions.IsAdminUser): pass -class IsVerified(DemoGroupPermissionMixin, IsAuthenticated): +class IsVerified(VerifiedEmailPermissionMixin, IsAuthenticated): pass -class IsVerifiedOrReadOnly(DemoGroupPermissionMixin, IsAuthenticatedOrReadOnly): +class IsVerifiedOrReadOnly(VerifiedEmailPermissionMixin, IsAuthenticatedOrReadOnly): pass diff --git a/arkindex/project/settings.py b/arkindex/project/settings.py index bbd0eee852815a94914ac6ee1d6096d69f144fe8..324817c9c7b7d7f22a9b0f65408ccbb0ca8782f6 100644 --- a/arkindex/project/settings.py +++ b/arkindex/project/settings.py @@ -202,14 +202,7 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = os.environ.get('STATIC_ROOT') -STATICFILES_DIRS = [ -] - -DEMO_FILES_LIMIT = 50 * 1024 ** 2 # 50 MiB -DEMO_ML_TOOLS = [ - {'type': 'classifier', 'slug': 'tobacco'}, - {'type': 'recognizer', 'slug': 'tesseract'}, -] +STATICFILES_DIRS = [] # API @@ -389,7 +382,6 @@ ARKINDEX_APP_IMAGE = os.environ.get('ARKINDEX_APP_IMAGE', 'arkindex-app') ARKINDEX_TASKS_IMAGE = os.environ.get('ARKINDEX_TASKS_IMAGE', 'arkindex-tasks') # User groups with special permissions -DEMO_GROUP_ID = 1 INTERNAL_GROUP_ID = 2 # Optional unit tests runner with code coverage diff --git a/arkindex/project/tests/test_checks.py b/arkindex/project/tests/test_checks.py index 1294ce51b6762ae2c8c6e111c173da5f4bf46686..fb1f122588c81f65421b2a3769017998be8b4366 100644 --- a/arkindex/project/tests/test_checks.py +++ b/arkindex/project/tests/test_checks.py @@ -35,43 +35,27 @@ class ChecksTestCase(TestCase): ] ) - @patch('arkindex.dataimport.serializers.ml_tool.MLTool.get') @patch('arkindex.project.checks.os.path.isdir') - def test_ml_default_tools_check(self, isdir_mock, ml_get_mock): + def test_ml_tools_check(self, isdir_mock): """ - Test the default ML tools existence checks + Test the ML tools existence checks """ - from arkindex.project.checks import ml_default_tools_check + from arkindex.project.checks import ml_tools_check isdir_mock.return_value = True - ml_get_mock.return_value.__hash__.side_effect = [1, 2, 3, 4] - self.assertListEqual(ml_default_tools_check(), []) + self.assertListEqual(ml_tools_check(), []) isdir_mock.return_value = False - ml_get_mock.side_effect = ValueError('Tool does not exist') - - with self.settings( - ML_CLASSIFIERS_DIR='oops', - DEMO_ML_TOOLS=[ - {'type': 'classifier', 'slug': 'fail1'}, - {'type': 'recognizer', 'slug': 'fail2'}, - ]): + + with self.settings(ML_CLASSIFIERS_DIR='oops'): self.assertListEqual( - ml_default_tools_check(), + ml_tools_check(), [ Error( 'ML tools directory does not exist', hint='settings.ML_CLASSIFIERS_DIR = "oops"', id='arkindex.E008', ), - Error( - 'Could not parse demo ML tools: ' - '[{"non_field_errors": ["Tool does not exist"]},' - ' {"non_field_errors": ["Tool does not exist"]}]', - hint="settings.DEMO_ML_TOOLS = " - "[{'type': 'classifier', 'slug': 'fail1'}, {'type': 'recognizer', 'slug': 'fail2'}]", - id='arkindex.E002', - ), ], ) @@ -208,28 +192,6 @@ class ChecksTestCase(TestCase): Group.objects.create(id=1234) self.assertListEqual(internal_group_check(), []) - @override_settings() - def test_demo_group_check(self): - from arkindex.project.checks import demo_group_check - from django.contrib.auth.models import Group - - del settings.DEMO_GROUP_ID - self.assertListEqual(demo_group_check(), [Warning( - 'Demo user group ID is not set; demo registration will fail.', - hint='settings.DEMO_GROUP_ID', - id='arkindex.W003', - )]) - - settings.DEMO_GROUP_ID = 1234 - self.assertListEqual(demo_group_check(), [Warning( - 'Demo user group does not exist; demo registration will fail.', - hint='settings.DEMO_GROUP_ID = "1234"', - id='arkindex.W004', - )]) - - Group.objects.create(id=1234) - self.assertListEqual(demo_group_check(), []) - @override_settings() def test_gitlab_oauth_check(self): from arkindex.project.checks import gitlab_oauth_check diff --git a/arkindex/users/api.py b/arkindex/users/api.py index 45562479175393295773496f467a9550218194dd..d7fac16ef0d51cfe08d63727c7d3beb74d142f1b 100644 --- a/arkindex/users/api.py +++ b/arkindex/users/api.py @@ -14,12 +14,11 @@ from rest_framework.generics import \ from rest_framework.response import Response from rest_framework.exceptions import AuthenticationFailed, ValidationError from arkindex.project.permissions import IsAuthenticated, IsVerified -from arkindex.documents.models import Corpus, Element, ElementType from arkindex.users.providers import oauth_providers, get_provider from arkindex.users.models import User, OAuthStatus from arkindex.users.serializers import ( OAuthCredentialsSerializer, OAuthProviderClassSerializer, OAuthRetrySerializer, - UserSerializer, NewDemoUserSerializer, EmailLoginSerializer, + UserSerializer, NewUserSerializer, EmailLoginSerializer, PasswordResetSerializer, PasswordResetConfirmSerializer, ) import urllib.parse @@ -67,37 +66,23 @@ class UserRetrieve(RetrieveUpdateDestroyAPIView): def get_object(self): return self.request.user - def check_permissions(self, request): - # Will raise REST framework exceptions for denied requests - super().check_permissions(request) - - # Deny changing the password on demo users without verified emails - if request.method.lower() in ('put', 'patch') and \ - request.user.is_demo and \ - not request.user.is_verified: - self.permission_denied(request) - def perform_destroy(self, instance): logout(self.request) class UserCreate(CreateAPIView): - serializer_class = NewDemoUserSerializer + serializer_class = NewUserSerializer + openapi_overrides = { + 'operationId': 'Register', + 'description': 'Register as a new user.', + 'security': [], + 'tags': ['users'], + } def perform_create(self, serializer): user = serializer.save() login(self.request, user) - corpus = Corpus.objects.create(name=user.email) - corpus.create_default_himanis_types() - corpus.corpus_right.create(user=user, can_write=True, can_admin=True) - Element.objects.create( - corpus=corpus, - new_type=corpus.himanis_volume, - type=ElementType.Volume, - name='Demo', - ) - activation_url = '{}?{}'.format( self.request.build_absolute_uri(reverse('api:user-token')), urllib.parse.urlencode({ @@ -210,14 +195,6 @@ class OAuthSignIn(APIView): """ permission_classes = (IsVerified, ) - def check_permissions(self, request): - # Will raise REST framework exceptions for denied requests - super().check_permissions(request) - - # Deny GET on Demo users - if request.user.is_demo: - self.permission_denied(request) - def get(self, *args, **kwargs): if 'provider' not in kwargs: raise ValidationError('Missing provider') @@ -250,14 +227,6 @@ class OAuthRetry(RetrieveAPIView): permission_classes = (IsVerified, ) serializer_class = OAuthRetrySerializer - def check_permissions(self, request): - # Will raise REST framework exceptions for denied requests - super().check_permissions(request) - - # Deny GET on Demo users - if request.user.is_demo: - self.permission_denied(request) - def get_queryset(self): return self.request.user.credentials @@ -284,11 +253,9 @@ class OAuthCallback(UserPassesTestMixin, RedirectView): def test_func(self): """ - Perform Django REST framework permission checks, but without REST framework, - and restrict GET on Demo users + Perform Django REST framework permission checks, but without REST framework. """ - return all(perm().has_permission(self.request, self) for perm in self.permission_classes) \ - and not self.request.user.is_demo + return all(perm().has_permission(self.request, self) for perm in self.permission_classes) def get(self, request, *args, **kwargs): assert 'provider' in kwargs diff --git a/arkindex/users/managers.py b/arkindex/users/managers.py index 34f2ea9122143bf2db0d06e456530c678782ca07..8da92660012d550d3878fe8b57016f88956dade5 100644 --- a/arkindex/users/managers.py +++ b/arkindex/users/managers.py @@ -30,14 +30,6 @@ class UserManager(BaseUserManager): user.save(using=self._db) return user - def create_demo_user(self, email): - user = self.create_user(email) - user.groups.add(Group.objects.get(id=settings.DEMO_GROUP_ID)) - if user.auth_token: - # Do not set a token for demo users - user.auth_token.delete() - return user - def create_internal_user(self, email): user = self.create_user(email) user.groups.add(Group.objects.get(id=settings.INTERNAL_GROUP_ID)) diff --git a/arkindex/users/models.py b/arkindex/users/models.py index 98bb59d47f439e9d29d54e7531daf21c87d4563f..389f71351b5b67aa918c4263fb246592adb6cb97 100644 --- a/arkindex/users/models.py +++ b/arkindex/users/models.py @@ -53,10 +53,6 @@ class User(AbstractBaseUser): def is_internal(self): return self.groups.filter(id=settings.INTERNAL_GROUP_ID).exists() - @cached_property - def is_demo(self): - return self.groups.filter(id=settings.DEMO_GROUP_ID).exists() - class OAuthStatus(Enum): Created = 'created' diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py index 338cf59836c47020de884fcaa45a8dbf8d2b0e05..bff0b7a1d0dca9e3ca5ca0d2af427b718389143a 100644 --- a/arkindex/users/serializers.py +++ b/arkindex/users/serializers.py @@ -71,7 +71,7 @@ class UserSerializer(serializers.ModelSerializer): return super().update(instance, validated_data) -class NewDemoUserSerializer(serializers.ModelSerializer): +class NewUserSerializer(serializers.ModelSerializer): class Meta: model = User @@ -80,7 +80,7 @@ class NewDemoUserSerializer(serializers.ModelSerializer): ) def create(self, validated_data): - return User.objects.create_demo_user(validated_data['email']) + return User.objects.create_user(validated_data['email']) class EmailLoginSerializer(serializers.Serializer): diff --git a/arkindex/users/tests/test_providers.py b/arkindex/users/tests/test_providers.py index 32608b533452d02c319757497d123469798eba03..f922a3cee9b31dee8f8a075fec8c9c312ecac680 100644 --- a/arkindex/users/tests/test_providers.py +++ b/arkindex/users/tests/test_providers.py @@ -1,8 +1,7 @@ from django.urls import reverse -from rest_framework import status from arkindex.project.tests import FixtureTestCase from arkindex.users import providers -from arkindex.users.models import OAuthStatus, User +from arkindex.users.models import OAuthStatus from arkindex.users.providers import get_provider from unittest.mock import MagicMock @@ -13,7 +12,6 @@ class TestProviders(FixtureTestCase): def setUpTestData(cls): super().setUpTestData() cls.creds = cls.user.credentials.get() - cls.demo_user = User.objects.get(email='demo@demo.fr') @classmethod def setUpClass(cls): @@ -53,15 +51,3 @@ class TestProviders(FixtureTestCase): ) self.assertRedirects(response, reverse('credentials'), fetch_redirect_response=False) self.assertEqual(self.creds.status, OAuthStatus.Error) - - def test_oauth_callback_not_demo(self): - self.provider_mock().handle_callback.side_effect = None - self.client.force_login(self.demo_user) - self.creds.user = self.demo_user - self.creds.status = OAuthStatus.Created - self.creds.save() - response = self.client.get( - reverse('api:oauth-callback', kwargs={'provider': 'provider-slug'}), - ) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertEqual(self.creds.status, OAuthStatus.Created) diff --git a/openapi/patch.yml b/openapi/patch.yml index 15a7ce7be76f0cf78199e69f68b459ec084bc45c..72cdc96c5b4eaa8c0c15b1db48d96614766972d0 100644 --- a/openapi/patch.yml +++ b/openapi/patch.yml @@ -38,6 +38,7 @@ tags: - name: ml description: Machine Learning tools and results - name: entities + - name: users paths: /api/v1/classification/bulk/: post: @@ -345,12 +346,6 @@ paths: description: List all data imports tags: - imports - /api/v1/imports/demo/{id}/: - post: - description: Run a data import with reduced access for demo users - security: [] - tags: - - imports /api/v1/imports/file/{id}/: get: description: Get an uploaded file's metadata @@ -643,13 +638,6 @@ paths: security: [] tags: - users - /api/v1/user/new/: - post: - operationId: Register - description: Register as a demo user - security: [] - tags: - - users /api/v1/user/password-reset/: post: operationId: ResetPassword