From ddfeb01a3dbc6a49f60b09455038a293d582b30c Mon Sep 17 00:00:00 2001 From: ml bonhomme <bonhomme@teklia.com> Date: Fri, 15 Mar 2024 10:55:53 +0000 Subject: [PATCH] Remove ProcessMode Repository --- arkindex/documents/fixtures/data.json | 1171 ++++++++--------- .../management/commands/build_fixtures.py | 31 +- .../tests/tasks/test_corpus_delete.py | 5 +- arkindex/documents/tests/tasks/test_export.py | 3 +- .../documents/tests/test_retrieve_elements.py | 12 +- arkindex/images/tests/test_image_api.py | 14 +- arkindex/ponos/api.py | 9 +- arkindex/ponos/tests/test_api.py | 98 -- arkindex/ponos/tests/test_artifacts_api.py | 72 +- arkindex/process/api.py | 19 +- arkindex/process/builder.py | 11 - arkindex/process/migrations/0003_initial.py | 22 +- .../0030_remove_repository_processes.py | 48 + ..._corpus_check_and_remove_revision_field.py | 21 + arkindex/process/models.py | 9 +- arkindex/process/serializers/imports.py | 5 - arkindex/process/serializers/training.py | 2 +- arkindex/process/serializers/workers.py | 32 +- .../process/tests/test_corpus_worker_runs.py | 4 +- arkindex/process/tests/test_create_process.py | 19 +- arkindex/process/tests/test_datafile_api.py | 2 +- .../tests/test_docker_worker_version.py | 11 +- arkindex/process/tests/test_managers.py | 4 - .../process/tests/test_process_datasets.py | 11 +- .../process/tests/test_process_elements.py | 19 +- arkindex/process/tests/test_processes.py | 115 +- arkindex/process/tests/test_repos.py | 56 +- arkindex/process/tests/test_templates.py | 32 +- .../process/tests/test_user_workerruns.py | 4 +- arkindex/process/tests/test_workeractivity.py | 8 +- arkindex/process/tests/test_workerruns.py | 115 +- arkindex/process/tests/test_workers.py | 150 +-- arkindex/project/mixins.py | 17 +- arkindex/project/tests/test_acl_mixin.py | 15 +- arkindex/project/triggers.py | 11 +- .../process_elements_filter_ml_class.sql | 1 - .../process_elements_filter_type.sql | 1 - .../process_elements_top_level.sql | 1 - .../process_elements_with_image.sql | 1 - arkindex/training/tests/test_datasets_api.py | 4 +- 40 files changed, 834 insertions(+), 1351 deletions(-) create mode 100644 arkindex/process/migrations/0030_remove_repository_processes.py create mode 100644 arkindex/process/migrations/0031_process_corpus_check_and_remove_revision_field.py diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 9e60c75219..15e6fbb2ce 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -1,50 +1,18 @@ [ { "model": "process.process", - "pk": "26050593-712f-4f7a-b15a-4d2132241514", - "fields": { - "created": "2020-02-02T01:23:45.678Z", - "updated": "2020-02-02T01:23:45.678Z", - "name": "Process fixture", - "creator": 2, - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "mode": "workers", - "revision": null, - "activity_state": "disabled", - "started": null, - "finished": null, - "farm": "94055f35-9ac9-44a0-ac5d-386e132bea2c", - "element": null, - "folder_type": null, - "element_type": null, - "name_contains": null, - "ml_class": null, - "load_children": false, - "generate_thumbnails": false, - "chunks": 1, - "use_cache": false, - "use_gpu": false, - "template": null, - "bucket_name": null, - "prefix": null, - "files": [] - } -}, -{ - "model": "process.process", - "pk": "3421ba72-b14c-4df0-a504-1e7e90abe4b4", + "pk": "76506eee-43ab-4caa-966c-9e8e5d10ef93", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "name": null, "creator": 1, "corpus": null, - "mode": "repository", - "revision": null, + "mode": "local", "activity_state": "disabled", "started": null, "finished": null, - "farm": "94055f35-9ac9-44a0-ac5d-386e132bea2c", + "farm": null, "element": null, "folder_type": null, "element_type": null, @@ -63,19 +31,18 @@ }, { "model": "process.process", - "pk": "4a3c1857-7fe7-47ba-9e47-7ce96eefc96f", + "pk": "7a6fed8c-ed9c-4714-8036-7048462ce0f2", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "name": null, + "name": "Process fixture", "creator": 2, - "corpus": null, - "mode": "local", - "revision": null, + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "mode": "workers", "activity_state": "disabled", "started": null, "finished": null, - "farm": null, + "farm": "395522d1-94a0-407a-b5cb-347fa68ec2c4", "element": null, "folder_type": null, "element_type": null, @@ -94,15 +61,14 @@ }, { "model": "process.process", - "pk": "be97d04e-0af4-4043-9874-d20f28b30431", + "pk": "b6b7dbcb-e134-4274-93fd-9d6d06818c6f", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "name": null, - "creator": 1, + "creator": 2, "corpus": null, "mode": "local", - "revision": null, "activity_state": "disabled", "started": null, "finished": null, @@ -125,25 +91,25 @@ }, { "model": "process.repository", - "pk": "0e1654c4-20e5-4d4a-99ab-7142040b6e88", + "pk": "bcfed350-d5be-4f27-b66a-042be3e6ee64", "fields": { "url": "http://gitlab/repo" } }, { "model": "process.repository", - "pk": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "pk": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "fields": { "url": "http://my_repo.fake/workers/worker" } }, { "model": "process.revision", - "pk": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", + "pk": "2d087aa1-82ba-4ec5-af14-c19e4213f913", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "repo": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repo": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "hash": "1337", "message": "My w0rk3r", "author": "Test user" @@ -151,11 +117,11 @@ }, { "model": "process.revision", - "pk": "d2d52ec9-2d56-4df1-9118-ed884f26cb83", + "pk": "7876a435-f3a5-40f8-b30b-f388f22019bf", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "repo": "0e1654c4-20e5-4d4a-99ab-7142040b6e88", + "repo": "bcfed350-d5be-4f27-b66a-042be3e6ee64", "hash": "42", "message": "Salve", "author": "Some user" @@ -163,115 +129,115 @@ }, { "model": "process.worker", - "pk": "5a6c0c92-b9b1-4a69-a8d0-b75841cd0193", + "pk": "12b2344f-4871-40ad-aa1b-efaa70b5823f", "fields": { - "name": "File import", - "slug": "file_import", - "type": "2c4d9006-9c1f-4a62-944d-a8862aa022b1", + "name": "Document layout analyser", + "slug": "dla", + "type": "e84d4893-ae73-4162-acb6-13d606587644", "description": "", - "repository": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repository": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "public": false, "archived": null } }, { "model": "process.worker", - "pk": "7458bec4-665b-4e2d-862f-7d87bc833481", + "pk": "1a18dc1d-49e3-4724-b1e3-cbc8da483610", "fields": { - "name": "Custom worker", - "slug": "custom", - "type": "9785b33d-d517-4a91-a4d9-b192e6b042b6", + "name": "Worker requiring a GPU", + "slug": "worker-gpu", + "type": "20d3065e-0ef7-428b-888f-177f59e6ddd0", "description": "", - "repository": null, + "repository": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "public": false, "archived": null } }, { "model": "process.worker", - "pk": "89964ea9-97a3-4edf-8568-545ea810342e", + "pk": "219444d1-2a84-49f4-94d6-d5c21e36fcb9", "fields": { - "name": "Document layout analyser", - "slug": "dla", - "type": "3b3adc81-73f1-4e92-8093-d1dd9431c53f", + "name": "Generic worker with a Model", + "slug": "generic", + "type": "50729501-d9c4-473d-803f-a7cf25f0f9bd", "description": "", - "repository": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repository": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "public": false, "archived": null } }, { "model": "process.worker", - "pk": "c7439e52-9b09-489b-8dc5-13994801e8ac", + "pk": "667a82ac-a19a-4e97-9239-35a3026246cb", "fields": { - "name": "Worker requiring a GPU", - "slug": "worker-gpu", - "type": "4696efe7-e3dd-4a8c-8346-c99d479c1756", + "name": "Custom worker", + "slug": "custom", + "type": "64a618df-09d0-47eb-b999-02ceb0a114a4", "description": "", - "repository": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repository": null, "public": false, "archived": null } }, { "model": "process.worker", - "pk": "c88cf97b-25a1-4074-a88c-8d2b7a82db8c", + "pk": "9775f6a1-6238-4943-b245-b69bde621912", "fields": { "name": "Recognizer", "slug": "reco", - "type": "999707eb-4c53-469d-8fb6-ec6a80010248", + "type": "50729501-d9c4-473d-803f-a7cf25f0f9bd", "description": "", - "repository": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repository": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "public": false, "archived": null } }, { "model": "process.worker", - "pk": "f62b2ea5-7bff-4c38-9bd1-7237543cad36", + "pk": "df6dbbb2-0526-46f9-8da2-5ada8f93826a", "fields": { - "name": "Generic worker with a Model", - "slug": "generic", - "type": "999707eb-4c53-469d-8fb6-ec6a80010248", + "name": "File import", + "slug": "file_import", + "type": "3a0b2c85-f53f-4ce7-942d-37c08f356880", "description": "", - "repository": "a091592f-0ea9-4147-be4e-4f580751ac9f", + "repository": "e3f470b1-fc46-4bc1-8117-30e1c62962b7", "public": false, "archived": null } }, { "model": "process.workertype", - "pk": "2c4d9006-9c1f-4a62-944d-a8862aa022b1", + "pk": "20d3065e-0ef7-428b-888f-177f59e6ddd0", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "import", - "display_name": "Import" + "slug": "worker", + "display_name": "Worker requiring a GPU" } }, { "model": "process.workertype", - "pk": "3b3adc81-73f1-4e92-8093-d1dd9431c53f", + "pk": "3a0b2c85-f53f-4ce7-942d-37c08f356880", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "dla", - "display_name": "Document Layout Analysis" + "slug": "import", + "display_name": "Import" } }, { "model": "process.workertype", - "pk": "4696efe7-e3dd-4a8c-8346-c99d479c1756", + "pk": "50729501-d9c4-473d-803f-a7cf25f0f9bd", "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": "9785b33d-d517-4a91-a4d9-b192e6b042b6", + "pk": "64a618df-09d0-47eb-b999-02ceb0a114a4", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -281,28 +247,28 @@ }, { "model": "process.workertype", - "pk": "999707eb-4c53-469d-8fb6-ec6a80010248", + "pk": "e84d4893-ae73-4162-acb6-13d606587644", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "slug": "recognizer", - "display_name": "Recognizer" + "slug": "dla", + "display_name": "Document Layout Analysis" } }, { "model": "process.workerversion", - "pk": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "pk": "229fc630-728b-421b-a2de-9618bd8e401f", "fields": { - "worker": "c88cf97b-25a1-4074-a88c-8d2b7a82db8c", - "revision": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", - "version": null, + "worker": "667a82ac-a19a-4e97-9239-35a3026246cb", + "revision": null, + "version": 1, "configuration": { - "test": 42 + "custom": "value" }, - "state": "available", + "state": "created", "gpu_usage": "disabled", "model_usage": "disabled", - "docker_image": "492ea45f-2c2d-4bf3-a461-016204fcfb03", + "docker_image": null, "docker_image_iid": null, "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" @@ -310,67 +276,65 @@ }, { "model": "process.workerversion", - "pk": "23473bff-4362-466e-ba5f-b6843df1fdf3", + "pk": "57cd018c-43e2-491e-9684-3b939df52921", "fields": { - "worker": "7458bec4-665b-4e2d-862f-7d87bc833481", - "revision": null, - "version": 1, - "configuration": { - "custom": "value" - }, - "state": "created", + "worker": "df6dbbb2-0526-46f9-8da2-5ada8f93826a", + "revision": "2d087aa1-82ba-4ec5-af14-c19e4213f913", + "version": null, + "configuration": {}, + "state": "available", "gpu_usage": "disabled", "model_usage": "disabled", "docker_image": null, - "docker_image_iid": null, + "docker_image_iid": "registry.somewhere.com/something:latest", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "process.workerversion", - "pk": "2aa45507-c5f2-4e1f-bc38-edf50dbf5aae", + "pk": "665fdbad-798b-434b-9ab0-95f7522c19d6", "fields": { - "worker": "f62b2ea5-7bff-4c38-9bd1-7237543cad36", - "revision": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", + "worker": "1a18dc1d-49e3-4724-b1e3-cbc8da483610", + "revision": "2d087aa1-82ba-4ec5-af14-c19e4213f913", "version": null, "configuration": { "test": 42 }, "state": "available", - "gpu_usage": "disabled", - "model_usage": "required", - "docker_image": "492ea45f-2c2d-4bf3-a461-016204fcfb03", - "docker_image_iid": null, + "gpu_usage": "required", + "model_usage": "disabled", + "docker_image": null, + "docker_image_iid": "registry.somewhere.com/something:latest", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "process.workerversion", - "pk": "66d545f5-4f60-436a-9cc3-517504cce152", + "pk": "88c64ea9-46e0-46fa-a65f-37eeaed3ded0", "fields": { - "worker": "c7439e52-9b09-489b-8dc5-13994801e8ac", - "revision": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", + "worker": "219444d1-2a84-49f4-94d6-d5c21e36fcb9", + "revision": "2d087aa1-82ba-4ec5-af14-c19e4213f913", "version": null, "configuration": { "test": 42 }, "state": "available", - "gpu_usage": "required", - "model_usage": "disabled", - "docker_image": "492ea45f-2c2d-4bf3-a461-016204fcfb03", - "docker_image_iid": null, + "gpu_usage": "disabled", + "model_usage": "required", + "docker_image": null, + "docker_image_iid": "registry.somewhere.com/something:latest", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "process.workerversion", - "pk": "7e54d670-f1f2-4b96-a38a-ac6a5416ea72", + "pk": "928cfe44-77bc-4cb1-84d2-f02006bd61d5", "fields": { - "worker": "89964ea9-97a3-4edf-8568-545ea810342e", - "revision": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", + "worker": "12b2344f-4871-40ad-aa1b-efaa70b5823f", + "revision": "2d087aa1-82ba-4ec5-af14-c19e4213f913", "version": null, "configuration": { "test": 42 @@ -378,35 +342,37 @@ "state": "available", "gpu_usage": "disabled", "model_usage": "disabled", - "docker_image": "492ea45f-2c2d-4bf3-a461-016204fcfb03", - "docker_image_iid": null, + "docker_image": null, + "docker_image_iid": "registry.somewhere.com/something:latest", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "process.workerversion", - "pk": "88a1c9ce-3128-4219-a120-9ea9574316a3", + "pk": "f62b2301-0447-4848-9848-a731ad801d60", "fields": { - "worker": "5a6c0c92-b9b1-4a69-a8d0-b75841cd0193", - "revision": "539e2eb4-6180-4d45-bc2f-ddd4bbe08ab1", + "worker": "9775f6a1-6238-4943-b245-b69bde621912", + "revision": "2d087aa1-82ba-4ec5-af14-c19e4213f913", "version": null, - "configuration": {}, + "configuration": { + "test": 42 + }, "state": "available", "gpu_usage": "disabled", "model_usage": "disabled", - "docker_image": "492ea45f-2c2d-4bf3-a461-016204fcfb03", - "docker_image_iid": null, + "docker_image": null, + "docker_image_iid": "registry.somewhere.com/something:latest", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z" } }, { "model": "process.workerrun", - "pk": "796a41f5-9797-443d-be13-ea73372e4950", + "pk": "14356945-e3a4-4d8b-b9b2-b4bc5e9287cc", "fields": { - "process": "4a3c1857-7fe7-47ba-9e47-7ce96eefc96f", - "version": "23473bff-4362-466e-ba5f-b6843df1fdf3", + "process": "76506eee-43ab-4caa-966c-9e8e5d10ef93", + "version": "229fc630-728b-421b-a2de-9618bd8e401f", "model_version": null, "parents": "[]", "configuration": null, @@ -418,14 +384,14 @@ }, { "model": "process.workerrun", - "pk": "9b99e704-47e6-478c-988f-323c636bb91a", + "pk": "2f828b7f-c169-4a8e-9555-0b4060e05641", "fields": { - "process": "26050593-712f-4f7a-b15a-4d2132241514", - "version": "7e54d670-f1f2-4b96-a38a-ac6a5416ea72", + "process": "7a6fed8c-ed9c-4714-8036-7048462ce0f2", + "version": "928cfe44-77bc-4cb1-84d2-f02006bd61d5", "model_version": null, "parents": "[]", "configuration": null, - "summary": "Worker Document layout analyser @ 7e54d6", + "summary": "Worker Document layout analyser @ 928cfe", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false @@ -433,14 +399,14 @@ }, { "model": "process.workerrun", - "pk": "810d22b3-90bf-44bb-a931-9c20d6b600ca", + "pk": "25e12096-d55e-4137-a954-3c344fc244bd", "fields": { - "process": "26050593-712f-4f7a-b15a-4d2132241514", - "version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "process": "7a6fed8c-ed9c-4714-8036-7048462ce0f2", + "version": "f62b2301-0447-4848-9848-a731ad801d60", "model_version": null, - "parents": "[\"9b99e704-47e6-478c-988f-323c636bb91a\"]", + "parents": "[\"2f828b7f-c169-4a8e-9555-0b4060e05641\"]", "configuration": null, - "summary": "Worker Recognizer @ 06e217", + "summary": "Worker Recognizer @ f62b23", "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "has_results": false @@ -448,10 +414,10 @@ }, { "model": "process.workerrun", - "pk": "9c5e8955-084a-4dd4-a816-c74d2ac0ab49", + "pk": "c2eb8dbb-584e-460a-8f0d-b6a7dc79f838", "fields": { - "process": "be97d04e-0af4-4043-9874-d20f28b30431", - "version": "23473bff-4362-466e-ba5f-b6843df1fdf3", + "process": "b6b7dbcb-e134-4274-93fd-9d6d06818c6f", + "version": "229fc630-728b-421b-a2de-9618bd8e401f", "model_version": null, "parents": "[]", "configuration": null, @@ -463,7 +429,7 @@ }, { "model": "documents.corpus", - "pk": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "pk": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -476,11 +442,11 @@ }, { "model": "documents.elementtype", - "pk": "097f73b9-4ea7-4063-98b0-e17eb698e77a", + "pk": "329625fb-1514-492a-9567-e231f7646648", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "slug": "text_line", - "display_name": "Line", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "slug": "page", + "display_name": "Page", "folder": false, "indexable": false, "color": "28b62c" @@ -488,23 +454,23 @@ }, { "model": "documents.elementtype", - "pk": "60e8c1f1-c04d-49b6-bc6e-70e38e437f36", + "pk": "ab1c133b-71d0-4928-b388-7c12345a8416", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "slug": "volume", - "display_name": "Volume", - "folder": true, + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "slug": "text_line", + "display_name": "Line", + "folder": false, "indexable": false, "color": "28b62c" } }, { "model": "documents.elementtype", - "pk": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", + "pk": "c196f23a-6843-48e1-a885-c7cda27e64ca", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "slug": "word", - "display_name": "Word", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "slug": "act", + "display_name": "Act", "folder": false, "indexable": false, "color": "28b62c" @@ -512,11 +478,11 @@ }, { "model": "documents.elementtype", - "pk": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", + "pk": "d15930a5-ebb8-40aa-968d-8bd2cf504230", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "slug": "act", - "display_name": "Act", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "slug": "word", + "display_name": "Word", "folder": false, "indexable": false, "color": "28b62c" @@ -524,21 +490,21 @@ }, { "model": "documents.elementtype", - "pk": "f2d75650-9d48-4b6e-b210-dbd595a668d2", + "pk": "e28100cb-49a4-4837-a9ae-81a519ebb43f", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "slug": "page", - "display_name": "Page", - "folder": false, + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "slug": "volume", + "display_name": "Volume", + "folder": true, "indexable": false, "color": "28b62c" } }, { "model": "documents.elementtype", - "pk": "fb9cf6d3-b31a-449c-a780-2f5db501695f", + "pk": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "slug": "surface", "display_name": "Surface", "folder": false, @@ -548,279 +514,279 @@ }, { "model": "documents.elementpath", - "pk": "13930713-e133-4d00-90fe-7169541b6b8c", + "pk": "06ab62e0-e9e7-4353-967d-a798806f7e8a", "fields": { - "element": "1f20a3a4-33be-43a3-9427-393799aba6d7", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"737db4ff-8119-4e12-be99-968d7fa3be22\"]", + "element": "9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "250c8b60-16ac-49c9-ba2a-ee157d387077", + "pk": "156e125d-4550-4a72-a124-3b5e7fe25e77", "fields": { - "element": "60a6c062-1bbb-4e5f-82e7-37cb77d92419", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"67482d70-765b-4092-b462-2d955fd8a7df\"]", + "element": "c8e488da-28d8-467e-a651-7d6f2ad6600d", + "path": "[\"2cd80ca1-7d55-4750-8c90-2b693e14a058\"]", "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "2d34a587-68b2-4087-a05e-d92c5bc0b086", + "pk": "17526830-1f55-41e1-82c5-6faf34831a0d", "fields": { - "element": "6452b6c6-3d58-48c2-9032-691095fe8317", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"67482d70-765b-4092-b462-2d955fd8a7df\"]", - "ordering": 1 + "element": "7ea6161f-62f5-4bdf-9412-bbc4d13b3e6f", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"d9744e02-66ef-424e-a71c-88b94b209688\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "33cdaa32-f9fe-4d60-91af-6200f90915af", + "pk": "210c3ff2-1aac-4b1d-bcff-67a76b2bc4f9", "fields": { - "element": "737db4ff-8119-4e12-be99-968d7fa3be22", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 2 + "element": "e7027313-7910-44b4-bdff-28e8d187c0b4", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 5 } }, { "model": "documents.elementpath", - "pk": "344c8906-d207-48cc-9d5b-5c738758e510", + "pk": "21af7d64-10db-43f4-a0dd-386be73314cd", "fields": { - "element": "66843ee4-559b-4d2d-a9ce-4dd425022159", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"737db4ff-8119-4e12-be99-968d7fa3be22\"]", + "element": "2df1881f-d666-43c9-8af7-507b277c4e23", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99\"]", "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "36612194-8586-43a3-9114-b3fa5d4c7832", + "pk": "262709fc-3d1f-46e2-8ba5-5c63b8d2b96f", "fields": { - "element": "8349d4ba-fd23-4da6-a99b-76ba2e359b6f", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 5 + "element": "d9744e02-66ef-424e-a71c-88b94b209688", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 7 } }, { "model": "documents.elementpath", - "pk": "37f898d5-0a9a-49df-b8f6-40761f18c734", + "pk": "32644adb-c33b-47bd-befe-f5d2142d60ee", "fields": { - "element": "a41e2061-65cf-4c6e-9ea3-48d00d74133d", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"a0373c38-907d-4127-9762-5aada56b7165\"]", - "ordering": 1 + "element": "ec742315-a1e6-4cf2-96c0-abe2b0e0e3fc", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "4450a6b1-88fb-4d11-9c7a-edd03872050d", + "pk": "3a86e5d2-3c7c-474f-82b1-60dae09a82b4", "fields": { - "element": "7f80cd7d-f24f-4691-a139-0ce744ea7577", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"492ea0b0-bcaf-4a46-a15a-29cd08e32d90\"]", - "ordering": 0 + "element": "dc66eac3-a4e9-4c55-a4a8-d239bd79f3f6", + "path": "[\"2cd80ca1-7d55-4750-8c90-2b693e14a058\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "48d847e6-26be-45e8-92a4-0a6517227172", + "pk": "5a8ae44a-8e2c-4eed-a1f1-c7ddcd4a093d", "fields": { - "element": "8727b32e-6b08-44fd-84ff-54d505fb5a85", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"a0373c38-907d-4127-9762-5aada56b7165\"]", + "element": "b8d9cf10-dc77-4a41-90f8-badf9718ebb9", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"f530bd2f-d0ab-4f14-9d98-087486c4b1ab\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "5bb0b100-e35c-4433-884e-16b3c827dea1", + "pk": "650ef880-9d63-4164-8d50-b7dff16ca738", "fields": { - "element": "e2e0ab90-85c8-457e-920d-479bebb43bf9", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"67482d70-765b-4092-b462-2d955fd8a7df\"]", - "ordering": 3 + "element": "aec1257f-bcbe-41d5-8983-966da539e912", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"e7027313-7910-44b4-bdff-28e8d187c0b4\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "60fccadc-2668-45f0-af63-8541f9d8000a", + "pk": "666416c1-5aa0-4f57-a21f-b7585b10efd2", "fields": { - "element": "900dcb10-2146-4571-8735-f508eb5f9986", - "path": "[]", - "ordering": 0 + "element": "f75ca797-0067-4711-b899-6ed39b0a6f1a", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 4 } }, { "model": "documents.elementpath", - "pk": "6b954042-1718-4794-aad4-55c6e2e9e054", + "pk": "6f42e63d-d4ba-495b-8e22-e059577c669f", "fields": { - "element": "7cd8a970-ca3a-479f-b49e-1292b216c1b9", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"492ea0b0-bcaf-4a46-a15a-29cd08e32d90\"]", - "ordering": 2 + "element": "f530bd2f-d0ab-4f14-9d98-087486c4b1ab", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "6ff93429-322f-486a-bc0f-31f7047ce341", + "pk": "72864cf7-e163-47c5-9a40-49a253e8cece", "fields": { - "element": "c80311e3-4529-45d6-9575-31b362c99925", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"737db4ff-8119-4e12-be99-968d7fa3be22\"]", - "ordering": 2 + "element": "39210eb6-70a9-4660-8a45-5c6957508936", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "8fd6c9e9-3133-4733-b58b-8a093e49288c", + "pk": "733ddae3-62e2-433a-b322-41bb6502ac93", "fields": { - "element": "f6b8eced-ee41-42d3-812a-a622f1879809", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"8144a0f8-f75b-43fa-ac27-d49d69bc483c\"]", + "element": "34cd2540-0a05-4812-add5-f24c08d46f73", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"1d0f7ea6-6455-4a8d-ade2-a853f8ab7e08\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "98f8328f-77b3-490d-aa4c-97d6f2030e3f", + "pk": "79ecb1ed-8036-4e88-a659-605fb3b5c8aa", "fields": { - "element": "dc79378e-1804-45c8-b23f-a2eeb33734de", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"8349d4ba-fd23-4da6-a99b-76ba2e359b6f\"]", + "element": "1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02", + "path": "[]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "9979cf91-e6da-46e4-976e-386cb9ebbc42", + "pk": "7d21ba65-6fc5-47db-995c-b4d8e8520c7c", "fields": { - "element": "7ac6504c-4088-4e6e-9a48-567f1f7e54c8", - "path": "[\"900dcb10-2146-4571-8735-f508eb5f9986\"]", - "ordering": 1 + "element": "9754d5ef-2888-4083-97b0-c9593321d8d1", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "99ac36ba-7c91-4beb-a10b-97d8edffa1d9", + "pk": "88d64d5e-3fba-450d-a9a8-5c7424559bbf", "fields": { - "element": "12e84ea0-004a-43e7-9fcc-85021e2407a9", - "path": "[]", - "ordering": 0 + "element": "2039b7b8-15cb-4b1f-a9e6-c681aa20e13a", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"f530bd2f-d0ab-4f14-9d98-087486c4b1ab\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "9feb4874-46bf-463a-9bc9-71b13af8bcc0", + "pk": "968de6aa-0d1c-47cc-ad94-02c2b59a2d79", "fields": { - "element": "e38ab791-092f-48eb-bb09-ea95e5a01998", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"492ea0b0-bcaf-4a46-a15a-29cd08e32d90\"]", - "ordering": 1 + "element": "9b478489-dd49-431b-8c51-f78ba7699f30", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"f75ca797-0067-4711-b899-6ed39b0a6f1a\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "b447f917-b73c-42b5-9512-1a3af17b3eee", + "pk": "9bdf9f6d-b114-443e-86fb-592a0ad362af", "fields": { - "element": "a0373c38-907d-4127-9762-5aada56b7165", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 4 + "element": "e9aa6eb2-eb0b-4503-9bbf-c3d27b9cce5f", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "b869ccff-bb9b-4c85-9743-d8930f2d920a", + "pk": "9c452d82-87c2-406c-add5-2556559e14f5", "fields": { - "element": "f8d56f23-51f6-40dd-9482-939a1dd877b3", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 7 + "element": "d82d4181-3ec4-45c2-b2cc-825d1382274f", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"f75ca797-0067-4711-b899-6ed39b0a6f1a\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "b8a8076c-62d4-4f86-a2f0-21187d589279", + "pk": "a599aafe-89d3-4589-8c6c-e20bf9f32efa", "fields": { - "element": "8144a0f8-f75b-43fa-ac27-d49d69bc483c", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 6 + "element": "02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "be089329-1d86-42cb-85b6-3a2520a334ed", + "pk": "b6ddde5c-f6de-433b-b9c3-c9afa288216f", "fields": { - "element": "492ea0b0-bcaf-4a46-a15a-29cd08e32d90", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 1 + "element": "1d0f7ea6-6455-4a8d-ade2-a853f8ab7e08", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\"]", + "ordering": 6 } }, { "model": "documents.elementpath", - "pk": "c66e5e45-f39b-42b7-bbf7-55bab78bfe2c", + "pk": "c0f23fcf-1c63-4af2-b8b2-af0865b6dd9e", "fields": { - "element": "72dd24ed-22f5-40a6-bbb4-b4b0abfcd758", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"f8d56f23-51f6-40dd-9482-939a1dd877b3\"]", - "ordering": 0 + "element": "2e8101c4-6fca-49b6-9b7b-41554facfa01", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "cc4ca9d4-57ac-4b86-aa08-848fb31c15f1", + "pk": "c614c8aa-de22-477f-bdb1-ef83ce7ab055", "fields": { - "element": "43ba23ed-3e59-466d-b48f-35928d3d9a59", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", - "ordering": 3 + "element": "4fed0e6a-9e3f-4e59-9c70-c5e74cc6d73c", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "d28feecf-d0a3-4bd6-b045-71cae47ccf4f", + "pk": "c8bc7413-c96b-4047-8782-87a37cfc520b", "fields": { - "element": "67482d70-765b-4092-b462-2d955fd8a7df", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\"]", + "element": "344f6b5b-b001-4084-950c-1925fdd2eef4", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "d840ea1c-695a-4e81-bfb1-ccc2c7746979", + "pk": "d06e1ff9-6dd5-4808-a035-bb2a0e7bd428", "fields": { - "element": "f09bebdb-152e-427c-ae2b-2e296982f342", - "path": "[\"900dcb10-2146-4571-8735-f508eb5f9986\"]", - "ordering": 2 + "element": "2cd80ca1-7d55-4750-8c90-2b693e14a058", + "path": "[]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "dd98d35b-a3dd-48fa-bec0-1e932f9314ff", + "pk": "d14e67c9-f5a9-4c81-ae3d-64599eb166a4", "fields": { - "element": "2aaa4788-127e-464c-bd8c-cd938796d207", - "path": "[\"900dcb10-2146-4571-8735-f508eb5f9986\"]", + "element": "b3c0b2bb-f53e-401a-ae19-bc7f2ec31179", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"39210eb6-70a9-4660-8a45-5c6957508936\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "de39b960-87d6-4805-bd39-93debf36f7b3", + "pk": "e3be0287-6213-4588-9407-6407c0de1d72", "fields": { - "element": "ba400ee3-7247-4c20-bef4-3a49ad9e2e77", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"67482d70-765b-4092-b462-2d955fd8a7df\"]", + "element": "9c42123c-b940-4695-b083-5b19392f68a6", + "path": "[\"2cd80ca1-7d55-4750-8c90-2b693e14a058\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "f0042f9c-66a9-448d-a202-03b55d40d03d", + "pk": "f4e4b076-bbfc-4c4e-90d2-060f1c0f3c89", "fields": { - "element": "9f1c4e10-d94c-4628-a575-5cb0afdd34af", - "path": "[\"12e84ea0-004a-43e7-9fcc-85021e2407a9\", \"43ba23ed-3e59-466d-b48f-35928d3d9a59\"]", - "ordering": 0 + "element": "86304b47-3d6a-48dd-a903-d0e09cde91ba", + "path": "[\"1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02\", \"f530bd2f-d0ab-4f14-9d98-087486c4b1ab\"]", + "ordering": 1 } }, { "model": "documents.element", - "pk": "12e84ea0-004a-43e7-9fcc-85021e2407a9", + "pk": "02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "60e8c1f1-c04d-49b6-bc6e-70e38e437f36", - "name": "Volume 1", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 1, page 2r", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -828,18 +794,18 @@ }, { "model": "documents.element", - "pk": "1f20a3a4-33be-43a3-9427-393799aba6d7", + "pk": "1d0f7ea6-6455-4a8d-ade2-a853f8ab7e08", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "PARIS", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "c196f23a-6843-48e1-a885-c7cda27e64ca", + "name": "Act 4", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -847,18 +813,18 @@ }, { "model": "documents.element", - "pk": "2aaa4788-127e-464c-bd8c-cd938796d207", + "pk": "1d4b82fe-f9c5-4012-a9ae-c2ff83c9cc02", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 2, page 1r", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "e28100cb-49a4-4837-a9ae-81a519ebb43f", + "name": "Volume 1", "creator": null, "worker_version": null, "worker_run": null, - "image": "a68c21d7-d24f-44d7-b134-3c50ee6ddba1", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -866,18 +832,18 @@ }, { "model": "documents.element", - "pk": "43ba23ed-3e59-466d-b48f-35928d3d9a59", + "pk": "2039b7b8-15cb-4b1f-a9e6-c681aa20e13a", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", - "name": "Act 1", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -885,18 +851,18 @@ }, { "model": "documents.element", - "pk": "492ea0b0-bcaf-4a46-a15a-29cd08e32d90", + "pk": "2cd80ca1-7d55-4750-8c90-2b693e14a058", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 1, page 1v", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "e28100cb-49a4-4837-a9ae-81a519ebb43f", + "name": "Volume 2", "creator": null, "worker_version": null, "worker_run": null, - "image": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -904,18 +870,18 @@ }, { "model": "documents.element", - "pk": "60a6c062-1bbb-4e5f-82e7-37cb77d92419", + "pk": "2df1881f-d666-43c9-8af7-507b277c4e23", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "DATUM", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -923,18 +889,18 @@ }, { "model": "documents.element", - "pk": "6452b6c6-3d58-48c2-9032-691095fe8317", + "pk": "2e8101c4-6fca-49b6-9b7b-41554facfa01", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "ROY", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -942,18 +908,18 @@ }, { "model": "documents.element", - "pk": "66843ee4-559b-4d2d-a9ce-4dd425022159", + "pk": "344f6b5b-b001-4084-950c-1925fdd2eef4", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "ROY", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -961,18 +927,18 @@ }, { "model": "documents.element", - "pk": "67482d70-765b-4092-b462-2d955fd8a7df", + "pk": "34cd2540-0a05-4812-add5-f24c08d46f73", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 1, page 1r", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", + "name": "Surface E", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (300 300, 300 600, 600 600, 600 300, 300 300)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -980,18 +946,18 @@ }, { "model": "documents.element", - "pk": "72dd24ed-22f5-40a6-bbb4-b4b0abfcd758", + "pk": "39210eb6-70a9-4660-8a45-5c6957508936", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", - "name": "Surface F", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "c196f23a-6843-48e1-a885-c7cda27e64ca", + "name": "Act 1", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -999,18 +965,18 @@ }, { "model": "documents.element", - "pk": "737db4ff-8119-4e12-be99-968d7fa3be22", + "pk": "4fed0e6a-9e3f-4e59-9c70-c5e74cc6d73c", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 1, page 2r", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1018,18 +984,18 @@ }, { "model": "documents.element", - "pk": "7ac6504c-4088-4e6e-9a48-567f1f7e54c8", + "pk": "7ea6161f-62f5-4bdf-9412-bbc4d13b3e6f", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 2, page 1v", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", + "name": "Surface F", "creator": null, "worker_version": null, "worker_run": null, - "image": "4867c2a1-fadc-4086-842c-c914b678d37d", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1037,18 +1003,18 @@ }, { "model": "documents.element", - "pk": "7cd8a970-ca3a-479f-b49e-1292b216c1b9", + "pk": "86304b47-3d6a-48dd-a903-d0e09cde91ba", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "DATUM", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1056,18 +1022,18 @@ }, { "model": "documents.element", - "pk": "7f80cd7d-f24f-4691-a139-0ce744ea7577", + "pk": "9754d5ef-2888-4083-97b0-c9593321d8d1", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "PARIS", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "ab1c133b-71d0-4928-b388-7c12345a8416", + "name": "Text line", "creator": null, "worker_version": null, "worker_run": null, - "image": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", + "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1075,18 +1041,18 @@ }, { "model": "documents.element", - "pk": "8144a0f8-f75b-43fa-ac27-d49d69bc483c", + "pk": "9b478489-dd49-431b-8c51-f78ba7699f30", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", - "name": "Act 4", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", + "name": "Surface B", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", + "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1094,18 +1060,18 @@ }, { "model": "documents.element", - "pk": "8349d4ba-fd23-4da6-a99b-76ba2e359b6f", + "pk": "9c42123c-b940-4695-b083-5b19392f68a6", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", - "name": "Act 3", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 2, page 1r", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "468df2f7-e22a-4dba-96d2-9c464ba6c2b0", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1113,18 +1079,18 @@ }, { "model": "documents.element", - "pk": "8727b32e-6b08-44fd-84ff-54d505fb5a85", + "pk": "9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", - "name": "Surface B", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 1, page 1r", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (600 600, 600 1000, 1000 1000, 1000 600, 600 600)", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1132,18 +1098,18 @@ }, { "model": "documents.element", - "pk": "900dcb10-2146-4571-8735-f508eb5f9986", + "pk": "aec1257f-bcbe-41d5-8983-966da539e912", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "60e8c1f1-c04d-49b6-bc6e-70e38e437f36", - "name": "Volume 2", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", + "name": "Surface D", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", + "polygon": "LINEARRING (0 0, 0 300, 300 300, 300 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1151,17 +1117,17 @@ }, { "model": "documents.element", - "pk": "9f1c4e10-d94c-4628-a575-5cb0afdd34af", + "pk": "b3c0b2bb-f53e-401a-ae19-bc7f2ec31179", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", "name": "Surface A", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", "polygon": "LINEARRING (0 0, 0 600, 600 600, 600 0, 0 0)", "rotation_angle": 0, "mirrored": false, @@ -1170,18 +1136,18 @@ }, { "model": "documents.element", - "pk": "a0373c38-907d-4127-9762-5aada56b7165", + "pk": "b8d9cf10-dc77-4a41-90f8-badf9718ebb9", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", - "name": "Act 2", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "PARIS", "creator": null, "worker_version": null, "worker_run": null, - "image": null, - "polygon": null, + "image": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", + "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1189,17 +1155,17 @@ }, { "model": "documents.element", - "pk": "a41e2061-65cf-4c6e-9ea3-48d00d74133d", + "pk": "c8e488da-28d8-467e-a651-7d6f2ad6600d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", - "name": "Surface C", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 2, page 2r", "creator": null, "worker_version": null, "worker_run": null, - "image": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", + "image": "53421855-db25-4abd-aba4-d86710a76d5d", "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, @@ -1208,18 +1174,18 @@ }, { "model": "documents.element", - "pk": "ba400ee3-7247-4c20-bef4-3a49ad9e2e77", + "pk": "d82d4181-3ec4-45c2-b2cc-825d1382274f", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "PARIS", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "efc85dfd-913e-4979-bb60-d6bf0c7dcd2d", + "name": "Surface C", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (100 100, 100 200, 200 200, 200 100, 100 100)", + "image": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1227,18 +1193,18 @@ }, { "model": "documents.element", - "pk": "c80311e3-4529-45d6-9575-31b362c99925", + "pk": "d9744e02-66ef-424e-a71c-88b94b209688", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", - "name": "DATUM", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "c196f23a-6843-48e1-a885-c7cda27e64ca", + "name": "Act 5", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1246,18 +1212,18 @@ }, { "model": "documents.element", - "pk": "dc79378e-1804-45c8-b23f-a2eeb33734de", + "pk": "dc66eac3-a4e9-4c55-a4a8-d239bd79f3f6", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", - "name": "Surface D", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 2, page 1v", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (0 0, 0 300, 300 300, 300 0, 0 0)", + "image": "27c0757d-4d15-4f0e-bfc1-ec63bfada9e7", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1265,18 +1231,18 @@ }, { "model": "documents.element", - "pk": "e2e0ab90-85c8-457e-920d-479bebb43bf9", + "pk": "e7027313-7910-44b4-bdff-28e8d187c0b4", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "097f73b9-4ea7-4063-98b0-e17eb698e77a", - "name": "Text line", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "c196f23a-6843-48e1-a885-c7cda27e64ca", + "name": "Act 3", "creator": null, "worker_version": null, "worker_run": null, - "image": "627a53a6-466c-4114-b826-852ecd328e47", - "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", + "image": null, + "polygon": null, "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1284,17 +1250,17 @@ }, { "model": "documents.element", - "pk": "e38ab791-092f-48eb-bb09-ea95e5a01998", + "pk": "e9aa6eb2-eb0b-4503-9bbf-c3d27b9cce5f", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "aa7b5e5a-eaa3-49b5-8c7a-826941c9d472", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", "name": "ROY", "creator": null, "worker_version": null, "worker_run": null, - "image": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", "polygon": "LINEARRING (400 400, 400 500, 500 500, 500 400, 400 400)", "rotation_angle": 0, "mirrored": false, @@ -1303,18 +1269,18 @@ }, { "model": "documents.element", - "pk": "f09bebdb-152e-427c-ae2b-2e296982f342", + "pk": "ec742315-a1e6-4cf2-96c0-abe2b0e0e3fc", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "f2d75650-9d48-4b6e-b210-dbd595a668d2", - "name": "Volume 2, page 2r", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "d15930a5-ebb8-40aa-968d-8bd2cf504230", + "name": "DATUM", "creator": null, "worker_version": null, "worker_run": null, - "image": "d7f4c84a-8aae-4c7d-86ce-567c5d4adc6d", - "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", + "image": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", + "polygon": "LINEARRING (700 700, 700 800, 800 800, 800 700, 700 700)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1322,18 +1288,18 @@ }, { "model": "documents.element", - "pk": "f6b8eced-ee41-42d3-812a-a622f1879809", + "pk": "f530bd2f-d0ab-4f14-9d98-087486c4b1ab", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "fb9cf6d3-b31a-449c-a780-2f5db501695f", - "name": "Surface E", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "329625fb-1514-492a-9567-e231f7646648", + "name": "Volume 1, page 1v", "creator": null, "worker_version": null, "worker_run": null, - "image": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", - "polygon": "LINEARRING (300 300, 300 600, 600 600, 600 300, 300 300)", + "image": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", + "polygon": "LINEARRING (0 0, 0 1000, 1000 1000, 1000 0, 0 0)", "rotation_angle": 0, "mirrored": false, "confidence": null @@ -1341,13 +1307,13 @@ }, { "model": "documents.element", - "pk": "f8d56f23-51f6-40dd-9482-939a1dd877b3", + "pk": "f75ca797-0067-4711-b899-6ed39b0a6f1a", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "c6267733-b1ce-4ea3-ac20-3a18c3d66f24", - "name": "Act 5", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "c196f23a-6843-48e1-a885-c7cda27e64ca", + "name": "Act 2", "creator": null, "worker_version": null, "worker_run": null, @@ -1360,67 +1326,67 @@ }, { "model": "documents.entitytype", - "pk": "4e9c9ca3-03ae-4994-b617-4d78f0854dc0", + "pk": "0199d0f3-a2e6-4422-9202-2be9fe6d9dff", "fields": { - "name": "person", + "name": "number", "color": "ff0000", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12" } }, { "model": "documents.entitytype", - "pk": "8c7ad642-50eb-4125-899b-aa3d03024a47", + "pk": "2b56b955-e322-4cb3-b66c-9de1ead52ead", "fields": { "name": "location", "color": "ff0000", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12" } }, { "model": "documents.entitytype", - "pk": "95fcaaf8-6a17-4540-8a76-866a6cad9f1d", + "pk": "493a7fd6-4d9b-4a42-bb1c-d4336852cf43", "fields": { - "name": "number", + "name": "organization", "color": "ff0000", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12" } }, { "model": "documents.entitytype", - "pk": "974f88d0-2e4c-4a9e-85b7-2e244c2e883f", + "pk": "7051555a-449f-4ebb-a519-f5b65517a520", "fields": { - "name": "date", + "name": "person", "color": "ff0000", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12" } }, { "model": "documents.entitytype", - "pk": "e82c02b6-9b63-483a-a3c0-94fe032d83f8", + "pk": "c6cb242c-688d-484f-87d1-42cabd41f67f", "fields": { - "name": "organization", + "name": "date", "color": "ff0000", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12" } }, { "model": "documents.transcription", - "pk": "268de903-300e-4a00-8f10-e2e10ac2a733", + "pk": "05882194-0210-441a-a167-f0b58cca0d2e", "fields": { - "element": "60a6c062-1bbb-4e5f-82e7-37cb77d92419", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "2df1881f-d666-43c9-8af7-507b277c4e23", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "DATUM", + "text": "ROY", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "53d8a708-cd44-40b8-8862-7f663ece1133", + "pk": "29dca1b6-8661-4bb5-933f-0b05ac7c30bb", "fields": { - "element": "e38ab791-092f-48eb-bb09-ea95e5a01998", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "86304b47-3d6a-48dd-a903-d0e09cde91ba", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, "text": "ROY", "orientation": "horizontal-lr", @@ -1429,10 +1395,10 @@ }, { "model": "documents.transcription", - "pk": "56a95e2d-4262-42da-a435-a5f29c0bc094", + "pk": "413a4b08-c496-4925-a440-e9edad4a9dc1", "fields": { - "element": "ba400ee3-7247-4c20-bef4-3a49ad9e2e77", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "b8d9cf10-dc77-4a41-90f8-badf9718ebb9", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, "text": "PARIS", "orientation": "horizontal-lr", @@ -1441,22 +1407,22 @@ }, { "model": "documents.transcription", - "pk": "7591f452-3d64-4b43-9789-0f05f2dfd6f8", + "pk": "5107512b-9bda-4f59-98e0-a0ff40c76d11", "fields": { - "element": "6452b6c6-3d58-48c2-9032-691095fe8317", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "ec742315-a1e6-4cf2-96c0-abe2b0e0e3fc", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "ROY", + "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "9b348778-35b7-4ed8-8232-4a641d51118d", + "pk": "5b4bd0f0-63fa-43d1-970f-a79c44784392", "fields": { - "element": "7f80cd7d-f24f-4691-a139-0ce744ea7577", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "344f6b5b-b001-4084-950c-1925fdd2eef4", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, "text": "PARIS", "orientation": "horizontal-lr", @@ -1465,34 +1431,34 @@ }, { "model": "documents.transcription", - "pk": "dd193fa4-103c-43ae-8914-ed24f2487251", + "pk": "7e865edb-f16e-4406-a497-682e5a946593", "fields": { - "element": "7cd8a970-ca3a-479f-b49e-1292b216c1b9", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "DATUM", + "text": "Lorem ipsum dolor sit amet", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "de4d3e9b-597b-483a-8178-0c78328655bf", + "pk": "b3ec03c1-fa36-4347-b3ad-64abf63ce10c", "fields": { - "element": "66843ee4-559b-4d2d-a9ce-4dd425022159", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "2039b7b8-15cb-4b1f-a9e6-c681aa20e13a", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "ROY", + "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "e37e143e-c6b5-4b3f-82ce-37e60fd188c1", + "pk": "bf9dddc1-c158-487c-99b4-37e0f7f44759", "fields": { - "element": "1f20a3a4-33be-43a3-9427-393799aba6d7", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "4fed0e6a-9e3f-4e59-9c70-c5e74cc6d73c", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, "text": "PARIS", "orientation": "horizontal-lr", @@ -1501,63 +1467,63 @@ }, { "model": "documents.transcription", - "pk": "e41a7db5-5c44-4a14-88e9-92d7769263ca", + "pk": "e1978d01-9182-4a42-a76f-7ae776aaaf55", "fields": { - "element": "c80311e3-4529-45d6-9575-31b362c99925", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "e9aa6eb2-eb0b-4503-9bbf-c3d27b9cce5f", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "DATUM", + "text": "ROY", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.transcription", - "pk": "fe88b0e9-117e-4c9b-a761-a8e63f2f095a", + "pk": "f5b81d19-ebb7-412d-9deb-455d72aaf829", "fields": { - "element": "67482d70-765b-4092-b462-2d955fd8a7df", - "worker_version": "06e2171f-b7d6-49dc-90fc-d47784e6e334", + "element": "2e8101c4-6fca-49b6-9b7b-41554facfa01", + "worker_version": "f62b2301-0447-4848-9848-a731ad801d60", "worker_run": null, - "text": "Lorem ipsum dolor sit amet", + "text": "DATUM", "orientation": "horizontal-lr", "confidence": 1.0 } }, { "model": "documents.allowedmetadata", - "pk": "13e9fa71-94a9-4e47-95a4-291597a811ef", + "pk": "6437fdd1-97c0-4fff-a325-039d0379bdbe", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "type": "text", "name": "folio" } }, { "model": "documents.allowedmetadata", - "pk": "721a146d-a883-4f73-981a-1d90744d6d13", + "pk": "89efa0fd-a187-4177-8de5-f3477dde921f", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "date", - "name": "date" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "location", + "name": "location" } }, { "model": "documents.allowedmetadata", - "pk": "7b693888-219e-4f24-a930-de812973dc27", + "pk": "ab34cc71-a15a-40d9-8cc5-f680adca898b", "fields": { - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", - "type": "location", - "name": "location" + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", + "type": "date", + "name": "date" } }, { "model": "documents.metadata", - "pk": "0d46167f-853f-4a07-b780-216a8c400aa3", + "pk": "0ba82a45-7667-4673-9258-34bbb9175f10", "fields": { - "element": "8349d4ba-fd23-4da6-a99b-76ba2e359b6f", + "element": "1d0f7ea6-6455-4a8d-ade2-a853f8ab7e08", "name": "number", "type": "text", - "value": "3", + "value": "4", "entity": null, "worker_version": null, "worker_run": null @@ -1565,12 +1531,12 @@ }, { "model": "documents.metadata", - "pk": "2cafc35d-ea3c-48cb-a93c-907d6f0a8643", + "pk": "3e7bf01c-c9d6-4322-bd3f-def5438d7384", "fields": { - "element": "2aaa4788-127e-464c-bd8c-cd938796d207", - "name": "folio", + "element": "d9744e02-66ef-424e-a71c-88b94b209688", + "name": "number", "type": "text", - "value": "1r", + "value": "5", "entity": null, "worker_version": null, "worker_run": null @@ -1578,12 +1544,12 @@ }, { "model": "documents.metadata", - "pk": "435e31bc-7844-474b-aff4-c3b8fcc6927a", + "pk": "52139b43-747a-4ffe-9f5c-cd43e0ad2b39", "fields": { - "element": "43ba23ed-3e59-466d-b48f-35928d3d9a59", + "element": "e7027313-7910-44b4-bdff-28e8d187c0b4", "name": "number", "type": "text", - "value": "1", + "value": "3", "entity": null, "worker_version": null, "worker_run": null @@ -1591,9 +1557,9 @@ }, { "model": "documents.metadata", - "pk": "44548048-3180-4912-9134-10ae87037392", + "pk": "62347283-e04f-4401-a8a9-ff402766ac2d", "fields": { - "element": "737db4ff-8119-4e12-be99-968d7fa3be22", + "element": "c8e488da-28d8-467e-a651-7d6f2ad6600d", "name": "folio", "type": "text", "value": "2r", @@ -1604,12 +1570,12 @@ }, { "model": "documents.metadata", - "pk": "57fb874a-5aa8-4526-9cf8-ad5c10b38d24", + "pk": "660e0182-f139-4a4b-b65e-b60b3051ef4c", "fields": { - "element": "8144a0f8-f75b-43fa-ac27-d49d69bc483c", - "name": "number", + "element": "9c42123c-b940-4695-b083-5b19392f68a6", + "name": "folio", "type": "text", - "value": "4", + "value": "1r", "entity": null, "worker_version": null, "worker_run": null @@ -1617,12 +1583,12 @@ }, { "model": "documents.metadata", - "pk": "9ea4ce55-d95c-46d2-802e-89f98abe862b", + "pk": "af1f94f7-b9a8-4963-9e21-d4a8c34b2627", "fields": { - "element": "f09bebdb-152e-427c-ae2b-2e296982f342", - "name": "folio", + "element": "39210eb6-70a9-4660-8a45-5c6957508936", + "name": "number", "type": "text", - "value": "2r", + "value": "1", "entity": null, "worker_version": null, "worker_run": null @@ -1630,12 +1596,12 @@ }, { "model": "documents.metadata", - "pk": "b22d936a-386d-48e3-88e0-6b88da42c982", + "pk": "cb325348-d43a-404f-b7f1-06c2230840c5", "fields": { - "element": "492ea0b0-bcaf-4a46-a15a-29cd08e32d90", - "name": "folio", + "element": "f75ca797-0067-4711-b899-6ed39b0a6f1a", + "name": "number", "type": "text", - "value": "1v", + "value": "2", "entity": null, "worker_version": null, "worker_run": null @@ -1643,12 +1609,12 @@ }, { "model": "documents.metadata", - "pk": "d58788f8-58a9-488a-bef9-0302705ff942", + "pk": "da44df4c-a8ac-4bdc-a10b-ab6939ac76cd", "fields": { - "element": "f8d56f23-51f6-40dd-9482-939a1dd877b3", - "name": "number", + "element": "dc66eac3-a4e9-4c55-a4a8-d239bd79f3f6", + "name": "folio", "type": "text", - "value": "5", + "value": "1v", "entity": null, "worker_version": null, "worker_run": null @@ -1656,12 +1622,12 @@ }, { "model": "documents.metadata", - "pk": "de810d60-9a4b-42e3-85c4-7a2174a01213", + "pk": "f55c81b9-bc87-4086-8cb1-b3a0eea6d491", "fields": { - "element": "a0373c38-907d-4127-9762-5aada56b7165", - "name": "number", + "element": "f530bd2f-d0ab-4f14-9d98-087486c4b1ab", + "name": "folio", "type": "text", - "value": "2", + "value": "1v", "entity": null, "worker_version": null, "worker_run": null @@ -1669,12 +1635,12 @@ }, { "model": "documents.metadata", - "pk": "e4b071a7-41f5-416f-aeee-53ca55d4b640", + "pk": "fb0bedec-cc2d-424e-86bf-05239865e3fd", "fields": { - "element": "67482d70-765b-4092-b462-2d955fd8a7df", + "element": "02a6f67e-c7d4-4dec-b3a0-9f9ab3f2ee99", "name": "folio", "type": "text", - "value": "1r", + "value": "2r", "entity": null, "worker_version": null, "worker_run": null @@ -1682,12 +1648,12 @@ }, { "model": "documents.metadata", - "pk": "fec9c649-5fd4-43f7-ab28-3b364b868087", + "pk": "fe60529e-30d4-4824-bb87-3534a652da81", "fields": { - "element": "7ac6504c-4088-4e6e-9a48-567f1f7e54c8", + "element": "9fc5e0a3-9afb-493e-bf0f-fc2998ba4ba4", "name": "folio", "type": "text", - "value": "1v", + "value": "1r", "entity": null, "worker_version": null, "worker_run": null @@ -1710,7 +1676,7 @@ }, { "model": "images.image", - "pk": "4867c2a1-fadc-4086-842c-c914b678d37d", + "pk": "27c0757d-4d15-4f0e-bfc1-ec63bfada9e7", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", @@ -1724,12 +1690,12 @@ }, { "model": "images.image", - "pk": "627a53a6-466c-4114-b826-852ecd328e47", + "pk": "468df2f7-e22a-4dba-96d2-9c464ba6c2b0", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img1", + "path": "img4", "width": 1000, "height": 1000, "hash": null, @@ -1738,12 +1704,12 @@ }, { "model": "images.image", - "pk": "68df44c1-ed1f-4f29-870d-de7b4b03b1a5", + "pk": "53421855-db25-4abd-aba4-d86710a76d5d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img3", + "path": "img6", "width": 1000, "height": 1000, "hash": null, @@ -1752,12 +1718,12 @@ }, { "model": "images.image", - "pk": "7f006318-b3d2-4cda-b1ab-8ff844c07b35", + "pk": "a38b69a3-a4f8-4dfc-a6b9-38ea2e52c713", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img2", + "path": "img3", "width": 1000, "height": 1000, "hash": null, @@ -1766,12 +1732,12 @@ }, { "model": "images.image", - "pk": "a68c21d7-d24f-44d7-b134-3c50ee6ddba1", + "pk": "f250d3f3-bd56-4a2f-bffc-fc3a33cd1902", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img4", + "path": "img1", "width": 1000, "height": 1000, "hash": null, @@ -1780,12 +1746,12 @@ }, { "model": "images.image", - "pk": "d7f4c84a-8aae-4c7d-86ce-567c5d4adc6d", + "pk": "f5ddf7e0-3dd3-4f4f-ada6-f42de7be869d", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", "server": 1, - "path": "img6", + "path": "img2", "width": 1000, "height": 1000, "hash": null, @@ -1794,64 +1760,64 @@ }, { "model": "users.right", - "pk": "053efd1b-d12f-49e5-ae72-54c7008224ec", + "pk": "15896320-98f2-48e1-9d36-4cef1e15c119", "fields": { "user": 2, "group": null, "content_type": 19, - "content_id": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "content_id": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "level": 100 } }, { "model": "users.right", - "pk": "3e267701-586a-45f5-adf3-20bab26fbaae", + "pk": "2a7d975d-4f18-41f4-964f-817aeae09582", "fields": { "user": 2, "group": null, - "content_type": 34, - "content_id": "192deb9f-d37e-4edd-bb9b-2ae35c7ecba5", - "level": 100 + "content_type": 11, + "content_id": "395522d1-94a0-407a-b5cb-347fa68ec2c4", + "level": 10 } }, { "model": "users.right", - "pk": "7c7634a0-2cd6-4d54-9a1b-14b0c0390050", + "pk": "7e2ea5d2-2408-49b4-b1b4-2ea0e12da7e4", "fields": { "user": 2, "group": null, - "content_type": 11, - "content_id": "94055f35-9ac9-44a0-ac5d-386e132bea2c", - "level": 10 + "content_type": 34, + "content_id": "8f459bd8-0440-444e-940b-3c14b10bdb0d", + "level": 100 } }, { "model": "users.right", - "pk": "9f79af1d-f49f-4fd7-8504-2553ceab64db", + "pk": "db08fb62-277f-475c-ae92-cfb4a515b146", "fields": { - "user": 3, + "user": 4, "group": null, "content_type": 34, - "content_id": "192deb9f-d37e-4edd-bb9b-2ae35c7ecba5", - "level": 50 + "content_id": "8f459bd8-0440-444e-940b-3c14b10bdb0d", + "level": 10 } }, { "model": "users.right", - "pk": "f38dad9a-d7b5-43cc-8ec7-e437296a0ca4", + "pk": "f61b568e-91d3-4e62-ba79-b5d7b326bc7d", "fields": { - "user": 4, + "user": 3, "group": null, "content_type": 34, - "content_id": "192deb9f-d37e-4edd-bb9b-2ae35c7ecba5", - "level": 10 + "content_id": "8f459bd8-0440-444e-940b-3c14b10bdb0d", + "level": 50 } }, { "model": "users.user", "pk": 1, "fields": { - "password": "pbkdf2_sha256$390000$uNaUvBneqUWhzAsyWIWTw0$2Q13vkqIe5EhzX9rxV94tnAAuzYxXL1OMkfD49k8j0U=", + "password": "pbkdf2_sha256$390000$n41pgYuMjEMc9yABOJDuv7$szqrPzEEMyrNyvxRF5ekrtgzLra4rnw09jkS/Rlb65M=", "last_login": null, "email": "root@root.fr", "display_name": "Admin", @@ -1866,7 +1832,7 @@ "model": "users.user", "pk": 2, "fields": { - "password": "pbkdf2_sha256$390000$c0a4pOThTZIgnvLuFhk0M8$uY0aZIWY33541EueCEsJwiSn9JV4/xMmblh2ZB+iJIQ=", + "password": "pbkdf2_sha256$390000$82MV7wfiM1CYxnR3JI9dRw$vavB8EAQRE2Z0REJhhWU7bRyrQqZF5wazXjl1rOrvTY=", "last_login": null, "email": "user@user.fr", "display_name": "Test user", @@ -1909,7 +1875,7 @@ }, { "model": "users.group", - "pk": "192deb9f-d37e-4edd-bb9b-2ae35c7ecba5", + "pk": "8f459bd8-0440-444e-940b-3c14b10bdb0d", "fields": { "name": "User group", "public": false, @@ -3907,60 +3873,19 @@ }, { "model": "ponos.farm", - "pk": "94055f35-9ac9-44a0-ac5d-386e132bea2c", + "pk": "395522d1-94a0-407a-b5cb-347fa68ec2c4", "fields": { "name": "Wheat farm", - "seed": "8cb2c985dcb2dcd344db193307b9049c1fe54d26faba25b417acbb2cdfcc9f41" - } -}, -{ - "model": "ponos.task", - "pk": "1cb97d66-b673-4068-9824-ab8c33fdcb95", - "fields": { - "run": 0, - "depth": 0, - "slug": "docker_build", - "priority": 10, - "state": "completed", - "image": "", - "shm_size": null, - "command": null, - "env": "{}", - "has_docker_socket": false, - "image_artifact": null, - "agent": null, - "requires_gpu": false, - "gpu": null, - "process": "3421ba72-b14c-4df0-a504-1e7e90abe4b4", - "worker_run": null, - "container": null, - "created": "2020-02-02T01:23:45.678Z", - "updated": "2020-02-02T01:23:45.678Z", - "expiry": "2100-12-31T23:59:59.999Z", - "extra_files": "{}", - "token": "/Mp4N1XhQsWzkPneokooyFdtnCiW4EeQi09Z6nn5LUo=", - "parents": [] - } -}, -{ - "model": "ponos.artifact", - "pk": "492ea45f-2c2d-4bf3-a461-016204fcfb03", - "fields": { - "task": "1cb97d66-b673-4068-9824-ab8c33fdcb95", - "path": "/path/to/docker_build", - "size": 42000, - "content_type": "application/octet-stream", - "created": "2020-02-02T01:23:45.678Z", - "updated": "2020-02-02T01:23:45.678Z" + "seed": "444809637bf8b3088a181de520a02151a99477edd051710e90a2d1fcdf860dbb" } }, { "model": "training.dataset", - "pk": "5fb84be2-a906-4bc0-830b-f3a369021a32", + "pk": "4a844b36-08bd-4284-918e-5e03d543df13", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "creator": 2, "task": null, "name": "Second Dataset", @@ -3971,11 +3896,11 @@ }, { "model": "training.dataset", - "pk": "cd5bcbb9-450f-4bdf-9bfc-9640194c2f88", + "pk": "630d1cf5-3ba8-4335-b0be-d1be4cb18782", "fields": { "created": "2020-02-02T01:23:45.678Z", "updated": "2020-02-02T01:23:45.678Z", - "corpus": "1204ee59-2b68-4dfb-a083-3df4996c2337", + "corpus": "f34313ec-45ec-4ac4-92e5-43d7eb045c12", "creator": 2, "task": null, "name": "First Dataset", diff --git a/arkindex/documents/management/commands/build_fixtures.py b/arkindex/documents/management/commands/build_fixtures.py index 1e8a5cbab4..b0e5d50103 100644 --- a/arkindex/documents/management/commands/build_fixtures.py +++ b/arkindex/documents/management/commands/build_fixtures.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -from datetime import datetime, timezone from unittest.mock import patch from django.contrib.gis.geos import LinearRing @@ -8,7 +7,7 @@ from django.utils import timezone as DjangoTimeZone from arkindex.documents.models import Corpus, Element, MetaData, MetaType from arkindex.images.models import Image, ImageServer -from arkindex.ponos.models import Farm, State +from arkindex.ponos.models import Farm from arkindex.process.models import ( FeatureUsage, Process, @@ -104,23 +103,7 @@ class Command(BaseCommand): farm = Farm.objects.create(name="Wheat farm") farm.memberships.create(user=user, level=Role.Guest.value) - # Create a fake docker build with a docker image task - build_process = Process.objects.create( - farm=farm, - creator=superuser, - mode=ProcessMode.Repository, - ) - build_task = build_process.tasks.create( - run=0, - depth=0, - slug="docker_build", - state=State.Completed, - # Use an expiry very far away so that task is never expired - expiry=datetime(2100, 12, 31, 23, 59, 59, 999999, timezone.utc), - ) - docker_image = build_task.artifacts.create(size=42_000, path="/path/to/docker_build") - - # Create some workers for the repository with their available version + # Create some workers with available versions recognizer_worker = WorkerVersion.objects.create( worker=worker_repo.workers.create( name="Recognizer", @@ -131,7 +114,7 @@ class Command(BaseCommand): configuration={"test": 42}, state=WorkerVersionState.Available, model_usage=FeatureUsage.Disabled, - docker_image=docker_image + docker_image_iid="registry.somewhere.com/something:latest" ) dla_worker = WorkerVersion.objects.create( worker=worker_repo.workers.create( @@ -143,7 +126,7 @@ class Command(BaseCommand): configuration={"test": 42}, state=WorkerVersionState.Available, model_usage=FeatureUsage.Disabled, - docker_image=docker_image + docker_image_iid="registry.somewhere.com/something:latest" ) WorkerVersion.objects.create( @@ -156,7 +139,7 @@ class Command(BaseCommand): configuration={}, state=WorkerVersionState.Available, model_usage=FeatureUsage.Disabled, - docker_image=docker_image, + docker_image_iid="registry.somewhere.com/something:latest" ) WorkerVersion.objects.create( @@ -169,7 +152,7 @@ class Command(BaseCommand): configuration={"test": 42}, state=WorkerVersionState.Available, model_usage=FeatureUsage.Disabled, - docker_image=docker_image, + docker_image_iid="registry.somewhere.com/something:latest", gpu_usage=FeatureUsage.Required ) @@ -185,7 +168,7 @@ class Command(BaseCommand): state=WorkerVersionState.Available, gpu_usage=FeatureUsage.Disabled, model_usage=FeatureUsage.Required, - docker_image=docker_image + docker_image_iid="registry.somewhere.com/something:latest" ) # Create a custom worker version that is not linked to a Git repository/revision diff --git a/arkindex/documents/tests/tasks/test_corpus_delete.py b/arkindex/documents/tests/tasks/test_corpus_delete.py index de915af8ff..1685f99b41 100644 --- a/arkindex/documents/tests/tasks/test_corpus_delete.py +++ b/arkindex/documents/tests/tasks/test_corpus_delete.py @@ -3,7 +3,7 @@ from django.db.models.signals import pre_delete from arkindex.documents.models import Corpus, Element, EntityType, MetaType, Transcription from arkindex.documents.tasks import corpus_delete from arkindex.ponos.models import Farm, State, Task -from arkindex.process.models import CorpusWorkerVersion, ProcessDataset, ProcessMode, Repository, WorkerVersion +from arkindex.process.models import CorpusWorkerVersion, Process, ProcessDataset, ProcessMode, Repository, WorkerVersion from arkindex.project.tests import FixtureTestCase, force_constraints_immediate from arkindex.training.models import Dataset @@ -132,7 +132,7 @@ class TestDeleteCorpus(FixtureTestCase): message="oh", author="me", ) - cls.process = cls.rev.processes.create( + cls.process = Process.objects.create( creator=cls.user, corpus=cls.corpus2, mode=ProcessMode.Files, @@ -204,7 +204,6 @@ class TestDeleteCorpus(FixtureTestCase): self.dataset_process3.refresh_from_db() self.assertTrue(self.repo.revisions.filter(id=self.rev.id).exists()) - self.assertEqual(self.process.revision, self.rev) self.assertEqual(self.process.files.get(), self.df) self.assertTrue(Element.objects.get_descending(self.vol.id).filter(id=self.page.id).exists()) self.assertTrue(self.corpus2.datasets.filter(id=self.dataset2.id).exists()) diff --git a/arkindex/documents/tests/tasks/test_export.py b/arkindex/documents/tests/tasks/test_export.py index 3277044330..d04e63a147 100644 --- a/arkindex/documents/tests/tasks/test_export.py +++ b/arkindex/documents/tests/tasks/test_export.py @@ -22,7 +22,6 @@ from arkindex.documents.models import ( TranscriptionEntity, ) from arkindex.images.models import Image, ImageServer -from arkindex.ponos.models import Artifact from arkindex.process.models import Repository, WorkerType, WorkerVersion, WorkerVersionState from arkindex.project.tests import FixtureTestCase @@ -65,7 +64,7 @@ class TestExport(FixtureTestCase): worker=self.repo.workers.create(slug=str(uuid4()), type=self.worker_type), configuration={}, state=WorkerVersionState.Available, - docker_image=Artifact.objects.first(), + docker_image_iid="registry.somewhere.com/something:latest", ) @override_settings(PUBLIC_HOSTNAME="https://darkindex.lol") diff --git a/arkindex/documents/tests/test_retrieve_elements.py b/arkindex/documents/tests/test_retrieve_elements.py index c8062471c5..0d6b8e8e98 100644 --- a/arkindex/documents/tests/test_retrieve_elements.py +++ b/arkindex/documents/tests/test_retrieve_elements.py @@ -121,14 +121,14 @@ class TestRetrieveElements(FixtureAPITestCase): running the thumbnails generation command on a folder element """ process = Process.objects.create( - mode=ProcessMode.Repository, - revision=self.worker_version.revision, + mode=ProcessMode.Workers, creator=self.user, generate_thumbnails=True, farm=Farm.objects.first(), + corpus=self.corpus ) process.run() - task = process.tasks.get() + task = process.tasks.first() task.image = "task_image" task.command = "python generate_thumbnails" @@ -154,13 +154,13 @@ class TestRetrieveElements(FixtureAPITestCase): can retrieve the thumbnails PUT URL. """ process = Process.objects.create( - mode=ProcessMode.Repository, - revision=self.worker_version.revision, + mode=ProcessMode.Workers, creator=self.user, farm=Farm.objects.first(), + corpus=self.corpus ) process.run() - task = process.tasks.get() + task = process.tasks.first() self.assertTrue(self.vol.type.folder) response = self.client.get( reverse("api:element-retrieve", kwargs={"pk": str(self.vol.id)}), diff --git a/arkindex/images/tests/test_image_api.py b/arkindex/images/tests/test_image_api.py index 89a8355214..c66e1052c3 100644 --- a/arkindex/images/tests/test_image_api.py +++ b/arkindex/images/tests/test_image_api.py @@ -8,7 +8,7 @@ from rest_framework import status from arkindex.images.models import Image, ImageServer from arkindex.ponos.models import Farm -from arkindex.process.models import Process, ProcessMode, Revision +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 @@ -608,13 +608,13 @@ class TestImageApi(FixtureAPITestCase): IIIF images created by a Ponos task are immediately checked """ process = Process.objects.create( - mode=ProcessMode.Repository, - revision=Revision.objects.first(), + mode=ProcessMode.Workers, creator=self.user, + corpus=self.corpus, farm=Farm.objects.first(), ) process.run() - task = process.tasks.get() + 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()) @@ -655,13 +655,13 @@ class TestImageApi(FixtureAPITestCase): height=100, ) process = Process.objects.create( - mode=ProcessMode.Repository, - revision=Revision.objects.first(), + mode=ProcessMode.Workers, creator=self.user, + corpus=self.corpus, farm=Farm.objects.first(), ) process.run() - task = process.tasks.get() + 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()) diff --git a/arkindex/ponos/api.py b/arkindex/ponos/api.py index 5f4a225572..a7f0864565 100644 --- a/arkindex/ponos/api.py +++ b/arkindex/ponos/api.py @@ -52,8 +52,7 @@ class TaskDetailsFromAgent(RetrieveUpdateAPIView): "agent__farm", "gpu", # Used for permission checks - "process__corpus", - "process__revision__repo", + "process__corpus" ) permission_classes = ( # On all HTTP methods, require either any Ponos agent, an instance admin, the task itself, or guest access to the process' task @@ -102,7 +101,7 @@ class TaskArtifacts(ListCreateAPIView): def task(self): task = get_object_or_404( # Select the required tables for permissions checking - Task.objects.select_related("process__corpus", "process__revision__repo"), + Task.objects.select_related("process__corpus"), pk=self.kwargs["pk"], ) self.check_object_permissions(self.request, task) @@ -126,7 +125,7 @@ class TaskArtifactDownload(APIView): def get_object(self, pk, path): artifact = get_object_or_404( # Select the required tables for permissions checking - Artifact.objects.select_related("task__process__corpus", "task__process__revision__repo"), + Artifact.objects.select_related("task__process__corpus"), task_id=pk, path=path, ) @@ -167,5 +166,5 @@ class TaskUpdate(UpdateAPIView): authentication_classes = (TokenAuthentication, SessionAuthentication) # Only allow regular users that have admin access to the task's process permission_classes = (IsTaskAdmin, ) - queryset = Task.objects.select_related("process__corpus", "process__revision__repo") + queryset = Task.objects.select_related("process__corpus") serializer_class = TaskTinySerializer diff --git a/arkindex/ponos/tests/test_api.py b/arkindex/ponos/tests/test_api.py index 713836fb26..84d5e3f875 100644 --- a/arkindex/ponos/tests/test_api.py +++ b/arkindex/ponos/tests/test_api.py @@ -174,60 +174,6 @@ class TestAPI(FixtureAPITestCase): call("get_object", Params={"Bucket": "ponos", "Key": "somelog"}), ) - @patch("arkindex.project.aws.s3") - def test_task_details_process_level_repo(self, s3_mock): - s3_mock.Object.return_value.bucket_name = "ponos" - s3_mock.Object.return_value.key = "somelog" - s3_mock.meta.client.generate_presigned_url.return_value = "http://somewhere" - - self.client.force_login(self.user) - self.process.mode = ProcessMode.Repository - self.process.corpus = None - self.process.revision = self.rev - self.process.save() - membership = self.rev.repo.memberships.create(user=self.user, level=Role.Guest.value) - - for role in Role: - s3_mock.reset_mock() - s3_mock.reset_mock() - # Recreate the BytesIO each time, because its contents get consumed each time the API is called - s3_mock.Object.return_value.get.return_value = {"Body": BytesIO(b"Failed successfully")} - - with self.subTest(role=role): - membership.level = role.value - membership.save() - - with self.assertNumQueries(4): - resp = self.client.get(reverse("api:task-details", args=[self.task1.id])) - self.assertEqual(resp.status_code, status.HTTP_200_OK) - - self.assertDictEqual( - resp.json(), - { - "id": str(self.task1.id), - "run": 0, - "depth": 0, - "slug": "initialisation", - "state": "unscheduled", - "parents": [], - "logs": "Failed successfully", - "full_log": "http://somewhere", - "extra_files": {}, - "agent": None, - "gpu": None, - "shm_size": None, - }, - ) - - self.assertEqual(s3_mock.Object.call_count, 2) - self.assertEqual(s3_mock.Object().get.call_count, 1) - self.assertEqual(s3_mock.Object().get.call_args, call(Range="bytes=-42")) - self.assertEqual(s3_mock.meta.client.generate_presigned_url.call_count, 1) - self.assertEqual( - s3_mock.meta.client.generate_presigned_url.call_args, - call("get_object", Params={"Bucket": "ponos", "Key": "somelog"}), - ) - @patch("arkindex.project.aws.s3") def test_task_details(self, s3_mock): s3_mock.Object.return_value.bucket_name = "ponos" @@ -319,28 +265,6 @@ class TestAPI(FixtureAPITestCase): ) self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) - @expectedFailure - def test_update_task_requires_process_admin_repo(self): - self.process.mode = ProcessMode.Repository - self.process.corpus = None - self.process.revision = self.rev - self.process.creator = self.superuser - self.process.save() - self.client.force_login(self.user) - - for role in [None, Role.Guest, Role.Contributor]: - with self.subTest(role=role): - self.rev.repo.memberships.filter(user=self.user).delete() - if role: - self.rev.repo.memberships.create(user=self.user, level=role.value) - - with self.assertNumQueries(5): - resp = self.client.put( - reverse("api:task-update", args=[self.task1.id]), - data={"state": State.Stopping.value}, - ) - self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) - def test_update_running_task_state_stopping(self): self.task1.state = State.Running self.task1.save() @@ -500,28 +424,6 @@ class TestAPI(FixtureAPITestCase): ) self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) - @expectedFailure - def test_partial_update_task_requires_process_admin_repo(self): - self.process.mode = ProcessMode.Repository - self.process.corpus = None - self.process.revision = self.rev - self.process.creator = self.superuser - self.process.save() - self.client.force_login(self.user) - - for role in [None, Role.Guest, Role.Contributor]: - with self.subTest(role=role): - self.rev.repo.memberships.filter(user=self.user).delete() - if role: - self.rev.repo.memberships.create(user=self.user, level=role.value) - - with self.assertNumQueries(5): - resp = self.client.patch( - reverse("api:task-update", args=[self.task1.id]), - data={"state": State.Stopping.value}, - ) - self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN) - def test_partial_update_running_task_state_stopping(self): self.task1.state = State.Running self.task1.save() diff --git a/arkindex/ponos/tests/test_artifacts_api.py b/arkindex/ponos/tests/test_artifacts_api.py index 5e3266f7ed..7e08fa148e 100644 --- a/arkindex/ponos/tests/test_artifacts_api.py +++ b/arkindex/ponos/tests/test_artifacts_api.py @@ -6,7 +6,7 @@ from django.urls import reverse from rest_framework import status from arkindex.documents.models import Corpus -from arkindex.process.models import Process, ProcessMode, Repository +from arkindex.process.models import Process, ProcessMode from arkindex.project.tests import FixtureAPITestCase from arkindex.users.models import Right, Role, User @@ -17,14 +17,6 @@ class TestAPI(FixtureAPITestCase): @classmethod def setUpTestData(cls): super().setUpTestData() - - cls.repo = Repository.objects.first() - cls.repository_process = Process.objects.create( - mode=ProcessMode.Repository, - creator=cls.superuser, - revision=cls.repo.revisions.first(), - ) - # Make corpus private cls.corpus.public = False cls.corpus.save() @@ -119,43 +111,6 @@ class TestAPI(FixtureAPITestCase): ], ) - def test_list_process_level_repo(self): - self.client.force_login(self.user) - membership = self.repo.memberships.create(user=self.user, level=Role.Guest.value) - - for role in Role: - with self.subTest(role=role): - membership.level = role.value - membership.save() - - with self.assertNumQueries(4): - response = self.client.get(reverse("api:task-artifacts", args=[self.task1.id])) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - self.assertListEqual( - response.json(), - [ - { - "content_type": "application/json", - "created": self.artifact1.created.isoformat().replace("+00:00", "Z"), - "id": str(self.artifact1.id), - "path": "path/to/file.json", - "s3_put_url": None, - "size": 42, - "updated": self.artifact1.updated.isoformat().replace("+00:00", "Z"), - }, - { - "content_type": "text/plain", - "created": self.artifact2.created.isoformat().replace("+00:00", "Z"), - "id": str(self.artifact2.id), - "path": "some/text.txt", - "s3_put_url": None, - "size": 1337, - "updated": self.artifact2.updated.isoformat().replace("+00:00", "Z"), - }, - ], - ) - def test_list_admin(self): self.client.force_login(self.superuser) with self.assertNumQueries(4): @@ -423,31 +378,6 @@ class TestAPI(FixtureAPITestCase): ) ) - def test_download_process_level_repo(self): - self.client.force_login(self.user) - membership = self.repo.memberships.create(user=self.user, level=Role.Guest.value) - - task = self.repository_process.tasks.create(run=0, depth=0, slug="a") - task.artifacts.create(path="path/to/file.json", content_type="application/json", size=42) - - for role in Role: - with self.subTest(role=role): - membership.level = role.value - membership.save() - - with self.assertNumQueries(3): - response = self.client.get( - reverse("api:task-artifact-download", args=[task.id, "path/to/file.json"]), - ) - self.assertEqual(response.status_code, status.HTTP_302_FOUND) - - self.assertTrue(response.has_header("Location")) - self.assertTrue( - response["Location"].startswith( - f"http://s3/ponos-artifacts/{task.id}/path/to/file.json" - ) - ) - def test_download_task(self): with self.assertNumQueries(2): response = self.client.get( diff --git a/arkindex/process/api.py b/arkindex/process/api.py index 42cefcecb5..e6f76cf645 100644 --- a/arkindex/process/api.py +++ b/arkindex/process/api.py @@ -306,8 +306,6 @@ class ProcessQuerysetMixin(object): # Element and folder types are serialized as their slugs "element_type", "folder_type", - # The revision is serialized with its commit URL, which also requires the repository - "revision__repo", ) # Files and tasks are also listed .prefetch_related("files", "tasks__parents") @@ -441,10 +439,6 @@ class ProcessRetry(ProcessACLMixin, ProcessQuerysetMixin, GenericAPIView): elif state == State.Stopping: raise ValidationError({"__all__": ["This process is stopping"]}) - if process.mode == ProcessMode.Repository: - if not process.revision: - raise ValidationError({"__all__": ["Git repository imports must have a revision set"]}) - @extend_schema( operation_id="RetryProcess", tags=["process"], @@ -701,7 +695,7 @@ class ProcessDatasets(ProcessACLMixin, ListAPIView): @cached_property def process(self): process = get_object_or_404( - Process.objects.using("default").select_related("corpus", "revision__repo"), + Process.objects.using("default").select_related("corpus"), Q(pk=self.kwargs["pk"]) ) if not self.process_access_level(process): @@ -986,7 +980,7 @@ class WorkerTypesList(ListAPIView): get=extend_schema( description=( "List versions for a given worker ID with their revision and associated git references.\n\n" - "Requires an **execution** access to the worker or its repository." + "Requires an **execution** access to the worker." ), parameters=[ OpenApiParameter( @@ -1001,13 +995,7 @@ class WorkerTypesList(ListAPIView): description=dedent(""" Create a new version for a worker. - Authentication can be done: - * Using a user authentication (via a cookie or token). The user must have an administrator access to the worker. - * Using a ponos task authentication. - The worker must be linked to a repository. - - The `revision_id` parameter must be set for workers linked to a repository only. """) ) ) @@ -1030,8 +1018,7 @@ class WorkerVersionList(WorkerACLMixin, ListCreateAPIView): raise PermissionDenied(detail="You do not have an execution access to this worker.") if ( self.request.method not in permissions.SAFE_METHODS - # Either a task authentication or an admin access is required for creation - and not isinstance(self.request.auth, Task) + # An admin access is required for creation and not self.has_admin_access(worker) ): raise PermissionDenied(detail="You do not have an admin access to this worker.") diff --git a/arkindex/process/builder.py b/arkindex/process/builder.py index 93e918f6aa..8a906063a4 100644 --- a/arkindex/process/builder.py +++ b/arkindex/process/builder.py @@ -191,10 +191,6 @@ class ProcessBuilder(object): ): raise ValidationError("Some model versions are on archived models and cannot be executed.") - def validate_repository(self) -> None: - if self.process.revision is None: - raise ValidationError("A revision is required to create an import workflow from GitLab repository") - def validate_s3(self) -> None: if not self.process.bucket_name: raise ValidationError("Missing S3 bucket name") @@ -251,13 +247,6 @@ class ProcessBuilder(object): ) self._create_worker_versions_cache([(settings.IMPORTS_WORKER_VERSION, None, None)]) - def build_repository(self): - self._build_task( - command=f"python -m arkindex_tasks.import_git {self.process.revision.id}", - slug="import_git", - env=self.base_env, - ) - def build_iiif(self): from arkindex.process.models import WorkerVersion diff --git a/arkindex/process/migrations/0003_initial.py b/arkindex/process/migrations/0003_initial.py index 3679db1e9a..e8dd2caf21 100644 --- a/arkindex/process/migrations/0003_initial.py +++ b/arkindex/process/migrations/0003_initial.py @@ -3,12 +3,18 @@ import django.db.models.deletion from django.conf import settings from django.db import migrations, models +from enumfields import Enum, fields import arkindex.process.models import pgtrigger.compiler import pgtrigger.migrations +class TmpProcessMode(Enum): + Repository = "repository" + Local = "local" + + class Migration(migrations.Migration): initial = True @@ -189,15 +195,25 @@ class Migration(migrations.Migration): ), migrations.AddConstraint( model_name="process", - constraint=models.CheckConstraint(check=models.Q(models.Q(("mode", arkindex.process.models.ProcessMode["Local"]), _negated=True), ("workflow", None), _connector="OR"), name="local_process_no_workflow", violation_error_message="Local processes cannot be started."), + constraint=models.UniqueConstraint(models.F("creator"), condition=models.Q(("mode", arkindex.process.models.ProcessMode["Local"])), name="unique_local_process", violation_error_message="Only one local process is allowed per user."), ), migrations.AddConstraint( model_name="process", - constraint=models.CheckConstraint(check=models.Q(("mode__in", (arkindex.process.models.ProcessMode["Local"], arkindex.process.models.ProcessMode["Repository"])), models.Q(("corpus", None), _negated=True), _connector="XOR"), name="check_process_corpus", violation_error_message="Local and repository processes cannot have a corpus, and other modes must have one set."), + constraint=models.CheckConstraint(check=models.Q(models.Q(("mode", arkindex.process.models.ProcessMode["Local"]), _negated=True), ("workflow", None), _connector="OR"), name="local_process_no_workflow", violation_error_message="Local processes cannot be started."), + ), + migrations.AlterField( + model_name="process", + name="mode", + field=fields.EnumField(enum=TmpProcessMode, max_length=30) ), migrations.AddConstraint( model_name="process", - constraint=models.UniqueConstraint(models.F("creator"), condition=models.Q(("mode", arkindex.process.models.ProcessMode["Local"])), name="unique_local_process", violation_error_message="Only one local process is allowed per user."), + constraint=models.CheckConstraint(check=models.Q(("mode__in", (TmpProcessMode["Local"], TmpProcessMode["Repository"])), models.Q(("corpus", None), _negated=True), _connector="XOR"), name="check_process_corpus", violation_error_message="Local and repository processes cannot have a corpus, and other modes must have one set."), + ), + migrations.AlterField( + model_name="process", + name="mode", + field=fields.EnumField(enum=arkindex.process.models.ProcessMode, max_length=30) ), migrations.AlterUniqueTogether( name="gitref", diff --git a/arkindex/process/migrations/0030_remove_repository_processes.py b/arkindex/process/migrations/0030_remove_repository_processes.py new file mode 100644 index 0000000000..fd7218ed91 --- /dev/null +++ b/arkindex/process/migrations/0030_remove_repository_processes.py @@ -0,0 +1,48 @@ +# Generated by Django 4.1.7 on 2024-02-29 13:28 + +from django.db import migrations +from enumfields import Enum + + +class TmpProcessMode(Enum): + Repository = "repository" + Workers = "workers" + + +def migrate_repository_processes(apps, schema): + """ + If there are Repository processes on the instances, update their mode to Workers + and attach them to a "Repository processes" corpus + """ + Process = apps.get_model("process", "Process") + Process.mode.field.enum = TmpProcessMode + # Do not do anything if there are no Repository processes to migrate + if not Process.objects.filter(mode=TmpProcessMode.Repository).exists(): + return + # Create a project to which all the old repository process will be linked, + # as non-Repository process modes require a link to a corpus + Corpus = apps.get_model("documents", "Corpus") + archival_corpus, _ = Corpus.objects.get_or_create( + name="Repository processes", + description="A project created to re-home the migrated Gitlab repository import processes.", + ) + Process.objects.filter(mode=TmpProcessMode.Repository).update(corpus=archival_corpus, mode=TmpProcessMode.Workers) + + +class Migration(migrations.Migration): + + dependencies = [ + ("process", "0029_processdataset_sets"), + ] + + operations = [ + migrations.RemoveConstraint( + model_name="process", + name="check_process_corpus", + ), + migrations.RunPython( + migrate_repository_processes, + reverse_code=migrations.RunPython.noop, + elidable=True, + ), + ] diff --git a/arkindex/process/migrations/0031_process_corpus_check_and_remove_revision_field.py b/arkindex/process/migrations/0031_process_corpus_check_and_remove_revision_field.py new file mode 100644 index 0000000000..fd2c5972b4 --- /dev/null +++ b/arkindex/process/migrations/0031_process_corpus_check_and_remove_revision_field.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + +import arkindex.process.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("process", "0030_remove_repository_processes"), + ] + + operations = [ + migrations.AddConstraint( + model_name="process", + constraint=models.CheckConstraint(check=models.Q(("mode", arkindex.process.models.ProcessMode["Local"]), models.Q(("corpus", None), _negated=True), _connector="XOR"), name="check_process_corpus", violation_error_message="Local processes cannot have a corpus, and other modes must have one set."), + ), + migrations.RemoveField( + model_name="process", + name="revision", + ), + ] diff --git a/arkindex/process/models.py b/arkindex/process/models.py index 3acbede35e..75774d7048 100644 --- a/arkindex/process/models.py +++ b/arkindex/process/models.py @@ -54,7 +54,6 @@ class ActivityState(Enum): class ProcessMode(Enum): Files = "files" - Repository = "repository" IIIF = "iiif" Workers = "workers" Template = "template" @@ -71,8 +70,6 @@ class Process(IndexableModel): mode = EnumField(ProcessMode, max_length=30) files = models.ManyToManyField("process.DataFile", related_name="processes") datasets = models.ManyToManyField("training.Dataset", related_name="processes", through="process.ProcessDataset") - revision = models.ForeignKey( - "process.Revision", related_name="processes", on_delete=models.CASCADE, blank=True, null=True) versions = models.ManyToManyField("process.WorkerVersion", through="process.WorkerRun", related_name="processes") activity_state = EnumField(ActivityState, max_length=32, default=ActivityState.Disabled) @@ -173,11 +170,11 @@ class Process(IndexableModel): verbose_name_plural = "processes" constraints = [ models.CheckConstraint( - # Either the process mode is local or repository and the process does not have a corpus, + # Either the process mode is local and the process does not have a corpus, # or it has another mode and has a corpus set. - check=Q(mode__in=(ProcessMode.Local, ProcessMode.Repository)) ^ ~Q(corpus=None), + check=Q(mode=ProcessMode.Local) ^ ~Q(corpus=None), name="check_process_corpus", - violation_error_message="Local and repository processes cannot have a corpus, and other modes must have one set.", + violation_error_message="Local processes cannot have a corpus, and other modes must have one set.", ), models.UniqueConstraint( "creator", diff --git a/arkindex/process/serializers/imports.py b/arkindex/process/serializers/imports.py index a0688da6ca..2dbcb97b1f 100644 --- a/arkindex/process/serializers/imports.py +++ b/arkindex/process/serializers/imports.py @@ -18,7 +18,6 @@ from arkindex.process.models import ( WorkerRun, WorkerVersionState, ) -from arkindex.process.serializers.git import RevisionSerializer from arkindex.project.mixins import ProcessACLMixin from arkindex.project.serializer_fields import EnumField, LinearRingField from arkindex.project.validators import MaxValueValidator @@ -78,7 +77,6 @@ class ProcessSerializer(ProcessLightSerializer): Serialize a process with its settings """ from arkindex.documents.serializers.elements import ElementSlimSerializer - revision = RevisionSerializer(read_only=True) element = ElementSlimSerializer(read_only=True) element_id = serializers.PrimaryKeyRelatedField( queryset=Element.objects.none(), @@ -119,7 +117,6 @@ class ProcessSerializer(ProcessLightSerializer): class Meta(ProcessLightSerializer.Meta): fields = ProcessLightSerializer.Meta.fields + ( "files", - "revision", "element", "element_id", "folder_type", @@ -132,7 +129,6 @@ class ProcessSerializer(ProcessLightSerializer): ) read_only_fields = ProcessLightSerializer.Meta.read_only_fields + ( "files", - "revision", "element", "folder_type", "use_gpu", @@ -522,7 +518,6 @@ class CreateProcessTemplateSerializer(serializers.ModelSerializer): def validate(self, data): data = super().validate(data) template = self.context["template"] - data["revision"] = template.revision data["mode"] = ProcessMode.Template data["creator"] = self.context["request"].user data["corpus"] = template.corpus diff --git a/arkindex/process/serializers/training.py b/arkindex/process/serializers/training.py index f56fc916a9..e7c25f1ec7 100644 --- a/arkindex/process/serializers/training.py +++ b/arkindex/process/serializers/training.py @@ -66,7 +66,7 @@ class ProcessDatasetSerializer(ProcessACLMixin, serializers.ModelSerializer): # Avoid a stale read when adding a dataset right after creating a process .using("default") # Required for ACL checks - .select_related("corpus", "revision__repo") + .select_related("corpus") # Required to check for a process that has already started .annotate(has_tasks=Exists(Task.objects.filter(process=OuterRef("pk")))) ) diff --git a/arkindex/process/serializers/workers.py b/arkindex/process/serializers/workers.py index c72f5190b0..9faef9fcef 100644 --- a/arkindex/process/serializers/workers.py +++ b/arkindex/process/serializers/workers.py @@ -6,16 +6,14 @@ from django.core.exceptions import ValidationError as DjangoValidationError from django.db import transaction from django.db.models import Max, Q from rest_framework import serializers -from rest_framework.exceptions import NotFound, PermissionDenied, ValidationError +from rest_framework.exceptions import ValidationError from arkindex.ponos.models import Task -from arkindex.ponos.utils import get_process_from_task_auth from arkindex.process.models import ( CorpusWorkerVersion, FeatureUsage, GitRef, Process, - ProcessMode, Repository, Revision, Worker, @@ -32,7 +30,6 @@ from arkindex.project.serializer_fields import ArchivedField, EnumField from arkindex.training.models import Model from arkindex.training.serializers import ModelVersionLightSerializer from arkindex.users.models import Role -from arkindex.users.utils import get_max_level class ExistingWorkerException(Exception): @@ -89,31 +86,14 @@ class WorkerCreateSerializer(WorkerSerializer): def create(self, validated_data): """ Retrieve or create the worker and its type. - In case of using Ponos auth, the worker is linked to the process repository """ request = self.context["request"] - repository = None - if isinstance(request.auth, Task): - process = get_process_from_task_auth(request) - if process is None or process.mode != ProcessMode.Repository or process.revision_id is None: - raise PermissionDenied( - "Workers can only be created on processes of type Repository with a" - " revision while using the Ponos authentication." - ) - repository = process.revision.repo - - access_right = get_max_level(request.user, repository) - if not access_right: - raise NotFound - elif access_right < Role.Admin.value: - raise PermissionDenied(detail="You do not have admin access to the repository of this process.") - with transaction.atomic(using="default"): - # First ensure no worker exists with the given slug and repository + # First ensure no worker exists with the given slug and no repository existing_worker = ( Worker.objects .using("default") - .filter(repository=repository, slug=validated_data["slug"]) + .filter(repository_id=None, slug=validated_data["slug"]) .first() ) if existing_worker: @@ -129,14 +109,12 @@ class WorkerCreateSerializer(WorkerSerializer): } ) worker = Worker.objects.create( - repository=repository, slug=validated_data["slug"], name=validated_data["name"], type=worker_type, ) - if repository is None: - # Automatically grant an admin access to the creator of a local worker - worker.memberships.create(user=request.user, level=Role.Admin.value) + # Automatically grant an admin access to the creator of a local worker + worker.memberships.create(user=request.user, level=Role.Admin.value) return worker diff --git a/arkindex/process/tests/test_corpus_worker_runs.py b/arkindex/process/tests/test_corpus_worker_runs.py index 2e62a89f37..b170a9d7dd 100644 --- a/arkindex/process/tests/test_corpus_worker_runs.py +++ b/arkindex/process/tests/test_corpus_worker_runs.py @@ -142,8 +142,8 @@ class TestCorpusWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.dla_worker_version.id), "configuration": {"test": 42}, - "docker_image": str(self.dla_worker_version.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.dla_worker_version.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/dla:{self.dla_worker_version.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, diff --git a/arkindex/process/tests/test_create_process.py b/arkindex/process/tests/test_create_process.py index cfb1f59958..45a92de085 100644 --- a/arkindex/process/tests/test_create_process.py +++ b/arkindex/process/tests/test_create_process.py @@ -104,7 +104,6 @@ class TestCreateProcess(FixtureAPITestCase): "corpus": str(self.volume.corpus.id), "files": [], "mode": "workers", - "revision": process.revision, "folder_type": None, "element_type": "page", "ml_class_id": None, @@ -157,7 +156,6 @@ class TestCreateProcess(FixtureAPITestCase): "mode": "workers", "corpus": str(self.corpus.id), "files": [], - "revision": process.revision, "folder_type": None, "element_type": None, "template_id": None, @@ -381,7 +379,6 @@ class TestCreateProcess(FixtureAPITestCase): "corpus": str(self.corpus.id), "files": [], "mode": "workers", - "revision": None, "folder_type": None, "element_type": None, "element": None, @@ -419,7 +416,6 @@ class TestCreateProcess(FixtureAPITestCase): "corpus": str(self.volume.corpus.id), "files": [], "mode": "workers", - "revision": process.revision, "folder_type": None, "element_type": None, "element": { @@ -621,7 +617,7 @@ class TestCreateProcess(FixtureAPITestCase): reco_task = process_2.tasks.get(slug=run_1.task_slug) self.assertEqual(reco_task.command, None) - self.assertEqual(reco_task.image, f"my_repo.fake/workers/worker/reco:{self.version_1.id}") + self.assertEqual(reco_task.image, self.version_1.docker_image_iid) self.assertEqual(reco_task.shm_size, None) self.assertEqual(list(reco_task.parents.all()), [init_task]) self.assertEqual(reco_task.env, { @@ -634,7 +630,7 @@ class TestCreateProcess(FixtureAPITestCase): dla_task = process_2.tasks.get(slug=run_2.task_slug) self.assertEqual(dla_task.command, None) - self.assertEqual(dla_task.image, f"my_repo.fake/workers/worker/dla:{self.version_2.id}") + self.assertEqual(dla_task.image, self.version_2.docker_image_iid) self.assertEqual(dla_task.shm_size, None) self.assertEqual(list(dla_task.parents.all()), [reco_task]) self.assertEqual(dla_task.env, { @@ -711,8 +707,7 @@ class TestCreateProcess(FixtureAPITestCase): worker_task = process_2.tasks.get(slug=run.task_slug) self.assertEqual(worker_task.command, None) - self.assertEqual(worker_task.image, f"my_repo.fake/workers/worker/reco:{self.version_1.id}") - self.assertEqual(worker_task.image_artifact.id, self.version_1.docker_image.id) + self.assertEqual(worker_task.image, self.version_1.docker_image_iid) self.assertEqual(worker_task.shm_size, None) self.assertEqual(worker_task.env, { "ARKINDEX_TASK_TOKEN": "67891", @@ -758,8 +753,7 @@ class TestCreateProcess(FixtureAPITestCase): worker_task = process_2.tasks.get(slug=run.task_slug) self.assertEqual(worker_task.command, None) - self.assertEqual(worker_task.image, f"my_repo.fake/workers/worker/worker-gpu:{self.version_3.id}") - self.assertEqual(worker_task.image_artifact.id, self.version_3.docker_image.id) + self.assertEqual(worker_task.image, self.version_3.docker_image_iid) self.assertEqual(worker_task.shm_size, None) self.assertEqual(worker_task.env, { "TASK_ELEMENTS": "/data/initialisation/elements.json", @@ -812,8 +806,7 @@ class TestCreateProcess(FixtureAPITestCase): worker_task = process.tasks.get(slug=run.task_slug) self.assertEqual(worker_task.command, None) - self.assertEqual(worker_task.image, f"my_repo.fake/workers/worker/worker-gpu:{self.version_3.id}") - self.assertEqual(worker_task.image_artifact.id, self.version_3.docker_image.id) + self.assertEqual(worker_task.image, "registry.somewhere.com/something:latest") self.assertEqual(worker_task.shm_size, None) self.assertEqual(worker_task.env, { "TASK_ELEMENTS": "/data/initialisation/elements.json", @@ -989,7 +982,6 @@ class TestCreateProcess(FixtureAPITestCase): "corpus": str(self.corpus.id), "files": [], "mode": "workers", - "revision": None, "folder_type": None, "element_type": None, "element": None, @@ -1032,7 +1024,6 @@ class TestCreateProcess(FixtureAPITestCase): "corpus": str(self.corpus.id), "files": [], "mode": mode if mode else "workers", - "revision": None, "folder_type": None, "element_type": None, "element": None, diff --git a/arkindex/process/tests/test_datafile_api.py b/arkindex/process/tests/test_datafile_api.py index 97b722c588..1b81c34856 100644 --- a/arkindex/process/tests/test_datafile_api.py +++ b/arkindex/process/tests/test_datafile_api.py @@ -190,7 +190,7 @@ class TestDataFileApi(FixtureAPITestCase): ] for process_mode, s3_url in cases: process.mode = process_mode - if process_mode in [ProcessMode.Local, ProcessMode.Repository]: + if process_mode == ProcessMode.Local: process.corpus = None else: process.corpus = self.corpus diff --git a/arkindex/process/tests/test_docker_worker_version.py b/arkindex/process/tests/test_docker_worker_version.py index 10262ce551..38c872135b 100644 --- a/arkindex/process/tests/test_docker_worker_version.py +++ b/arkindex/process/tests/test_docker_worker_version.py @@ -4,7 +4,7 @@ from django.urls import reverse from rest_framework import status from arkindex.ponos.models import Farm -from arkindex.process.models import FeatureUsage, GitRefType, ProcessMode, Repository, Worker, WorkerType +from arkindex.process.models import FeatureUsage, GitRefType, Process, ProcessMode, Repository, Worker, WorkerType from arkindex.project.tests import FixtureAPITestCase from arkindex.users.models import Role, Scope @@ -33,10 +33,11 @@ class TestDockerWorkerVersion(FixtureAPITestCase): """ Ponos task authentication is disabled on that endpoint """ - process = self.rev.processes.create( - mode=ProcessMode.Repository, + process = Process.objects.create( + mode=ProcessMode.Workers, creator=self.user, farm=Farm.objects.first(), + corpus=self.corpus, ) process.run() task = process.tasks.get() @@ -432,8 +433,8 @@ class TestDockerWorkerVersion(FixtureAPITestCase): self.assertDictEqual(response.json(), { "id": str(self.version.id), "configuration": {"test": 42}, - "docker_image": str(self.version.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": "registry.somewhere.com/something:latest", "docker_image_name": self.version.docker_image_name, "gpu_usage": FeatureUsage.Disabled.value, "model_usage": FeatureUsage.Disabled.value, diff --git a/arkindex/process/tests/test_managers.py b/arkindex/process/tests/test_managers.py index 70c192a016..8438449621 100644 --- a/arkindex/process/tests/test_managers.py +++ b/arkindex/process/tests/test_managers.py @@ -10,7 +10,6 @@ from arkindex.documents.models import ( Transcription, TranscriptionEntity, ) -from arkindex.ponos.models import Artifact from arkindex.process.models import CorpusWorkerVersion, ProcessMode, Repository, WorkerRun from arkindex.project.tests import FixtureTestCase @@ -21,10 +20,7 @@ class TestManagers(FixtureTestCase): def setUpTestData(cls): super().setUpTestData() cls.repo = Repository.objects.get(url="http://my_repo.fake/workers/worker") - cls.revision = cls.repo.revisions.first() - cls.artifact = Artifact.objects.get() # The fixtures have two worker versions, only one of them is used in existing elements - cls.worker = cls.repo.workers.get(slug="reco") cls.worker_version = cls.worker.versions.get() cls.worker_configuration = cls.worker.configurations.create(name="test config") diff --git a/arkindex/process/tests/test_process_datasets.py b/arkindex/process/tests/test_process_datasets.py index af98d7b253..5f35cff0b9 100644 --- a/arkindex/process/tests/test_process_datasets.py +++ b/arkindex/process/tests/test_process_datasets.py @@ -7,7 +7,7 @@ from rest_framework import status from arkindex.documents.models import Corpus from arkindex.ponos.models import Farm -from arkindex.process.models import Process, ProcessDataset, ProcessMode, Repository +from arkindex.process.models import Process, ProcessDataset, ProcessMode from arkindex.project.tests import FixtureAPITestCase from arkindex.training.models import Dataset from arkindex.users.models import Role, User @@ -51,11 +51,6 @@ class TestProcessDatasets(FixtureAPITestCase): ) ProcessDataset.objects.create(process=cls.dataset_process_2, dataset=cls.dataset2, sets=cls.dataset2.sets) - # For repository process - cls.repo = Repository.objects.get(url="http://my_repo.fake/workers/worker") - cls.repo.memberships.create(user=cls.test_user, level=Role.Admin.value) - cls.rev = cls.repo.revisions.get() - # List process datasets def test_list_requires_login(self): @@ -165,7 +160,7 @@ class TestProcessDatasets(FixtureAPITestCase): self.assertEqual(get_max_level_mock.call_args, call(self.test_user, self.private_corpus)) def test_create_process_mode(self): - cases = set(ProcessMode) - {ProcessMode.Dataset, ProcessMode.Local, ProcessMode.Repository} + cases = set(ProcessMode) - {ProcessMode.Dataset, ProcessMode.Local} for mode in cases: with self.subTest(mode=mode): self.dataset_process.mode = mode @@ -716,7 +711,7 @@ class TestProcessDatasets(FixtureAPITestCase): self.assertFalse(ProcessDataset.objects.filter(process=self.dataset_process, dataset=new_dataset).exists()) def test_destroy_process_mode(self): - cases = set(ProcessMode) - {ProcessMode.Dataset, ProcessMode.Local, ProcessMode.Repository} + cases = set(ProcessMode) - {ProcessMode.Dataset, ProcessMode.Local} for mode in cases: with self.subTest(mode=mode): self.dataset_process.mode = mode diff --git a/arkindex/process/tests/test_process_elements.py b/arkindex/process/tests/test_process_elements.py index e437584d2d..ddb62ef3d3 100644 --- a/arkindex/process/tests/test_process_elements.py +++ b/arkindex/process/tests/test_process_elements.py @@ -544,9 +544,8 @@ class TestProcessElements(FixtureAPITestCase): # Every mode other than Workers never returns elements modes = list(ProcessMode) modes.remove(ProcessMode.Workers) - # Those modes do not have a corpus, causing HTTP 404 + # Local processes do not have a corpus, causing HTTP 404 modes.remove(ProcessMode.Local) - modes.remove(ProcessMode.Repository) for mode in modes: with self.subTest(mode=mode): @@ -565,19 +564,17 @@ class TestProcessElements(FixtureAPITestCase): def test_no_corpus(self): """ - ListProcessElements does not support repositories without a corpus + ListProcessElements does not support processes without a corpus """ process = self.superuser.processes.get(corpus=None, mode=ProcessMode.Local) self.client.force_login(self.superuser) - for mode in (ProcessMode.Local, ProcessMode.Repository): - with self.subTest(mode=mode): - process.mode = mode - process.save() - with self.assertNumQueries(3): - response = self.client.get(reverse("api:process-elements-list", kwargs={"pk": process.id})) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + process.mode = ProcessMode.Local + process.save() + with self.assertNumQueries(3): + response = self.client.get(reverse("api:process-elements-list", kwargs={"pk": process.id})) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertDictEqual(response.json(), {"detail": "Not found."}) def test_workers_mode(self): # The Workers mode returns some elements diff --git a/arkindex/process/tests/test_processes.py b/arkindex/process/tests/test_processes.py index 1af5d37866..8a4d715cd2 100644 --- a/arkindex/process/tests/test_processes.py +++ b/arkindex/process/tests/test_processes.py @@ -18,7 +18,6 @@ from arkindex.process.models import ( Process, ProcessDataset, ProcessMode, - Repository, WorkerActivity, WorkerActivityState, WorkerVersion, @@ -37,8 +36,6 @@ class TestProcesses(FixtureAPITestCase): @classmethod def setUpTestData(cls): super().setUpTestData() - cls.repo = Repository.objects.get(url="http://my_repo.fake/workers/worker") - cls.rev = cls.repo.revisions.get() cls.dataset1, cls.dataset2 = Dataset.objects.filter(corpus=cls.corpus).order_by("name") cls.private_corpus = Corpus.objects.create(name="Private corpus") cls.private_dataset = cls.private_corpus.datasets.create( @@ -87,19 +84,21 @@ class TestProcesses(FixtureAPITestCase): cls.private_ml_class = cls.private_corpus.ml_classes.create(name="beignet") # Contributor access - cls.repo.memberships.create(user=cls.user, level=Role.Contributor.value) - cls.repository_process = Process.objects.create( - mode=ProcessMode.Repository, + cls.other_corpus = Corpus.objects.create(name="SEELE") + cls.other_corpus.memberships.create(user=cls.user2, level=Role.Contributor.value) + cls.workers_process2 = cls.other_corpus.processes.create( + mode=ProcessMode.Workers, creator=cls.user2, - revision=cls.rev, ) + # Admin access cls.elts_process = cls.corpus.processes.create( mode=ProcessMode.Workers, creator=cls.user2, ) + cls.processes = Process.objects.filter( - id__in=[cls.user_img_process.id, cls.repository_process.id, cls.elts_process.id] + id__in=[cls.user_img_process.id, cls.workers_process2.id, cls.elts_process.id] ) cls.local_process = Process.objects.get( @@ -125,7 +124,7 @@ class TestProcesses(FixtureAPITestCase): # Order processes by causing updates on them self.elts_process.run() self.user_img_process.save() - self.repository_process.save() + self.workers_process2.save() # An update on a process task will make it first task = self.elts_process.tasks.first() task.save() @@ -143,15 +142,15 @@ class TestProcesses(FixtureAPITestCase): "previous": None, "results": [ { - "id": str(self.repository_process.id), + "id": str(self.workers_process2.id), "name": None, - "mode": "repository", - "corpus": None, + "mode": "workers", + "corpus": str(self.other_corpus.id), "state": "unscheduled", "activity_state": "disabled", - "created": self.repository_process.created.isoformat().replace("+00:00", "Z"), + "created": self.workers_process2.created.isoformat().replace("+00:00", "Z"), "creator": "Process creator", - "updated": self.repository_process.updated.isoformat().replace("+00:00", "Z"), + "updated": self.workers_process2.updated.isoformat().replace("+00:00", "Z"), "started": None, "finished": None, "use_cache": False, @@ -244,7 +243,7 @@ class TestProcesses(FixtureAPITestCase): """ Filter process that have not been started yet """ - self.repository_process.run() + self.workers_process2.run() self.elts_process.run() self.client.force_login(self.user) @@ -559,8 +558,8 @@ class TestProcesses(FixtureAPITestCase): self.assertFalse(self.user_img_process.tasks.exists()) self.assertEqual(self.user_img_process.state, State.Unscheduled) - self.assertFalse(self.repository_process.tasks.exists()) - self.assertEqual(self.repository_process.state, State.Unscheduled) + self.assertFalse(self.workers_process2.tasks.exists()) + self.assertEqual(self.workers_process2.state, State.Unscheduled) self.assertFalse(self.elts_process.tasks.exists()) self.assertEqual(self.elts_process.state, State.Unscheduled) @@ -617,15 +616,15 @@ class TestProcesses(FixtureAPITestCase): "use_cache": False }, { - "id": str(self.repository_process.id), + "id": str(self.workers_process2.id), "name": None, - "mode": "repository", - "corpus": None, + "mode": "workers", + "corpus": str(self.other_corpus.id), "state": "unscheduled", "activity_state": "disabled", - "created": self.repository_process.created.isoformat().replace("+00:00", "Z"), + "created": self.workers_process2.created.isoformat().replace("+00:00", "Z"), "creator": "Process creator", - "updated": self.repository_process.updated.isoformat().replace("+00:00", "Z"), + "updated": self.workers_process2.updated.isoformat().replace("+00:00", "Z"), "started": None, "finished": None, "use_cache": False @@ -694,7 +693,6 @@ class TestProcesses(FixtureAPITestCase): "ml_class_id": None, "mode": "files", "name": None, - "revision": None, "state": "unscheduled", "tasks": [ { @@ -956,19 +954,6 @@ class TestProcesses(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertDictEqual(response.json(), {"detail": "You do not have a sufficient access level to this process."}) - @expectedFailure - def test_partial_update_repository_requires_admin(self): - """ - Edition of a repository import requires to be admin on the repository - """ - self.client.force_login(self.user) - response = self.client.patch( - reverse("api:process-details", kwargs={"pk": self.repository_process.id}), - {"name": "newName"} - ) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - self.assertDictEqual(response.json(), {"detail": "You do not have a sufficient access level to this process."}) - def test_partial_update_stop(self): """ A pending or running process can be stopped @@ -1079,8 +1064,6 @@ class TestProcesses(FixtureAPITestCase): # Local processes cannot be accessed by anyone because they have no corpus and no revision, # not even instance admins, so they cause a 404 instead of 400 forbidden_modes.remove(ProcessMode.Local) - # Tested separately; this process mode does not have a corpus, which causes other errors. - forbidden_modes.remove(ProcessMode.Repository) for mode in forbidden_modes: with self.subTest(mode=mode): @@ -1107,34 +1090,6 @@ class TestProcesses(FixtureAPITestCase): {"__all__": ["Only processes of mode Workers can be updated"]} ) - def test_update_repository(self): - """ - Trying to update any field other than the `name` field on a Repository process is not allowed - """ - self.client.force_login(self.superuser) - process = Process.objects.create( - creator=self.user, - mode=ProcessMode.Repository, - revision=self.rev, - ) - with self.assertNumQueries(5): - response = self.client.put( - reverse("api:process-details", kwargs={"pk": process.id}), - { - "name": "newName", - "template_id": None, - "element_type": "page", - "element_name_contains": "AAA", - "load_children": True, - }, - format="json" - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertDictEqual( - response.json(), - {"element_type": ["Object with slug=page does not exist."]}, - ) - def test_update_unscheduled_stop(self): """ An unscheduled process can be stopped @@ -1307,7 +1262,6 @@ class TestProcesses(FixtureAPITestCase): reverse("api:process-details", kwargs={"pk": process.id}), { "id": str(uuid.uuid4()), - "revision": str(uuid.uuid4()), "element": str(uuid.uuid4()), "workflow": str(uuid.uuid4()), "creator": str(uuid.uuid4()), @@ -1348,7 +1302,6 @@ class TestProcesses(FixtureAPITestCase): "element": None, "files": [], "mode": "workers", - "revision": None, "state": "unscheduled", "template_id": None, "tasks": [], @@ -1376,9 +1329,6 @@ class TestProcesses(FixtureAPITestCase): creator=self.user, corpus=self.corpus, ) - if mode == ProcessMode.Repository: - process.corpus = None - process.revision = self.rev process.save() response = self.client.patch( @@ -1409,9 +1359,6 @@ class TestProcesses(FixtureAPITestCase): creator=self.user, corpus=self.corpus, ) - if mode == ProcessMode.Repository: - process.corpus = None - process.revision = self.rev process.save() self.assertEqual(process.name, None) @@ -1546,7 +1493,6 @@ class TestProcesses(FixtureAPITestCase): reverse("api:process-details", kwargs={"pk": process.id}), { "id": str(uuid.uuid4()), - "revision": str(uuid.uuid4()), "element": str(uuid.uuid4()), "workflow": str(uuid.uuid4()), "creator": str(uuid.uuid4()), @@ -1584,7 +1530,6 @@ class TestProcesses(FixtureAPITestCase): "element": None, "files": [], "mode": "workers", - "revision": None, "state": "unscheduled", "template_id": None, "farm": None, @@ -1600,22 +1545,6 @@ class TestProcesses(FixtureAPITestCase): response = self.client.post(reverse("api:process-retry", kwargs={"pk": self.user_img_process.id})) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - @expectedFailure - def test_retry_repository_process_no_right(self): - """ - A user that is not the creator nor admin cannot restart a process that is not linked to any corpus - """ - self.client.force_login(self.user) - self.repository_process.run() - self.repository_process.tasks.all().update(state=State.Error) - self.assertEqual(self.repository_process.state, State.Error) - - with self.assertNumQueries(9): - response = self.client.post(reverse("api:process-retry", kwargs={"pk": self.repository_process.id})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - self.assertDictEqual(response.json(), {"detail": "You do not have an admin access to this process."}) - def test_retry_only_final(self): self.client.force_login(self.user) self.elts_process.run() @@ -1967,7 +1896,6 @@ class TestProcesses(FixtureAPITestCase): self.assertIsNone(process.element) self.assertEqual(process.creator, self.user) self.assertEqual(process.corpus, self.corpus) - self.assertIsNone(process.revision) worker_run = process.worker_runs.get() self.assertEqual(worker_run.version, self.import_worker_version) @@ -2815,7 +2743,6 @@ class TestProcesses(FixtureAPITestCase): }) self.assertEqual(worker_task.image, run.version.docker_image_iid or run.version.docker_image_name) self.assertEqual(worker_task.command, run.version.docker_command) - self.assertEqual(worker_task.image_artifact.id, run.version.docker_image_id) self.assertEqual(worker_task.extra_files, { "model": "https://arkindex.localhost" + reverse("api:model-version-download", kwargs={"pk": run.model_version.id}) + f"?token={run.model_version.build_authentication_token_hash()}" }) diff --git a/arkindex/process/tests/test_repos.py b/arkindex/process/tests/test_repos.py index 607efa3d20..e7f3fdc1fe 100644 --- a/arkindex/process/tests/test_repos.py +++ b/arkindex/process/tests/test_repos.py @@ -3,7 +3,7 @@ from rest_framework import status from rest_framework.serializers import DateTimeField from arkindex.ponos.models import Farm -from arkindex.process.models import ProcessMode, Repository +from arkindex.process.models import Repository from arkindex.project.tests import FixtureTestCase from arkindex.users.models import Role, User @@ -109,60 +109,6 @@ class TestRepositories(FixtureTestCase): "authorized_users": self.repo_2.memberships.count(), }) - def test_repository_retrieve_ponos_task(self): - """ - A Ponos task can retrieve the clone URL for the repository it should work on - """ - process = self.repo_2.revisions.first().processes.create( - mode=ProcessMode.Repository, - creator=self.user, - farm=Farm.objects.first(), - ) - process.run() - task = process.tasks.get() - self.repo_2.memberships.create(user=self.user, level=Role.Guest.value) - - with self.assertNumQueries(3): - response = self.client.get( - reverse("api:repository-retrieve", kwargs={"pk": str(self.repo_2.id)}), - HTTP_AUTHORIZATION=f"Ponos {task.token}", - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - self.assertDictEqual(response.json(), { - "id": str(self.repo_2.id), - "url": self.repo_2.url, - "workers": [], - "authorized_users": self.repo_2.memberships.count(), - }) - - def test_repository_retrieve_ponos_task_not_assigned(self): - """ - A Ponos task cannot retrieve the clone URL of a repository it should not work on - """ - process = self.repo.revisions.first().processes.create( - mode=ProcessMode.Repository, - creator=self.user, - farm=Farm.objects.first(), - ) - process.run() - task = process.tasks.get() - self.repo_2.memberships.create(user=self.user, level=Role.Guest.value) - - with self.assertNumQueries(3): - response = self.client.get( - reverse("api:repository-retrieve", kwargs={"pk": str(self.repo_2.id)}), - HTTP_AUTHORIZATION=f"Ponos {task.token}", - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - self.assertDictEqual(response.json(), { - "id": str(self.repo_2.id), - "url": self.repo_2.url, - "workers": [], - "authorized_users": self.repo_2.memberships.count(), - }) - def test_repository_retrieve_disabled_repo(self): self.repo_2.memberships.create(user=self.user, level=Role.Guest.value) self.client.force_login(self.user) diff --git a/arkindex/process/tests/test_templates.py b/arkindex/process/tests/test_templates.py index 49f8b82e94..770b6d2f96 100644 --- a/arkindex/process/tests/test_templates.py +++ b/arkindex/process/tests/test_templates.py @@ -6,14 +6,7 @@ from rest_framework import status from rest_framework.reverse import reverse from arkindex.documents.models import Corpus -from arkindex.process.models import ( - Process, - ProcessMode, - WorkerConfiguration, - WorkerRun, - WorkerVersion, - WorkerVersionState, -) +from arkindex.process.models import ProcessMode, WorkerConfiguration, WorkerRun, WorkerVersion, WorkerVersionState from arkindex.project.tests import FixtureAPITestCase from arkindex.training.models import Model, ModelVersionState from arkindex.users.models import Role, User @@ -177,7 +170,6 @@ class TestTemplates(FixtureAPITestCase): for mode in set(ProcessMode) - {ProcessMode.Workers, ProcessMode.Dataset, ProcessMode.Local}: with self.subTest(mode=mode): self.process.mode = mode - self.process.corpus = None if mode == ProcessMode.Repository else self.corpus self.process.save() with self.assertNumQueries(5): @@ -307,7 +299,7 @@ class TestTemplates(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_apply(self): - self.assertIsNotNone(self.version_2.docker_image_id) + self.assertIsNotNone(self.version_2.docker_image_iid) self.client.force_login(self.user) with self.assertNumQueries(11): response = self.client.post( @@ -453,7 +445,7 @@ class TestTemplates(FixtureAPITestCase): def test_apply_unsupported_mode(self): self.client.force_login(self.user) - for mode in set(ProcessMode) - {ProcessMode.Workers, ProcessMode.Dataset, ProcessMode.Local, ProcessMode.Repository}: + for mode in set(ProcessMode) - {ProcessMode.Workers, ProcessMode.Dataset, ProcessMode.Local}: with self.subTest(mode=mode): self.process.mode = mode self.process.save() @@ -490,24 +482,6 @@ class TestTemplates(FixtureAPITestCase): local_process.refresh_from_db() self.assertEqual(local_process.template, None) - def test_apply_repository(self): - self.client.force_login(self.user) - process = Process.objects.filter(mode=ProcessMode.Repository).first() - - with self.assertNumQueries(6): - response = self.client.post( - reverse("api:apply-process-template", kwargs={"pk": str(self.template.id)}), - data=json.dumps({"process_id": str(process.id)}), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - self.assertEqual(response.json(), { - "process_id": ["Process with this ID does not exist."], - }) - process.refresh_from_db() - self.assertEqual(process.template, None) - def test_list_ignores_configuration_filter(self): self.client.force_login(self.user) with self.assertNumQueries(4): diff --git a/arkindex/process/tests/test_user_workerruns.py b/arkindex/process/tests/test_user_workerruns.py index 69c05a1d5b..f3b2884c47 100644 --- a/arkindex/process/tests/test_user_workerruns.py +++ b/arkindex/process/tests/test_user_workerruns.py @@ -95,8 +95,8 @@ class TestUserWorkerRuns(FixtureAPITestCase): "test": 42 }, "created": self.version_1.created.isoformat().replace("+00:00", "Z"), - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{str(self.version_1.id)}", "gpu_usage": "disabled", "id": str(self.version_1.id), diff --git a/arkindex/process/tests/test_workeractivity.py b/arkindex/process/tests/test_workeractivity.py index 4520f37c3a..6ce01a5368 100644 --- a/arkindex/process/tests/test_workeractivity.py +++ b/arkindex/process/tests/test_workeractivity.py @@ -13,7 +13,6 @@ from arkindex.process.models import ( Process, ProcessMode, Repository, - Revision, WorkerActivity, WorkerActivityState, WorkerConfiguration, @@ -331,11 +330,10 @@ class TestWorkerActivity(FixtureTestCase): Unlike the usual HTTP 409, we can raise a HTTP 400 here as the check requires no extra query and can be done in the serializer before the UPDATE query that normally updates any WorkerActivity if it exists. """ - rev = Revision.objects.first() process2 = Process.objects.create( - mode=ProcessMode.Repository, + mode=ProcessMode.Workers, creator=self.user, - revision=rev, + corpus=self.corpus, farm=Farm.objects.first(), ) process2.run() @@ -674,7 +672,7 @@ class TestWorkerActivity(FixtureTestCase): revision=self.worker_version.revision, configuration={}, state=WorkerVersionState.Available, - docker_image=self.worker_version.docker_image + docker_image_iid=self.worker_version.docker_image_iid ) # Create runs run_1 > run_2 > run_3 run_1 = self.process.worker_runs.first() diff --git a/arkindex/process/tests/test_workerruns.py b/arkindex/process/tests/test_workerruns.py index d0a6f75d27..cbe72a1c97 100644 --- a/arkindex/process/tests/test_workerruns.py +++ b/arkindex/process/tests/test_workerruns.py @@ -8,7 +8,7 @@ from django.urls import reverse from rest_framework import status from rest_framework.exceptions import ValidationError -from arkindex.ponos.models import Agent, Artifact, Farm, State +from arkindex.ponos.models import Agent, Farm, State from arkindex.process.models import ( FeatureUsage, GitRef, @@ -37,7 +37,6 @@ class TestWorkerRuns(FixtureAPITestCase): @classmethod def setUpTestData(cls): super().setUpTestData() - cls.artifact = Artifact.objects.first() cls.local_process = cls.user.processes.get(mode=ProcessMode.Local) cls.farm = Farm.objects.first() cls.process_1 = cls.corpus.processes.create( @@ -131,8 +130,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -333,7 +332,7 @@ class TestWorkerRuns(FixtureAPITestCase): def test_create_invalid_process_mode(self): self.client.force_login(self.user) - for mode in set(ProcessMode) - {ProcessMode.Workers, ProcessMode.Dataset, ProcessMode.Local, ProcessMode.Repository}: + for mode in set(ProcessMode) - {ProcessMode.Workers, ProcessMode.Dataset, ProcessMode.Local}: with self.subTest(mode=mode): self.process_2.mode = mode self.process_2.save() @@ -353,19 +352,13 @@ class TestWorkerRuns(FixtureAPITestCase): def test_create_non_corpus_process_mode(self): process = self.user.processes.get(mode=ProcessMode.Local) self.client.force_login(self.user) - - for mode in {ProcessMode.Local, ProcessMode.Repository}: - with self.subTest(mode=mode): - process.mode = mode - process.save() - - with self.assertNumQueries(3): - response = self.client.post( - reverse("api:worker-run-list", kwargs={"pk": str(process.id)}), - {"worker_version_id": str(self.version_1.id), "parents": []}, - format="json", - ) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + with self.assertNumQueries(3): + response = self.client.post( + reverse("api:worker-run-list", kwargs={"pk": str(process.id)}), + {"worker_version_id": str(self.version_1.id), "parents": []}, + format="json", + ) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_create_process_already_started(self): process = self.corpus.processes.create( @@ -414,8 +407,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -507,8 +500,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -594,7 +587,7 @@ class TestWorkerRuns(FixtureAPITestCase): revision=revision, configuration={}, state=WorkerVersionState.Available, - docker_image_id=self.version_1.docker_image_id, + docker_image_iid=self.version_1.docker_image_iid, ) with self.assertNumQueries(8): @@ -612,8 +605,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(version.id), "configuration": {}, - "docker_image": str(self.version_1.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": version.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{version.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -689,8 +682,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -749,8 +742,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -913,8 +906,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -983,8 +976,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -1230,8 +1223,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -1292,8 +1285,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -1362,8 +1355,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -1942,8 +1935,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -2175,8 +2168,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -2237,8 +2230,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -2304,8 +2297,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -2867,8 +2860,8 @@ class TestWorkerRuns(FixtureAPITestCase): "worker_version": { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -3097,13 +3090,11 @@ class TestWorkerRuns(FixtureAPITestCase): }) def test_build_task_no_parent(self): - self.version_1.docker_image_id = self.artifact.id task, parent_slugs = self.run_1.build_task(self.process_1, ENV.copy(), "import", "/data/import/elements.json") self.assertEqual(task.slug, f"reco_{str(self.run_1.id)[0:6]}") - self.assertEqual(task.image, f"my_repo.fake/workers/worker/reco:{str(self.version_1.id)}") + self.assertEqual(task.image, self.version_1.docker_image_iid) self.assertEqual(task.command, None) - self.assertEqual(task.image_artifact, self.artifact) self.assertEqual(task.shm_size, None) self.assertEqual(parent_slugs, ["import"]) self.assertEqual(task.env, { @@ -3114,13 +3105,11 @@ class TestWorkerRuns(FixtureAPITestCase): }) def test_build_task_with_chunk(self): - self.version_1.docker_image_id = self.artifact.id task, parent_slugs = self.run_1.build_task(self.process_1, ENV.copy(), "import", "/data/import/elements.json", chunk=4) self.assertEqual(task.slug, f"reco_{str(self.run_1.id)[0:6]}_4") - self.assertEqual(task.image, f"my_repo.fake/workers/worker/reco:{str(self.version_1.id)}") + self.assertEqual(task.image, self.version_1.docker_image_iid) self.assertEqual(task.command, None) - self.assertEqual(task.image_artifact, self.artifact) self.assertEqual(task.shm_size, None) self.assertEqual(parent_slugs, ["import"]) self.assertEqual(task.env, { @@ -3142,7 +3131,7 @@ class TestWorkerRuns(FixtureAPITestCase): revision=rev_2, configuration={"test": "test2"} ) - version_2.docker_image_id = self.artifact.id + version_2.docker_image_iid = "evaunit:latest" version_2.state = WorkerVersionState.Available run_2 = self.process_1.worker_runs.create( version=version_2, @@ -3152,9 +3141,8 @@ class TestWorkerRuns(FixtureAPITestCase): task, parent_slugs = run_2.build_task(self.process_1, ENV.copy(), "import", "/data/import/elements.json") self.assertEqual(task.slug, f"reco_{str(run_2.id)[0:6]}") - self.assertEqual(task.image, f"my_repo.fake/workers/worker/reco:{str(version_2.id)}") + self.assertEqual(task.image, version_2.docker_image_iid) self.assertEqual(task.command, None) - self.assertEqual(task.image_artifact, self.artifact) self.assertEqual(task.shm_size, None) self.assertEqual(parent_slugs, [f"reco_{str(self.run_1.id)[0:6]}"]) self.assertEqual(task.env, { @@ -3175,7 +3163,7 @@ class TestWorkerRuns(FixtureAPITestCase): revision=rev_2, configuration={"test": "test2"} ) - version_2.docker_image_id = self.artifact.id + version_2.docker_image_iid = "evaunit:latest" version_2.state = WorkerVersionState.Available run_2 = self.process_1.worker_runs.create( version=version_2, @@ -3185,9 +3173,8 @@ class TestWorkerRuns(FixtureAPITestCase): task, parent_slugs = run_2.build_task(self.process_1, ENV.copy(), "import", "/data/import/elements.json", chunk=4) self.assertEqual(task.slug, f"reco_{str(run_2.id)[0:6]}_4") - self.assertEqual(task.image, f"my_repo.fake/workers/worker/reco:{str(version_2.id)}") + self.assertEqual(task.image, version_2.docker_image_iid) self.assertEqual(task.command, None) - self.assertEqual(task.image_artifact, self.artifact) self.assertEqual(task.shm_size, None) self.assertEqual(parent_slugs, [f"reco_{str(self.run_1.id)[0:6]}_4"]) self.assertEqual(task.env, { @@ -3199,7 +3186,6 @@ class TestWorkerRuns(FixtureAPITestCase): }) def test_build_task_shm_size(self): - self.version_1.docker_image_id = self.artifact.id self.version_1.configuration = { "docker": { "shm_size": 505, @@ -3208,9 +3194,8 @@ class TestWorkerRuns(FixtureAPITestCase): task, parent_slugs = self.run_1.build_task(self.process_1, ENV.copy(), "import", "/data/import/elements.json") self.assertEqual(task.slug, f"reco_{str(self.run_1.id)[0:6]}") - self.assertEqual(task.image, f"my_repo.fake/workers/worker/reco:{str(self.version_1.id)}") + self.assertEqual(task.image, self.version_1.docker_image_iid) self.assertEqual(task.command, None) - self.assertEqual(task.image_artifact, self.artifact) self.assertEqual(task.shm_size, 505) self.assertEqual(parent_slugs, ["import"]) self.assertEqual(task.env, { @@ -3231,7 +3216,7 @@ class TestWorkerRuns(FixtureAPITestCase): revision=rev_2, configuration={"test": "test2"} ) - version_2.docker_image_id = self.artifact.id + version_2.docker_image_iid = "evaunit:latest" self.assertEqual(version_2.state, WorkerVersionState.Created) run_2 = self.process_1.worker_runs.create( version=version_2, diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py index 98a2d31ffd..b1a24c423f 100644 --- a/arkindex/process/tests/test_workers.py +++ b/arkindex/process/tests/test_workers.py @@ -1,4 +1,3 @@ -import uuid from datetime import datetime, timezone from unittest.mock import call, patch @@ -11,7 +10,6 @@ from arkindex.process.models import ( CorpusWorkerVersion, FeatureUsage, GitRefType, - Process, ProcessMode, Repository, Revision, @@ -68,10 +66,11 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) cls.farm = Farm.objects.first() - process = cls.rev.processes.create( - mode=ProcessMode.Repository, + process = cls.corpus.processes.create( + mode=ProcessMode.Workers, creator=cls.user, farm=cls.farm, + name="test_process" ) process.run() cls.task = process.tasks.get() @@ -575,26 +574,6 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): "type": ["This field is required."] }) - def test_worker_create_task_read_only_repository_id(self): - """ - Repository ID is deduced from the authenticated task. - """ - with self.assertNumQueries(8): - response = self.client.post( - reverse("api:workers-list"), - data={ - "repository_id": uuid.uuid4(), - "name": "Worker post", - "slug": "worker_post", - "type": self.worker_type_dla.slug - }, - HTTP_AUTHORIZATION=f"Ponos {self.task.token}", - ) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - worker = Worker.objects.get(id=response.json()["id"]) - assert worker.repository_id == self.repo.id - def test_worker_create_user(self): """ A user can create a worker that is not linked to a repository. @@ -657,65 +636,21 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(get_max_level_mock.call_count, 1) self.assertEqual(get_max_level_mock.call_args, call(self.user, self.worker_custom)) - def test_worker_create_task_repository_process(self): - """ - Ponos tasks can create a worker only on a process of Repository type - """ - process = Process.objects.get(mode=ProcessMode.Workers) - process.run() - task = process.tasks.first() - - with self.assertNumQueries(1): - response = self.client.post( - reverse("api:workers-list"), - data={ - "name": "Worker post", - "slug": "worker_post", - "type": self.worker_type_dla.slug - }, - HTTP_AUTHORIZATION=f"Ponos {task.token}", - ) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - self.assertDictEqual(response.json(), { - "detail": ( - "Workers can only be created on processes of type Repository with a" - " revision while using the Ponos authentication." - ) - }) - - @patch("arkindex.process.serializers.workers.get_max_level", return_value=None) - def test_worker_create_task_rights(self, get_max_level_mock): - """ - Ponos tasks are not allowed to create workers when they do not have a right on the repository - """ - with self.assertNumQueries(3): - response = self.client.post( - reverse("api:workers-list"), - data={ - "repository_id": str(self.repo.id), - "name": "Worker post", - "slug": "worker_post", - "type": self.worker_type_dla.slug - }, - HTTP_AUTHORIZATION=f"Ponos {self.task.token}", - ) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - self.assertEqual(get_max_level_mock.call_count, 1) - self.assertEqual(get_max_level_mock.call_args, call(self.user, self.repo)) - def test_worker_create_task_return_existing_worker(self): """ Creation with an existing slug returns the existing worker with a HTTP status 200 """ - with self.assertNumQueries(8): + test_worker = Worker.objects.create( + name="Prog Knife", + slug="prog_knife", + type=self.worker_reco.type + ) + with self.assertNumQueries(6): response = self.client.post( reverse("api:workers-list"), data={ - "repository_id": str(self.repo.id), - "name": "Worker Test", - "slug": "reco", + "name": "Progressive Knife", + "slug": "prog_knife", "type": self.worker_type_dla.slug }, HTTP_AUTHORIZATION=f"Ponos {self.task.token}", @@ -723,9 +658,9 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() - self.assertEqual(data["id"], str(self.worker_reco.id)) - self.assertEqual(data["name"], "Recognizer") - self.assertEqual(data["slug"], "reco") + self.assertEqual(data["id"], str(test_worker.id)) + self.assertEqual(data["name"], "Prog Knife") + self.assertEqual(data["slug"], "prog_knife") self.assertEqual(data["type"], "recognizer") def test_worker_create_task_new_type(self): @@ -1249,8 +1184,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertDictEqual(first_version, { "id": str(last_version.id), "configuration": {"a": "bc"}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": last_version.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{last_version.id}", "state": "error", "gpu_usage": "disabled", @@ -2240,8 +2175,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertDictEqual(data, { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "gpu_usage": "disabled", @@ -2266,8 +2201,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertDictEqual(data, { "id": str(self.version_1.id), "configuration": {"test": 42}, - "docker_image": str(self.version_1.docker_image.id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "gpu_usage": "disabled", @@ -2314,16 +2249,16 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): """ Only Ponos tasks are allowed to update a worker version """ - docker_image = self.version_1.docker_image + docker_image_iid = self.version_1.docker_image_iid self.version_1.state = WorkerVersionState.Created - self.version_1.docker_image = None + self.version_1.docker_image_iid = None self.version_1.save() self.client.force_login(self.user) response = self.client.patch( reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}), data={ "configuration": {"test": "test2"}, - "docker_image": str(docker_image.id), + "docker_image": str(docker_image_iid), "state": "error", "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, @@ -2336,16 +2271,14 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): """ Update worker version artifact, configuration and state """ - docker_image = self.version_1.docker_image self.version_1.state = WorkerVersionState.Created - self.version_1.docker_image = None self.version_1.save() response = self.client.patch( reverse("api:version-retrieve", kwargs={"pk": str(self.version_1.id)}), data={ "configuration": {"test": "test2"}, - "docker_image": str(docker_image.id), + "docker_image_iid": "eva:unit-01", "state": "error", }, format="json", @@ -2356,8 +2289,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(data["id"], str(self.version_1.id)) self.version_1.refresh_from_db() self.assertEqual(data["configuration"], {"test": "test2"}) - self.assertEqual(data["docker_image"], str(docker_image.id)) - self.assertIsNone(data["docker_image_iid"]) + self.assertEqual(data["docker_image_iid"], "eva:unit-01") + self.assertIsNone(data["docker_image"]) self.assertEqual(data["state"], "error") self.assertEqual(data["gpu_usage"], "disabled") @@ -2422,7 +2355,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): def test_update_version_available_requires_docker_image(self): self.version_1.state = WorkerVersionState.Created - self.version_1.docker_image = None + self.version_1.docker_image_iid = None self.version_1.save() response = self.client.patch( @@ -2447,6 +2380,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) process.run() task = process.tasks.first() + self.version_1.docker_image_iid = None self.version_1.docker_image = task.artifacts.create( path="path/to/file.json", size=100, @@ -2546,8 +2480,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_2.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_2.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/dla:{self.version_2.id}", "state": "available", "worker": { @@ -2577,8 +2511,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_1.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "worker": { @@ -2640,8 +2574,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_2.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_2.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/dla:{self.version_2.id}", "state": "available", "worker": { @@ -2671,8 +2605,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_1.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_2.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "worker": { @@ -2730,8 +2664,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_2.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_2.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/dla:{self.version_2.id}", "state": "available", "worker": { @@ -2776,8 +2710,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_1.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "worker": { @@ -2841,8 +2775,8 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): }, "gpu_usage": "disabled", "model_usage": FeatureUsage.Disabled.value, - "docker_image": str(self.version_1.docker_image_id), - "docker_image_iid": None, + "docker_image": None, + "docker_image_iid": self.version_1.docker_image_iid, "docker_image_name": f"my_repo.fake/workers/worker/reco:{self.version_1.id}", "state": "available", "worker": { diff --git a/arkindex/project/mixins.py b/arkindex/project/mixins.py index b26f626dd6..99ecfc1c3e 100644 --- a/arkindex/project/mixins.py +++ b/arkindex/project/mixins.py @@ -8,7 +8,7 @@ from rest_framework.exceptions import APIException, PermissionDenied from rest_framework.serializers import CharField, Serializer from arkindex.documents.models import Corpus -from arkindex.process.models import Process, ProcessMode, Repository, Worker +from arkindex.process.models import Process, Repository, Worker from arkindex.training.models import Model from arkindex.users.models import Role from arkindex.users.utils import filter_rights, get_max_level, has_access @@ -166,8 +166,7 @@ class ProcessACLMixin(ACLMixin): """ Rights on processes are determined depending on its nature. The process creator always has a read access. - If the process is attached to a project, the project right apply. - If the process is a version build, the repository right apply. + If the process is attached to a project, the project rights apply. """ @property @@ -176,19 +175,13 @@ class ProcessACLMixin(ACLMixin): return Process.objects.filter( Q(creator_id=self.user.id) | Q(corpus_id__in=filter_rights(self.user, Corpus, Role.Guest.value).values("id")) - | Q(revision__repo_id__in=filter_rights(self.user, Repository, Role.Guest.value).values("id")) ).distinct() def process_access_level(self, process): + if not process.corpus_id: + return None # Return the access level on a single process - access_levels = [] - if process.corpus_id: - # On all processes with a corpus, include corpus ACLs - access_levels.append(get_max_level(self.user, process.corpus)) - elif process.mode == ProcessMode.Repository and process.revision_id: - # Use repository right in case of a workers docker build - access_levels.append(get_max_level(self.user, process.revision.repo)) - return max(filter(None, access_levels), default=None) + return get_max_level(self.user, process.corpus) class SelectionMixin(object): diff --git a/arkindex/project/tests/test_acl_mixin.py b/arkindex/project/tests/test_acl_mixin.py index a36975c7b2..64248aaaa4 100644 --- a/arkindex/project/tests/test_acl_mixin.py +++ b/arkindex/project/tests/test_acl_mixin.py @@ -5,7 +5,7 @@ from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.models import ContentType from arkindex.documents.models import Corpus -from arkindex.process.models import Process, ProcessMode, Repository, Revision, WorkerType +from arkindex.process.models import Process, ProcessMode, Repository, WorkerType from arkindex.project.mixins import ACLMixin, CorpusACLMixin, ProcessACLMixin, TrainingModelMixin from arkindex.project.tests import FixtureTestCase from arkindex.training.models import Model @@ -261,20 +261,9 @@ class TestACLMixin(FixtureTestCase): process_1 = Process.objects.filter(mode=ProcessMode.Workers).get() process_2 = Process.objects.create(mode=ProcessMode.Local, creator=self.user1) process_3 = Process.objects.create(mode=ProcessMode.Workers, creator=self.user2, corpus=self.corpus1) - process_4 = Process.objects.create( - mode=ProcessMode.Repository, - creator=self.user2, - revision=self.repo1.revisions.create(hash="42", message="Message", author="User 1") - ) # Non readable processes Process.objects.create(mode=ProcessMode.Local, creator=self.user2) Process.objects.create(mode=ProcessMode.Workers, creator=self.user2, corpus=self.corpus2) - Process.objects.create( - mode=ProcessMode.Repository, - - creator=self.user2, - revision=Revision.objects.get(message="My w0rk3r") - ) with self.assertNumQueries(1): readable_process_ids = list( @@ -282,7 +271,7 @@ class TestACLMixin(FixtureTestCase): ) self.assertCountEqual( readable_process_ids, - [process_1.id, process_2.id, process_3.id, process_4.id] + [process_1.id, process_2.id, process_3.id] ) def test_models_access_user(self): diff --git a/arkindex/project/triggers.py b/arkindex/project/triggers.py index 2e8bdabf51..67328f7c36 100644 --- a/arkindex/project/triggers.py +++ b/arkindex/project/triggers.py @@ -14,14 +14,7 @@ from arkindex.documents.models import Corpus, CorpusExport, Element from arkindex.ponos import tasks as ponos_tasks from arkindex.ponos.models import State, Task from arkindex.process import tasks as process_tasks -from arkindex.process.models import ( - Process, - ProcessMode, - WorkerActivityState, - WorkerConfiguration, - WorkerRun, - WorkerVersion, -) +from arkindex.process.models import Process, WorkerActivityState, WorkerConfiguration, WorkerRun, WorkerVersion from arkindex.training.models import ModelVersion @@ -228,7 +221,7 @@ def notify_process_completion(process: Process): State.Error: "with errors", State.Stopped: "because it was stopped", } - if process.mode != ProcessMode.Repository and state in state_msg.keys(): + if state in state_msg.keys(): process_name = process.name or str(process.id) ponos_tasks.notify_process_completion.delay( process=process, diff --git a/arkindex/sql_validation/process_elements_filter_ml_class.sql b/arkindex/sql_validation/process_elements_filter_ml_class.sql index 01a2e567dc..b8169c5012 100644 --- a/arkindex/sql_validation/process_elements_filter_ml_class.sql +++ b/arkindex/sql_validation/process_elements_filter_ml_class.sql @@ -19,7 +19,6 @@ SELECT "process_process"."id", "process_process"."creator_id", "process_process"."corpus_id", "process_process"."mode", - "process_process"."revision_id", "process_process"."activity_state", "process_process"."started", "process_process"."finished", diff --git a/arkindex/sql_validation/process_elements_filter_type.sql b/arkindex/sql_validation/process_elements_filter_type.sql index 507cc004cb..a0413952bd 100644 --- a/arkindex/sql_validation/process_elements_filter_type.sql +++ b/arkindex/sql_validation/process_elements_filter_type.sql @@ -19,7 +19,6 @@ SELECT "process_process"."id", "process_process"."creator_id", "process_process"."corpus_id", "process_process"."mode", - "process_process"."revision_id", "process_process"."activity_state", "process_process"."started", "process_process"."finished", diff --git a/arkindex/sql_validation/process_elements_top_level.sql b/arkindex/sql_validation/process_elements_top_level.sql index ce1c0fbfcd..68df166d1a 100644 --- a/arkindex/sql_validation/process_elements_top_level.sql +++ b/arkindex/sql_validation/process_elements_top_level.sql @@ -19,7 +19,6 @@ SELECT "process_process"."id", "process_process"."creator_id", "process_process"."corpus_id", "process_process"."mode", - "process_process"."revision_id", "process_process"."activity_state", "process_process"."started", "process_process"."finished", diff --git a/arkindex/sql_validation/process_elements_with_image.sql b/arkindex/sql_validation/process_elements_with_image.sql index 055baeee3e..ec4b65bf47 100644 --- a/arkindex/sql_validation/process_elements_with_image.sql +++ b/arkindex/sql_validation/process_elements_with_image.sql @@ -19,7 +19,6 @@ SELECT "process_process"."id", "process_process"."creator_id", "process_process"."corpus_id", "process_process"."mode", - "process_process"."revision_id", "process_process"."activity_state", "process_process"."started", "process_process"."finished", diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py index a97ad190a6..3cba65910c 100644 --- a/arkindex/training/tests/test_datasets_api.py +++ b/arkindex/training/tests/test_datasets_api.py @@ -2064,12 +2064,12 @@ class TestDatasetsAPI(FixtureAPITestCase): "set": "train", "previous": ( sorted_dataset2_elements[page1_index_2 - 1] - if page1_index_2 - 1 >= 0 + if page1_index_2 == 1 else None ), "next": ( sorted_dataset2_elements[page1_index_2 + 1] - if page1_index_2 + 1 <= 2 + if page1_index_2 == 0 else None ) }] -- GitLab