diff --git a/Makefile b/Makefile index e565a43aa05520615170c286f67ebbc0c546f3e5..3bd777250f1cb1e13255c287ddd3c3bbbcb323ae 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ test-fixtures: test-fixtures-run: arkindex/manage.py migrate arkindex/manage.py build_fixtures - arkindex/manage.py dumpdata --indent 4 dataimport documents images users > arkindex/documents/fixtures/data.json + arkindex/manage.py dumpdata --indent 4 dataimport documents images users auth > arkindex/documents/fixtures/data.json test-fixtures-restore: # This first renaming ensures that arkindex_tmp_fixtures exists; we don't want to drop arkindex_dev without a backup diff --git a/README.md b/README.md index 3fbc74e666a09353997a6c844d3eece1c682591c..3802cd96ef00ad3fa440edbb90f09fd8648564d7 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,17 @@ backend/arkindex$ ./manage.py shell Note that this local server will only work inside Docker. +### User groups + +Two groups have a special meaning in Arkindex: The `Demo` group, for demo users, and the `Internal` group, for special users whose tokens are used by workers. Those groups are configured using the `INTERNAL_GROUP_ID` and `DEMO_GROUP_ID` settings. The development server will show warnings but let you start the server anyway if the group aren't there; you will be able to access the Django admin and create the groups from there. To create them using the shell: + +``` +backend/arkindex$ ./manage.py shell +>>> from django.contrib.auth.models import Group +>>> Group.objects.create(id=1, name='Demo') +>>> Group.objects.create(id=2, name='Internal') +``` + ## Usage ### Makefile diff --git a/arkindex/dataimport/api.py b/arkindex/dataimport/api.py index f04ae80e301715a1317fbe81982ce0236fca0407..ef34c1183d2a8fa8862a96d2e6f6e5e93ee57349 100644 --- a/arkindex/dataimport/api.py +++ b/arkindex/dataimport/api.py @@ -13,7 +13,7 @@ from rest_framework.response import Response from rest_framework import status from rest_framework.exceptions import ValidationError from arkindex.project.mixins import CorpusACLMixin -from arkindex.project.permissions import IsAuthenticated, IsAdminUser +from arkindex.project.permissions import IsVerified, IsAuthenticated, IsAdminUser from arkindex.documents.models import Corpus, Right, Element, ElementType from arkindex.dataimport.models import \ DataImport, DataFile, DataImportMode, DataImportFailure, Repository, Event, EventType @@ -35,7 +35,7 @@ class DataImportsList(CorpusACLMixin, ListAPIView): """ List data imports """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataImportLightSerializer def get_queryset(self): @@ -85,7 +85,7 @@ class DataImportRetry(CorpusACLMixin, GenericAPIView): """ Retry a failed import """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataImportSerializer def get_queryset(self): @@ -107,7 +107,7 @@ class DataImportFailures(ListAPIView): List a single import's errors """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataImportFailureSerializer def get_queryset(self): @@ -122,7 +122,7 @@ class DataImportFromFiles(CreateAPIView): Create, configure and start a workflow from one or more DataFiles """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataImportFromFilesSerializer def create(self, *args, **kwargs): @@ -221,7 +221,7 @@ class DataFileList(CorpusACLMixin, ListAPIView): """ List uploaded files """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataFileSerializer def get_queryset(self): @@ -232,7 +232,7 @@ class DataFileRetrieve(CorpusACLMixin, RetrieveUpdateDestroyAPIView): """ Get one file """ - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = DataFileSerializer def get_queryset(self): @@ -314,7 +314,7 @@ class GitRepositoryImportHook(APIView): class RepositoryList(ListAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = RepositorySerializer def get_queryset(self): @@ -324,7 +324,7 @@ class RepositoryList(ListAPIView): class AvailableRepositoriesList(ListCreateAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) pagination_class = None serializer_class = ExternalRepositorySerializer @@ -348,7 +348,7 @@ class AvailableRepositoriesList(ListCreateAPIView): class RepositoryRetrieve(CorpusACLMixin, RetrieveDestroyAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = RepositorySerializer def get_queryset(self): diff --git a/arkindex/dataimport/tests/test_files.py b/arkindex/dataimport/tests/test_files.py index 4f52db9941f7ffbcfbed5b5f1c9af65323e153e2..c6fc5ad0d82fe4071cd39a1154942a754b51ccac 100644 --- a/arkindex/dataimport/tests/test_files.py +++ b/arkindex/dataimport/tests/test_files.py @@ -1,6 +1,5 @@ from rest_framework import status from django.urls import reverse -from django.contrib.auth.models import Group from django.core.files.uploadedfile import SimpleUploadedFile from django.conf import settings from django.test import override_settings @@ -12,7 +11,7 @@ import uuid import os -@override_settings(INTERNAL_GROUP_ID=999) +@override_settings(DEMO_GROUP_ID=2) class TestFiles(FixtureAPITestCase): """ Test file management @@ -21,15 +20,12 @@ class TestFiles(FixtureAPITestCase): @classmethod def setUpTestData(cls): super().setUpTestData() - cls.demo_user = User.objects.create_user('test@test.test', 'testtest') - cls.group = Group.objects.create(name='Demo') - cls.demo_user.groups.add(cls.group) + cls.demo_user = User.objects.get(email='demo@demo.fr') cls.demo_user.corpus_right.create(corpus=cls.corpus, can_write=True) def setUp(self): super().setUp() - self.assertNotEqual(self.group.id, settings.INTERNAL_GROUP_ID) - self.client.force_login(self.demo_user) + self.client.force_login(self.user) def test_file_list(self): df = DataFile.objects.create( @@ -130,6 +126,7 @@ class TestFiles(FixtureAPITestCase): """ Assert a file upload fails for demo users when its size exceeds the corpus limit """ + self.client.force_login(self.demo_user) # Create a file one byte under the allowed size DataFile.objects.create( name='test.txt', size=52428799, hash='aaaa', content_type='text/plain', corpus=self.corpus) diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py index 293e000502f989a09e1b4c2f4dc1be7f937e8c22..965ab18b9d9fc95b77e3dd509da16cae36c39741 100644 --- a/arkindex/documents/api/elements.py +++ b/arkindex/documents/api/elements.py @@ -8,7 +8,7 @@ from arkindex.documents.serializers.elements import ( ) from arkindex.documents.models import Element, ElementType, Page, Act, Corpus, Right from arkindex.project.mixins import CorpusACLMixin -from arkindex.project.permissions import IsAuthenticatedOrReadOnly +from arkindex.project.permissions import IsVerifiedOrReadOnly class ElementsList(CorpusACLMixin, ListAPIView): @@ -93,7 +93,7 @@ class CorpusList(ListCreateAPIView): """ serializer_class = CorpusSerializer pagination_class = None - permission_classes = (IsAuthenticatedOrReadOnly, ) + permission_classes = (IsVerifiedOrReadOnly, ) def get_queryset(self): return Corpus.objects.readable(self.request.user) @@ -104,7 +104,7 @@ class CorpusRetrieve(RetrieveUpdateDestroyAPIView): Get, update and delete corpora """ serializer_class = CorpusSerializer - permission_classes = (IsAuthenticatedOrReadOnly, ) + permission_classes = (IsVerifiedOrReadOnly, ) def get_queryset(self): return Corpus.objects.readable(self.request.user) diff --git a/arkindex/documents/api/ml.py b/arkindex/documents/api/ml.py index d7ea871bf59fd591cf39bb1b0581e1cd2f95a267..2377f00a3cb316a7e5e672d2d81db772a57f9b49 100644 --- a/arkindex/documents/api/ml.py +++ b/arkindex/documents/api/ml.py @@ -9,13 +9,13 @@ from arkindex.documents.serializers.ml import \ from arkindex.documents.indexer import Indexer from arkindex.images.models import Zone from arkindex.images.importer import build_transcriptions, save_transcriptions, index_transcriptions -from arkindex.project.permissions import IsAuthenticated +from arkindex.project.permissions import IsVerified from arkindex.project.polygon import Polygon class TranscriptionCreate(CreateAPIView): serializer_class = TranscriptionCreateSerializer - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) def perform_create(self, serializer): transcription_type = serializer.validated_data['type'] @@ -74,7 +74,7 @@ class TranscriptionBulk(CreateAPIView): and parent element ''' serializer_class = TranscriptionsSerializer - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) def perform_create(self, serializer): @@ -133,7 +133,7 @@ class ClassificationBulk(CreateAPIView): Create multiple classifications at once for a single element from a single ML tool """ serializer_class = ClassificationsSerializer - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) def perform_create(self, serializer): parent = serializer.validated_data['parent'] diff --git a/arkindex/documents/fixtures/data.json b/arkindex/documents/fixtures/data.json index 45abb1daae53ff9428b498d950a1c97485eb8cb0..b029c1a8555315ae170ecdd6167b88e401917a62 100644 --- a/arkindex/documents/fixtures/data.json +++ b/arkindex/documents/fixtures/data.json @@ -1,22 +1,22 @@ [ { "model": "dataimport.repository", - "pk": "6cb81038-0316-43ce-a9f4-611c38b2d21b", + "pk": "f777ed27-fbe0-4fec-b344-f78070cfa264", "fields": { "url": "http://gitlab/repo", "hook_token": "hook-token", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "credentials": "434edb7d-46e2-42f8-80a9-de2a16958c4f", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "credentials": "656059a3-e70c-46b5-b2a0-bb4d34794df7", "provider_name": "GitLabProvider" } }, { "model": "dataimport.revision", - "pk": "5842292c-7aac-45a6-910d-34c7d3c1b58a", + "pk": "ff7c4a7f-ca1c-4277-ab8c-d6a84977447e", "fields": { - "created": "2019-02-21T11:18:38.292Z", - "updated": "2019-02-21T11:18:38.292Z", - "repo": "6cb81038-0316-43ce-a9f4-611c38b2d21b", + "created": "2019-03-08T15:10:28.095Z", + "updated": "2019-03-08T15:10:28.095Z", + "repo": "f777ed27-fbe0-4fec-b344-f78070cfa264", "hash": "42", "ref": "refs/heads/master", "message": "a", @@ -25,7 +25,7 @@ }, { "model": "documents.corpus", - "pk": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "pk": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "fields": { "name": "Unit Tests", "description": "", @@ -34,430 +34,430 @@ }, { "model": "documents.elementpath", - "pk": "0dff409a-6573-4877-b49d-5ed3ab7d3c11", + "pk": "0d8c5a5d-4dba-48ac-acd1-5a979d130ce9", "fields": { - "element": "2bb339be-cf43-46fa-be69-920da0339b60", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 0 + "element": "f645b44c-52c8-449e-b73b-ebedc044729a", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 3 } }, { "model": "documents.elementpath", - "pk": "14a1deeb-5021-4415-b8ff-4f5a87b92085", + "pk": "1d77dd8d-0403-474a-ae84-f19b8b00e2ac", "fields": { - "element": "431dd110-aa03-4e74-aca4-d7276c2c7a2b", - "path": "[\"42134c45-6acd-4f77-9dd5-0e82481c6495\", \"7e8a8e54-c419-4b7b-8b22-deb0cadef2c1\"]", + "element": "39e63c49-4f17-47f5-a30d-ff2f76f1427f", + "path": "[\"0d8822c0-f117-48c0-b07a-3539773d1fcb\", \"6559a60a-215a-4cc3-a96a-37dfe2740c2c\"]", "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "350f5e80-ed09-4b85-ba8b-830e452bc977", + "pk": "2161930a-8524-4109-aa2f-d77f73bb569b", "fields": { - "element": "7e8a8e54-c419-4b7b-8b22-deb0cadef2c1", - "path": "[\"42134c45-6acd-4f77-9dd5-0e82481c6495\"]", - "ordering": 0 + "element": "b3c809d6-e8c6-4dae-b459-a42de2e62d6c", + "path": "[\"0d8822c0-f117-48c0-b07a-3539773d1fcb\", \"6559a60a-215a-4cc3-a96a-37dfe2740c2c\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "413083ac-60d7-4982-8d5c-dd0c38386348", + "pk": "25378386-ca5f-4903-821b-1ba2d50b225a", "fields": { - "element": "5fc163e2-86dd-4dab-89d1-89fc9d2fc8a1", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"03db6182-c24c-4b56-8e99-04706ceca550\"]", + "element": "0171957b-b3a1-45d3-bf3d-bd9879412d75", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "42774706-0f13-454b-83ba-ba0cb869cddd", + "pk": "2937b9e2-bfaf-4d5e-9a6f-c76d837b8a53", "fields": { - "element": "559d42c1-abe0-4bc3-8ccd-2701c555a571", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", + "element": "ce37cf4d-935e-4891-b2db-c53907dde024", + "path": "[\"0d8822c0-f117-48c0-b07a-3539773d1fcb\", \"6559a60a-215a-4cc3-a96a-37dfe2740c2c\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "52a9e8b7-5989-4cd4-ab1f-36a0071b0ead", + "pk": "31725cf5-e8fa-4e69-9234-c343f1f75e97", "fields": { - "element": "2a190b6b-c017-4840-9a7d-9234450d1bfd", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"0221f848-d543-4a7e-9b32-f4bebbb91ee6\"]", - "ordering": 1 + "element": "50fe8cfd-222a-42c4-8b88-11af80d19ca9", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "58a3290b-bc9c-4470-ad9c-4af3e5e527c9", + "pk": "3a4c2d4f-428d-4bce-9482-ebf499f847e2", "fields": { - "element": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 1 + "element": "f0562a35-05e2-4861-8deb-f553ea740479", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "5c739ced-b26b-4eeb-bc14-e0a1584d84ec", + "pk": "3c13b16c-5460-4c46-939d-42d59bb312f3", "fields": { - "element": "f037604e-1ed6-49a6-97fd-d1926479290b", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 2 + "element": "aa4dfa2c-2f68-4f8b-8d58-358ace1ade4e", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"f645b44c-52c8-449e-b73b-ebedc044729a\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "66e03ca8-222d-4220-94fe-57b038c764a6", + "pk": "43c02669-4689-4eb9-adbb-6857172e5393", "fields": { - "element": "03db6182-c24c-4b56-8e99-04706ceca550", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 2 + "element": "07b1468e-96ac-4418-9637-d9215e623836", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"0171957b-b3a1-45d3-bf3d-bd9879412d75\"]", + "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "6b1a95ba-b0b9-49df-a872-c91e619e3377", + "pk": "462ee4b9-f948-4a77-8963-a357bc995e69", "fields": { - "element": "748b1670-efea-4992-8d65-689ce4736d19", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"0221f848-d543-4a7e-9b32-f4bebbb91ee6\"]", + "element": "6559a60a-215a-4cc3-a96a-37dfe2740c2c", + "path": "[\"0d8822c0-f117-48c0-b07a-3539773d1fcb\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "77438d36-96b0-4e87-96b0-3b8f32e65ca8", + "pk": "4afedad3-41ea-4f15-849d-b4d3d65a9c2f", "fields": { - "element": "7aa6f286-eb0c-4d97-bcf2-1905c5be5cbe", - "path": "[\"42134c45-6acd-4f77-9dd5-0e82481c6495\", \"7e8a8e54-c419-4b7b-8b22-deb0cadef2c1\"]", + "element": "197c9ef2-f3f7-401a-bbe0-ce89c334f6a8", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"38a16c2d-c3d2-4e50-85f0-bf862ada16a0\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "7d808740-31bb-4487-8efb-43033521a68a", + "pk": "4d422e57-86be-43ee-aa1e-c6f0ebf4e4f3", "fields": { - "element": "05e48dee-f9c3-47f3-8469-12564999fa54", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"3f4eb943-a13c-4295-b063-481bd488de62\"]", - "ordering": 0 + "element": "2cd72d10-912c-4d77-bf5a-dccb44ce215d", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"80c7cb92-a19a-49ff-acb0-e05ec4daeeac\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "7f21ee7a-eda4-4b22-a171-c8b2f5288d2e", + "pk": "5aa9c701-b476-417d-9364-ec3acf177d88", "fields": { - "element": "f0ebf92f-b3a0-44dc-86e5-91932052c1a5", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"2bb339be-cf43-46fa-be69-920da0339b60\"]", + "element": "a1d59519-210f-45eb-8949-fdee8a566e52", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "80538bb1-76d3-427c-894b-736477f71a2a", + "pk": "84c0259e-b4d7-43e6-b6ec-b2a035560aec", "fields": { - "element": "4ab6e2d2-0db4-419b-bc8e-0d2f3636ebfd", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\", \"12441ce3-32c4-425e-ae47-e6c65d86afe7\"]", + "element": "bc9e55cf-178a-4d1f-9f77-b171704cfb56", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"ec578e2b-0056-44a5-a9bb-28804878ce0d\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "81b510fa-0316-4402-bcd6-f66e8c853b07", + "pk": "89bcda89-6e2b-4746-9df7-14cf92e0475c", "fields": { - "element": "0221f848-d543-4a7e-9b32-f4bebbb91ee6", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 1 + "element": "38a16c2d-c3d2-4e50-85f0-bf862ada16a0", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 2 } }, { "model": "documents.elementpath", - "pk": "936c77fd-7d21-4848-a922-63bb1710c5c8", + "pk": "c10fefb5-ecf3-4431-b042-0dc36d360d15", "fields": { - "element": "5d24b089-a1e0-4bd0-9d6b-e673faca5e57", - "path": "[\"42134c45-6acd-4f77-9dd5-0e82481c6495\", \"7e8a8e54-c419-4b7b-8b22-deb0cadef2c1\"]", - "ordering": 1 + "element": "ec578e2b-0056-44a5-a9bb-28804878ce0d", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 4 } }, { "model": "documents.elementpath", - "pk": "d59c2966-7839-47d0-bf0e-eb6970ee8518", + "pk": "c124fa98-8663-4888-a344-abccea44f7d6", "fields": { - "element": "3f4eb943-a13c-4295-b063-481bd488de62", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 3 + "element": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 1 } }, { "model": "documents.elementpath", - "pk": "ee76427e-ee84-4201-a222-8e3941d24dc4", + "pk": "c3113ab0-fb64-4cb1-9eeb-e32effab2d91", "fields": { - "element": "dcf54664-f834-4974-bf28-c28ec10e5b87", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\"]", + "element": "36daf398-49d0-4754-8e3b-3f8ab83a4d69", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\", \"80c7cb92-a19a-49ff-acb0-e05ec4daeeac\"]", "ordering": 0 } }, { "model": "documents.elementpath", - "pk": "f7e46bd9-3d60-494e-a0af-b23fd465d276", + "pk": "ee73a39d-8542-4d39-9907-16c55576536f", "fields": { - "element": "12441ce3-32c4-425e-ae47-e6c65d86afe7", - "path": "[\"31e583fa-87c3-4373-ac24-a5b8003c324a\", \"dcf54664-f834-4974-bf28-c28ec10e5b87\"]", - "ordering": 4 + "element": "80c7cb92-a19a-49ff-acb0-e05ec4daeeac", + "path": "[\"735e4fce-d2f8-4859-90da-4adb494d6e07\", \"50fe8cfd-222a-42c4-8b88-11af80d19ca9\"]", + "ordering": 1 } }, { "model": "documents.element", - "pk": "0221f848-d543-4a7e-9b32-f4bebbb91ee6", + "pk": "0171957b-b3a1-45d3-bf3d-bd9879412d75", "fields": { - "created": "2019-02-21T11:18:38.116Z", - "updated": "2019-02-21T11:18:38.116Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:27.997Z", + "updated": "2019-03-08T15:10:27.997Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "act", - "name": "Act 2", + "name": "Act 1", "zone": null } }, { "model": "documents.element", - "pk": "03db6182-c24c-4b56-8e99-04706ceca550", + "pk": "07b1468e-96ac-4418-9637-d9215e623836", "fields": { - "created": "2019-02-21T11:18:38.120Z", - "updated": "2019-02-21T11:18:38.120Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "act", - "name": "Act 3", - "zone": null + "created": "2019-03-08T15:10:28.042Z", + "updated": "2019-03-08T15:10:28.042Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "surface", + "name": "Surface A", + "zone": "63f6db61-6b2d-48ab-9f5e-2ed0537bfc29" } }, { "model": "documents.element", - "pk": "05e48dee-f9c3-47f3-8469-12564999fa54", + "pk": "0d8822c0-f117-48c0-b07a-3539773d1fcb", "fields": { - "created": "2019-02-21T11:18:38.206Z", - "updated": "2019-02-21T11:18:38.206Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "surface", - "name": "Surface E", - "zone": "cca66be4-8976-468c-bfc5-c717b5094d4c" + "created": "2019-03-08T15:10:27.901Z", + "updated": "2019-03-08T15:10:27.901Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "volume", + "name": "Volume 2", + "zone": null } }, { "model": "documents.element", - "pk": "12441ce3-32c4-425e-ae47-e6c65d86afe7", + "pk": "197c9ef2-f3f7-401a-bbe0-ce89c334f6a8", "fields": { - "created": "2019-02-21T11:18:38.128Z", - "updated": "2019-02-21T11:18:38.128Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "act", - "name": "Act 5", - "zone": null + "created": "2019-03-08T15:10:28.048Z", + "updated": "2019-03-08T15:10:28.048Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "surface", + "name": "Surface D", + "zone": "c22b94a3-5cb7-47c4-8c54-58724d0c3605" } }, { "model": "documents.element", - "pk": "2a190b6b-c017-4840-9a7d-9234450d1bfd", + "pk": "2cd72d10-912c-4d77-bf5a-dccb44ce215d", "fields": { - "created": "2019-02-21T11:18:38.198Z", - "updated": "2019-02-21T11:18:38.198Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:28.046Z", + "updated": "2019-03-08T15:10:28.046Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "surface", "name": "Surface C", - "zone": "97a7d8c5-af46-4da8-8099-dc67673ffd92" + "zone": "5f9213ba-993f-4599-a73d-3e53a165c79f" } }, { "model": "documents.element", - "pk": "2bb339be-cf43-46fa-be69-920da0339b60", + "pk": "36daf398-49d0-4754-8e3b-3f8ab83a4d69", "fields": { - "created": "2019-02-21T11:18:38.111Z", - "updated": "2019-02-21T11:18:38.112Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "act", - "name": "Act 1", - "zone": null + "created": "2019-03-08T15:10:28.044Z", + "updated": "2019-03-08T15:10:28.044Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "surface", + "name": "Surface B", + "zone": "0a3409f0-6df1-41b2-81ab-1bbb39273b6f" } }, { "model": "documents.element", - "pk": "31e583fa-87c3-4373-ac24-a5b8003c324a", + "pk": "38a16c2d-c3d2-4e50-85f0-bf862ada16a0", "fields": { - "created": "2019-02-21T11:18:37.934Z", - "updated": "2019-02-21T11:18:37.934Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "volume", - "name": "Volume 1", + "created": "2019-03-08T15:10:28.002Z", + "updated": "2019-03-08T15:10:28.002Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "act", + "name": "Act 3", "zone": null } }, { "model": "documents.element", - "pk": "3f4eb943-a13c-4295-b063-481bd488de62", + "pk": "39e63c49-4f17-47f5-a30d-ff2f76f1427f", "fields": { - "created": "2019-02-21T11:18:38.124Z", - "updated": "2019-02-21T11:18:38.124Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "act", - "name": "Act 4", - "zone": null + "created": "2019-03-08T15:10:27.952Z", + "updated": "2019-03-08T15:10:27.952Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "page", + "name": "Volume 2, page 2r", + "zone": "75df3358-147f-4b5f-a5d8-17d03207d8c3" } }, { "model": "documents.element", - "pk": "42134c45-6acd-4f77-9dd5-0e82481c6495", + "pk": "50fe8cfd-222a-42c4-8b88-11af80d19ca9", "fields": { - "created": "2019-02-21T11:18:37.937Z", - "updated": "2019-02-21T11:18:37.937Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "volume", - "name": "Volume 2", + "created": "2019-03-08T15:10:27.902Z", + "updated": "2019-03-08T15:10:27.902Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "register", + "name": "Register 1", "zone": null } }, { "model": "documents.element", - "pk": "431dd110-aa03-4e74-aca4-d7276c2c7a2b", + "pk": "6559a60a-215a-4cc3-a96a-37dfe2740c2c", "fields": { - "created": "2019-02-21T11:18:38.036Z", - "updated": "2019-02-21T11:18:38.036Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "page", - "name": "Volume 2, page 2r", - "zone": "c25d73ad-a6e5-4474-a1c5-dd8746097724" + "created": "2019-03-08T15:10:27.903Z", + "updated": "2019-03-08T15:10:27.903Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "register", + "name": "Register 2", + "zone": null } }, { "model": "documents.element", - "pk": "4ab6e2d2-0db4-419b-bc8e-0d2f3636ebfd", + "pk": "735e4fce-d2f8-4859-90da-4adb494d6e07", "fields": { - "created": "2019-02-21T11:18:38.210Z", - "updated": "2019-02-21T11:18:38.210Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "surface", - "name": "Surface F", - "zone": "eacd4db4-6a0e-410c-8874-a4c445303ccb" + "created": "2019-03-08T15:10:27.899Z", + "updated": "2019-03-08T15:10:27.899Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "volume", + "name": "Volume 1", + "zone": null } }, { "model": "documents.element", - "pk": "559d42c1-abe0-4bc3-8ccd-2701c555a571", + "pk": "80c7cb92-a19a-49ff-acb0-e05ec4daeeac", "fields": { - "created": "2019-02-21T11:18:37.977Z", - "updated": "2019-02-21T11:18:37.977Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "page", - "name": "Volume 1, page 1r", - "zone": "ddaaa60b-c5ff-4948-a959-837cbdc42fe6" + "created": "2019-03-08T15:10:28.000Z", + "updated": "2019-03-08T15:10:28.000Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "act", + "name": "Act 2", + "zone": null } }, { "model": "documents.element", - "pk": "5d24b089-a1e0-4bd0-9d6b-e673faca5e57", + "pk": "a1d59519-210f-45eb-8949-fdee8a566e52", "fields": { - "created": "2019-02-21T11:18:38.032Z", - "updated": "2019-02-21T11:18:38.032Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:27.920Z", + "updated": "2019-03-08T15:10:27.920Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "page", - "name": "Volume 2, page 1v", - "zone": "85a0bfa3-aa89-4aed-82ee-dcfbb1b730d1" + "name": "Volume 1, page 1r", + "zone": "d4389d0e-2cbf-4474-90c2-fe774c4e1784" } }, { "model": "documents.element", - "pk": "5fc163e2-86dd-4dab-89d1-89fc9d2fc8a1", + "pk": "aa4dfa2c-2f68-4f8b-8d58-358ace1ade4e", "fields": { - "created": "2019-02-21T11:18:38.202Z", - "updated": "2019-02-21T11:18:38.202Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:28.049Z", + "updated": "2019-03-08T15:10:28.049Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "surface", - "name": "Surface D", - "zone": "d8d7e8ad-7db1-4849-a53a-b0a31879dcb7" + "name": "Surface E", + "zone": "02baf086-d54b-4ebc-acb5-665251c86ece" } }, { "model": "documents.element", - "pk": "748b1670-efea-4992-8d65-689ce4736d19", + "pk": "b3c809d6-e8c6-4dae-b459-a42de2e62d6c", "fields": { - "created": "2019-02-21T11:18:38.194Z", - "updated": "2019-02-21T11:18:38.194Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "surface", - "name": "Surface B", - "zone": "3766b684-531f-49d6-a634-ab3ae3c94121" + "created": "2019-03-08T15:10:27.950Z", + "updated": "2019-03-08T15:10:27.950Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "page", + "name": "Volume 2, page 1v", + "zone": "65103a6d-894d-4503-b479-8fdc0df711d0" } }, { "model": "documents.element", - "pk": "7aa6f286-eb0c-4d97-bcf2-1905c5be5cbe", + "pk": "bc9e55cf-178a-4d1f-9f77-b171704cfb56", "fields": { - "created": "2019-02-21T11:18:38.028Z", - "updated": "2019-02-21T11:18:38.028Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "page", - "name": "Volume 2, page 1r", - "zone": "2abfa43d-3b7f-4be8-ab98-127fd930d5a3" + "created": "2019-03-08T15:10:28.051Z", + "updated": "2019-03-08T15:10:28.051Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "surface", + "name": "Surface F", + "zone": "db2aa3f6-49f4-4077-b8c6-9f613b14e6ed" } }, { "model": "documents.element", - "pk": "7e8a8e54-c419-4b7b-8b22-deb0cadef2c1", + "pk": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", "fields": { - "created": "2019-02-21T11:18:37.942Z", - "updated": "2019-02-21T11:18:37.942Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "register", - "name": "Register 2", - "zone": null + "created": "2019-03-08T15:10:27.923Z", + "updated": "2019-03-08T15:10:27.923Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "page", + "name": "Volume 1, page 1v", + "zone": "223d51b6-b2aa-48f3-b6c2-5c1a6e6d8918" } }, { "model": "documents.element", - "pk": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", + "pk": "ce37cf4d-935e-4891-b2db-c53907dde024", "fields": { - "created": "2019-02-21T11:18:37.983Z", - "updated": "2019-02-21T11:18:37.983Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:27.948Z", + "updated": "2019-03-08T15:10:27.948Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "page", - "name": "Volume 1, page 1v", - "zone": "c929aaf9-f313-479e-8d4e-5b60a6d9a907" + "name": "Volume 2, page 1r", + "zone": "a07c3fcb-1f48-4c14-9b9f-f3b7d07d79fb" } }, { "model": "documents.element", - "pk": "dcf54664-f834-4974-bf28-c28ec10e5b87", + "pk": "ec578e2b-0056-44a5-a9bb-28804878ce0d", "fields": { - "created": "2019-02-21T11:18:37.939Z", - "updated": "2019-02-21T11:18:37.939Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "register", - "name": "Register 1", + "created": "2019-03-08T15:10:28.007Z", + "updated": "2019-03-08T15:10:28.007Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "act", + "name": "Act 5", "zone": null } }, { "model": "documents.element", - "pk": "f037604e-1ed6-49a6-97fd-d1926479290b", + "pk": "f0562a35-05e2-4861-8deb-f553ea740479", "fields": { - "created": "2019-02-21T11:18:37.988Z", - "updated": "2019-02-21T11:18:37.988Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "created": "2019-03-08T15:10:27.925Z", + "updated": "2019-03-08T15:10:27.925Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "type": "page", "name": "Volume 1, page 2r", - "zone": "ae749e9b-01fd-40d7-8240-63e5a1e5545f" + "zone": "50a14471-3698-45ab-9542-a216374d2e37" } }, { "model": "documents.element", - "pk": "f0ebf92f-b3a0-44dc-86e5-91932052c1a5", + "pk": "f645b44c-52c8-449e-b73b-ebedc044729a", "fields": { - "created": "2019-02-21T11:18:38.191Z", - "updated": "2019-02-21T11:18:38.191Z", - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", - "type": "surface", - "name": "Surface A", - "zone": "60659f4b-3299-4b2e-a86a-ec97ac47044f" + "created": "2019-03-08T15:10:28.004Z", + "updated": "2019-03-08T15:10:28.004Z", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", + "type": "act", + "name": "Act 4", + "zone": null } }, { "model": "documents.page", - "pk": "431dd110-aa03-4e74-aca4-d7276c2c7a2b", + "pk": "39e63c49-4f17-47f5-a30d-ff2f76f1427f", "fields": { "folio": "2r", "page_type": "page", @@ -468,7 +468,7 @@ }, { "model": "documents.page", - "pk": "559d42c1-abe0-4bc3-8ccd-2701c555a571", + "pk": "a1d59519-210f-45eb-8949-fdee8a566e52", "fields": { "folio": "1r", "page_type": "page", @@ -479,7 +479,7 @@ }, { "model": "documents.page", - "pk": "5d24b089-a1e0-4bd0-9d6b-e673faca5e57", + "pk": "b3c809d6-e8c6-4dae-b459-a42de2e62d6c", "fields": { "folio": "1v", "page_type": "page", @@ -490,29 +490,29 @@ }, { "model": "documents.page", - "pk": "7aa6f286-eb0c-4d97-bcf2-1905c5be5cbe", + "pk": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", "fields": { - "folio": "1r", + "folio": "1v", "page_type": "page", "nb": 1, - "direction": "recto", + "direction": "verso", "complement": null } }, { "model": "documents.page", - "pk": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", + "pk": "ce37cf4d-935e-4891-b2db-c53907dde024", "fields": { - "folio": "1v", + "folio": "1r", "page_type": "page", "nb": 1, - "direction": "verso", + "direction": "recto", "complement": null } }, { "model": "documents.page", - "pk": "f037604e-1ed6-49a6-97fd-d1926479290b", + "pk": "f0562a35-05e2-4861-8deb-f553ea740479", "fields": { "folio": "2r", "page_type": "page", @@ -523,15 +523,15 @@ }, { "model": "documents.act", - "pk": "0221f848-d543-4a7e-9b32-f4bebbb91ee6", + "pk": "0171957b-b3a1-45d3-bf3d-bd9879412d75", "fields": { - "number": "2", - "folio": "1r-1v" + "number": "1", + "folio": "1r" } }, { "model": "documents.act", - "pk": "03db6182-c24c-4b56-8e99-04706ceca550", + "pk": "38a16c2d-c3d2-4e50-85f0-bf862ada16a0", "fields": { "number": "3", "folio": "2r" @@ -539,23 +539,23 @@ }, { "model": "documents.act", - "pk": "12441ce3-32c4-425e-ae47-e6c65d86afe7", + "pk": "80c7cb92-a19a-49ff-acb0-e05ec4daeeac", "fields": { - "number": "5", - "folio": "2r" + "number": "2", + "folio": "1r-1v" } }, { "model": "documents.act", - "pk": "2bb339be-cf43-46fa-be69-920da0339b60", + "pk": "ec578e2b-0056-44a5-a9bb-28804878ce0d", "fields": { - "number": "1", - "folio": "1r" + "number": "5", + "folio": "2r" } }, { "model": "documents.act", - "pk": "3f4eb943-a13c-4295-b063-481bd488de62", + "pk": "f645b44c-52c8-449e-b73b-ebedc044729a", "fields": { "number": "4", "folio": "2r" @@ -563,7 +563,7 @@ }, { "model": "documents.datasource", - "pk": "8936463b-c07f-4cf5-845f-3724295dbc5d", + "pk": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", "fields": { "type": "recognizer", "slug": "test", @@ -573,109 +573,109 @@ }, { "model": "documents.transcription", - "pk": "05153a78-3722-43c1-9067-bda131027286", + "pk": "09742293-2f42-44a1-8980-70ea0e2f61dd", "fields": { - "element": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", + "element": "a1d59519-210f-45eb-8949-fdee8a566e52", "type": "word", - "zone": "15f01f99-e108-4f81-9408-9f5ab97e6b85", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "ROY", + "zone": "34039648-e389-43e1-a406-90ba221f072b", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "2eb5639d-a998-4f15-a629-745191120888", + "pk": "0a94dfae-dd41-4fce-9199-3defe5c4dd25", "fields": { - "element": "f037604e-1ed6-49a6-97fd-d1926479290b", + "element": "a1d59519-210f-45eb-8949-fdee8a566e52", "type": "word", - "zone": "f5f0d49c-6655-466e-b6a8-8317cd45086a", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "DATUM", + "zone": "6714f377-62f1-47f3-84f2-95df3f773d87", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "2f1fee19-d2c6-4532-ac80-f255bf25108e", + "pk": "0e8456b4-ece4-47b4-9097-886258eafd06", "fields": { - "element": "559d42c1-abe0-4bc3-8ccd-2701c555a571", + "element": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", "type": "word", - "zone": "643f5244-ba32-4fb7-8aa9-07412727c8a6", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", + "zone": "63167e3c-6a0a-4106-971b-0be343a77925", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "5a22c173-a3e3-4491-9a2c-297f6be5a2fe", + "pk": "28a0afa9-b87d-401d-aad9-eeea14fef99e", "fields": { - "element": "559d42c1-abe0-4bc3-8ccd-2701c555a571", + "element": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", "type": "word", - "zone": "93710d62-20f8-4a96-b8a4-4c108cf380e0", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "DATUM", + "zone": "844f5d59-da6e-4c92-90ac-7f5288391da9", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "PARIS", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "86419383-8db8-4c86-91e8-6505c3813a83", + "pk": "2c6c0338-2c8b-42fc-babb-915899fd57b7", "fields": { - "element": "559d42c1-abe0-4bc3-8ccd-2701c555a571", + "element": "a1d59519-210f-45eb-8949-fdee8a566e52", "type": "word", - "zone": "94cc533e-dc39-4f2f-8cde-98bc9fc6d35a", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "PARIS", + "zone": "d03c0305-6ebb-47fa-bbc5-8eb7de78fd41", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "b22ccfa1-4bc2-408e-a994-5496bec59d18", + "pk": "7b923901-1ce6-493f-a0ab-ce9d4512095f", "fields": { - "element": "f037604e-1ed6-49a6-97fd-d1926479290b", + "element": "f0562a35-05e2-4861-8deb-f553ea740479", "type": "word", - "zone": "e8ff9b94-2d2e-449c-b841-a7fb3fa0da5e", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "PARIS", + "zone": "cba81c23-d41f-4849-9cb2-168dea386f90", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "ROY", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "b69a5426-e435-4117-a92e-0a06421c0aa2", + "pk": "c423fda6-5dc2-4081-9926-c63961fb842d", "fields": { - "element": "f037604e-1ed6-49a6-97fd-d1926479290b", + "element": "f0562a35-05e2-4861-8deb-f553ea740479", "type": "word", - "zone": "9aa37972-ce4a-4abc-aaec-09e828e42209", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "ROY", + "zone": "8fb0f797-8646-4c50-bb36-1c12108b52bb", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "e7798784-fe3a-4a05-8f9b-0b82bbd367aa", + "pk": "c55de22f-3ca4-4daa-85cb-0c7a0db93f84", "fields": { - "element": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", + "element": "c3f32f55-4167-4b6d-9e7a-8fa1e8bb77f5", "type": "word", - "zone": "659dc10b-7c46-4b40-8fb9-e00124de27c8", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "PARIS", + "zone": "ea60ffe7-cff0-4cb0-aa5c-1fcbf3b6bc69", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "DATUM", "score": 1.0 } }, { "model": "documents.transcription", - "pk": "f55146b2-e1c0-4878-95d6-ed56eb337dd2", + "pk": "e109e287-8f18-4f0a-af4e-3335e884713b", "fields": { - "element": "d1820806-9f2b-4e10-9fd7-cc38a92bc603", + "element": "f0562a35-05e2-4861-8deb-f553ea740479", "type": "word", - "zone": "e5b52038-9b8a-4507-b2cb-99345abeed3d", - "source": "8936463b-c07f-4cf5-845f-3724295dbc5d", - "text": "DATUM", + "zone": "335b3f42-c06a-4928-b5a4-1a3f3abe15a6", + "source": "ade8ff44-c0c7-4e2e-98f9-cb0f02a1cabe", + "text": "PARIS", "score": 1.0 } }, @@ -685,17 +685,17 @@ "fields": { "display_name": "Test Server", "url": "http://server", - "created": "2019-02-21T11:18:37.512Z", - "updated": "2019-02-21T11:18:37.512Z", + "created": "2019-03-08T15:10:27.638Z", + "updated": "2019-03-08T15:10:27.638Z", "validated": false } }, { "model": "images.image", - "pk": "37dba55e-09d4-4177-a160-410f81b9dcb5", + "pk": "4c52be7a-599b-4775-92a6-e261ce78ed16", "fields": { - "created": "2019-02-21T11:18:37.525Z", - "updated": "2019-02-21T11:18:37.525Z", + "created": "2019-03-08T15:10:27.644Z", + "updated": "2019-03-08T15:10:27.644Z", "server": 1, "path": "img4", "width": 1000, @@ -705,12 +705,12 @@ }, { "model": "images.image", - "pk": "463eae17-0946-425e-92d3-f763c09babae", + "pk": "7c841a21-146b-4db4-9d28-2101490d2b8d", "fields": { - "created": "2019-02-21T11:18:37.529Z", - "updated": "2019-02-21T11:18:37.529Z", + "created": "2019-03-08T15:10:27.643Z", + "updated": "2019-03-08T15:10:27.643Z", "server": 1, - "path": "img6", + "path": "img3", "width": 1000, "height": 1000, "status": "unchecked" @@ -718,12 +718,12 @@ }, { "model": "images.image", - "pk": "627f8463-4f86-4a65-ac2d-2544bd721762", + "pk": "830dae4d-c2ec-4e45-9c93-7416d10da405", "fields": { - "created": "2019-02-21T11:18:37.518Z", - "updated": "2019-02-21T11:18:37.518Z", + "created": "2019-03-08T15:10:27.646Z", + "updated": "2019-03-08T15:10:27.646Z", "server": 1, - "path": "img1", + "path": "img6", "width": 1000, "height": 1000, "status": "unchecked" @@ -731,12 +731,12 @@ }, { "model": "images.image", - "pk": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", + "pk": "9d210df7-7a35-4907-8ca6-19392909c984", "fields": { - "created": "2019-02-21T11:18:37.521Z", - "updated": "2019-02-21T11:18:37.521Z", + "created": "2019-03-08T15:10:27.645Z", + "updated": "2019-03-08T15:10:27.645Z", "server": 1, - "path": "img2", + "path": "img5", "width": 1000, "height": 1000, "status": "unchecked" @@ -744,12 +744,12 @@ }, { "model": "images.image", - "pk": "a5030802-72e4-47f0-b846-379ec0c66ddd", + "pk": "b72c434a-3983-4d98-a850-104b7f948691", "fields": { - "created": "2019-02-21T11:18:37.527Z", - "updated": "2019-02-21T11:18:37.527Z", + "created": "2019-03-08T15:10:27.640Z", + "updated": "2019-03-08T15:10:27.640Z", "server": 1, - "path": "img5", + "path": "img1", "width": 1000, "height": 1000, "status": "unchecked" @@ -757,12 +757,12 @@ }, { "model": "images.image", - "pk": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "pk": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", "fields": { - "created": "2019-02-21T11:18:37.523Z", - "updated": "2019-02-21T11:18:37.523Z", + "created": "2019-03-08T15:10:27.642Z", + "updated": "2019-03-08T15:10:27.642Z", "server": 1, - "path": "img3", + "path": "img2", "width": 1000, "height": 1000, "status": "unchecked" @@ -770,243 +770,1318 @@ }, { "model": "images.zone", - "pk": "15f01f99-e108-4f81-9408-9f5ab97e6b85", + "pk": "02baf086-d54b-4ebc-acb5-665251c86ece", "fields": { - "created": "2019-02-21T11:18:38.091Z", - "updated": "2019-02-21T11:18:38.091Z", - "image": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2019-03-08T15:10:28.048Z", + "updated": "2019-03-08T15:10:28.048Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", + "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" } }, { "model": "images.zone", - "pk": "2abfa43d-3b7f-4be8-ab98-127fd930d5a3", + "pk": "0a3409f0-6df1-41b2-81ab-1bbb39273b6f", "fields": { - "created": "2019-02-21T11:18:37.538Z", - "updated": "2019-02-21T11:18:37.538Z", - "image": "37dba55e-09d4-4177-a160-410f81b9dcb5", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-03-08T15:10:28.043Z", + "updated": "2019-03-08T15:10:28.043Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", + "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "3766b684-531f-49d6-a634-ab3ae3c94121", + "pk": "223d51b6-b2aa-48f3-b6c2-5c1a6e6d8918", "fields": { - "created": "2019-02-21T11:18:38.192Z", - "updated": "2019-02-21T11:18:38.192Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" + "created": "2019-03-08T15:10:27.649Z", + "updated": "2019-03-08T15:10:27.649Z", + "image": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "60659f4b-3299-4b2e-a86a-ec97ac47044f", + "pk": "335b3f42-c06a-4928-b5a4-1a3f3abe15a6", "fields": { - "created": "2019-02-21T11:18:38.189Z", - "updated": "2019-02-21T11:18:38.189Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" + "created": "2019-03-08T15:10:27.990Z", + "updated": "2019-03-08T15:10:27.990Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "643f5244-ba32-4fb7-8aa9-07412727c8a6", + "pk": "34039648-e389-43e1-a406-90ba221f072b", "fields": { - "created": "2019-02-21T11:18:38.078Z", - "updated": "2019-02-21T11:18:38.078Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" + "created": "2019-03-08T15:10:27.977Z", + "updated": "2019-03-08T15:10:27.977Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "659dc10b-7c46-4b40-8fb9-e00124de27c8", + "pk": "50a14471-3698-45ab-9542-a216374d2e37", "fields": { - "created": "2019-02-21T11:18:38.086Z", - "updated": "2019-02-21T11:18:38.086Z", - "image": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-03-08T15:10:27.650Z", + "updated": "2019-03-08T15:10:27.650Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "85a0bfa3-aa89-4aed-82ee-dcfbb1b730d1", + "pk": "5f9213ba-993f-4599-a73d-3e53a165c79f", "fields": { - "created": "2019-02-21T11:18:37.540Z", - "updated": "2019-02-21T11:18:37.540Z", - "image": "a5030802-72e4-47f0-b846-379ec0c66ddd", + "created": "2019-03-08T15:10:28.045Z", + "updated": "2019-03-08T15:10:28.045Z", + "image": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "93710d62-20f8-4a96-b8a4-4c108cf380e0", + "pk": "63167e3c-6a0a-4106-971b-0be343a77925", "fields": { - "created": "2019-02-21T11:18:38.082Z", - "updated": "2019-02-21T11:18:38.082Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" + "created": "2019-03-08T15:10:27.986Z", + "updated": "2019-03-08T15:10:27.986Z", + "image": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "94cc533e-dc39-4f2f-8cde-98bc9fc6d35a", + "pk": "63f6db61-6b2d-48ab-9f5e-2ed0537bfc29", "fields": { - "created": "2019-02-21T11:18:38.073Z", - "updated": "2019-02-21T11:18:38.073Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-03-08T15:10:28.041Z", + "updated": "2019-03-08T15:10:28.041Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", + "polygon": "Polygon((0,0), (600,0), (600,600), (0,600), (0,0))" } }, { "model": "images.zone", - "pk": "97a7d8c5-af46-4da8-8099-dc67673ffd92", + "pk": "65103a6d-894d-4503-b479-8fdc0df711d0", "fields": { - "created": "2019-02-21T11:18:38.196Z", - "updated": "2019-02-21T11:18:38.196Z", - "image": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", + "created": "2019-03-08T15:10:27.652Z", + "updated": "2019-03-08T15:10:27.652Z", + "image": "9d210df7-7a35-4907-8ca6-19392909c984", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "9aa37972-ce4a-4abc-aaec-09e828e42209", + "pk": "6714f377-62f1-47f3-84f2-95df3f773d87", "fields": { - "created": "2019-02-21T11:18:38.103Z", - "updated": "2019-02-21T11:18:38.103Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "created": "2019-03-08T15:10:27.980Z", + "updated": "2019-03-08T15:10:27.980Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "ae749e9b-01fd-40d7-8240-63e5a1e5545f", + "pk": "75df3358-147f-4b5f-a5d8-17d03207d8c3", "fields": { - "created": "2019-02-21T11:18:37.536Z", - "updated": "2019-02-21T11:18:37.536Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "created": "2019-03-08T15:10:27.653Z", + "updated": "2019-03-08T15:10:27.653Z", + "image": "830dae4d-c2ec-4e45-9c93-7416d10da405", "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "c25d73ad-a6e5-4474-a1c5-dd8746097724", + "pk": "844f5d59-da6e-4c92-90ac-7f5288391da9", "fields": { - "created": "2019-02-21T11:18:37.542Z", - "updated": "2019-02-21T11:18:37.542Z", - "image": "463eae17-0946-425e-92d3-f763c09babae", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-03-08T15:10:27.984Z", + "updated": "2019-03-08T15:10:27.984Z", + "image": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", + "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" } }, { "model": "images.zone", - "pk": "c929aaf9-f313-479e-8d4e-5b60a6d9a907", + "pk": "8fb0f797-8646-4c50-bb36-1c12108b52bb", "fields": { - "created": "2019-02-21T11:18:37.534Z", - "updated": "2019-02-21T11:18:37.534Z", - "image": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-03-08T15:10:27.994Z", + "updated": "2019-03-08T15:10:27.994Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", + "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "cca66be4-8976-468c-bfc5-c717b5094d4c", + "pk": "a07c3fcb-1f48-4c14-9b9f-f3b7d07d79fb", "fields": { - "created": "2019-02-21T11:18:38.204Z", - "updated": "2019-02-21T11:18:38.204Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", - "polygon": "Polygon((300,300), (600,300), (600,600), (300,600), (300,300))" + "created": "2019-03-08T15:10:27.651Z", + "updated": "2019-03-08T15:10:27.651Z", + "image": "4c52be7a-599b-4775-92a6-e261ce78ed16", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "d8d7e8ad-7db1-4849-a53a-b0a31879dcb7", + "pk": "c22b94a3-5cb7-47c4-8c54-58724d0c3605", "fields": { - "created": "2019-02-21T11:18:38.200Z", - "updated": "2019-02-21T11:18:38.200Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "created": "2019-03-08T15:10:28.047Z", + "updated": "2019-03-08T15:10:28.047Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", "polygon": "Polygon((0,0), (300,0), (300,300), (0,300), (0,0))" } }, { "model": "images.zone", - "pk": "ddaaa60b-c5ff-4948-a959-837cbdc42fe6", + "pk": "cba81c23-d41f-4849-9cb2-168dea386f90", "fields": { - "created": "2019-02-21T11:18:37.531Z", - "updated": "2019-02-21T11:18:37.531Z", - "image": "627f8463-4f86-4a65-ac2d-2544bd721762", - "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" + "created": "2019-03-08T15:10:27.992Z", + "updated": "2019-03-08T15:10:27.992Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", + "polygon": "Polygon((400,400), (500,400), (500,500), (400,500), (400,400))" } }, { "model": "images.zone", - "pk": "e5b52038-9b8a-4507-b2cb-99345abeed3d", + "pk": "d03c0305-6ebb-47fa-bbc5-8eb7de78fd41", "fields": { - "created": "2019-02-21T11:18:38.095Z", - "updated": "2019-02-21T11:18:38.095Z", - "image": "a1e49cb4-7ad7-42d4-a3f9-2db4b71fc4d7", + "created": "2019-03-08T15:10:27.982Z", + "updated": "2019-03-08T15:10:27.982Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { "model": "images.zone", - "pk": "e8ff9b94-2d2e-449c-b841-a7fb3fa0da5e", + "pk": "d4389d0e-2cbf-4474-90c2-fe774c4e1784", "fields": { - "created": "2019-02-21T11:18:38.099Z", - "updated": "2019-02-21T11:18:38.099Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", - "polygon": "Polygon((100,100), (200,100), (200,200), (100,200), (100,100))" + "created": "2019-03-08T15:10:27.647Z", + "updated": "2019-03-08T15:10:27.647Z", + "image": "b72c434a-3983-4d98-a850-104b7f948691", + "polygon": "Polygon((0,0), (1000,0), (1000,1000), (0,1000), (0,0))" } }, { "model": "images.zone", - "pk": "eacd4db4-6a0e-410c-8874-a4c445303ccb", + "pk": "db2aa3f6-49f4-4077-b8c6-9f613b14e6ed", "fields": { - "created": "2019-02-21T11:18:38.208Z", - "updated": "2019-02-21T11:18:38.208Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "created": "2019-03-08T15:10:28.050Z", + "updated": "2019-03-08T15:10:28.050Z", + "image": "7c841a21-146b-4db4-9d28-2101490d2b8d", "polygon": "Polygon((600,600), (1000,600), (1000,1000), (600,1000), (600,600))" } }, { "model": "images.zone", - "pk": "f5f0d49c-6655-466e-b6a8-8317cd45086a", + "pk": "ea60ffe7-cff0-4cb0-aa5c-1fcbf3b6bc69", "fields": { - "created": "2019-02-21T11:18:38.106Z", - "updated": "2019-02-21T11:18:38.106Z", - "image": "b98dacb3-fc42-45ec-b647-16cd42967e34", + "created": "2019-03-08T15:10:27.988Z", + "updated": "2019-03-08T15:10:27.988Z", + "image": "ed0a53ee-ce6d-4ce2-8203-fbcc1e561541", "polygon": "Polygon((700,700), (800,700), (800,800), (700,800), (700,700))" } }, { - "model": "users.user", + "model": "auth.permission", "pk": 1, "fields": { - "password": "pbkdf2_sha256$120000$40qEOjyZpfFD$4MblclYgRZ1Dd0nzjktJ42b7jtCuDwTJQ2KK7P/zC54=", - "last_login": null, - "email": "root@root.fr", - "is_active": true, - "is_admin": true, - "verified_email": false, - "groups": [] + "name": "Can add log entry", + "content_type": 1, + "codename": "add_logentry" } }, { - "model": "users.user", + "model": "auth.permission", "pk": 2, "fields": { - "password": "pbkdf2_sha256$120000$spXFEiXF3QkH$tDkpLtyWfWIBav+zCAHyJ/Zvkq15ccNbJ1waoSKVczI=", - "last_login": null, - "email": "user@user.fr", - "is_active": true, - "is_admin": false, - "verified_email": false, - "groups": [] + "name": "Can change log entry", + "content_type": 1, + "codename": "change_logentry" + } +}, +{ + "model": "auth.permission", + "pk": 3, + "fields": { + "name": "Can delete log entry", + "content_type": 1, + "codename": "delete_logentry" + } +}, +{ + "model": "auth.permission", + "pk": 4, + "fields": { + "name": "Can view log entry", + "content_type": 1, + "codename": "view_logentry" + } +}, +{ + "model": "auth.permission", + "pk": 5, + "fields": { + "name": "Can add permission", + "content_type": 2, + "codename": "add_permission" + } +}, +{ + "model": "auth.permission", + "pk": 6, + "fields": { + "name": "Can change permission", + "content_type": 2, + "codename": "change_permission" + } +}, +{ + "model": "auth.permission", + "pk": 7, + "fields": { + "name": "Can delete permission", + "content_type": 2, + "codename": "delete_permission" + } +}, +{ + "model": "auth.permission", + "pk": 8, + "fields": { + "name": "Can view permission", + "content_type": 2, + "codename": "view_permission" + } +}, +{ + "model": "auth.permission", + "pk": 9, + "fields": { + "name": "Can add group", + "content_type": 3, + "codename": "add_group" + } +}, +{ + "model": "auth.permission", + "pk": 10, + "fields": { + "name": "Can change group", + "content_type": 3, + "codename": "change_group" + } +}, +{ + "model": "auth.permission", + "pk": 11, + "fields": { + "name": "Can delete group", + "content_type": 3, + "codename": "delete_group" + } +}, +{ + "model": "auth.permission", + "pk": 12, + "fields": { + "name": "Can view group", + "content_type": 3, + "codename": "view_group" + } +}, +{ + "model": "auth.permission", + "pk": 13, + "fields": { + "name": "Can add content type", + "content_type": 4, + "codename": "add_contenttype" + } +}, +{ + "model": "auth.permission", + "pk": 14, + "fields": { + "name": "Can change content type", + "content_type": 4, + "codename": "change_contenttype" + } +}, +{ + "model": "auth.permission", + "pk": 15, + "fields": { + "name": "Can delete content type", + "content_type": 4, + "codename": "delete_contenttype" + } +}, +{ + "model": "auth.permission", + "pk": 16, + "fields": { + "name": "Can view content type", + "content_type": 4, + "codename": "view_contenttype" + } +}, +{ + "model": "auth.permission", + "pk": 17, + "fields": { + "name": "Can add session", + "content_type": 5, + "codename": "add_session" + } +}, +{ + "model": "auth.permission", + "pk": 18, + "fields": { + "name": "Can change session", + "content_type": 5, + "codename": "change_session" + } +}, +{ + "model": "auth.permission", + "pk": 19, + "fields": { + "name": "Can delete session", + "content_type": 5, + "codename": "delete_session" + } +}, +{ + "model": "auth.permission", + "pk": 20, + "fields": { + "name": "Can view session", + "content_type": 5, + "codename": "view_session" + } +}, +{ + "model": "auth.permission", + "pk": 21, + "fields": { + "name": "Can add Token", + "content_type": 6, + "codename": "add_token" + } +}, +{ + "model": "auth.permission", + "pk": 22, + "fields": { + "name": "Can change Token", + "content_type": 6, + "codename": "change_token" + } +}, +{ + "model": "auth.permission", + "pk": 23, + "fields": { + "name": "Can delete Token", + "content_type": 6, + "codename": "delete_token" + } +}, +{ + "model": "auth.permission", + "pk": 24, + "fields": { + "name": "Can view Token", + "content_type": 6, + "codename": "view_token" + } +}, +{ + "model": "auth.permission", + "pk": 25, + "fields": { + "name": "Can add task", + "content_type": 7, + "codename": "add_task" + } +}, +{ + "model": "auth.permission", + "pk": 26, + "fields": { + "name": "Can change task", + "content_type": 7, + "codename": "change_task" + } +}, +{ + "model": "auth.permission", + "pk": 27, + "fields": { + "name": "Can delete task", + "content_type": 7, + "codename": "delete_task" + } +}, +{ + "model": "auth.permission", + "pk": 28, + "fields": { + "name": "Can view task", + "content_type": 7, + "codename": "view_task" + } +}, +{ + "model": "auth.permission", + "pk": 29, + "fields": { + "name": "Can add workflow", + "content_type": 8, + "codename": "add_workflow" + } +}, +{ + "model": "auth.permission", + "pk": 30, + "fields": { + "name": "Can change workflow", + "content_type": 8, + "codename": "change_workflow" + } +}, +{ + "model": "auth.permission", + "pk": 31, + "fields": { + "name": "Can delete workflow", + "content_type": 8, + "codename": "delete_workflow" + } +}, +{ + "model": "auth.permission", + "pk": 32, + "fields": { + "name": "Can view workflow", + "content_type": 8, + "codename": "view_workflow" + } +}, +{ + "model": "auth.permission", + "pk": 33, + "fields": { + "name": "Can add image", + "content_type": 9, + "codename": "add_image" + } +}, +{ + "model": "auth.permission", + "pk": 34, + "fields": { + "name": "Can change image", + "content_type": 9, + "codename": "change_image" + } +}, +{ + "model": "auth.permission", + "pk": 35, + "fields": { + "name": "Can delete image", + "content_type": 9, + "codename": "delete_image" + } +}, +{ + "model": "auth.permission", + "pk": 36, + "fields": { + "name": "Can view image", + "content_type": 9, + "codename": "view_image" + } +}, +{ + "model": "auth.permission", + "pk": 37, + "fields": { + "name": "Can add image server", + "content_type": 10, + "codename": "add_imageserver" + } +}, +{ + "model": "auth.permission", + "pk": 38, + "fields": { + "name": "Can change image server", + "content_type": 10, + "codename": "change_imageserver" + } +}, +{ + "model": "auth.permission", + "pk": 39, + "fields": { + "name": "Can delete image server", + "content_type": 10, + "codename": "delete_imageserver" + } +}, +{ + "model": "auth.permission", + "pk": 40, + "fields": { + "name": "Can view image server", + "content_type": 10, + "codename": "view_imageserver" + } +}, +{ + "model": "auth.permission", + "pk": 41, + "fields": { + "name": "Can add zone", + "content_type": 11, + "codename": "add_zone" + } +}, +{ + "model": "auth.permission", + "pk": 42, + "fields": { + "name": "Can change zone", + "content_type": 11, + "codename": "change_zone" + } +}, +{ + "model": "auth.permission", + "pk": 43, + "fields": { + "name": "Can delete zone", + "content_type": 11, + "codename": "delete_zone" + } +}, +{ + "model": "auth.permission", + "pk": 44, + "fields": { + "name": "Can view zone", + "content_type": 11, + "codename": "view_zone" + } +}, +{ + "model": "auth.permission", + "pk": 45, + "fields": { + "name": "Can add classification", + "content_type": 12, + "codename": "add_classification" + } +}, +{ + "model": "auth.permission", + "pk": 46, + "fields": { + "name": "Can change classification", + "content_type": 12, + "codename": "change_classification" + } +}, +{ + "model": "auth.permission", + "pk": 47, + "fields": { + "name": "Can delete classification", + "content_type": 12, + "codename": "delete_classification" + } +}, +{ + "model": "auth.permission", + "pk": 48, + "fields": { + "name": "Can view classification", + "content_type": 12, + "codename": "view_classification" + } +}, +{ + "model": "auth.permission", + "pk": 49, + "fields": { + "name": "Can add corpus", + "content_type": 13, + "codename": "add_corpus" + } +}, +{ + "model": "auth.permission", + "pk": 50, + "fields": { + "name": "Can change corpus", + "content_type": 13, + "codename": "change_corpus" + } +}, +{ + "model": "auth.permission", + "pk": 51, + "fields": { + "name": "Can delete corpus", + "content_type": 13, + "codename": "delete_corpus" + } +}, +{ + "model": "auth.permission", + "pk": 52, + "fields": { + "name": "Can view corpus", + "content_type": 13, + "codename": "view_corpus" + } +}, +{ + "model": "auth.permission", + "pk": 53, + "fields": { + "name": "Can add data source", + "content_type": 14, + "codename": "add_datasource" + } +}, +{ + "model": "auth.permission", + "pk": 54, + "fields": { + "name": "Can change data source", + "content_type": 14, + "codename": "change_datasource" + } +}, +{ + "model": "auth.permission", + "pk": 55, + "fields": { + "name": "Can delete data source", + "content_type": 14, + "codename": "delete_datasource" + } +}, +{ + "model": "auth.permission", + "pk": 56, + "fields": { + "name": "Can view data source", + "content_type": 14, + "codename": "view_datasource" + } +}, +{ + "model": "auth.permission", + "pk": 57, + "fields": { + "name": "Can add element", + "content_type": 15, + "codename": "add_element" + } +}, +{ + "model": "auth.permission", + "pk": 58, + "fields": { + "name": "Can change element", + "content_type": 15, + "codename": "change_element" + } +}, +{ + "model": "auth.permission", + "pk": 59, + "fields": { + "name": "Can delete element", + "content_type": 15, + "codename": "delete_element" + } +}, +{ + "model": "auth.permission", + "pk": 60, + "fields": { + "name": "Can view element", + "content_type": 15, + "codename": "view_element" + } +}, +{ + "model": "auth.permission", + "pk": 61, + "fields": { + "name": "Can add element path", + "content_type": 16, + "codename": "add_elementpath" + } +}, +{ + "model": "auth.permission", + "pk": 62, + "fields": { + "name": "Can change element path", + "content_type": 16, + "codename": "change_elementpath" + } +}, +{ + "model": "auth.permission", + "pk": 63, + "fields": { + "name": "Can delete element path", + "content_type": 16, + "codename": "delete_elementpath" + } +}, +{ + "model": "auth.permission", + "pk": 64, + "fields": { + "name": "Can view element path", + "content_type": 16, + "codename": "view_elementpath" + } +}, +{ + "model": "auth.permission", + "pk": 65, + "fields": { + "name": "Can add meta data", + "content_type": 17, + "codename": "add_metadata" + } +}, +{ + "model": "auth.permission", + "pk": 66, + "fields": { + "name": "Can change meta data", + "content_type": 17, + "codename": "change_metadata" + } +}, +{ + "model": "auth.permission", + "pk": 67, + "fields": { + "name": "Can delete meta data", + "content_type": 17, + "codename": "delete_metadata" + } +}, +{ + "model": "auth.permission", + "pk": 68, + "fields": { + "name": "Can view meta data", + "content_type": 17, + "codename": "view_metadata" + } +}, +{ + "model": "auth.permission", + "pk": 69, + "fields": { + "name": "Can add transcription", + "content_type": 18, + "codename": "add_transcription" + } +}, +{ + "model": "auth.permission", + "pk": 70, + "fields": { + "name": "Can change transcription", + "content_type": 18, + "codename": "change_transcription" + } +}, +{ + "model": "auth.permission", + "pk": 71, + "fields": { + "name": "Can delete transcription", + "content_type": 18, + "codename": "delete_transcription" + } +}, +{ + "model": "auth.permission", + "pk": 72, + "fields": { + "name": "Can view transcription", + "content_type": 18, + "codename": "view_transcription" + } +}, +{ + "model": "auth.permission", + "pk": 73, + "fields": { + "name": "Can add act", + "content_type": 19, + "codename": "add_act" + } +}, +{ + "model": "auth.permission", + "pk": 74, + "fields": { + "name": "Can change act", + "content_type": 19, + "codename": "change_act" + } +}, +{ + "model": "auth.permission", + "pk": 75, + "fields": { + "name": "Can delete act", + "content_type": 19, + "codename": "delete_act" + } +}, +{ + "model": "auth.permission", + "pk": 76, + "fields": { + "name": "Can view act", + "content_type": 19, + "codename": "view_act" + } +}, +{ + "model": "auth.permission", + "pk": 77, + "fields": { + "name": "Can add page", + "content_type": 20, + "codename": "add_page" + } +}, +{ + "model": "auth.permission", + "pk": 78, + "fields": { + "name": "Can change page", + "content_type": 20, + "codename": "change_page" + } +}, +{ + "model": "auth.permission", + "pk": 79, + "fields": { + "name": "Can delete page", + "content_type": 20, + "codename": "delete_page" + } +}, +{ + "model": "auth.permission", + "pk": 80, + "fields": { + "name": "Can view page", + "content_type": 20, + "codename": "view_page" + } +}, +{ + "model": "auth.permission", + "pk": 81, + "fields": { + "name": "Can add user", + "content_type": 21, + "codename": "add_user" + } +}, +{ + "model": "auth.permission", + "pk": 82, + "fields": { + "name": "Can change user", + "content_type": 21, + "codename": "change_user" + } +}, +{ + "model": "auth.permission", + "pk": 83, + "fields": { + "name": "Can delete user", + "content_type": 21, + "codename": "delete_user" + } +}, +{ + "model": "auth.permission", + "pk": 84, + "fields": { + "name": "Can view user", + "content_type": 21, + "codename": "view_user" + } +}, +{ + "model": "auth.permission", + "pk": 85, + "fields": { + "name": "Can add corpus right", + "content_type": 22, + "codename": "add_corpusright" + } +}, +{ + "model": "auth.permission", + "pk": 86, + "fields": { + "name": "Can change corpus right", + "content_type": 22, + "codename": "change_corpusright" + } +}, +{ + "model": "auth.permission", + "pk": 87, + "fields": { + "name": "Can delete corpus right", + "content_type": 22, + "codename": "delete_corpusright" + } +}, +{ + "model": "auth.permission", + "pk": 88, + "fields": { + "name": "Can view corpus right", + "content_type": 22, + "codename": "view_corpusright" + } +}, +{ + "model": "auth.permission", + "pk": 89, + "fields": { + "name": "Can add o auth credentials", + "content_type": 23, + "codename": "add_oauthcredentials" + } +}, +{ + "model": "auth.permission", + "pk": 90, + "fields": { + "name": "Can change o auth credentials", + "content_type": 23, + "codename": "change_oauthcredentials" + } +}, +{ + "model": "auth.permission", + "pk": 91, + "fields": { + "name": "Can delete o auth credentials", + "content_type": 23, + "codename": "delete_oauthcredentials" + } +}, +{ + "model": "auth.permission", + "pk": 92, + "fields": { + "name": "Can view o auth credentials", + "content_type": 23, + "codename": "view_oauthcredentials" + } +}, +{ + "model": "auth.permission", + "pk": 93, + "fields": { + "name": "Can add data file", + "content_type": 24, + "codename": "add_datafile" + } +}, +{ + "model": "auth.permission", + "pk": 94, + "fields": { + "name": "Can change data file", + "content_type": 24, + "codename": "change_datafile" + } +}, +{ + "model": "auth.permission", + "pk": 95, + "fields": { + "name": "Can delete data file", + "content_type": 24, + "codename": "delete_datafile" + } +}, +{ + "model": "auth.permission", + "pk": 96, + "fields": { + "name": "Can view data file", + "content_type": 24, + "codename": "view_datafile" + } +}, +{ + "model": "auth.permission", + "pk": 97, + "fields": { + "name": "Can add data import", + "content_type": 25, + "codename": "add_dataimport" + } +}, +{ + "model": "auth.permission", + "pk": 98, + "fields": { + "name": "Can change data import", + "content_type": 25, + "codename": "change_dataimport" + } +}, +{ + "model": "auth.permission", + "pk": 99, + "fields": { + "name": "Can delete data import", + "content_type": 25, + "codename": "delete_dataimport" + } +}, +{ + "model": "auth.permission", + "pk": 100, + "fields": { + "name": "Can view data import", + "content_type": 25, + "codename": "view_dataimport" + } +}, +{ + "model": "auth.permission", + "pk": 101, + "fields": { + "name": "Can add data import failure", + "content_type": 26, + "codename": "add_dataimportfailure" + } +}, +{ + "model": "auth.permission", + "pk": 102, + "fields": { + "name": "Can change data import failure", + "content_type": 26, + "codename": "change_dataimportfailure" + } +}, +{ + "model": "auth.permission", + "pk": 103, + "fields": { + "name": "Can delete data import failure", + "content_type": 26, + "codename": "delete_dataimportfailure" + } +}, +{ + "model": "auth.permission", + "pk": 104, + "fields": { + "name": "Can view data import failure", + "content_type": 26, + "codename": "view_dataimportfailure" + } +}, +{ + "model": "auth.permission", + "pk": 105, + "fields": { + "name": "Can add event", + "content_type": 27, + "codename": "add_event" + } +}, +{ + "model": "auth.permission", + "pk": 106, + "fields": { + "name": "Can change event", + "content_type": 27, + "codename": "change_event" + } +}, +{ + "model": "auth.permission", + "pk": 107, + "fields": { + "name": "Can delete event", + "content_type": 27, + "codename": "delete_event" + } +}, +{ + "model": "auth.permission", + "pk": 108, + "fields": { + "name": "Can view event", + "content_type": 27, + "codename": "view_event" + } +}, +{ + "model": "auth.permission", + "pk": 109, + "fields": { + "name": "Can add repository", + "content_type": 28, + "codename": "add_repository" + } +}, +{ + "model": "auth.permission", + "pk": 110, + "fields": { + "name": "Can change repository", + "content_type": 28, + "codename": "change_repository" + } +}, +{ + "model": "auth.permission", + "pk": 111, + "fields": { + "name": "Can delete repository", + "content_type": 28, + "codename": "delete_repository" + } +}, +{ + "model": "auth.permission", + "pk": 112, + "fields": { + "name": "Can view repository", + "content_type": 28, + "codename": "view_repository" + } +}, +{ + "model": "auth.permission", + "pk": 113, + "fields": { + "name": "Can add revision", + "content_type": 29, + "codename": "add_revision" + } +}, +{ + "model": "auth.permission", + "pk": 114, + "fields": { + "name": "Can change revision", + "content_type": 29, + "codename": "change_revision" + } +}, +{ + "model": "auth.permission", + "pk": 115, + "fields": { + "name": "Can delete revision", + "content_type": 29, + "codename": "delete_revision" + } +}, +{ + "model": "auth.permission", + "pk": 116, + "fields": { + "name": "Can view revision", + "content_type": 29, + "codename": "view_revision" + } +}, +{ + "model": "auth.group", + "pk": 1, + "fields": { + "name": "Demo", + "permissions": [] + } +}, +{ + "model": "auth.group", + "pk": 2, + "fields": { + "name": "Internal", + "permissions": [] + } +}, +{ + "model": "users.user", + "pk": 1, + "fields": { + "password": "pbkdf2_sha256$120000$Dx98eTfRNicu$3Zc5hyU6e4vgpACjhqG1z6Ea1TZsiobMnYJ2kIqrhiM=", + "last_login": null, + "email": "root@root.fr", + "is_active": true, + "is_admin": true, + "verified_email": true, + "groups": [] + } +}, +{ + "model": "users.user", + "pk": 2, + "fields": { + "password": "pbkdf2_sha256$120000$KXMjGSzVwS6Y$jbVZmaiV8cPAvlgI0EzSfc/1LFvOVbGv5zjmjJrDGC0=", + "last_login": null, + "email": "user@user.fr", + "is_active": true, + "is_admin": false, + "verified_email": true, + "groups": [] + } +}, +{ + "model": "users.user", + "pk": 3, + "fields": { + "password": "!18RAuzZnNjjVddPXK2jDVG19prOBwQaxEgG0SZam", + "last_login": null, + "email": "demo@demo.fr", + "is_active": true, + "is_admin": false, + "verified_email": false, + "groups": [ + 1 + ] } }, { "model": "users.oauthcredentials", - "pk": "434edb7d-46e2-42f8-80a9-de2a16958c4f", + "pk": "656059a3-e70c-46b5-b2a0-bb4d34794df7", "fields": { "user": 2, "provider_name": "gitlab", @@ -1023,7 +2098,7 @@ "pk": 1, "fields": { "user": 2, - "corpus": "6a3dfb5d-8c4a-4212-8839-10a4c75e9f5f", + "corpus": "ad8b0559-7d92-4634-a9d1-557a473a5b05", "can_write": true, "can_admin": true } diff --git a/arkindex/documents/management/commands/build_fixtures.py b/arkindex/documents/management/commands/build_fixtures.py index 47d86c4669f135ccfb8790e693cf84ab2b5decc3..870131e4109b869d234911a6ca481801246a9491 100644 --- a/arkindex/documents/management/commands/build_fixtures.py +++ b/arkindex/documents/management/commands/build_fixtures.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 from django.core.management.base import BaseCommand +from django.contrib.auth.models import Group from arkindex_common.ml_tool import MLToolType from arkindex.documents.models import ( Corpus, Element, ElementType, Page, PageDirection, PageType, Act, @@ -39,9 +40,20 @@ class Command(BaseCommand): z5 = makezone(img5, 0, 1000) z6 = makezone(img6, 0, 1000) - # Create an admin and a user - User.objects.create_superuser('root@root.fr', 'Pa$$w0rd') + # Create internal and demo user groups + Group.objects.create(id=1, name='Demo') + Group.objects.create(id=2, name='Internal') + + # Create an admin, a user and a demo user + superuser = User.objects.create_superuser('root@root.fr', 'Pa$$w0rd') + superuser.verified_email = True + superuser.save() + user = User.objects.create_user('user@user.fr', 'Pa$$w0rd') + user.verified_email = True + user.save() + + User.objects.create_demo_user('demo@demo.fr') # Create 1 data source for transcriptions source = DataSource.objects.create( diff --git a/arkindex/project/checks.py b/arkindex/project/checks.py index 055f632ad6c6cbe07cf12b06b73d63986c0cf98f..3c9c42e808b98fe929b76ef2435bf6203b3cafa7 100644 --- a/arkindex/project/checks.py +++ b/arkindex/project/checks.py @@ -232,6 +232,30 @@ def internal_group_check(*args, **kwargs): return [] +@register() +@only_runserver +def demo_group_check(*args, **kwargs): + from django.conf import settings + from django.contrib.auth.models import Group + try: + group_id = settings.DEMO_GROUP_ID + except AttributeError: + return [Warning( + 'Demo user group ID is not set; demo registration will fail.', + hint='settings.DEMO_GROUP_ID', + id='arkindex.W003', + )] + try: + Group.objects.get(id=group_id) + except Group.DoesNotExist: + return [Warning( + 'Demo user group does not exist; demo registration will fail.', + hint='settings.DEMO_GROUP_ID = "{}"'.format(group_id), + id='arkindex.W004', + )] + return [] + + @register() @only_runserver def gitlab_oauth_check(*args, **kwargs): diff --git a/arkindex/project/permissions.py b/arkindex/project/permissions.py index 01dedbdad0132eb55635162de1f3541bfbbcd041..6c2cbc512bf9b6f3d5e741099b1f9154dd58cbc9 100644 --- a/arkindex/project/permissions.py +++ b/arkindex/project/permissions.py @@ -2,7 +2,7 @@ from django.conf import settings from rest_framework import permissions -class GroupPermissionMixin(object): +class InternalGroupPermissionMixin(object): def has_permission(self, request, view): if request.user.is_authenticated and not request.user.is_admin: @@ -18,17 +18,37 @@ class GroupPermissionMixin(object): return super().has_permission(request, view) -class AllowAny(GroupPermissionMixin, permissions.AllowAny): +class DemoGroupPermissionMixin(object): + + def has_permission(self, request, view): + if request.user.is_authenticated and not request.user.is_admin: + # If the user has registered from the demo, or has an unverified email, + # only allow HEAD, GET and OPTIONS. + if not request.user.verified_email or request.user.is_demo: + return super().has_permission(request, view) and request.method in permissions.SAFE_METHODS + + return super().has_permission(request, view) + + +class AllowAny(InternalGroupPermissionMixin, permissions.AllowAny): + pass + + +class IsAuthenticated(InternalGroupPermissionMixin, permissions.IsAuthenticated): + pass + + +class IsAuthenticatedOrReadOnly(InternalGroupPermissionMixin, permissions.IsAuthenticatedOrReadOnly): pass -class IsAuthenticated(GroupPermissionMixin, permissions.IsAuthenticated): +class IsAdminUser(InternalGroupPermissionMixin, permissions.IsAdminUser): pass -class IsAuthenticatedOrReadOnly(GroupPermissionMixin, permissions.IsAuthenticatedOrReadOnly): +class IsVerified(DemoGroupPermissionMixin, IsAuthenticated): pass -class IsAdminUser(GroupPermissionMixin, permissions.IsAdminUser): +class IsVerifiedOrReadOnly(DemoGroupPermissionMixin, IsAuthenticatedOrReadOnly): pass diff --git a/arkindex/project/settings.py b/arkindex/project/settings.py index aa6a93ac7b3a7c646440f216f5e589dd318124c1..6116c3b07b870cdeed2bb351ef3873ada9bd6582 100644 --- a/arkindex/project/settings.py +++ b/arkindex/project/settings.py @@ -384,7 +384,8 @@ ML_DEFAULT_CLASSIFIER = 'tobacco' ML_DEFAULT_RECOGNIZER = 'tesseract' # User groups with special permissions -INTERNAL_GROUP_ID = 1 +DEMO_GROUP_ID = 1 +INTERNAL_GROUP_ID = 2 # Optional unit tests runner with code coverage try: diff --git a/arkindex/project/tests/test_checks.py b/arkindex/project/tests/test_checks.py index c5d2b780491b59fd02a5cc94b59ea6d95e4dc1cb..0491e66d5fb5b9103d06440fe102bc37beae75c0 100644 --- a/arkindex/project/tests/test_checks.py +++ b/arkindex/project/tests/test_checks.py @@ -235,8 +235,6 @@ class ChecksTestCase(TestCase): from arkindex.project.checks import internal_group_check from django.contrib.auth.models import Group - self.assertEqual(Group.objects.count(), 0) - del settings.INTERNAL_GROUP_ID self.assertListEqual(internal_group_check(), [Warning( 'Internal group ID is not set; internal API requests will fail.', @@ -251,10 +249,31 @@ class ChecksTestCase(TestCase): id='arkindex.W002', )]) - g = Group.objects.create() - settings.INTERNAL_GROUP_ID = g.id + Group.objects.create(id=1234) self.assertListEqual(internal_group_check(), []) + @override_settings() + def test_demo_group_check(self): + from arkindex.project.checks import demo_group_check + from django.contrib.auth.models import Group + + del settings.DEMO_GROUP_ID + self.assertListEqual(demo_group_check(), [Warning( + 'Demo user group ID is not set; demo registration will fail.', + hint='settings.DEMO_GROUP_ID', + id='arkindex.W003', + )]) + + settings.DEMO_GROUP_ID = 1234 + self.assertListEqual(demo_group_check(), [Warning( + 'Demo user group does not exist; demo registration will fail.', + hint='settings.DEMO_GROUP_ID = "1234"', + id='arkindex.W004', + )]) + + Group.objects.create(id=1234) + self.assertListEqual(demo_group_check(), []) + @override_settings() def test_gitlab_oauth_check(self): from arkindex.project.checks import gitlab_oauth_check diff --git a/arkindex/users/api.py b/arkindex/users/api.py index 086cc958b6d351095345fea8a70be0ab45744b65..0066ef2dbc5897596176c6a92f128eafa9d75943 100644 --- a/arkindex/users/api.py +++ b/arkindex/users/api.py @@ -3,7 +3,6 @@ from django.core.mail import send_mail from django.contrib.auth import login, logout from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib.auth.models import Group from django.contrib.auth.forms import PasswordResetForm from django.views.generic import RedirectView from django.template.loader import render_to_string @@ -14,13 +13,13 @@ from rest_framework.generics import \ ListAPIView, RetrieveAPIView, RetrieveDestroyAPIView, RetrieveUpdateDestroyAPIView, CreateAPIView from rest_framework.response import Response from rest_framework.exceptions import AuthenticationFailed, ValidationError -from arkindex.project.permissions import IsAuthenticated +from arkindex.project.permissions import IsAuthenticated, IsVerified from arkindex.documents.models import Corpus, Element, ElementType from arkindex.users.providers import oauth_providers, get_provider from arkindex.users.models import User, OAuthStatus from arkindex.users.serializers import ( OAuthCredentialsSerializer, OAuthProviderClassSerializer, - UserSerializer, NewUserSerializer, EmailLoginSerializer, + UserSerializer, NewDemoUserSerializer, EmailLoginSerializer, PasswordResetSerializer, PasswordResetConfirmSerializer, ) import urllib.parse @@ -30,7 +29,7 @@ logger = logging.getLogger(__name__) class ProvidersList(ListAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = OAuthProviderClassSerializer pagination_class = None @@ -39,7 +38,7 @@ class ProvidersList(ListAPIView): class CredentialsList(ListAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = OAuthCredentialsSerializer def get_queryset(self): @@ -50,7 +49,7 @@ class CredentialsList(ListAPIView): class CredentialsRetrieve(RetrieveDestroyAPIView): - permission_classes = (IsAuthenticated, ) + permission_classes = (IsVerified, ) serializer_class = OAuthCredentialsSerializer def get_queryset(self): @@ -68,17 +67,25 @@ class UserRetrieve(RetrieveUpdateDestroyAPIView): def get_object(self): return self.request.user + def check_permissions(self, request): + # Will raise REST framework exceptions for denied requests + super().check_permissions(request) + + # Deny changing the password on demo users without verified emails + if request.method.lower() in ('put', 'patch') and \ + request.user.is_demo and \ + not request.user.is_verified: + self.permission_denied(request) + def perform_destroy(self, instance): logout(self.request) class UserCreate(CreateAPIView): - serializer_class = NewUserSerializer + serializer_class = NewDemoUserSerializer def perform_create(self, serializer): user = serializer.save() - demo_group, _ = Group.objects.get_or_create(name="Demo") - user.groups.add(demo_group) login(self.request, user) corpus = Corpus.objects.create(name=user.email) @@ -195,6 +202,7 @@ class OAuthSignIn(APIView): """ Start an OAuth authentication workflow """ + permission_classes = (IsVerified, ) def get(self, *args, **kwargs): if 'provider' not in kwargs: @@ -225,6 +233,7 @@ class OAuthRetry(RetrieveAPIView): """ Restart an OAuth authentication workflow for existing credentials """ + permission_classes = (IsVerified, ) def get_queryset(self): return self.request.user.credentials @@ -246,6 +255,7 @@ class OAuthCallback(LoginRequiredMixin, RedirectView): """ Callback for OAuth responses """ + permission_classes = (IsVerified, ) pattern_name = 'credentials' diff --git a/arkindex/users/managers.py b/arkindex/users/managers.py index c801afbab831f6c6df0d09bffc8eecdd0ae3f9dc..28c144bfaa05972b626530bf0a1eaadaa4d9e770 100644 --- a/arkindex/users/managers.py +++ b/arkindex/users/managers.py @@ -1,4 +1,5 @@ -from django.contrib.auth.models import BaseUserManager +from django.conf import settings +from django.contrib.auth.models import BaseUserManager, Group class UserManager(BaseUserManager): @@ -28,3 +29,11 @@ class UserManager(BaseUserManager): user.is_admin = True user.save(using=self._db) return user + + def create_demo_user(self, email): + user = self.create_user(email) + user.groups.add(Group.objects.get(id=settings.DEMO_GROUP_ID)) + if user.auth_token: + # Do not set a token for demo users + user.auth_token.delete() + return user diff --git a/arkindex/users/migrations/0002_default_groups.py b/arkindex/users/migrations/0002_default_groups.py new file mode 100644 index 0000000000000000000000000000000000000000..2ad11e641e7f6a2539c9dbd0086b8fe813df5e80 --- /dev/null +++ b/arkindex/users/migrations/0002_default_groups.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1 on 2019-03-08 15:11 + +from django.db import migrations + + +def create_groups(apps, schema_editor): + """ + Create the default user groups, used for permission checking + """ + Group = apps.get_model('auth', 'Group') + Group.objects.get_or_create(id=1, name='Demo') + Group.objects.create(id=2, name='Internal') + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.RunPython(create_groups), + ] diff --git a/arkindex/users/models.py b/arkindex/users/models.py index b4fdefd118358fe34ab92e21601c22e63b750c05..cf45ae709d3892ad56d3f7b9f18019ab2c7c5b5f 100644 --- a/arkindex/users/models.py +++ b/arkindex/users/models.py @@ -52,6 +52,10 @@ class User(AbstractBaseUser): def is_internal(self): return self.groups.filter(id=settings.INTERNAL_GROUP_ID).exists() + @property + def is_demo(self): + return self.groups.filter(id=settings.DEMO_GROUP_ID).exists() + class OAuthStatus(Enum): Created = 'created' diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py index 45b078586d9a6677698e3c915b46768f360ef16c..27b8b94b83488e48c8b550a83d5e33723f3daf71 100644 --- a/arkindex/users/serializers.py +++ b/arkindex/users/serializers.py @@ -54,7 +54,7 @@ class UserSerializer(serializers.ModelSerializer): return super().update(instance, validated_data) -class NewUserSerializer(serializers.ModelSerializer): +class NewDemoUserSerializer(serializers.ModelSerializer): class Meta: model = User @@ -63,7 +63,7 @@ class NewUserSerializer(serializers.ModelSerializer): ) def create(self, validated_data): - return User.objects.create_user(validated_data['email']) + return User.objects.create_demo_user(validated_data['email']) class EmailLoginSerializer(serializers.Serializer): diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py index 61ac1e30b0468433df0f48e61481f678844a8350..5f2bfbc5ba66c6ae7551156b2b64ea965d3754d0 100644 --- a/arkindex/users/tests/test_registration.py +++ b/arkindex/users/tests/test_registration.py @@ -1,14 +1,14 @@ -from rest_framework.test import APITestCase from rest_framework import status from django.urls import reverse from django.core import mail from django.contrib import auth from django.contrib.auth.tokens import default_token_generator +from arkindex.project.tests import FixtureAPITestCase from arkindex.users.models import User import urllib.parse -class TestRegistration(APITestCase): +class TestRegistration(FixtureAPITestCase): @classmethod def setUpTestData(cls):