Skip to content
Snippets Groups Projects
Commit 49d90559 authored by Valentin Rigal's avatar Valentin Rigal Committed by Erwan Rouchet
Browse files

Index edited metadata

parent 46cda6d8
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@ from arkindex.documents.serializers.ml import DataSourceSerializer, MLClassSeria
from arkindex.images.serializers import ZoneSerializer
from arkindex.dataimport.serializers.git import RevisionSerializer
from arkindex.project.serializer_fields import EnumField
from arkindex.project.triggers import reindex_start
class InterpretedDateSerializer(serializers.Serializer):
......@@ -132,6 +133,9 @@ class MetaDataLightSerializer(serializers.ModelSerializer):
revision = RevisionSerializer(read_only=True)
dates = InterpretedDateSerializer(many=True, source='get_dates', read_only=True)
def reindex_element(self, elt):
reindex_start(element=elt, elements=True)
def check_allowed(self, corpus=None, type=None, name=None, instance=None, **kwargs):
"""
Assert metadata type and value are allowed in this corpus
......@@ -154,10 +158,14 @@ class MetaDataLightSerializer(serializers.ModelSerializer):
metadata = element.metadatas.filter(name=validated_data['name'])
if metadata.exists():
if metadata.filter(value=validated_data['value'], type=validated_data['type']).exists():
# A metdata with same type, name and value exists, raises a 200_OK
# Raise a 200_OK if a metadata with same type, name and value exists
raise DuplicatedMetadata
validated_data['index'] = metadata.aggregate(Max('index'))['index__max'] + 1
metadata = element.metadatas.create(**validated_data)
if metadata.type == MetaType.Reference:
# Index reference metadatas
self.reindex_element(element)
return metadata
def update(self, instance, validated_data):
......@@ -174,14 +182,24 @@ class MetaDataLightSerializer(serializers.ModelSerializer):
.exclude(id=instance.id)
if metadata.exists():
validated_data['index'] = metadata.aggregate(Max('index'))['index__max'] + 1
return super().update(instance, validated_data)
original_type = instance.type
updated_metadata = super().update(instance, validated_data)
if MetaType.Reference in (original_type, updated_metadata.type):
# Reindex element reference metadatas
self.reindex_element(updated_metadata.element)
return updated_metadata
def delete(self, instance):
user = self.context['request'].user
element = instance.element
element, meta_type = instance.element, instance.type
if not (user.is_admin or user.is_internal):
self.check_allowed(corpus=element.corpus, instance=instance)
instance.delete()
if meta_type == MetaType.Reference:
# Reindex metadata's element
self.reindex_element(element)
class Meta:
model = MetaData
......
from arkindex.documents.models import Corpus, AllowedMetaData
from arkindex.documents.models import Corpus, MetaData, AllowedMetaData
from arkindex.project.tests import FixtureAPITestCase
from arkindex_common.enums import MetaType
from arkindex.users.models import User
from rest_framework import status
from django.urls import reverse
from unittest.mock import patch
from unittest.mock import patch, call
class TestMetaData(FixtureAPITestCase):
......@@ -27,6 +27,7 @@ class TestMetaData(FixtureAPITestCase):
for t, n in (
(MetaType.Date, 'edition'),
(MetaType.Text, 'edition'),
(MetaType.Reference, '_id'),
)
)
......@@ -52,7 +53,7 @@ class TestMetaData(FixtureAPITestCase):
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data['count'], 5)
self.assertEqual(data['count'], 6)
self.assertListEqual(
data['results'],
[
......@@ -66,6 +67,7 @@ class TestMetaData(FixtureAPITestCase):
self.assertListEqual(
response.json()['results'],
[
{'type': 'reference', 'name': '_id'},
{'type': 'text', 'name': 'edition'},
{'type': 'text', 'name': 'folio'}
]
......@@ -376,3 +378,65 @@ class TestMetaData(FixtureAPITestCase):
'dates': []
}
)
@patch('arkindex.documents.serializers.light.reindex_start')
def test_reference_metadata_reindex_on_delete(self, reindex_mock):
self.client.force_login(self.user)
ref_metadata = self.vol.metadatas.create(type=MetaType.Reference, name='_id', value='42')
response = self.client.delete(reverse('api:metadata-edit', kwargs={'pk': str(ref_metadata.id)}))
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertEqual(reindex_mock.call_count, 1)
self.assertEqual(
reindex_mock.call_args,
call(element=self.vol, elements=True)
)
self.assertEqual(MetaData.objects.filter(id=ref_metadata.id).exists(), False)
@patch('arkindex.documents.serializers.light.reindex_start')
def test_reference_metadata_reindex_on_create(self, reindex_mock):
self.client.force_login(self.user)
response = self.client.post(
reverse('api:element-metadata', kwargs={'pk': str(self.vol.id)}),
data={'type': 'reference', 'name': '_id', 'value': '42'}
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(reindex_mock.call_count, 1)
self.assertEqual(
reindex_mock.call_args,
call(element=self.vol, elements=True)
)
self.assertEqual(MetaData.objects.filter(id=response.json()['id']).exists(), True)
@patch('arkindex.documents.serializers.light.reindex_start')
def test_metadata_reindex_patch_from_reference(self, reindex_mock):
self.client.force_login(self.user)
ref_metadata = self.vol.metadatas.create(type=MetaType.Reference, name='_id', value='42')
response = self.client.patch(
reverse('api:metadata-edit', kwargs={'pk': str(ref_metadata.id)}),
data={'name': 'edition', 'type': 'text'}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(reindex_mock.call_count, 1)
self.assertEqual(
reindex_mock.call_args,
call(element=self.vol, elements=True)
)
ref_metadata.refresh_from_db()
self.assertEqual(ref_metadata.type, MetaType.Text)
@patch('arkindex.documents.serializers.light.reindex_start')
def test_metadata_reindex_patch_to_reference(self, reindex_mock):
self.client.force_login(self.user)
ref_metadata = self.vol.metadatas.create(type=MetaType.Text, name='edition', value='42')
response = self.client.patch(
reverse('api:metadata-edit', kwargs={'pk': str(ref_metadata.id)}),
data={'type': 'reference', 'name': '_id'}
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(reindex_mock.call_count, 1)
self.assertEqual(
reindex_mock.call_args,
call(element=self.vol, elements=True)
)
ref_metadata.refresh_from_db()
self.assertEqual(ref_metadata.type, MetaType.Reference)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment