From f1ab5f157c44c8a385c2072acb015ff460dcff48 Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Mon, 8 Jun 2020 12:24:55 +0200
Subject: [PATCH] Update default corpora types

---
 arkindex/documents/models.py               |  7 ++++
 arkindex/documents/serializers/elements.py | 10 +-----
 arkindex/documents/tests/test_corpus.py    | 26 +++++++++-----
 arkindex/project/default_corpus.py         | 42 ++++++++++++++++------
 arkindex/users/api.py                      |  8 ++---
 arkindex/users/tests/test_registration.py  | 11 ++++--
 6 files changed, 69 insertions(+), 35 deletions(-)

diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py
index 26ca7659d8..825043879f 100644
--- a/arkindex/documents/models.py
+++ b/arkindex/documents/models.py
@@ -6,6 +6,7 @@ from django.core.exceptions import ValidationError
 from enumfields import EnumField, Enum
 from arkindex_common.enums import TranscriptionType, MetaType, EntityType
 from arkindex_common.ml_tool import MLToolType
+from arkindex.project.default_corpus import DEFAULT_CORPUS_TYPES
 from arkindex.project.models import IndexableModel
 from arkindex.project.fields import ArrayField
 from arkindex.project.elastic import ESTranscription, ESElement, ESEntity
@@ -81,6 +82,12 @@ class Corpus(IndexableModel):
 
         return rights
 
+    def create_default_types(self):
+        self.types.bulk_create(
+            ElementType(corpus=self, **values)
+            for values in DEFAULT_CORPUS_TYPES
+        )
+
 
 class ElementType(models.Model):
     id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index 3fe4e89362..2d27bbe05f 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -78,15 +78,7 @@ class CorpusSerializer(serializers.ModelSerializer):
             can_write=True,
             can_admin=True,
         )
-        corpus.types.create(
-            folder=True,
-            slug='folder',
-            display_name='Folder',
-        )
-        corpus.types.create(
-            slug='page',
-            display_name='Page',
-        )
+        corpus.create_default_types()
         return corpus
 
 
diff --git a/arkindex/documents/tests/test_corpus.py b/arkindex/documents/tests/test_corpus.py
index 91cc9b76a8..a0a1bd8412 100644
--- a/arkindex/documents/tests/test_corpus.py
+++ b/arkindex/documents/tests/test_corpus.py
@@ -6,6 +6,7 @@ from django.urls import reverse
 from rest_framework import status
 
 from arkindex.documents.models import Corpus, Element, Right
+from arkindex.project.default_corpus import DEFAULT_CORPUS_TYPES
 from arkindex.project.tests import FixtureAPITestCase
 import datetime
 import mock
@@ -279,14 +280,23 @@ class TestCorpus(FixtureAPITestCase):
         right = corpus.corpus_right.get(user=self.user)
         self.assertTrue(right.can_write)
         self.assertTrue(right.can_admin)
-        self.assertEqual(corpus.types.count(), 2)
-        folder, page = corpus.types.order_by('slug')
-        self.assertEqual(folder.slug, 'folder')
-        self.assertEqual(folder.display_name, 'Folder')
-        self.assertTrue(folder.folder)
-        self.assertEqual(page.slug, 'page')
-        self.assertEqual(page.display_name, 'Page')
-        self.assertFalse(page.folder)
+
+        # Assert defaults types are set on the new corpus
+        self.assertCountEqual(
+            list(corpus.types.values(
+                'slug',
+                'display_name',
+                'folder',
+                'default_view',
+                'allowed_transcription'
+            )),
+            [{
+                'folder': False,
+                'default_view': False,
+                'allowed_transcription': None,
+                **values
+            } for values in DEFAULT_CORPUS_TYPES]
+        )
 
     def test_create_requires_login(self):
         response = self.client.post(reverse('api:corpus'), {
diff --git a/arkindex/project/default_corpus.py b/arkindex/project/default_corpus.py
index a4681b6373..965e90f251 100644
--- a/arkindex/project/default_corpus.py
+++ b/arkindex/project/default_corpus.py
@@ -1,19 +1,41 @@
 # Default corpus attributes
+from arkindex_common.enums import TranscriptionType
+
 
 DEFAULT_CORPUS_TYPES = [
     {
-        'slug': 'volume',
-        'display_name': 'Volume',
+        'slug': 'folder',
+        'display_name': 'Folder',
         'folder': True,
-        'default_view': True
-    }, {
+        'default_view': True,
+    },
+    {
         'slug': 'page',
-        'display_name': 'Page'
-    }, {
+        'display_name': 'Page',
+    },
+    {
         'slug': 'text_line',
-        'display_name': 'Text line'
-    }, {
-        'slug': 'text',
-        'display_name': 'Text'
+        'display_name': 'Text line',
+        'allowed_transcription': TranscriptionType.Line,
+    },
+    {
+        'slug': 'illustration',
+        'display_name': 'Illustration',
+    },
+    {
+        'slug': 'decoration',
+        'display_name': 'Decoration',
+    },
+    {
+        'slug': 'chart',
+        'display_name': 'Chart',
+    },
+    {
+        'slug': 'table',
+        'display_name': 'Table',
+    },
+    {
+        'slug': 'signature',
+        'display_name': 'Signature',
     }
 ]
diff --git a/arkindex/users/api.py b/arkindex/users/api.py
index 652c9653ab..77cbbce5e8 100644
--- a/arkindex/users/api.py
+++ b/arkindex/users/api.py
@@ -15,8 +15,7 @@ from rest_framework.generics import \
 from rest_framework.response import Response
 from rest_framework.exceptions import AuthenticationFailed, ValidationError, PermissionDenied
 from arkindex.project.permissions import IsAuthenticatedOrReadOnly, IsVerified
-from arkindex.project.default_corpus import DEFAULT_CORPUS_TYPES
-from arkindex.documents.models import Corpus, ElementType
+from arkindex.documents.models import Corpus
 from arkindex.users.providers import oauth_providers, get_provider
 from arkindex.users.models import User, OAuthStatus, UserScope, Scope
 from arkindex.users.serializers import (
@@ -246,10 +245,7 @@ class UserEmailVerification(APIView):
                     can_write=True
                 )
                 # Add default types
-                corpus.types.bulk_create([
-                    ElementType(corpus=corpus, **values)
-                    for values in DEFAULT_CORPUS_TYPES
-                ])
+                corpus.create_default_types()
 
             # Redirtect to home page
             url = '/'
diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py
index 25dbfc5c62..2b9ae3d873 100644
--- a/arkindex/users/tests/test_registration.py
+++ b/arkindex/users/tests/test_registration.py
@@ -111,11 +111,18 @@ class TestRegistration(FixtureAPITestCase):
             list(new_corpus)
         )
         # Assert defaults types are set on the new corpus
-        self.assertListEqual(
-            list(new_corpus.get().types.values('slug', 'display_name', 'folder', 'default_view')),
+        self.assertCountEqual(
+            list(new_corpus.get().types.values(
+                'slug',
+                'display_name',
+                'folder',
+                'default_view',
+                'allowed_transcription'
+            )),
             [{
                 'folder': False,
                 'default_view': False,
+                'allowed_transcription': None,
                 **values
             } for values in DEFAULT_CORPUS_TYPES]
         )
-- 
GitLab