From 66908a24eaabb35e1208789b26e550082c830c48 Mon Sep 17 00:00:00 2001 From: ml bonhomme <bonhomme@teklia.com> Date: Wed, 28 Aug 2024 13:29:18 +0000 Subject: [PATCH] Make user scopes into boolean attributes on users --- arkindex/documents/fixtures/data.json | 1470 ++++++++--------- arkindex/images/api.py | 12 +- arkindex/images/tests/test_image_api.py | 32 +- arkindex/process/api.py | 12 +- .../process/tests/test_create_s3_import.py | 36 +- arkindex/process/tests/test_list_buckets.py | 22 +- arkindex/project/permissions.py | 78 +- .../process_elements_filter_ml_class.sql | 4 + .../process_elements_filter_type.sql | 4 + .../process_elements_top_level.sql | 5 + .../process_elements_with_image.sql | 4 + arkindex/users/admin.py | 11 +- arkindex/users/migrations/0001_initial.py | 11 +- arkindex/users/migrations/0004_user_scopes.py | 83 + arkindex/users/models.py | 61 +- arkindex/users/serializers.py | 22 +- arkindex/users/tests/test_registration.py | 24 +- 17 files changed, 985 insertions(+), 906 deletions(-) create mode 100644 arkindex/users/migrations/0004_user_scopes.py diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 5adf99eabd..313c927cb7 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -1,7 +1,7 @@ [ { "model": "process.process", - "pk": "374c483b-62b1-4565-8834-0ab2c4960c25", + "pk": "7cf97824-75fb-4c4b-bf2e-5c8ac5e56d48", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -29,18 +29,18 @@ }, { "model": "process.process", - "pk": "38e459b9-2ffa-4bc6-b389-03a9a76d9deb", + "pk": "9e0d85d1-7f7a-4851-ae6d-e9bb544ece1d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "name": "Process fixture", "creator": 2, - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "mode": "workers", "activity_state": "disabled", "started": null, "finished": null, - "farm": "f2a2e1cb-2090-4b69-b204-1a40440e2619", + "farm": "787cc46d-2877-4cd7-8bac-f79d092d8550", "element": null, "folder_type": null, "element_type": null, @@ -57,7 +57,7 @@ }, { "model": "process.process", - "pk": "da1ca18e-736e-4123-8d66-27385205494d", + "pk": "c747f822-76d6-495b-ba93-351b2090e02b", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -85,11 +85,11 @@ }, { "model": "process.worker", - "pk": "2666efcd-09df-49e5-9504-92953561ba23", + "pk": "10a634d9-0e78-4df8-a7e7-0b44d8bb2024", "fields": { - "name": "Generic worker with a Model", - "slug": "generic", - "type": "32060b55-22ca-447b-bc7a-1aafd38d6521", + "name": "Worker requiring a GPU", + "slug": "worker-gpu", + "type": "1bad9ad8-4546-4289-9721-56012135a9ad", "description": "", "public": false, "archived": null, @@ -98,11 +98,11 @@ }, { "model": "process.worker", - "pk": "aa0da253-2300-4b80-9403-1247b1c473ba", + "pk": "3fc69147-7a90-4702-9c0a-174f26d6e722", "fields": { - "name": "File import", - "slug": "file_import", - "type": "5ad90007-3888-4973-8ce8-98515a66f640", + "name": "Document layout analyser", + "slug": "dla", + "type": "391a0197-62bb-4a3a-8867-1cea98eb0360", "description": "", "public": false, "archived": null, @@ -111,11 +111,11 @@ }, { "model": "process.worker", - "pk": "b391fd40-ca4b-4963-b49b-96ac34ad2e1d", + "pk": "59355b24-6dff-4b8a-a2ac-2568c7520650", "fields": { - "name": "Custom worker", - "slug": "custom", - "type": "39b4a530-423d-4f0d-9729-a010279bb2d0", + "name": "Recognizer", + "slug": "reco", + "type": "2a2fbb7f-0fe1-47c8-8f45-62b5cb823a37", "description": "", "public": false, "archived": null, @@ -124,11 +124,11 @@ }, { "model": "process.worker", - "pk": "c3a739d0-024e-4405-bc07-f8736d701623", + "pk": "5b7252aa-801d-4532-b0ac-3acf0dab1ae7", "fields": { - "name": "Document layout analyser", - "slug": "dla", - "type": "8e44b24b-205c-4eda-b41f-37ca0f802e27", + "name": "Elements Initialisation Worker", + "slug": "initialisation", + "type": "11a16320-7eaa-4a7d-a255-639204e92519", "description": "", "public": false, "archived": null, @@ -137,11 +137,11 @@ }, { "model": "process.worker", - "pk": "cbaebcd5-3c7b-4e9a-9b93-1a2ff6521273", + "pk": "6504aeb6-1709-4b9d-9a60-bb3ee6e97983", "fields": { - "name": "Recognizer", - "slug": "reco", - "type": "32060b55-22ca-447b-bc7a-1aafd38d6521", + "name": "Generic worker with a Model", + "slug": "generic", + "type": "2a2fbb7f-0fe1-47c8-8f45-62b5cb823a37", "description": "", "public": false, "archived": null, @@ -150,11 +150,11 @@ }, { "model": "process.worker", - "pk": "d99d8050-297c-41db-85b1-8760ae6875b7", + "pk": "7934da96-65c2-4c87-8efb-4daa92ec30dc", "fields": { - "name": "Elements Initialisation Worker", - "slug": "initialisation", - "type": "b3376082-2033-4dde-a834-8829445baaf6", + "name": "File import", + "slug": "file_import", + "type": "f1b446d7-635d-497c-a1d9-932e88314569", "description": "", "public": false, "archived": null, @@ -163,11 +163,11 @@ }, { "model": "process.worker", - "pk": "fb83b17c-c9cf-43e5-9ef8-e1362381dd09", + "pk": "ab087d67-78ee-40bb-9f3c-5a8788fedfe0", "fields": { - "name": "Worker requiring a GPU", - "slug": "worker-gpu", - "type": "44c4defd-0619-4982-8e52-5663cfec9e1f", + "name": "Custom worker", + "slug": "custom", + "type": "4bac9693-412e-4b7f-b7e8-b0217cb16bb2", "description": "", "public": false, "archived": null, @@ -176,76 +176,76 @@ }, { "model": "process.workertype", - "pk": "32060b55-22ca-447b-bc7a-1aafd38d6521", + "pk": "11a16320-7eaa-4a7d-a255-639204e92519", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "recognizer", - "display_name": "Recognizer" + "slug": "init", + "display_name": "Elements Initialisation" } }, { "model": "process.workertype", - "pk": "39b4a530-423d-4f0d-9729-a010279bb2d0", + "pk": "1bad9ad8-4546-4289-9721-56012135a9ad", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "custom", - "display_name": "Custom" + "slug": "worker", + "display_name": "Worker requiring a GPU" } }, { "model": "process.workertype", - "pk": "44c4defd-0619-4982-8e52-5663cfec9e1f", + "pk": "2a2fbb7f-0fe1-47c8-8f45-62b5cb823a37", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "worker", - "display_name": "Worker requiring a GPU" + "slug": "recognizer", + "display_name": "Recognizer" } }, { "model": "process.workertype", - "pk": "5ad90007-3888-4973-8ce8-98515a66f640", + "pk": "391a0197-62bb-4a3a-8867-1cea98eb0360", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "import", - "display_name": "Import" + "slug": "dla", + "display_name": "Document Layout Analysis" } }, { "model": "process.workertype", - "pk": "8e44b24b-205c-4eda-b41f-37ca0f802e27", + "pk": "4bac9693-412e-4b7f-b7e8-b0217cb16bb2", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "dla", - "display_name": "Document Layout Analysis" + "slug": "custom", + "display_name": "Custom" } }, { "model": "process.workertype", - "pk": "b3376082-2033-4dde-a834-8829445baaf6", + "pk": "f1b446d7-635d-497c-a1d9-932e88314569", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "init", - "display_name": "Elements Initialisation" + "slug": "import", + "display_name": "Import" } }, { "model": "process.workerversion", - "pk": "221791c3-7fa9-4669-9399-0ca05220b7c0", + "pk": "23219e88-6203-4a66-8eeb-a47ea3178b5a", "fields": { - "worker": "2666efcd-09df-49e5-9504-92953561ba23", + "worker": "3fc69147-7a90-4702-9c0a-174f26d6e722", "version": 1, "configuration": { "test": 42 }, "state": "available", "gpu_usage": "disabled", - "model_usage": "required", + "model_usage": "disabled", "docker_image_iid": "registry.somewhere.com/something:latest", "revision_url": null, "tag": null, @@ -255,17 +255,19 @@ }, { "model": "process.workerversion", - "pk": "282dd426-0828-46cd-b15c-7da00c3b6279", + "pk": "3eca986d-082a-49cb-ac2e-5b3b6a2ec6d5", "fields": { - "worker": "c3a739d0-024e-4405-bc07-f8736d701623", + "worker": "5b7252aa-801d-4532-b0ac-3acf0dab1ae7", "version": 1, "configuration": { - "test": 42 + "docker": { + "command": "worker-init-elements" + } }, "state": "available", "gpu_usage": "disabled", "model_usage": "disabled", - "docker_image_iid": "registry.somewhere.com/something:latest", + "docker_image_iid": "registry.gitlab.teklia.com/arkindex/workers/init-elements:latest", "revision_url": null, "tag": null, "created": "2020-02-02T01:23:45.678Z", @@ -274,9 +276,9 @@ }, { "model": "process.workerversion", - "pk": "5e755c30-57f6-4e19-8e3a-6b5a7f09f2ee", + "pk": "6e30bb3b-37fd-42a9-8591-52398332e52f", "fields": { - "worker": "b391fd40-ca4b-4963-b49b-96ac34ad2e1d", + "worker": "ab087d67-78ee-40bb-9f3c-5a8788fedfe0", "version": 1, "configuration": { "custom": "value" @@ -293,15 +295,13 @@ }, { "model": "process.workerversion", - "pk": "821770c1-6438-49a8-a200-8662fa2a607d", + "pk": "7110e9b2-24b7-4bc6-95a5-cd8bff541436", "fields": { - "worker": "fb83b17c-c9cf-43e5-9ef8-e1362381dd09", + "worker": "7934da96-65c2-4c87-8efb-4daa92ec30dc", "version": 1, - "configuration": { - "test": 42 - }, + "configuration": {}, "state": "available", - "gpu_usage": "required", + "gpu_usage": "disabled", "model_usage": "disabled", "docker_image_iid": "registry.somewhere.com/something:latest", "revision_url": null, @@ -312,13 +312,15 @@ }, { "model": "process.workerversion", - "pk": "9a5ae4ee-ebff-40bd-8582-b2f1f244ac15", + "pk": "8ceacd46-b8a3-4a9d-8c5e-4adf633cccc0", "fields": { - "worker": "aa0da253-2300-4b80-9403-1247b1c473ba", + "worker": "10a634d9-0e78-4df8-a7e7-0b44d8bb2024", "version": 1, - "configuration": {}, + "configuration": { + "test": 42 + }, "state": "available", - "gpu_usage": "disabled", + "gpu_usage": "required", "model_usage": "disabled", "docker_image_iid": "registry.somewhere.com/something:latest", "revision_url": null, @@ -329,9 +331,9 @@ }, { "model": "process.workerversion", - "pk": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", + "pk": "9f68bd33-2dfa-44aa-b461-6ab72161a859", "fields": { - "worker": "cbaebcd5-3c7b-4e9a-9b93-1a2ff6521273", + "worker": "59355b24-6dff-4b8a-a2ac-2568c7520650", "version": 1, "configuration": { "test": 42 @@ -348,19 +350,17 @@ }, { "model": "process.workerversion", - "pk": "f5857b3b-8330-4735-a619-4a0ddde14b0f", + "pk": "ee2c2d36-e30c-416f-9240-daa561987193", "fields": { - "worker": "d99d8050-297c-41db-85b1-8760ae6875b7", + "worker": "6504aeb6-1709-4b9d-9a60-bb3ee6e97983", "version": 1, "configuration": { - "docker": { - "command": "worker-init-elements" - } + "test": 42 }, "state": "available", "gpu_usage": "disabled", - "model_usage": "disabled", - "docker_image_iid": "registry.gitlab.teklia.com/arkindex/workers/init-elements:latest", + "model_usage": "required", + "docker_image_iid": "registry.somewhere.com/something:latest", "revision_url": null, "tag": null, "created": "2020-02-02T01:23:45.678Z", @@ -369,14 +369,14 @@ }, { "model": "process.workerrun", - "pk": "00794041-a034-477e-8dc8-ad6d4eae7f11", + "pk": "4c2a35c1-c325-4e01-bfb2-dab70e6acbf4", "fields": { - "process": "38e459b9-2ffa-4bc6-b389-03a9a76d9deb", - "version": "f5857b3b-8330-4735-a619-4a0ddde14b0f", + "process": "c747f822-76d6-495b-ba93-351b2090e02b", + "version": "6e30bb3b-37fd-42a9-8591-52398332e52f", "model_version": null, "parents": "[]", "configuration": null, - "summary": "Worker Elements Initialisation Worker @ version 1", + "summary": "Worker Custom worker @ version 1", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false, @@ -385,14 +385,14 @@ }, { "model": "process.workerrun", - "pk": "75d5400c-650f-4870-a23c-6dfbb5c51cab", + "pk": "b72a2677-f6f2-4eca-80e2-57709ec8cea3", "fields": { - "process": "38e459b9-2ffa-4bc6-b389-03a9a76d9deb", - "version": "282dd426-0828-46cd-b15c-7da00c3b6279", + "process": "9e0d85d1-7f7a-4851-ae6d-e9bb544ece1d", + "version": "3eca986d-082a-49cb-ac2e-5b3b6a2ec6d5", "model_version": null, - "parents": "[\"00794041-a034-477e-8dc8-ad6d4eae7f11\"]", + "parents": "[]", "configuration": null, - "summary": "Worker Document layout analyser @ version 1", + "summary": "Worker Elements Initialisation Worker @ version 1", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false, @@ -401,14 +401,14 @@ }, { "model": "process.workerrun", - "pk": "a3adcf61-c7ce-48e1-8488-541ba1373740", + "pk": "5287808f-22cd-4f02-a007-cbb56aecbdb3", "fields": { - "process": "38e459b9-2ffa-4bc6-b389-03a9a76d9deb", - "version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", + "process": "9e0d85d1-7f7a-4851-ae6d-e9bb544ece1d", + "version": "23219e88-6203-4a66-8eeb-a47ea3178b5a", "model_version": null, - "parents": "[\"75d5400c-650f-4870-a23c-6dfbb5c51cab\"]", + "parents": "[\"b72a2677-f6f2-4eca-80e2-57709ec8cea3\"]", "configuration": null, - "summary": "Worker Recognizer @ version 1", + "summary": "Worker Document layout analyser @ version 1", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false, @@ -417,14 +417,14 @@ }, { "model": "process.workerrun", - "pk": "b2a718fc-bf5c-4a56-8b07-d7f10328c07c", + "pk": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", "fields": { - "process": "374c483b-62b1-4565-8834-0ab2c4960c25", - "version": "5e755c30-57f6-4e19-8e3a-6b5a7f09f2ee", + "process": "9e0d85d1-7f7a-4851-ae6d-e9bb544ece1d", + "version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", "model_version": null, - "parents": "[]", + "parents": "[\"5287808f-22cd-4f02-a007-cbb56aecbdb3\"]", "configuration": null, - "summary": "Worker Custom worker @ version 1", + "summary": "Worker Recognizer @ version 1", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false, @@ -433,10 +433,10 @@ }, { "model": "process.workerrun", - "pk": "cda74349-cb8d-49ed-bf43-9a06a9e17d79", + "pk": "e0247f8e-c31f-410c-9e62-e4e8d9b49f3c", "fields": { - "process": "da1ca18e-736e-4123-8d66-27385205494d", - "version": "5e755c30-57f6-4e19-8e3a-6b5a7f09f2ee", + "process": "7cf97824-75fb-4c4b-bf2e-5c8ac5e56d48", + "version": "6e30bb3b-37fd-42a9-8591-52398332e52f", "model_version": null, "parents": "[]", "configuration": null, @@ -449,7 +449,7 @@ }, { "model": "documents.corpus", - "pk": "b1be7812-a2b1-4d26-a031-8d85869228df", + "pk": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -462,11 +462,11 @@ }, { "model": "documents.elementtype", - "pk": "0f9084ac-d62f-435e-8dd2-c66052dca93b", + "pk": "318f9b79-62ee-4521-82c0-670aa99ececf", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "slug": "page", - "display_name": "Page", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "slug": "act", + "display_name": "Act", "folder": false, "indexable": false, "color": "28b62c" @@ -474,11 +474,11 @@ }, { "model": "documents.elementtype", - "pk": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", + "pk": "34a11cd0-1ab9-4043-a1be-89d12dc09398", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "slug": "surface", - "display_name": "Surface", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "slug": "page", + "display_name": "Page", "folder": false, "indexable": false, "color": "28b62c" @@ -486,23 +486,23 @@ }, { "model": "documents.elementtype", - "pk": "71849ae9-9235-4c55-a627-d5a98af53ea4", + "pk": "a5b6234e-d9a2-4263-b315-f87a5179830b", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "slug": "volume", - "display_name": "Volume", - "folder": true, + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "slug": "word", + "display_name": "Word", + "folder": false, "indexable": false, "color": "28b62c" } }, { "model": "documents.elementtype", - "pk": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", + "pk": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "slug": "word", - "display_name": "Word", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "slug": "surface", + "display_name": "Surface", "folder": false, "indexable": false, "color": "28b62c" @@ -510,21 +510,21 @@ }, { "model": "documents.elementtype", - "pk": "90463352-3033-4f98-9b4b-b01d463ede34", + "pk": "fc18d3b3-1d6d-48f3-8e59-59a7edc43b34", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "slug": "act", - "display_name": "Act", - "folder": false, + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "slug": "volume", + "display_name": "Volume", + "folder": true, "indexable": false, "color": "28b62c" } }, { "model": "documents.elementtype", - "pk": "d11fd6b0-37c7-4566-abee-1283803bf546", + "pk": "fc6f5d0b-55bb-4ca8-880d-d2da865000e4", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "slug": "text_line", "display_name": "Line", "folder": false, @@ -534,279 +534,279 @@ }, { "model": "documents.elementpath", - "pk": "07cf4470-ce10-4bb3-b624-8693b7d830aa", + "pk": "19ad5308-22e2-4d51-9503-0a86f4086465", "fields": { - "element": "c77fbfa2-1edc-4c83-bb60-a59773be6f39", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 4 + "element": "4d1642e0-a456-4ea6-a0e7-d4190b85dd23", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 6 } }, { "model": "documents.elementpath", - "pk": "2299e751-efbc-44f9-928d-eae11419bf08", + "pk": "1a939690-ea65-4f9f-bd88-d010ccea4ad8", "fields": { - "element": "809a018e-3b3e-4ba0-9e10-7378df428f8b", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 5 + "element": "b9e34045-cd42-4611-9140-9b36c255aa7d", + "path": "[\"a04bc2a1-a34c-4ff1-8cee-1610a6292f08\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "24d60fd8-fd8a-4199-9892-7502dcbca1b7", + "pk": "2b055722-0e89-413e-97bd-2d0b6125ada2", "fields": { - "element": "92edae95-97fd-44c9-a8f3-86aaabd3e685", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"30211bbd-f970-46f2-8010-6a03afa219d4\"]", - "ordering": 2 + "element": "273940fa-29e6-4a6f-8ebe-2f0530c5638a", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"659147b8-aa8d-430d-be80-bfb45abbc86c\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "2b3baf15-7c24-4824-be6e-023a6b918b8d", + "pk": "2c367bea-3a32-4c2d-ac9c-1e4c589a7aa2", "fields": { - "element": "6c2b3553-a182-41e7-86b7-d074ee38ef3a", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"bd5a671f-ca17-476e-a43d-25b4aa386abf\"]", + "element": "305d4981-1f1b-441d-b147-9a04ef512c2d", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"3e88150e-0dd5-4f1f-bdf3-5ff962df5520\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "2f5a38d5-1c15-4be2-8540-4f69e37a0b6a", + "pk": "30dbd0cf-b735-4243-8507-8a340561d475", "fields": { - "element": "9475daba-8eb1-4553-a400-3fb117528bb3", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"7f3bbf36-2f96-4297-adc3-4258e3456c29\"]", - "ordering": 0 + "element": "9a2ee49d-0c3c-4c41-bdc7-5cf696c23d11", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "43e2ccf3-7bba-40e7-98c6-93737541a0f2", + "pk": "313629c9-fccf-4860-8f63-4c5b369fe64d", "fields": { - "element": "bd5a671f-ca17-476e-a43d-25b4aa386abf", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 3 + "element": "fc591db1-9115-48ed-b79e-ae73f08ddd72", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"4d1642e0-a456-4ea6-a0e7-d4190b85dd23\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "46a19bee-37af-48cd-bc88-0839541e35bf", + "pk": "3b0c0d4b-48b1-4c22-87de-79080fa2ab39", "fields": { - "element": "26ac9c54-10e9-4996-8cfa-9df1434774f6", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"76a56cff-9680-4c5a-8a01-53b43700b093\"]", + "element": "a04bc2a1-a34c-4ff1-8cee-1610a6292f08", + "path": "[]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "4761a077-d4de-48b2-9477-3520907439e9", + "pk": "3b66f0c6-a2fd-4800-b366-8257cc587da0", "fields": { - "element": "30211bbd-f970-46f2-8010-6a03afa219d4", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", + "element": "49e3b2aa-2dc1-4d9e-930b-433529ce74ed", + "path": "[]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "5a917257-c667-4f13-80e6-106380a8b3ea", + "pk": "448602e5-244f-414d-ba25-a7d355f44347", "fields": { - "element": "7fa801e7-2b7a-46b5-9c2a-19a227ba56d6", - "path": "[\"bd6e6b59-cfb5-41f6-b333-794accb8eff9\"]", + "element": "588ce3be-858d-4963-a7ae-9e9ac593e604", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"4df12da3-657e-4373-aff0-2d97f06ae764\"]", "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "655bca20-7dc6-4c03-ae5b-a0099d124281", + "pk": "4982f9e2-ad8e-42ee-9742-9d3d9621dbeb", "fields": { - "element": "ee14b7ed-9fee-49c6-9983-9d52b2a59343", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"c77fbfa2-1edc-4c83-bb60-a59773be6f39\"]", - "ordering": 0 + "element": "d237b4d8-0f0f-4048-b8fb-88822eeab941", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"132bd0a4-51b3-409c-a794-790f98885c04\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "74242843-2aec-455b-8dce-87b8ce562f3d", + "pk": "4d34d168-ddee-4486-95da-55f7b5dd8f38", "fields": { - "element": "71287d83-8628-48ac-9e3f-40f2f6daf136", - "path": "[]", + "element": "4df12da3-657e-4373-aff0-2d97f06ae764", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "77e0cddf-b8c5-4af2-aa7a-437341876530", + "pk": "7c262f41-0d07-4624-91da-19551010ecde", "fields": { - "element": "a317a77b-9ddd-4f48-82cf-17d25aec30f6", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"b786da45-c90c-4569-aa31-1b4351bc9e34\"]", - "ordering": 2 + "element": "6a10d9e5-d497-4653-a067-cd0314d2f806", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"4df12da3-657e-4373-aff0-2d97f06ae764\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "8d008ef2-d1c3-4615-9c8b-43aace76b30b", + "pk": "7c6edcbc-839e-43d9-b85e-dc26cdaad20c", "fields": { - "element": "7f3bbf36-2f96-4297-adc3-4258e3456c29", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 7 + "element": "bbad9d5b-21af-4c94-a5e2-90526817f0ef", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"9a2ee49d-0c3c-4c41-bdc7-5cf696c23d11\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "978c2b40-fbb4-415d-ae51-65641826153f", + "pk": "805e75ca-fcdf-4ed9-87df-39f38de0a7d2", "fields": { - "element": "6fb612a7-e337-4538-8ca9-f79d7b1c80f3", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"76a56cff-9680-4c5a-8a01-53b43700b093\"]", - "ordering": 1 + "element": "2d1dae06-f06e-4675-acb3-cf7d89d391f9", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 4 } }, { "model": "documents.elementpath", - "pk": "9eaa2e45-241f-494d-8135-dacdcb36e4fe", + "pk": "80a33d75-558f-452e-ad5d-78b4e373a442", "fields": { - "element": "b826c0e5-4877-487e-bd77-b4198cf76f4c", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"76a56cff-9680-4c5a-8a01-53b43700b093\"]", - "ordering": 2 + "element": "1894f1ac-0e28-4b14-9c31-0429d068c419", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"132bd0a4-51b3-409c-a794-790f98885c04\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "9f0b10d4-7c88-4f54-a308-4652618790c0", + "pk": "81895f6f-3254-410a-8812-bca58773fcf9", "fields": { - "element": "38cafdb6-bb8a-45bc-b514-f19cb27ac7a9", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"b786da45-c90c-4569-aa31-1b4351bc9e34\"]", - "ordering": 1 + "element": "4f90d19e-e255-4fa7-a644-9d611a62d967", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"842cd8c3-526c-46da-81a9-c033e9cc276c\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "a57189bd-d29f-4dab-b66c-d06876f59118", + "pk": "8fa16771-c069-49e8-8bd7-705151423ba4", "fields": { - "element": "9afab3a6-e895-4c0a-807d-d31354bd8b0a", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"30211bbd-f970-46f2-8010-6a03afa219d4\"]", + "element": "df79e245-1acf-4bef-bbf3-346806bfa272", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"132bd0a4-51b3-409c-a794-790f98885c04\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "aecdcf26-7dd1-4186-b872-300918e92658", + "pk": "9c57ec9e-445f-46ab-9984-3b89deedf7f3", "fields": { - "element": "4bb67850-d7ba-459e-a106-b2cf48f9f6cb", - "path": "[\"bd6e6b59-cfb5-41f6-b333-794accb8eff9\"]", - "ordering": 1 + "element": "132bd0a4-51b3-409c-a794-790f98885c04", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "b93d6025-9349-439d-bd65-992c13db4010", + "pk": "9f3ae480-5058-41a4-9138-aaddc218e4b5", "fields": { - "element": "9d026bbe-71d7-4ed0-8291-c00cad083f3b", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"c77fbfa2-1edc-4c83-bb60-a59773be6f39\"]", + "element": "ebc8c3f5-90d3-4269-91b0-bca2d82e83ce", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"842cd8c3-526c-46da-81a9-c033e9cc276c\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "ba4dc25d-1878-4327-ba75-babaccaf3edc", + "pk": "a158160d-7349-41db-8dca-b2f05f0aecbe", "fields": { - "element": "dc730372-6e7a-4baf-9d0a-7f1ca89802f9", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 6 + "element": "c975f120-35dd-4d27-9136-503eee141c78", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"842cd8c3-526c-46da-81a9-c033e9cc276c\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "c2d77a3f-16c3-435b-989a-94202960561f", + "pk": "b4b428f6-b1e7-4ac7-91a2-94e5fe0050b1", "fields": { - "element": "bd6e6b59-cfb5-41f6-b333-794accb8eff9", - "path": "[]", - "ordering": 0 + "element": "c7a86026-64d7-4976-ba39-05e94b3a2a5d", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"4df12da3-657e-4373-aff0-2d97f06ae764\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "c8acfd35-3fd9-4b79-9a38-b503e262c46c", + "pk": "c0203529-60e9-42a8-ae93-404882f6893d", "fields": { - "element": "e247c22a-4e83-4997-a284-5d1fda37a82f", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"dc730372-6e7a-4baf-9d0a-7f1ca89802f9\"]", - "ordering": 0 + "element": "659147b8-aa8d-430d-be80-bfb45abbc86c", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 5 } }, { "model": "documents.elementpath", - "pk": "caf5c422-7d5f-451f-aeda-ad0239c6b880", + "pk": "c874b409-b0b8-4650-9874-defaf75e1c29", "fields": { - "element": "be2b81f0-dec4-41fd-a720-e8383244ee91", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"30211bbd-f970-46f2-8010-6a03afa219d4\"]", - "ordering": 1 + "element": "f137753e-86f3-4424-99c1-4b3ddd39c518", + "path": "[\"a04bc2a1-a34c-4ff1-8cee-1610a6292f08\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "d967f4ee-b387-4b62-a140-9273de9b1f42", + "pk": "d664f672-e134-4bd7-afb2-f124d8d321fb", "fields": { - "element": "76a56cff-9680-4c5a-8a01-53b43700b093", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", + "element": "842cd8c3-526c-46da-81a9-c033e9cc276c", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "e61e9861-4e60-4459-839d-8dfe0803ab3d", + "pk": "d6fe5c2a-95bc-4002-8f20-df22443b742d", "fields": { - "element": "ae67b0f1-dfee-464d-8c96-fa3150eb924f", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"b786da45-c90c-4569-aa31-1b4351bc9e34\"]", - "ordering": 0 + "element": "3e88150e-0dd5-4f1f-bdf3-5ff962df5520", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\"]", + "ordering": 7 } }, { "model": "documents.elementpath", - "pk": "eb20eb41-0d8a-4950-a838-24c98e707315", + "pk": "d8f5544d-0bc2-49a7-b17a-d6cbd53674f7", "fields": { - "element": "b8d55a9f-f3d6-4778-8eda-5b6b85d458b1", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"30211bbd-f970-46f2-8010-6a03afa219d4\"]", - "ordering": 3 + "element": "8d0dbf71-8c18-4114-8d95-ee3a4fb2b69b", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"2d1dae06-f06e-4675-acb3-cf7d89d391f9\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "f27d02e0-2cdb-4c7b-a3a0-dbb21603424b", + "pk": "dd79b4f9-58de-4e4b-bc40-182f0ba2dd37", "fields": { - "element": "b786da45-c90c-4569-aa31-1b4351bc9e34", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\"]", - "ordering": 2 + "element": "80208152-f014-4c73-bdb3-f4e961b023a7", + "path": "[\"a04bc2a1-a34c-4ff1-8cee-1610a6292f08\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "f577406b-f31d-4fd6-801d-1b1385700304", + "pk": "e8f15cce-af65-45c7-986b-670d43fca586", "fields": { - "element": "590d69b1-95c8-4ba0-8617-9c0b022a4ba8", - "path": "[\"bd6e6b59-cfb5-41f6-b333-794accb8eff9\"]", - "ordering": 0 + "element": "ed194a73-39ff-42f9-8133-dec044bf4792", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"4df12da3-657e-4373-aff0-2d97f06ae764\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "f68d74c1-7b5d-43fc-a259-98eb8500a827", + "pk": "fbbb5d47-d505-45c8-adaf-897b6057f909", "fields": { - "element": "02fd8dce-00b9-4895-93b6-94f8026a8a41", - "path": "[\"71287d83-8628-48ac-9e3f-40f2f6daf136\", \"809a018e-3b3e-4ba0-9e10-7378df428f8b\"]", - "ordering": 0 + "element": "97c25afa-8568-46f9-bb21-7d5530ec0fcd", + "path": "[\"49e3b2aa-2dc1-4d9e-930b-433529ce74ed\", \"2d1dae06-f06e-4675-acb3-cf7d89d391f9\"]", + "ordering": 1 } }, { "model": "documents.element", - "pk": "02fd8dce-00b9-4895-93b6-94f8026a8a41", + "pk": "132bd0a4-51b3-409c-a794-790f98885c04", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", - "name": "Surface D", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 1, page 2r", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (0 0, 0 300, 300 300, 300 0, 0 0)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -814,18 +814,18 @@ }, { "model": "documents.element", - "pk": "26ac9c54-10e9-4996-8cfa-9df1434774f6", + "pk": "1894f1ac-0e28-4b14-9c31-0429d068c419", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "PARIS", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": "da507478-8d0a-41d5-8ad7-5b062521e984", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -833,18 +833,18 @@ }, { "model": "documents.element", - "pk": "30211bbd-f970-46f2-8010-6a03afa219d4", + "pk": "273940fa-29e6-4a6f-8ebe-2f0530c5638a", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 1, page 1r", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", + "name": "Surface D", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (0 0, 0 300, 300 300, 300 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -852,18 +852,18 @@ }, { "model": "documents.element", - "pk": "38cafdb6-bb8a-45bc-b514-f19cb27ac7a9", + "pk": "2d1dae06-f06e-4675-acb3-cf7d89d391f9", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "ROY", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "318f9b79-62ee-4521-82c0-670aa99ececf", + "name": "Act 2", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -871,18 +871,18 @@ }, { "model": "documents.element", - "pk": "4bb67850-d7ba-459e-a106-b2cf48f9f6cb", + "pk": "305d4981-1f1b-441d-b147-9a04ef512c2d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 2, page 1v", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", + "name": "Surface F", "creator": null, "worker_version": null, "worker_run": null, - "image": "6358303d-1167-489c-b456-2ad6f80b7909", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -890,18 +890,18 @@ }, { "model": "documents.element", - "pk": "590d69b1-95c8-4ba0-8617-9c0b022a4ba8", + "pk": "3e88150e-0dd5-4f1f-bdf3-5ff962df5520", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 2, page 1r", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "318f9b79-62ee-4521-82c0-670aa99ececf", + "name": "Act 5", "creator": null, "worker_version": null, "worker_run": null, - "image": "0d4b917a-4b05-412e-9a32-78da2031dd70", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -909,18 +909,18 @@ }, { "model": "documents.element", - "pk": "6c2b3553-a182-41e7-86b7-d074ee38ef3a", + "pk": "49e3b2aa-2dc1-4d9e-930b-433529ce74ed", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", - "name": "Surface A", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "fc18d3b3-1d6d-48f3-8e59-59a7edc43b34", + "name": "Volume 1", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (0 0, 0 600, 600 600, 600 0, 0 0)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -928,18 +928,18 @@ }, { "model": "documents.element", - "pk": "6fb612a7-e337-4538-8ca9-f79d7b1c80f3", + "pk": "4d1642e0-a456-4ea6-a0e7-d4190b85dd23", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "ROY", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "318f9b79-62ee-4521-82c0-670aa99ececf", + "name": "Act 4", "creator": null, "worker_version": null, "worker_run": null, - "image": "da507478-8d0a-41d5-8ad7-5b062521e984", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -947,18 +947,18 @@ }, { "model": "documents.element", - "pk": "71287d83-8628-48ac-9e3f-40f2f6daf136", + "pk": "4df12da3-657e-4373-aff0-2d97f06ae764", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "71849ae9-9235-4c55-a627-d5a98af53ea4", - "name": "Volume 1", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 1, page 1r", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -966,18 +966,18 @@ }, { "model": "documents.element", - "pk": "76a56cff-9680-4c5a-8a01-53b43700b093", + "pk": "4f90d19e-e255-4fa7-a644-9d611a62d967", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 1, page 1v", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": "da507478-8d0a-41d5-8ad7-5b062521e984", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -985,18 +985,18 @@ }, { "model": "documents.element", - "pk": "7f3bbf36-2f96-4297-adc3-4258e3456c29", + "pk": "588ce3be-858d-4963-a7ae-9e9ac593e604", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "90463352-3033-4f98-9b4b-b01d463ede34", - "name": "Act 5", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1004,18 +1004,18 @@ }, { "model": "documents.element", - "pk": "7fa801e7-2b7a-46b5-9c2a-19a227ba56d6", + "pk": "659147b8-aa8d-430d-be80-bfb45abbc86c", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 2, page 2r", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "318f9b79-62ee-4521-82c0-670aa99ececf", + "name": "Act 3", "creator": null, "worker_version": null, "worker_run": null, - "image": "fa147dd6-f548-478d-a2ce-de54e28aeda9", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1023,18 +1023,18 @@ }, { "model": "documents.element", - "pk": "809a018e-3b3e-4ba0-9e10-7378df428f8b", + "pk": "6a10d9e5-d497-4653-a067-cd0314d2f806", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "90463352-3033-4f98-9b4b-b01d463ede34", - "name": "Act 3", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1042,18 +1042,18 @@ }, { "model": "documents.element", - "pk": "92edae95-97fd-44c9-a8f3-86aaabd3e685", + "pk": "80208152-f014-4c73-bdb3-f4e961b023a7", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "DATUM", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 2, page 1v", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": "651a1319-22d6-4bd6-a385-a64f0235228f", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1061,18 +1061,18 @@ }, { "model": "documents.element", - "pk": "9475daba-8eb1-4553-a400-3fb117528bb3", + "pk": "842cd8c3-526c-46da-81a9-c033e9cc276c", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", - "name": "Surface F", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 1, page 1v", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", + "image": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1080,18 +1080,18 @@ }, { "model": "documents.element", - "pk": "9afab3a6-e895-4c0a-807d-d31354bd8b0a", + "pk": "8d0dbf71-8c18-4114-8d95-ee3a4fb2b69b", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "PARIS", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", + "name": "Surface B", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1099,17 +1099,17 @@ }, { "model": "documents.element", - "pk": "9d026bbe-71d7-4ed0-8291-c00cad083f3b", + "pk": "97c25afa-8568-46f9-bb21-7d5530ec0fcd", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", "name": "Surface C", "creator": null, "worker_version": null, "worker_run": null, - "image": "da507478-8d0a-41d5-8ad7-5b062521e984", + "image": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, @@ -1118,18 +1118,18 @@ }, { "model": "documents.element", - "pk": "a317a77b-9ddd-4f48-82cf-17d25aec30f6", + "pk": "9a2ee49d-0c3c-4c41-bdc7-5cf696c23d11", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "DATUM", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "318f9b79-62ee-4521-82c0-670aa99ececf", + "name": "Act 1", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1137,18 +1137,18 @@ }, { "model": "documents.element", - "pk": "ae67b0f1-dfee-464d-8c96-fa3150eb924f", + "pk": "a04bc2a1-a34c-4ff1-8cee-1610a6292f08", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "PARIS", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "fc18d3b3-1d6d-48f3-8e59-59a7edc43b34", + "name": "Volume 2", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1156,17 +1156,17 @@ }, { "model": "documents.element", - "pk": "b786da45-c90c-4569-aa31-1b4351bc9e34", + "pk": "b9e34045-cd42-4611-9140-9b36c255aa7d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "0f9084ac-d62f-435e-8dd2-c66052dca93b", - "name": "Volume 1, page 2r", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 2, page 1r", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", + "image": "d8cc120e-fb8c-4057-a243-558a02213f54", "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, @@ -1175,18 +1175,18 @@ }, { "model": "documents.element", - "pk": "b826c0e5-4877-487e-bd77-b4198cf76f4c", + "pk": "bbad9d5b-21af-4c94-a5e2-90526817f0ef", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "DATUM", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", + "name": "Surface A", "creator": null, "worker_version": null, "worker_run": null, - "image": "da507478-8d0a-41d5-8ad7-5b062521e984", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (0 0, 0 600, 600 600, 600 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1194,17 +1194,17 @@ }, { "model": "documents.element", - "pk": "b8d55a9f-f3d6-4778-8eda-5b6b85d458b1", + "pk": "c7a86026-64d7-4976-ba39-05e94b3a2a5d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "d11fd6b0-37c7-4566-abee-1283803bf546", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "fc6f5d0b-55bb-4ca8-880d-d2da865000e4", "name": "Text line", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, @@ -1213,18 +1213,18 @@ }, { "model": "documents.element", - "pk": "bd5a671f-ca17-476e-a43d-25b4aa386abf", + "pk": "c975f120-35dd-4d27-9136-503eee141c78", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "90463352-3033-4f98-9b4b-b01d463ede34", - "name": "Act 1", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1232,18 +1232,18 @@ }, { "model": "documents.element", - "pk": "bd6e6b59-cfb5-41f6-b333-794accb8eff9", + "pk": "d237b4d8-0f0f-4048-b8fb-88822eeab941", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "71849ae9-9235-4c55-a627-d5a98af53ea4", - "name": "Volume 2", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1251,18 +1251,18 @@ }, { "model": "documents.element", - "pk": "be2b81f0-dec4-41fd-a720-e8383244ee91", + "pk": "df79e245-1acf-4bef-bbf3-346806bfa272", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "8f16a5a3-4dfb-4851-a05a-36d95bb1cc0c", - "name": "ROY", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1270,18 +1270,18 @@ }, { "model": "documents.element", - "pk": "c77fbfa2-1edc-4c83-bb60-a59773be6f39", + "pk": "ebc8c3f5-90d3-4269-91b0-bca2d82e83ce", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "90463352-3033-4f98-9b4b-b01d463ede34", - "name": "Act 2", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1289,18 +1289,18 @@ }, { "model": "documents.element", - "pk": "dc730372-6e7a-4baf-9d0a-7f1ca89802f9", + "pk": "ed194a73-39ff-42f9-8133-dec044bf4792", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "90463352-3033-4f98-9b4b-b01d463ede34", - "name": "Act 4", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "a5b6234e-d9a2-4263-b315-f87a5179830b", + "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1308,18 +1308,18 @@ }, { "model": "documents.element", - "pk": "e247c22a-4e83-4997-a284-5d1fda37a82f", + "pk": "f137753e-86f3-4424-99c1-4b3ddd39c518", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", - "name": "Surface E", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "34a11cd0-1ab9-4043-a1be-89d12dc09398", + "name": "Volume 2, page 2r", "creator": null, "worker_version": null, "worker_run": null, - "image": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", - "polygon": "LINEARRING (300 300, 300 600, 600 600, 600 300, 300 300)", + "image": "cf799a21-7bd2-45f5-a83d-272ee97d6b20", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1327,18 +1327,18 @@ }, { "model": "documents.element", - "pk": "ee14b7ed-9fee-49c6-9983-9d52b2a59343", + "pk": "fc591db1-9115-48ed-b79e-ae73f08ddd72", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "4ae753e7-ddf9-4500-a72f-9efdd71ba37c", - "name": "Surface B", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "d6578a7a-92a5-492a-bd5e-bd91bc67180c", + "name": "Surface E", "creator": null, "worker_version": null, "worker_run": null, - "image": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", - "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", + "image": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", + "polygon": "LINEARRING (300 300, 300 600, 600 600, 600 300, 300 300)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1346,152 +1346,152 @@ }, { "model": "documents.entitytype", - "pk": "1af77054-dd36-4b06-ba8a-49e3d91863e0", + "pk": "1b55bf17-dc54-47ed-813e-71392b2db2b4", "fields": { - "name": "location", + "name": "person", "color": "ff0000", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b" } }, { "model": "documents.entitytype", - "pk": "63f1a5d7-b449-4f63-890f-3a6f54202e38", + "pk": "27478365-be5f-4d06-8e05-e791a10b4e8a", "fields": { "name": "number", "color": "ff0000", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b" } }, { "model": "documents.entitytype", - "pk": "6fba3f08-f987-41f2-97dd-579d6a4595f3", + "pk": "4579f508-6d4d-4fd0-a1bb-8fa8fe8c112b", "fields": { - "name": "date", + "name": "location", "color": "ff0000", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b" } }, { "model": "documents.entitytype", - "pk": "a6e74713-9506-4aac-a826-1d293185953d", + "pk": "5a8a15fc-3cba-4212-b793-df5cf975a160", "fields": { - "name": "person", + "name": "organization", "color": "ff0000", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b" } }, { "model": "documents.entitytype", - "pk": "b6a370db-6d54-446d-96ad-f5244105da45", + "pk": "c6577a07-8a03-4bee-9edb-8b0428b26bf4", "fields": { - "name": "organization", + "name": "date", "color": "ff0000", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b" } }, { "model": "documents.transcription", - "pk": "348d340d-e8ae-4a6e-8a1c-cc71d9f554d7", + "pk": "0f0cb096-02f4-45c3-b997-0b7fbbab30f0", "fields": { - "element": "26ac9c54-10e9-4996-8cfa-9df1434774f6", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "PARIS", + "element": "4f90d19e-e255-4fa7-a644-9d611a62d967", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "3b5850fc-cc4a-4200-8639-b23d360c69f8", + "pk": "5f36b188-61f8-40c9-bb68-6a53ee11c8bb", "fields": { - "element": "be2b81f0-dec4-41fd-a720-e8383244ee91", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "ROY", + "element": "4df12da3-657e-4373-aff0-2d97f06ae764", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "Lorem ipsum dolor sit amet", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "560159b2-6563-48ec-8ce4-9c600e346d71", + "pk": "7e8dcdcb-9e59-49dc-b420-cc7d29bab40f", "fields": { - "element": "b826c0e5-4877-487e-bd77-b4198cf76f4c", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "DATUM", + "element": "c975f120-35dd-4d27-9136-503eee141c78", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "PARIS", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "72a44064-b773-40c6-9984-9b205540ac13", + "pk": "80f4fead-a7ac-4168-b7c3-9ce5627ce779", "fields": { - "element": "6fb612a7-e337-4538-8ca9-f79d7b1c80f3", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "ROY", + "element": "6a10d9e5-d497-4653-a067-cd0314d2f806", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "PARIS", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "bac52ae2-6303-4a67-92b9-b872436e6815", + "pk": "950b9f03-126e-443d-bbfe-14804583e519", "fields": { - "element": "38cafdb6-bb8a-45bc-b514-f19cb27ac7a9", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "ROY", + "element": "d237b4d8-0f0f-4048-b8fb-88822eeab941", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "c526a613-ea9d-4351-a6df-4a83d83b9383", + "pk": "bddc34e6-4513-4494-b903-a64a1af6fe41", "fields": { - "element": "30211bbd-f970-46f2-8010-6a03afa219d4", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "Lorem ipsum dolor sit amet", + "element": "ebc8c3f5-90d3-4269-91b0-bca2d82e83ce", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "ROY", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "cc171391-89d2-4ed8-a3c6-70b588f41153", + "pk": "dcf3e084-2a45-4538-a093-1d74f3316afd", "fields": { - "element": "ae67b0f1-dfee-464d-8c96-fa3150eb924f", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "PARIS", + "element": "1894f1ac-0e28-4b14-9c31-0429d068c419", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "ROY", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "cc5df7ac-a137-4fa4-8a71-0e152133bf48", + "pk": "e4036088-8cc5-4274-a47e-7f1a0cffe9a4", "fields": { - "element": "92edae95-97fd-44c9-a8f3-86aaabd3e685", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "DATUM", + "element": "df79e245-1acf-4bef-bbf3-346806bfa272", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "PARIS", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "e6c64593-5211-4787-997c-cdaa57ef8527", + "pk": "e7223e3f-85d2-4120-b983-de7065e8f2d1", "fields": { - "element": "a317a77b-9ddd-4f48-82cf-17d25aec30f6", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", + "element": "588ce3be-858d-4963-a7ae-9e9ac593e604", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 @@ -1499,51 +1499,51 @@ }, { "model": "documents.transcription", - "pk": "f16d07b9-5431-4613-974b-fa9a275b96eb", + "pk": "fd9f370c-8dd9-4c1c-a4d0-9b3dd10b873d", "fields": { - "element": "9afab3a6-e895-4c0a-807d-d31354bd8b0a", - "worker_version": "ccf2a96f-ed15-495c-886b-b5068b01b9f8", - "worker_run": "a3adcf61-c7ce-48e1-8488-541ba1373740", - "text": "PARIS", + "element": "ed194a73-39ff-42f9-8133-dec044bf4792", + "worker_version": "9f68bd33-2dfa-44aa-b461-6ab72161a859", + "worker_run": "55d64c3a-0fc6-4d9f-9563-0661d0fb4a95", + "text": "ROY", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.allowedmetadata", - "pk": "abf0de31-f528-42af-a3d3-6951ba9a59a2", + "pk": "1902466d-3de0-45ca-95c2-baa093c02c61", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "location", - "name": "location" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "date", + "name": "date" } }, { "model": "documents.allowedmetadata", - "pk": "eb4ccf3c-1b4c-42c5-acad-ec0b40f8ae3b", + "pk": "6e118f91-8ee7-4dc6-acd5-847393c3ddf9", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "type": "text", "name": "folio" } }, { "model": "documents.allowedmetadata", - "pk": "faf366c7-66e3-4702-9d0f-69f165ff2730", + "pk": "d1d30e40-9b1f-4680-a659-53c9c36caf45", "fields": { - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", - "type": "date", - "name": "date" + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", + "type": "location", + "name": "location" } }, { "model": "documents.metadata", - "pk": "041e2100-3e15-4898-83cc-cdb6ff86bc86", + "pk": "03f42c94-337c-41f8-9a3f-3c107e48c0ab", "fields": { - "element": "bd5a671f-ca17-476e-a43d-25b4aa386abf", - "name": "number", + "element": "f137753e-86f3-4424-99c1-4b3ddd39c518", + "name": "folio", "type": "text", - "value": "1", + "value": "2r", "entity": null, "worker_version": null, "worker_run": null @@ -1551,12 +1551,12 @@ }, { "model": "documents.metadata", - "pk": "11b19ba3-6b0d-48b5-a68b-aac627227e11", + "pk": "0481986f-d8cc-4ef3-aaef-9d7215405887", "fields": { - "element": "7fa801e7-2b7a-46b5-9c2a-19a227ba56d6", + "element": "b9e34045-cd42-4611-9140-9b36c255aa7d", "name": "folio", "type": "text", - "value": "2r", + "value": "1r", "entity": null, "worker_version": null, "worker_run": null @@ -1564,12 +1564,12 @@ }, { "model": "documents.metadata", - "pk": "52abcc33-23b7-4482-9607-786bc789e578", + "pk": "0d319711-d6f5-429d-8973-78e2f891670e", "fields": { - "element": "b786da45-c90c-4569-aa31-1b4351bc9e34", + "element": "4df12da3-657e-4373-aff0-2d97f06ae764", "name": "folio", "type": "text", - "value": "2r", + "value": "1r", "entity": null, "worker_version": null, "worker_run": null @@ -1577,12 +1577,12 @@ }, { "model": "documents.metadata", - "pk": "765f5186-16dc-4bf6-88c6-80d47d1db628", + "pk": "1af65499-291c-4fdc-a602-a88a2ea87540", "fields": { - "element": "7f3bbf36-2f96-4297-adc3-4258e3456c29", - "name": "number", + "element": "80208152-f014-4c73-bdb3-f4e961b023a7", + "name": "folio", "type": "text", - "value": "5", + "value": "1v", "entity": null, "worker_version": null, "worker_run": null @@ -1590,12 +1590,12 @@ }, { "model": "documents.metadata", - "pk": "806431c0-093d-4172-884f-8b3e83ea84be", + "pk": "64327dd3-26dd-4a8f-b989-53889e8b5210", "fields": { - "element": "c77fbfa2-1edc-4c83-bb60-a59773be6f39", + "element": "9a2ee49d-0c3c-4c41-bdc7-5cf696c23d11", "name": "number", "type": "text", - "value": "2", + "value": "1", "entity": null, "worker_version": null, "worker_run": null @@ -1603,12 +1603,12 @@ }, { "model": "documents.metadata", - "pk": "8e37aaf1-5ba2-4188-98aa-11667f36ac10", + "pk": "71318c8d-f312-4200-8651-7efc23e5e8d2", "fields": { - "element": "dc730372-6e7a-4baf-9d0a-7f1ca89802f9", + "element": "3e88150e-0dd5-4f1f-bdf3-5ff962df5520", "name": "number", "type": "text", - "value": "4", + "value": "5", "entity": null, "worker_version": null, "worker_run": null @@ -1616,12 +1616,12 @@ }, { "model": "documents.metadata", - "pk": "92fa129a-e147-46f0-9a98-400c78619844", + "pk": "793136d1-2407-4c05-8a4e-22ebf931a197", "fields": { - "element": "809a018e-3b3e-4ba0-9e10-7378df428f8b", - "name": "number", + "element": "842cd8c3-526c-46da-81a9-c033e9cc276c", + "name": "folio", "type": "text", - "value": "3", + "value": "1v", "entity": null, "worker_version": null, "worker_run": null @@ -1629,12 +1629,12 @@ }, { "model": "documents.metadata", - "pk": "a5569b70-8f9a-4f21-83e6-de0841aeeb4b", + "pk": "a3577808-1f42-4eac-9a12-fbb95f4f700f", "fields": { - "element": "4bb67850-d7ba-459e-a106-b2cf48f9f6cb", + "element": "132bd0a4-51b3-409c-a794-790f98885c04", "name": "folio", "type": "text", - "value": "1v", + "value": "2r", "entity": null, "worker_version": null, "worker_run": null @@ -1642,12 +1642,12 @@ }, { "model": "documents.metadata", - "pk": "a7b28339-a1e9-4d31-bf9d-a24296bb8105", + "pk": "a4820235-d5da-4e27-af57-b85b4659906e", "fields": { - "element": "76a56cff-9680-4c5a-8a01-53b43700b093", - "name": "folio", + "element": "4d1642e0-a456-4ea6-a0e7-d4190b85dd23", + "name": "number", "type": "text", - "value": "1v", + "value": "4", "entity": null, "worker_version": null, "worker_run": null @@ -1655,12 +1655,12 @@ }, { "model": "documents.metadata", - "pk": "c17618a2-8b96-4b61-9361-1559540a4871", + "pk": "a75a0a28-f5aa-4332-b310-95d140893df4", "fields": { - "element": "590d69b1-95c8-4ba0-8617-9c0b022a4ba8", - "name": "folio", + "element": "659147b8-aa8d-430d-be80-bfb45abbc86c", + "name": "number", "type": "text", - "value": "1r", + "value": "3", "entity": null, "worker_version": null, "worker_run": null @@ -1668,12 +1668,12 @@ }, { "model": "documents.metadata", - "pk": "d1c624a7-e32e-4473-ab71-d5c39e449a76", + "pk": "c1fc4c6b-aa35-40bb-aee7-1b2819accd9a", "fields": { - "element": "30211bbd-f970-46f2-8010-6a03afa219d4", - "name": "folio", + "element": "2d1dae06-f06e-4675-acb3-cf7d89d391f9", + "name": "number", "type": "text", - "value": "1r", + "value": "2", "entity": null, "worker_version": null, "worker_run": null @@ -1696,12 +1696,12 @@ }, { "model": "images.image", - "pk": "0d4b917a-4b05-412e-9a32-78da2031dd70", + "pk": "651a1319-22d6-4bd6-a385-a64f0235228f", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img4", + "path": "img5", "width": 1000, "height": 1000, "hash": null, @@ -1710,12 +1710,12 @@ }, { "model": "images.image", - "pk": "6358303d-1167-489c-b456-2ad6f80b7909", + "pk": "ad2a47fa-c3a6-4b0a-9e35-44563187350e", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img5", + "path": "img2", "width": 1000, "height": 1000, "hash": null, @@ -1724,12 +1724,12 @@ }, { "model": "images.image", - "pk": "b6ac34ae-c245-4bf5-8c24-cee3b25a8498", + "pk": "b6d5c8c8-c27f-43a8-8edb-0cb287eda8b3", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img1", + "path": "img3", "width": 1000, "height": 1000, "hash": null, @@ -1738,12 +1738,12 @@ }, { "model": "images.image", - "pk": "da507478-8d0a-41d5-8ad7-5b062521e984", + "pk": "cf799a21-7bd2-45f5-a83d-272ee97d6b20", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img2", + "path": "img6", "width": 1000, "height": 1000, "hash": null, @@ -1752,12 +1752,12 @@ }, { "model": "images.image", - "pk": "e7b06b72-703b-45aa-9c91-12eba0f1e9d9", + "pk": "d8cc120e-fb8c-4057-a243-558a02213f54", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img3", + "path": "img4", "width": 1000, "height": 1000, "hash": null, @@ -1766,12 +1766,12 @@ }, { "model": "images.image", - "pk": "fa147dd6-f548-478d-a2ce-de54e28aeda9", + "pk": "f5fb4f00-ee17-4d71-8021-543bb01ba0bb", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img6", + "path": "img1", "width": 1000, "height": 1000, "hash": null, @@ -1780,56 +1780,56 @@ }, { "model": "users.right", - "pk": "552b002f-df32-4a69-ba96-cb55735c5c88", + "pk": "26a8c15c-32eb-49e7-9819-08a10e57163a", "fields": { "user": 2, "group": null, "content_type": 21, - "content_id": "b1be7812-a2b1-4d26-a031-8d85869228df", + "content_id": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "level": 100 } }, { "model": "users.right", - "pk": "a2e659c9-bb9e-4c5a-9667-44b393da48e0", + "pk": "4daf40a9-e44b-430c-9ad6-9a1bcf5e0296", "fields": { - "user": 4, + "user": 2, "group": null, - "content_type": 34, - "content_id": "3bb20c38-2a86-4504-be0f-e63e3b94d65b", + "content_type": 13, + "content_id": "787cc46d-2877-4cd7-8bac-f79d092d8550", "level": 10 } }, { "model": "users.right", - "pk": "de2d22ca-2dc3-4037-8048-f2344eeefd26", + "pk": "52a59192-b791-4e1a-b3f9-dcaca8bbf53a", "fields": { - "user": 2, + "user": 4, "group": null, "content_type": 34, - "content_id": "3bb20c38-2a86-4504-be0f-e63e3b94d65b", - "level": 100 + "content_id": "7b55538f-262a-4d16-9abe-477d49bedce6", + "level": 10 } }, { "model": "users.right", - "pk": "e13f9b34-4e97-4f99-8453-65f29520e680", + "pk": "cae06f2d-dce3-4021-90a9-74164dd0bab2", "fields": { "user": 2, "group": null, - "content_type": 13, - "content_id": "f2a2e1cb-2090-4b69-b204-1a40440e2619", - "level": 10 + "content_type": 34, + "content_id": "7b55538f-262a-4d16-9abe-477d49bedce6", + "level": 100 } }, { "model": "users.right", - "pk": "e2d2fa8c-3a28-4b9b-a93b-5fba3d9e7157", + "pk": "d11a61eb-7197-45af-8375-e3650b534b87", "fields": { "user": 3, "group": null, "content_type": 34, - "content_id": "3bb20c38-2a86-4504-be0f-e63e3b94d65b", + "content_id": "7b55538f-262a-4d16-9abe-477d49bedce6", "level": 50 } }, @@ -1837,13 +1837,17 @@ "model": "users.user", "pk": 1, "fields": { - "password": "pbkdf2_sha256$720000$35EvN3z9hMVfoshEvJCX17$HTH5LH72xqd/ym03bfkdq93US3a2MKqzicyei5/zZQI=", + "password": "pbkdf2_sha256$600000$0ZmfEB4W0Hf1ESgG3aWVuN$EZNx4llNwL0mi+Zdvw5O+1LRkELDgm0bYwMS8Jl82/4=", "last_login": null, "email": "root@root.fr", "display_name": "Admin", "is_active": true, "is_admin": true, "verified_email": true, + "can_upload_s3_image": false, + "can_create_iiif_image": false, + "can_ingest": false, + "can_create_worker_version": false, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } @@ -1852,13 +1856,17 @@ "model": "users.user", "pk": 2, "fields": { - "password": "pbkdf2_sha256$720000$wmZ5ZDkcvtlXOcUgtAm6sv$Y1Wl6SzWPGbKEsLFBSuQ4snL7RsKdUQsrfFDTWQVIro=", + "password": "pbkdf2_sha256$600000$QJoEp6azwQAVJ3hRSIguj7$y7Sm+YYsgn9ihRQc0ILbfk5IQ9qJqJ3tDklHL3pBHaA=", "last_login": null, "email": "user@user.fr", "display_name": "Test user", "is_active": true, "is_admin": false, "verified_email": true, + "can_upload_s3_image": false, + "can_create_iiif_image": false, + "can_ingest": false, + "can_create_worker_version": false, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } @@ -1874,6 +1882,10 @@ "is_active": true, "is_admin": false, "verified_email": true, + "can_upload_s3_image": false, + "can_create_iiif_image": false, + "can_ingest": false, + "can_create_worker_version": false, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } @@ -1889,13 +1901,17 @@ "is_active": true, "is_admin": false, "verified_email": true, + "can_upload_s3_image": false, + "can_create_iiif_image": false, + "can_ingest": false, + "can_create_worker_version": false, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "users.group", - "pk": "3bb20c38-2a86-4504-be0f-e63e3b94d65b", + "pk": "7b55538f-262a-4d16-9abe-477d49bedce6", "fields": { "name": "User group", "public": false, @@ -3066,186 +3082,150 @@ { "model": "auth.permission", "pk": 130, - "fields": { - "name": "Can add user scope", - "content_type": 36, - "codename": "add_userscope" - } -}, -{ - "model": "auth.permission", - "pk": 131, - "fields": { - "name": "Can change user scope", - "content_type": 36, - "codename": "change_userscope" - } -}, -{ - "model": "auth.permission", - "pk": 132, - "fields": { - "name": "Can delete user scope", - "content_type": 36, - "codename": "delete_userscope" - } -}, -{ - "model": "auth.permission", - "pk": 133, - "fields": { - "name": "Can view user scope", - "content_type": 36, - "codename": "view_userscope" - } -}, -{ - "model": "auth.permission", - "pk": 134, "fields": { "name": "Can add corpus worker version", - "content_type": 37, + "content_type": 36, "codename": "add_corpusworkerversion" } }, { "model": "auth.permission", - "pk": 135, + "pk": 131, "fields": { "name": "Can change corpus worker version", - "content_type": 37, + "content_type": 36, "codename": "change_corpusworkerversion" } }, { "model": "auth.permission", - "pk": 136, + "pk": 132, "fields": { "name": "Can delete corpus worker version", - "content_type": 37, + "content_type": 36, "codename": "delete_corpusworkerversion" } }, { "model": "auth.permission", - "pk": 137, + "pk": 133, "fields": { "name": "Can view corpus worker version", - "content_type": 37, + "content_type": 36, "codename": "view_corpusworkerversion" } }, { "model": "auth.permission", - "pk": 138, + "pk": 134, "fields": { "name": "Can add data file", - "content_type": 38, + "content_type": 37, "codename": "add_datafile" } }, { "model": "auth.permission", - "pk": 139, + "pk": 135, "fields": { "name": "Can change data file", - "content_type": 38, + "content_type": 37, "codename": "change_datafile" } }, { "model": "auth.permission", - "pk": 140, + "pk": 136, "fields": { "name": "Can delete data file", - "content_type": 38, + "content_type": 37, "codename": "delete_datafile" } }, { "model": "auth.permission", - "pk": 141, + "pk": 137, "fields": { "name": "Can view data file", - "content_type": 38, + "content_type": 37, "codename": "view_datafile" } }, { "model": "auth.permission", - "pk": 142, + "pk": 138, "fields": { "name": "Can add process", - "content_type": 39, + "content_type": 38, "codename": "add_process" } }, { "model": "auth.permission", - "pk": 143, + "pk": 139, "fields": { "name": "Can change process", - "content_type": 39, + "content_type": 38, "codename": "change_process" } }, { "model": "auth.permission", - "pk": 144, + "pk": 140, "fields": { "name": "Can delete process", - "content_type": 39, + "content_type": 38, "codename": "delete_process" } }, { "model": "auth.permission", - "pk": 145, + "pk": 141, "fields": { "name": "Can view process", - "content_type": 39, + "content_type": 38, "codename": "view_process" } }, { "model": "auth.permission", - "pk": 146, + "pk": 142, "fields": { "name": "Can add process element", - "content_type": 40, + "content_type": 39, "codename": "add_processelement" } }, { "model": "auth.permission", - "pk": 147, + "pk": 143, "fields": { "name": "Can change process element", - "content_type": 40, + "content_type": 39, "codename": "change_processelement" } }, { "model": "auth.permission", - "pk": 148, + "pk": 144, "fields": { "name": "Can delete process element", - "content_type": 40, + "content_type": 39, "codename": "delete_processelement" } }, { "model": "auth.permission", - "pk": 149, + "pk": 145, "fields": { "name": "Can view process element", - "content_type": 40, + "content_type": 39, "codename": "view_processelement" } }, { "model": "auth.permission", - "pk": 150, + "pk": 146, "fields": { "name": "Can add worker", "content_type": 2, @@ -3254,7 +3234,7 @@ }, { "model": "auth.permission", - "pk": 151, + "pk": 147, "fields": { "name": "Can change worker", "content_type": 2, @@ -3263,7 +3243,7 @@ }, { "model": "auth.permission", - "pk": 152, + "pk": 148, "fields": { "name": "Can delete worker", "content_type": 2, @@ -3272,7 +3252,7 @@ }, { "model": "auth.permission", - "pk": 153, + "pk": 149, "fields": { "name": "Can view worker", "content_type": 2, @@ -3281,487 +3261,487 @@ }, { "model": "auth.permission", - "pk": 154, + "pk": 150, "fields": { "name": "Can add worker activity", - "content_type": 41, + "content_type": 40, "codename": "add_workeractivity" } }, { "model": "auth.permission", - "pk": 155, + "pk": 151, "fields": { "name": "Can change worker activity", - "content_type": 41, + "content_type": 40, "codename": "change_workeractivity" } }, { "model": "auth.permission", - "pk": 156, + "pk": 152, "fields": { "name": "Can delete worker activity", - "content_type": 41, + "content_type": 40, "codename": "delete_workeractivity" } }, { "model": "auth.permission", - "pk": 157, + "pk": 153, "fields": { "name": "Can view worker activity", - "content_type": 41, + "content_type": 40, "codename": "view_workeractivity" } }, { "model": "auth.permission", - "pk": 158, + "pk": 154, "fields": { "name": "Can add worker configuration", - "content_type": 42, + "content_type": 41, "codename": "add_workerconfiguration" } }, { "model": "auth.permission", - "pk": 159, + "pk": 155, "fields": { "name": "Can change worker configuration", - "content_type": 42, + "content_type": 41, "codename": "change_workerconfiguration" } }, { "model": "auth.permission", - "pk": 160, + "pk": 156, "fields": { "name": "Can delete worker configuration", - "content_type": 42, + "content_type": 41, "codename": "delete_workerconfiguration" } }, { "model": "auth.permission", - "pk": 161, + "pk": 157, "fields": { "name": "Can view worker configuration", - "content_type": 42, + "content_type": 41, "codename": "view_workerconfiguration" } }, { "model": "auth.permission", - "pk": 162, + "pk": 158, "fields": { "name": "Can add worker type", - "content_type": 43, + "content_type": 42, "codename": "add_workertype" } }, { "model": "auth.permission", - "pk": 163, + "pk": 159, "fields": { "name": "Can change worker type", - "content_type": 43, + "content_type": 42, "codename": "change_workertype" } }, { "model": "auth.permission", - "pk": 164, + "pk": 160, "fields": { "name": "Can delete worker type", - "content_type": 43, + "content_type": 42, "codename": "delete_workertype" } }, { "model": "auth.permission", - "pk": 165, + "pk": 161, "fields": { "name": "Can view worker type", - "content_type": 43, + "content_type": 42, "codename": "view_workertype" } }, { "model": "auth.permission", - "pk": 166, + "pk": 162, "fields": { "name": "Can add worker version", - "content_type": 44, + "content_type": 43, "codename": "add_workerversion" } }, { "model": "auth.permission", - "pk": 167, + "pk": 163, "fields": { "name": "Can change worker version", - "content_type": 44, + "content_type": 43, "codename": "change_workerversion" } }, { "model": "auth.permission", - "pk": 168, + "pk": 164, "fields": { "name": "Can delete worker version", - "content_type": 44, + "content_type": 43, "codename": "delete_workerversion" } }, { "model": "auth.permission", - "pk": 169, + "pk": 165, "fields": { "name": "Can view worker version", - "content_type": 44, + "content_type": 43, "codename": "view_workerversion" } }, { "model": "auth.permission", - "pk": 170, + "pk": 166, "fields": { "name": "Can add worker run", - "content_type": 45, + "content_type": 44, "codename": "add_workerrun" } }, { "model": "auth.permission", - "pk": 171, + "pk": 167, "fields": { "name": "Can change worker run", - "content_type": 45, + "content_type": 44, "codename": "change_workerrun" } }, { "model": "auth.permission", - "pk": 172, + "pk": 168, "fields": { "name": "Can delete worker run", - "content_type": 45, + "content_type": 44, "codename": "delete_workerrun" } }, { "model": "auth.permission", - "pk": 173, + "pk": 169, "fields": { "name": "Can view worker run", - "content_type": 45, + "content_type": 44, "codename": "view_workerrun" } }, { "model": "auth.permission", - "pk": 174, + "pk": 170, "fields": { "name": "Can add process dataset set", - "content_type": 46, + "content_type": 45, "codename": "add_processdatasetset" } }, { "model": "auth.permission", - "pk": 175, + "pk": 171, "fields": { "name": "Can change process dataset set", - "content_type": 46, + "content_type": 45, "codename": "change_processdatasetset" } }, { "model": "auth.permission", - "pk": 176, + "pk": 172, "fields": { "name": "Can delete process dataset set", - "content_type": 46, + "content_type": 45, "codename": "delete_processdatasetset" } }, { "model": "auth.permission", - "pk": 177, + "pk": 173, "fields": { "name": "Can view process dataset set", - "content_type": 46, + "content_type": 45, "codename": "view_processdatasetset" } }, { "model": "auth.permission", - "pk": 178, + "pk": 174, "fields": { "name": "Can add dataset", - "content_type": 47, + "content_type": 46, "codename": "add_dataset" } }, { "model": "auth.permission", - "pk": 179, + "pk": 175, "fields": { "name": "Can change dataset", - "content_type": 47, + "content_type": 46, "codename": "change_dataset" } }, { "model": "auth.permission", - "pk": 180, + "pk": 176, "fields": { "name": "Can delete dataset", - "content_type": 47, + "content_type": 46, "codename": "delete_dataset" } }, { "model": "auth.permission", - "pk": 181, + "pk": 177, "fields": { "name": "Can view dataset", - "content_type": 47, + "content_type": 46, "codename": "view_dataset" } }, { "model": "auth.permission", - "pk": 182, + "pk": 178, "fields": { "name": "Can add metric key", - "content_type": 48, + "content_type": 47, "codename": "add_metrickey" } }, { "model": "auth.permission", - "pk": 183, + "pk": 179, "fields": { "name": "Can change metric key", - "content_type": 48, + "content_type": 47, "codename": "change_metrickey" } }, { "model": "auth.permission", - "pk": 184, + "pk": 180, "fields": { "name": "Can delete metric key", - "content_type": 48, + "content_type": 47, "codename": "delete_metrickey" } }, { "model": "auth.permission", - "pk": 185, + "pk": 181, "fields": { "name": "Can view metric key", - "content_type": 48, + "content_type": 47, "codename": "view_metrickey" } }, { "model": "auth.permission", - "pk": 186, + "pk": 182, "fields": { "name": "Can add model", - "content_type": 49, + "content_type": 48, "codename": "add_model" } }, { "model": "auth.permission", - "pk": 187, + "pk": 183, "fields": { "name": "Can change model", - "content_type": 49, + "content_type": 48, "codename": "change_model" } }, { "model": "auth.permission", - "pk": 188, + "pk": 184, "fields": { "name": "Can delete model", - "content_type": 49, + "content_type": 48, "codename": "delete_model" } }, { "model": "auth.permission", - "pk": 189, + "pk": 185, "fields": { "name": "Can view model", - "content_type": 49, + "content_type": 48, "codename": "view_model" } }, { "model": "auth.permission", - "pk": 190, + "pk": 186, "fields": { "name": "Can add model version", - "content_type": 50, + "content_type": 49, "codename": "add_modelversion" } }, { "model": "auth.permission", - "pk": 191, + "pk": 187, "fields": { "name": "Can change model version", - "content_type": 50, + "content_type": 49, "codename": "change_modelversion" } }, { "model": "auth.permission", - "pk": 192, + "pk": 188, "fields": { "name": "Can delete model version", - "content_type": 50, + "content_type": 49, "codename": "delete_modelversion" } }, { "model": "auth.permission", - "pk": 193, + "pk": 189, "fields": { "name": "Can view model version", - "content_type": 50, + "content_type": 49, "codename": "view_modelversion" } }, { "model": "auth.permission", - "pk": 194, + "pk": 190, "fields": { "name": "Can add metric value", - "content_type": 51, + "content_type": 50, "codename": "add_metricvalue" } }, { "model": "auth.permission", - "pk": 195, + "pk": 191, "fields": { "name": "Can change metric value", - "content_type": 51, + "content_type": 50, "codename": "change_metricvalue" } }, { "model": "auth.permission", - "pk": 196, + "pk": 192, "fields": { "name": "Can delete metric value", - "content_type": 51, + "content_type": 50, "codename": "delete_metricvalue" } }, { "model": "auth.permission", - "pk": 197, + "pk": 193, "fields": { "name": "Can view metric value", - "content_type": 51, + "content_type": 50, "codename": "view_metricvalue" } }, { "model": "auth.permission", - "pk": 198, + "pk": 194, "fields": { "name": "Can add dataset element", - "content_type": 52, + "content_type": 51, "codename": "add_datasetelement" } }, { "model": "auth.permission", - "pk": 199, + "pk": 195, "fields": { "name": "Can change dataset element", - "content_type": 52, + "content_type": 51, "codename": "change_datasetelement" } }, { "model": "auth.permission", - "pk": 200, + "pk": 196, "fields": { "name": "Can delete dataset element", - "content_type": 52, + "content_type": 51, "codename": "delete_datasetelement" } }, { "model": "auth.permission", - "pk": 201, + "pk": 197, "fields": { "name": "Can view dataset element", - "content_type": 52, + "content_type": 51, "codename": "view_datasetelement" } }, { "model": "auth.permission", - "pk": 202, + "pk": 198, "fields": { "name": "Can add dataset set", - "content_type": 53, + "content_type": 52, "codename": "add_datasetset" } }, { "model": "auth.permission", - "pk": 203, + "pk": 199, "fields": { "name": "Can change dataset set", - "content_type": 53, + "content_type": 52, "codename": "change_datasetset" } }, { "model": "auth.permission", - "pk": 204, + "pk": 200, "fields": { "name": "Can delete dataset set", - "content_type": 53, + "content_type": 52, "codename": "delete_datasetset" } }, { "model": "auth.permission", - "pk": 205, + "pk": 201, "fields": { "name": "Can view dataset set", - "content_type": 53, + "content_type": 52, "codename": "view_datasetset" } }, { "model": "ponos.farm", - "pk": "f2a2e1cb-2090-4b69-b204-1a40440e2619", + "pk": "787cc46d-2877-4cd7-8bac-f79d092d8550", "fields": { "name": "Wheat farm", - "seed": "c04bde99f4349c3c806e4e82dc60c42163fc3820a421ce82c4055d67ae4ec4bb" + "seed": "d90dfa09bb51171382a67d5390b643e7040e1a3d50aed2472889d2d45a0fc08a" } }, { "model": "training.dataset", - "pk": "673cba70-7596-4a91-9921-49eebe97f63f", + "pk": "5661afe1-89ce-441c-b116-c9900831bf01", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "creator": 2, "task": null, "name": "First Dataset", @@ -3772,11 +3752,11 @@ }, { "model": "training.dataset", - "pk": "da0300a9-55e5-4a0d-90a2-4fb42d0a4744", + "pk": "a89810dd-38a6-4fe0-81b8-870a2efd8340", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "b1be7812-a2b1-4d26-a031-8d85869228df", + "corpus": "a5047c63-e91c-4cf1-9cd7-068bc3e1de9b", "creator": 2, "task": null, "name": "Second Dataset", @@ -3787,50 +3767,50 @@ }, { "model": "training.datasetset", - "pk": "3cd3cbbd-6454-4977-814c-42fc1a4c858a", + "pk": "53a16c0f-7aee-4893-9063-f833255f5cd5", "fields": { - "name": "dev", - "dataset": "da0300a9-55e5-4a0d-90a2-4fb42d0a4744" + "name": "train", + "dataset": "5661afe1-89ce-441c-b116-c9900831bf01" } }, { "model": "training.datasetset", - "pk": "3e1573e3-044b-47b0-b2b3-27eda5b4e441", + "pk": "8c29f873-54ad-4025-b871-0756aee654db", "fields": { - "name": "test", - "dataset": "673cba70-7596-4a91-9921-49eebe97f63f" + "name": "train", + "dataset": "a89810dd-38a6-4fe0-81b8-870a2efd8340" } }, { "model": "training.datasetset", - "pk": "4454e41b-c60c-4d68-b428-d07c74af1f17", + "pk": "c59f3671-4b48-4d6d-a276-0aeef9f0918a", "fields": { - "name": "dev", - "dataset": "673cba70-7596-4a91-9921-49eebe97f63f" + "name": "test", + "dataset": "5661afe1-89ce-441c-b116-c9900831bf01" } }, { "model": "training.datasetset", - "pk": "5333a80b-ff91-4a6b-9703-b26b8f472118", + "pk": "d40ac85f-2114-4c25-9ae6-20fe3b586199", "fields": { - "name": "test", - "dataset": "da0300a9-55e5-4a0d-90a2-4fb42d0a4744" + "name": "dev", + "dataset": "5661afe1-89ce-441c-b116-c9900831bf01" } }, { "model": "training.datasetset", - "pk": "94c3d754-21ad-49e3-90d0-3874e54aa029", + "pk": "f7a6d650-b66d-49d7-895a-5ed5107cf6e2", "fields": { - "name": "train", - "dataset": "da0300a9-55e5-4a0d-90a2-4fb42d0a4744" + "name": "dev", + "dataset": "a89810dd-38a6-4fe0-81b8-870a2efd8340" } }, { "model": "training.datasetset", - "pk": "d2e394b1-6a76-4b83-8966-392422317d2b", + "pk": "fe34e567-2cb8-4adf-87c5-fb5f59ccab4b", "fields": { - "name": "train", - "dataset": "673cba70-7596-4a91-9921-49eebe97f63f" + "name": "test", + "dataset": "a89810dd-38a6-4fe0-81b8-870a2efd8340" } } ] diff --git a/arkindex/images/api.py b/arkindex/images/api.py index cefedc15c8..294283cc43 100644 --- a/arkindex/images/api.py +++ b/arkindex/images/api.py @@ -16,8 +16,7 @@ from arkindex.images.serializers import ( ImageSerializer, ImageUploadSerializer, ) -from arkindex.project.permissions import IsVerified -from arkindex.users.models import Scope +from arkindex.project.permissions import CanCreateIIIFImage, CanUploadS3Image, IsVerified @extend_schema_view( @@ -47,8 +46,7 @@ class ImageCreate(CreateAPIView): """ serializer_class = ImageUploadSerializer - permission_classes = (IsVerified, ) - scopes = (Scope.UploadS3Image, ) + permission_classes = (IsVerified, CanUploadS3Image,) def perform_create(self, serializer): image_hash = serializer.validated_data.get("hash") @@ -78,8 +76,7 @@ class IIIFURLCreate(CreateAPIView): The URL should be of the image's identifier, not of its Image Information request (`/info.json`). """ serializer_class = IIIFImageSerializer - permission_classes = (IsVerified, ) - scopes = (Scope.CreateIIIFImage, ) + permission_classes = (IsVerified, CanCreateIIIFImage, ) class IIIFInformationCreate(CreateAPIView): @@ -89,8 +86,7 @@ class IIIFInformationCreate(CreateAPIView): Image Information specification: https://iiif.io/api/image/2.1/#image-information """ serializer_class = ImageInformationSerializer - permission_classes = (IsVerified, ) - scopes = (Scope.CreateIIIFImage, ) + permission_classes = (IsVerified, CanCreateIIIFImage, ) @extend_schema( operation_id="CreateIIIFInformation", diff --git a/arkindex/images/tests/test_image_api.py b/arkindex/images/tests/test_image_api.py index f54a8b443e..ccac55f3bc 100644 --- a/arkindex/images/tests/test_image_api.py +++ b/arkindex/images/tests/test_image_api.py @@ -11,7 +11,6 @@ from arkindex.ponos.models import Farm from arkindex.process.models import Process, ProcessMode from arkindex.project.aws import S3FileStatus from arkindex.project.tests import FixtureAPITestCase -from arkindex.users.models import Scope class ImageMethods: @@ -43,24 +42,24 @@ class TestImageApi(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) def test_create_image_requires_scope(self): - self.assertFalse(self.user.user_scopes.filter(scope=Scope.UploadS3Image).exists()) + self.assertFalse(self.user.can_upload_s3_image) self.client.force_login(self.user) - with self.assertNumQueries(3): + with self.assertNumQueries(2): response = self.client.post(reverse("api:image-create"), {"hash": self.image_hash}) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertDictEqual(response.json(), { - "detail": "You do not have permission to perform this action.", - "missing_scopes": [Scope.UploadS3Image.value], + "detail": "You do not have permission to upload images to S3.", }) - self.user.user_scopes.create(scope=Scope.UploadS3Image) + self.user.can_upload_s3_image = True + self.user.save() response = self.client.post(reverse("api:image-create"), {"hash": self.image_hash}) self.assertEqual(response.status_code, status.HTTP_201_CREATED) def test_create_image_admin_noscope(self): - self.assertFalse(self.superuser.user_scopes.filter(scope=Scope.UploadS3Image).exists()) + self.assertFalse(self.superuser.can_upload_s3_image) self.client.force_login(self.superuser) with self.assertNumQueries(5): @@ -487,7 +486,7 @@ class TestImageApi(FixtureAPITestCase): }) def test_create_iiif_image_scope(self): - self.assertFalse(self.user.user_scopes.filter(scope=Scope.CreateIIIFImage).exists()) + self.assertFalse(self.user.can_create_iiif_image) self.client.force_login(self.user) response = self.client.post( reverse("api:iiif-url-create"), @@ -495,11 +494,11 @@ class TestImageApi(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertDictEqual(response.json(), { - "detail": "You do not have permission to perform this action.", - "missing_scopes": [Scope.CreateIIIFImage.value], + "detail": "You do not have permission to create IIIF images.", }) - self.user.user_scopes.create(scope=Scope.CreateIIIFImage) + self.user.can_create_iiif_image = True + self.user.save() response = self.client.post( reverse("api:iiif-url-create"), {"url": "https://test-iiif-server.teklia.com/images/image_path"} @@ -509,7 +508,7 @@ class TestImageApi(FixtureAPITestCase): def test_create_iiif_image_admin_noscope(self): self.client.force_login(self.superuser) - self.assertFalse(self.superuser.user_scopes.filter(scope=Scope.CreateIIIFImage).exists()) + self.assertFalse(self.superuser.can_create_iiif_image) response = self.client.post( reverse("api:iiif-url-create"), {"url": "https://test-iiif-server.teklia.com/images/image_path"} @@ -616,7 +615,7 @@ class TestImageApi(FixtureAPITestCase): process.run() task = process.tasks.first() # The user scope should not be necessary with Ponos task authentication - self.assertFalse(self.user.user_scopes.filter(scope=Scope.CreateIIIFImage).exists()) + self.assertFalse(self.user.can_create_iiif_image) response = self.client.post( reverse("api:iiif-info-create"), @@ -663,7 +662,7 @@ class TestImageApi(FixtureAPITestCase): process.run() task = process.tasks.first() # The user scope should not be necessary with Ponos task authentication - self.assertFalse(self.user.user_scopes.filter(scope=Scope.CreateIIIFImage).exists()) + self.assertFalse(self.user.can_create_iiif_image) response = self.client.post( reverse("api:iiif-info-create"), @@ -695,7 +694,7 @@ class TestImageApi(FixtureAPITestCase): }) def test_create_image_information_external_scope(self): - self.assertFalse(self.user.user_scopes.filter(scope=Scope.CreateIIIFImage).exists()) + self.assertFalse(self.user.can_create_iiif_image) self.client.force_login(self.user) payload = { "@id": "https://test-iiif-server.teklia.com/images/image_path", @@ -706,7 +705,8 @@ class TestImageApi(FixtureAPITestCase): response = self.client.post(reverse("api:iiif-info-create"), payload) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.user.user_scopes.create(scope=Scope.CreateIIIFImage) + self.user.can_create_iiif_image = True + self.user.save() response = self.client.post(reverse("api:iiif-info-create"), payload) self.assertEqual(response.status_code, status.HTTP_201_CREATED) data = response.json() diff --git a/arkindex/process/api.py b/arkindex/process/api.py index e7c63d12b2..16785a6719 100644 --- a/arkindex/process/api.py +++ b/arkindex/process/api.py @@ -112,11 +112,11 @@ from arkindex.project.mixins import ( ) from arkindex.project.openapi import UUID_OR_FALSE, UUID_OR_STR from arkindex.project.pagination import CountCursorPagination -from arkindex.project.permissions import IsVerified, IsVerifiedOrReadOnly +from arkindex.project.permissions import CanIngest, IsVerified, IsVerifiedOrReadOnly from arkindex.project.tools import PercentileCont from arkindex.project.triggers import create_process_failures, process_delete from arkindex.training.models import DatasetSet, Model -from arkindex.users.models import Role, Scope +from arkindex.users.models import Role logger = logging.getLogger(__name__) @@ -2078,8 +2078,7 @@ class BucketList(ListAPIView): List the S3 buckets that are available for ingestion. """ - permission_classes = (IsVerified, ) - scopes = (Scope.S3Ingest, ) + permission_classes = (IsVerified, CanIngest, ) pagination_class = None serializer_class = BucketSerializer @@ -2112,11 +2111,10 @@ class S3ImportCreate(CreateAPIView): """ Create a new S3 import. - Requires a verified email and the `s3_ingest` scope. + Requires a verified email and the `can_ingest` permission. """ - permission_classes = (IsVerified, ) - scopes = (Scope.S3Ingest, ) + permission_classes = (IsVerified, CanIngest, ) serializer_class = S3ImportSerializer def check_permissions(self, *args, **kwargs): diff --git a/arkindex/process/tests/test_create_s3_import.py b/arkindex/process/tests/test_create_s3_import.py index 9750b1ca9e..013ea9c592 100644 --- a/arkindex/process/tests/test_create_s3_import.py +++ b/arkindex/process/tests/test_create_s3_import.py @@ -9,7 +9,7 @@ from arkindex.images.models import ImageServer from arkindex.ponos.models import Farm from arkindex.process.models import Process, ProcessMode, Worker, WorkerType, WorkerVersion, WorkerVersionState from arkindex.project.tests import FixtureTestCase -from arkindex.users.models import Role, Scope +from arkindex.users.models import Role class TestCreateS3Import(FixtureTestCase): @@ -64,7 +64,7 @@ class TestCreateS3Import(FixtureTestCase): @override_settings(ARKINDEX_FEATURES={"ingest": True}) def test_requires_verified(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True self.user.verified_email = False self.user.save() self.client.force_login(self.user) @@ -80,9 +80,9 @@ class TestCreateS3Import(FixtureTestCase): @override_settings(ARKINDEX_FEATURES={"ingest": True}) def test_requires_scope(self): - self.assertFalse(self.user.user_scopes.exists()) + self.assertFalse(self.user.can_ingest) self.client.force_login(self.user) - with self.assertNumQueries(3): + with self.assertNumQueries(2): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "folder_type": "volume", @@ -96,7 +96,8 @@ class TestCreateS3Import(FixtureTestCase): @patch("arkindex.users.managers.BaseACLManager.filter_rights") def test_invalid(self, filter_rights_mock): filter_rights_mock.return_value = Corpus.objects.filter(id=self.corpus.id) - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) private_corpus = Corpus.objects.create(name="nope") private_element = private_corpus.elements.create(type=private_corpus.types.create(slug="something"), name="can't touch this") @@ -167,12 +168,13 @@ class TestCreateS3Import(FixtureTestCase): INGEST_PREFIX_BY_BUCKET_NAME=True, ) def test_create(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) element = self.corpus.elements.get(name="Volume 1") farm = Farm.objects.create(name="Crypto farm") - with self.assertNumQueries(25): + with self.assertNumQueries(24): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "element_id": str(element.id), @@ -234,10 +236,11 @@ class TestCreateS3Import(FixtureTestCase): INGEST_PREFIX_BY_BUCKET_NAME=True, ) def test_defaults(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) - with self.assertNumQueries(23): + with self.assertNumQueries(22): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "bucket_name": "blah", @@ -288,12 +291,13 @@ class TestCreateS3Import(FixtureTestCase): ) @patch("arkindex.ponos.models.Farm.is_available", return_value=False) def test_farm_guest(self, is_available_mock): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) farm = Farm.objects.create(name="Crypto farm") - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "bucket_name": "blah", @@ -316,13 +320,14 @@ class TestCreateS3Import(FixtureTestCase): ) @patch("arkindex.process.serializers.ingest.get_default_farm") def test_default_farm(self, get_default_farm_mock): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) default_farm = Farm.objects.create(name="Crypto farm") get_default_farm_mock.return_value = default_farm - with self.assertNumQueries(23): + with self.assertNumQueries(22): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "bucket_name": "blah", @@ -339,13 +344,14 @@ class TestCreateS3Import(FixtureTestCase): @patch("arkindex.ponos.models.Farm.is_available", return_value=False) @patch("arkindex.process.serializers.ingest.get_default_farm") def test_default_farm_guest(self, get_default_farm_mock, is_available_mock): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) default_farm = Farm.objects.create(name="Crypto farm") get_default_farm_mock.return_value = default_farm - with self.assertNumQueries(4): + with self.assertNumQueries(3): response = self.client.post(reverse("api:s3-import-create"), { "corpus_id": str(self.corpus.id), "bucket_name": "blah", diff --git a/arkindex/process/tests/test_list_buckets.py b/arkindex/process/tests/test_list_buckets.py index 284af96d7b..41b2c789af 100644 --- a/arkindex/process/tests/test_list_buckets.py +++ b/arkindex/process/tests/test_list_buckets.py @@ -4,7 +4,6 @@ from django.urls import reverse from rest_framework import status from arkindex.project.tests import FixtureAPITestCase -from arkindex.users.models import Scope from moto import mock_s3 @@ -28,8 +27,8 @@ class TestListBuckets(FixtureAPITestCase): @override_settings(ARKINDEX_FEATURES={"ingest": True}) def test_requires_verified(self): self.user.verified_email = False + self.user.can_ingest = True self.user.save() - self.user.user_scopes.create(scope=Scope.S3Ingest) self.client.force_login(self.user) with self.assertNumQueries(2): @@ -38,10 +37,10 @@ class TestListBuckets(FixtureAPITestCase): @override_settings(ARKINDEX_FEATURES={"ingest": True}) def test_requires_scope(self): - self.assertFalse(self.user.user_scopes.exists()) + self.assertFalse(self.user.can_ingest) self.client.force_login(self.user) - with self.assertNumQueries(3): + with self.assertNumQueries(2): resp = self.client.get(reverse("api:bucket-list")) self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) @@ -53,9 +52,10 @@ class TestListBuckets(FixtureAPITestCase): INGEST_S3_REGION=None, ) def test_missing_settings(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) - with self.assertNumQueries(3), self.assertRaises(AssertionError): + with self.assertNumQueries(2), self.assertRaises(AssertionError): self.client.get(reverse("api:bucket-list")) @override_settings( @@ -68,7 +68,8 @@ class TestListBuckets(FixtureAPITestCase): ) @mock_s3 def test_list_buckets(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) # Create some buckets with moto to get some test data @@ -76,7 +77,7 @@ class TestListBuckets(FixtureAPITestCase): s3.create_bucket(Bucket="dank-memes") s3.create_bucket(Bucket="cursed-emojis") - with self.assertNumQueries(3): + with self.assertNumQueries(2): resp = self.client.get(reverse("api:bucket-list")) self.assertEqual(resp.status_code, status.HTTP_200_OK) @@ -98,14 +99,15 @@ class TestListBuckets(FixtureAPITestCase): ) @mock_s3 def test_list_buckets_extra(self): - self.user.user_scopes.create(scope=Scope.S3Ingest) + self.user.can_ingest = True + self.user.save() self.client.force_login(self.user) s3 = boto3.resource("s3", region_name="us-east-1") s3.create_bucket(Bucket="dank-memes") s3.create_bucket(Bucket="cursed-emojis") - with self.assertNumQueries(3): + with self.assertNumQueries(2): resp = self.client.get(reverse("api:bucket-list")) self.assertEqual(resp.status_code, status.HTTP_200_OK) diff --git a/arkindex/project/permissions.py b/arkindex/project/permissions.py index ee36346dcc..7724a7fbc5 100644 --- a/arkindex/project/permissions.py +++ b/arkindex/project/permissions.py @@ -1,4 +1,5 @@ import logging +from functools import wraps from rest_framework.exceptions import PermissionDenied from rest_framework.permissions import SAFE_METHODS, BasePermission @@ -16,36 +17,43 @@ def require_verified_email(request, view): return request.user.is_authenticated and (request.user.is_admin or request.user.verified_email) -def _get_scopes(request, view): - specific_scopes_attr = f"{request.method.lower()}_scopes" - scopes = list(getattr(view, "scopes", [])) - scopes.extend(getattr(view, specific_scopes_attr, [])) - return set(scopes) - - -def check_scopes(request, view): +def scope_check_skips(func): """ - When the `scopes` attribute is defined on the view, ensure an authenticated user has said scopes, - no matter which HTTP method is used. - When the `<method>_scopes` attribute is defined for a given HTTP method, ensures the user - has said scopes only for this HTTP method. + Decorator to skip scope checks if the user is not logged in, is an admin, or is a Ponos task. """ - missing_scopes = _get_scopes(request, view) - # Skip this check if there are no defined scopes, if the user is not logged in, is an admin, or is a Ponos task. - if not missing_scopes or not request.user.is_authenticated or request.user.is_admin or isinstance(request.auth, Task): - return True + @wraps(func) + def wrapper(request, *args, **kwargs): + if not request.user.is_authenticated or request.user.is_admin or isinstance(request.auth, Task): + return True + return func(request, *args, **kwargs) + return wrapper + + +@scope_check_skips +def require_can_upload_s3_image(request, view): + if not request.user.can_upload_s3_image: + raise PermissionDenied("You do not have permission to upload images to S3.") + return True + + +@scope_check_skips +def require_can_create_iiif_image(request, view): + if not request.user.can_create_iiif_image: + raise PermissionDenied("You do not have permission to create IIIF images.") + return True - if request.user.is_authenticated: - # Tell which scopes are missing by subtracting found scopes from the expected scopes - missing_scopes -= set(request.user.user_scopes.filter(scope__in=missing_scopes).values_list("scope", flat=True)) - if missing_scopes: - # If scopes are not matched, cause a custom error - raise PermissionDenied({ - "detail": PermissionDenied.default_detail, - "missing_scopes": [scope.value for scope in missing_scopes], - }) +@scope_check_skips +def require_can_ingest(request, view): + if not request.user.can_ingest: + raise PermissionDenied("You do not have permission to access S3 ingestion features.") + return True + +@scope_check_skips +def require_can_create_worker_version(request, view): + if not request.user.can_create_worker_version: + raise PermissionDenied("You do not have permission to create worker versions.") return True @@ -76,7 +84,7 @@ class ArkindexPermission(BasePermission): class IsAuthenticated(ArkindexPermission): - checks = (require_auth, check_scopes) + checks = (require_auth, ) class IsAuthenticatedOrReadOnly(IsAuthenticated): @@ -84,8 +92,24 @@ class IsAuthenticatedOrReadOnly(IsAuthenticated): class IsVerified(ArkindexPermission): - checks = (require_verified_email, check_scopes) + checks = (require_verified_email, ) class IsVerifiedOrReadOnly(IsVerified): allow_safe_methods = True + + +class CanUploadS3Image(ArkindexPermission): + checks = (require_can_upload_s3_image, ) + + +class CanCreateIIIFImage(ArkindexPermission): + checks = (require_can_create_iiif_image, ) + + +class CanCreateWorkerVersion(ArkindexPermission): + checks = (require_can_create_worker_version, ) + + +class CanIngest(ArkindexPermission): + checks = (require_can_ingest, ) diff --git a/arkindex/sql_validation/process_elements_filter_ml_class.sql b/arkindex/sql_validation/process_elements_filter_ml_class.sql index 318cdd913b..b680823edc 100644 --- a/arkindex/sql_validation/process_elements_filter_ml_class.sql +++ b/arkindex/sql_validation/process_elements_filter_ml_class.sql @@ -6,6 +6,10 @@ SELECT "users_user"."id", "users_user"."is_active", "users_user"."is_admin", "users_user"."verified_email", + "users_user"."can_upload_s3_image", + "users_user"."can_create_iiif_image", + "users_user"."can_ingest", + "users_user"."can_create_worker_version", "users_user"."created", "users_user"."updated" FROM "users_user" diff --git a/arkindex/sql_validation/process_elements_filter_type.sql b/arkindex/sql_validation/process_elements_filter_type.sql index 3fea7de04d..ca208bed06 100644 --- a/arkindex/sql_validation/process_elements_filter_type.sql +++ b/arkindex/sql_validation/process_elements_filter_type.sql @@ -6,6 +6,10 @@ SELECT "users_user"."id", "users_user"."is_active", "users_user"."is_admin", "users_user"."verified_email", + "users_user"."can_upload_s3_image", + "users_user"."can_create_iiif_image", + "users_user"."can_ingest", + "users_user"."can_create_worker_version", "users_user"."created", "users_user"."updated" FROM "users_user" diff --git a/arkindex/sql_validation/process_elements_top_level.sql b/arkindex/sql_validation/process_elements_top_level.sql index 04772b592c..2aa70b65dd 100644 --- a/arkindex/sql_validation/process_elements_top_level.sql +++ b/arkindex/sql_validation/process_elements_top_level.sql @@ -6,6 +6,11 @@ SELECT "users_user"."id", "users_user"."is_active", "users_user"."is_admin", "users_user"."verified_email", + "users_user"."can_upload_s3_image", + "users_user"."can_create_iiif_image", + "users_user"."can_ingest", + "users_user"."can_create_worker_version", + "users_user"."created", "users_user"."updated" FROM "users_user" diff --git a/arkindex/sql_validation/process_elements_with_image.sql b/arkindex/sql_validation/process_elements_with_image.sql index 9bdfca2670..46b90514e1 100644 --- a/arkindex/sql_validation/process_elements_with_image.sql +++ b/arkindex/sql_validation/process_elements_with_image.sql @@ -6,6 +6,10 @@ SELECT "users_user"."id", "users_user"."is_active", "users_user"."is_admin", "users_user"."verified_email", + "users_user"."can_upload_s3_image", + "users_user"."can_create_iiif_image", + "users_user"."can_ingest", + "users_user"."can_create_worker_version", "users_user"."created", "users_user"."updated" FROM "users_user" diff --git a/arkindex/users/admin.py b/arkindex/users/admin.py index a50a388cf8..893e19f291 100644 --- a/arkindex/users/admin.py +++ b/arkindex/users/admin.py @@ -4,9 +4,8 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.contrib.auth.models import Group as BaseGroup from django.db.models.functions import Collate -from enumfields.admin import EnumFieldListFilter -from arkindex.users.models import User, UserScope +from arkindex.users.models import User class UserCreationForm(forms.ModelForm): @@ -66,7 +65,7 @@ class UserAdmin(BaseUserAdmin): list_filter = ("is_admin", ) fieldsets = ( (None, {"fields": ("email", "display_name", "verified_email", "password")}), - ("Permissions", {"fields": ("is_admin", "is_active")}), + ("Permissions", {"fields": ("is_admin", "is_active", "can_upload_s3_image", "can_create_iiif_image", "can_ingest", "can_create_worker_version")}), ) # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin # overrides get_fieldsets to use this attribute when creating a user. @@ -89,12 +88,6 @@ class UserAdmin(BaseUserAdmin): return qs.annotate(searchable_email=Collate("email", "default")) -class UserScopeAdmin(admin.ModelAdmin): - list_display = ("user", "scope") - list_filter = [("scope", EnumFieldListFilter), ] - - admin.site.register(User, UserAdmin) -admin.site.register(UserScope, UserScopeAdmin) # Remove the admin page for the default Django groups admin.site.unregister(BaseGroup) diff --git a/arkindex/users/migrations/0001_initial.py b/arkindex/users/migrations/0001_initial.py index f21fb4f20d..16b6e68972 100644 --- a/arkindex/users/migrations/0001_initial.py +++ b/arkindex/users/migrations/0001_initial.py @@ -10,8 +10,6 @@ from django.contrib.postgres.operations import CreateCollation from django.db import migrations, models from enumfields import Enum -import arkindex.users.models - class OAuthStatus(Enum): Created = "created" @@ -19,6 +17,13 @@ class OAuthStatus(Enum): Error = "error" +class Scope(Enum): + UploadS3Image = "upload_s3_image" + CreateIIIFImage = "create_iiif_image" + S3Ingest = "s3_ingest" + CreateDockerWorkerVersion = "create_docker_worker_version" + + class Migration(migrations.Migration): initial = True @@ -93,7 +98,7 @@ class Migration(migrations.Migration): name="UserScope", fields=[ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), - ("scope", enumfields.fields.EnumField(enum=arkindex.users.models.Scope, max_length=50)), + ("scope", enumfields.fields.EnumField(enum=Scope, max_length=50)), ("user", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="user_scopes", to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/arkindex/users/migrations/0004_user_scopes.py b/arkindex/users/migrations/0004_user_scopes.py new file mode 100644 index 0000000000..a349f802fc --- /dev/null +++ b/arkindex/users/migrations/0004_user_scopes.py @@ -0,0 +1,83 @@ +# Generated by Django 4.2.13 on 2024-08-26 08:48 + +from django.db import migrations, models +from django.db.models import Exists, OuterRef +from enumfields import Enum, EnumField + + +class Scope(Enum): + UploadS3Image = "upload_s3_image" + CreateIIIFImage = "create_iiif_image" + S3Ingest = "s3_ingest" + CreateDockerWorkerVersion = "create_docker_worker_version" + +def create_user_scope_booleans(apps, schema): + UserScope = apps.get_model("users", "UserScope") + User = apps.get_model("users", "User") + + User.objects.all().update( + can_create_iiif_image=Exists(UserScope.objects.filter(user_id=OuterRef("pk"), scope=Scope.CreateIIIFImage)), + can_create_worker_version=Exists(UserScope.objects.filter(user_id=OuterRef("pk"), scope=Scope.CreateDockerWorkerVersion)), + can_ingest=Exists(UserScope.objects.filter(user_id=OuterRef("pk"), scope=Scope.S3Ingest)), + can_upload_s3_image=Exists(UserScope.objects.filter(user_id=OuterRef("pk"), scope=Scope.UploadS3Image)), + ) + +def create_user_scopes(apps, schema): + UserScope = apps.get_model("users", "UserScope") + User = apps.get_model("users", "User") + + scope_matching = [ + ("can_upload_s3_image", Scope.UploadS3Image), + ("can_create_iiif_image", Scope.CreateIIIFImage), + ("can_ingest", Scope.S3Ingest), + ("can_create_worker_version", Scope.CreateDockerWorkerVersion) + ] + + UserScope.objects.bulk_create( + [ + UserScope(user_id=user.id, scope=scope) + for user in User.objects.iterator() + for scope_attr, scope in scope_matching + if getattr(user, scope_attr) + ] + ) + +class Migration(migrations.Migration): + + dependencies = [ + ("users", "0003_delete_oauthcredentials"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="can_create_iiif_image", + field=models.BooleanField(default=False, help_text="Allows adding images to Arkindex from external IIIF servers using the CreateIIIFImage endpoint.\nThis could allow someone to make Arkindex perform DoS attacks on other IIIF servers due to the image checks."), + ), + migrations.AddField( + model_name="user", + name="can_create_worker_version", + field=models.BooleanField(default=False, help_text="Allows creating workers and worker versions from Docker images."), + ), + migrations.AddField( + model_name="user", + name="can_ingest", + field=models.BooleanField(default=False, help_text="Allows access to S3 ingestion features."), + ), + migrations.AddField( + model_name="user", + name="can_upload_s3_image", + field=models.BooleanField(default=False, help_text="Allows uploading images to an S3 bucket using the CreateImage endpoint and `s3_put_url`.\nThis could allow someone to upload very large files or make DoS attacks on the local IIIF image server."), + ), + migrations.AlterField( + model_name="userscope", + name="scope", + field=EnumField(enum=Scope, max_length=50), + ), + migrations.RunPython( + create_user_scope_booleans, + reverse_code=create_user_scopes, + elidable=False + ), + migrations.DeleteModel(name="UserScope") + ] diff --git a/arkindex/users/models.py b/arkindex/users/models.py index 47552f0f37..f3feccbf77 100644 --- a/arkindex/users/models.py +++ b/arkindex/users/models.py @@ -1,4 +1,5 @@ import uuid +from textwrap import dedent from django.conf import settings from django.contrib.auth.models import AbstractBaseUser @@ -7,7 +8,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django_rq.queues import get_queue -from enumfields import Enum, EnumField +from enumfields import Enum from rq.utils import as_text from arkindex.users.managers import UserManager @@ -79,6 +80,17 @@ class User(AbstractBaseUser): is_admin = models.BooleanField(default=False) verified_email = models.BooleanField(default=False) + can_upload_s3_image = models.BooleanField(default=False, help_text=dedent(""" + Allows uploading images to an S3 bucket using the CreateImage endpoint and `s3_put_url`. + This could allow someone to upload very large files or make DoS attacks on the local IIIF image server. + """).strip()) + can_create_iiif_image = models.BooleanField(default=False, help_text=dedent(""" + Allows adding images to Arkindex from external IIIF servers using the CreateIIIFImage endpoint. + This could allow someone to make Arkindex perform DoS attacks on other IIIF servers due to the image checks. + """).strip()) + can_ingest = models.BooleanField(default=False, help_text="Allows access to S3 ingestion features.") + can_create_worker_version = models.BooleanField(default=False, help_text="Allows creating workers and worker versions from Docker images.") + selected_elements = models.ManyToManyField( "documents.Element", through="documents.Selection", @@ -111,18 +123,6 @@ class User(AbstractBaseUser): # Simplest possible answer: Yes, always return True - def has_scopes(self, *scopes): - if not scopes: - return True - assert all(isinstance(scope, Scope) for scope in scopes), "Scopes should be from the Scope enum" - return self.user_scopes.filter(scope__in=scopes).count() == len(set(scopes)) - - def has_scope(self, scope): - assert isinstance(scope, Scope), "Scope should be from the Scope enum" - # TODO: Could be optimized in a way similar to Process.get_state() - # See https://gitlab.teklia.com/arkindex/ponos/-/blob/e5989f3e1dd1f6d7d93ba940b7ed2c5471ddd34f/ponos/models.py#L370 - return self.user_scopes.filter(scope=scope).exists() - @property def is_staff(self): """Is the user a member of staff?""" @@ -182,38 +182,3 @@ class Group(models.Model): def __str__(self): return self.name - - -class Scope(Enum): - - UploadS3Image = "upload_s3_image" - """ - Allows uploading images to an S3 bucket using the CreateImage endpoint and `s3_put_url`. - This could allow someone to upload very large files or make DoS attacks on the local IIIF image server. - """ - - CreateIIIFImage = "create_iiif_image" - """ - Allows adding images to Arkindex from external IIIF servers using the CreateIIIFImage endpoint. - This could allow someone to make Arkindex perform DoS attacks on other IIIF servers due to the image checks. - """ - - S3Ingest = "s3_ingest" - """ - Allows access to S3 ingestion features. - """ - - CreateDockerWorkerVersion = "create_docker_worker_version" - """ - Allows creating a worker version and its Git stack from a docker image - """ - - -class UserScope(models.Model): - user = models.ForeignKey("users.User", related_name="user_scopes", on_delete=models.CASCADE) - scope = EnumField(Scope, max_length=50) - - class Meta: - unique_together = ( - "user", "scope" - ) diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py index 41ccf7d98b..1c335a730e 100644 --- a/arkindex/users/serializers.py +++ b/arkindex/users/serializers.py @@ -10,7 +10,7 @@ from rest_framework import serializers from rest_framework.validators import UniqueValidator from arkindex.documents.models import Corpus -from arkindex.users.models import Group, Role, Scope, User, UserScope +from arkindex.users.models import Group, Role, User def validate_user_password(user, data): @@ -40,6 +40,10 @@ class UserSerializer(SimpleUserSerializer): "password", "verified_email", "is_admin", + "can_upload_s3_image", + "can_create_iiif_image", + "can_ingest", + "can_create_worker_version", "auth_token", "features", "has_usable_password", @@ -49,6 +53,10 @@ class UserSerializer(SimpleUserSerializer): "email", "verified_email", "is_admin", + "can_upload_s3_image", + "can_create_iiif_image", + "can_ingest", + "can_create_worker_version", "auth_token", ) extra_kwargs = { @@ -222,16 +230,16 @@ class UserEmailVerificationSerializer(UserSerializer): raise ValidationError({"__all__": [error_msg]}) # Set self.instance so the view can build the response with the current user self.instance = user - # Only update verified_email field for the current user - return {"verified_email": True} + # Update verified_email field for the current user and give image upload permissions + return { + "verified_email": True, + "can_upload_s3_image": True, + "can_create_iiif_image": True, + } @transaction.atomic def update(self, instance, validated_data): instance = super().update(instance, validated_data) - UserScope.objects.bulk_create([ - UserScope(user=instance, scope=Scope.CreateIIIFImage), - UserScope(user=instance, scope=Scope.UploadS3Image), - ], ignore_conflicts=True) # If a default group into which to add newly registered and verified users has been # defined, then add the user to that group if settings.SIGNUP_DEFAULT_GROUP: diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py index 8c289177aa..57cc042162 100644 --- a/arkindex/users/tests/test_registration.py +++ b/arkindex/users/tests/test_registration.py @@ -10,7 +10,7 @@ from rest_framework import status from arkindex.documents.models import Corpus from arkindex.project.default_corpus import DEFAULT_CORPUS_TYPES from arkindex.project.tests import FixtureAPITestCase -from arkindex.users.models import Group, Right, Role, Scope, User +from arkindex.users.models import Group, Right, Role, User from arkindex.users.tasks import send_verification_email @@ -188,11 +188,11 @@ class TestRegistration(FixtureAPITestCase): **values } for values in DEFAULT_CORPUS_TYPES] ) - - self.assertCountEqual( - list(newuser.user_scopes.values_list("scope", flat=True)), - [Scope.CreateIIIFImage, Scope.UploadS3Image], - ) + # Check created permissions + self.assertTrue(newuser.can_create_iiif_image) + self.assertTrue(newuser.can_upload_s3_image) + self.assertFalse(newuser.can_ingest) + self.assertFalse(newuser.can_create_worker_version) def test_email_verification_default_group(self): """ @@ -203,7 +203,7 @@ class TestRegistration(FixtureAPITestCase): newuser = User.objects.create_user("newuser@example.com", password="hunter2") self.assertFalse(newuser.verified_email) - with (self.settings(SIGNUP_DEFAULT_GROUP=str(test_group.id)), self.assertNumQueries(11)): + with (self.settings(SIGNUP_DEFAULT_GROUP=str(test_group.id)), self.assertNumQueries(10)): response = self.client.post( reverse("api:verify-email"), data={ @@ -223,7 +223,7 @@ class TestRegistration(FixtureAPITestCase): with ( self.settings(SIGNUP_DEFAULT_GROUP="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"), - self.assertNumQueries(7), + self.assertNumQueries(6), self.assertRaises(Group.DoesNotExist) ): self.client.post( @@ -241,7 +241,7 @@ class TestRegistration(FixtureAPITestCase): self.assertFalse(newuser.has_usable_password()) corpora = Corpus.objects.all().values_list("id", flat=True) - with self.assertNumQueries(7): + with self.assertNumQueries(6): response = self.client.post( reverse("api:verify-email"), data={ @@ -315,7 +315,8 @@ class TestRegistration(FixtureAPITestCase): self.assertEqual(auth.get_user(self.client).email, "newuser@example.com") user = User.objects.get_by_natural_key("newuser@example.com") self.assertFalse(user.verified_email) - self.assertFalse(user.user_scopes.exists()) + self.assertFalse(user.can_upload_s3_image) + self.assertFalse(user.can_create_iiif_image) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["newuser@example.com"]) @@ -331,7 +332,8 @@ class TestRegistration(FixtureAPITestCase): self.assertEqual(auth.get_user(self.client).email, "newuser@example.com") user = User.objects.get_by_natural_key("newuser@example.com") self.assertFalse(user.verified_email) - self.assertFalse(user.user_scopes.exists()) + self.assertFalse(user.can_upload_s3_image) + self.assertFalse(user.can_create_iiif_image) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to, ["newuser@example.com"]) self.assertTrue(user.check_password("myVerySecretPassword")) -- GitLab