Fix optional metadata remove

Soleve issue of removing an optional document metadata
from a document that also contained existing required metadata.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-05-11 18:02:10 -04:00
parent aa94247c3d
commit 74ec939779
10 changed files with 209 additions and 183 deletions

View File

@@ -252,7 +252,9 @@
* Install and server static content to and from the image.
* Add support for editing document comments.
* Remove Internet Explorer specific markup.
* Fix optional metadata remove when mixed with required
metadata.
3.1.11 (2019-04-XX)
===================
* Fix multiple tag selection wizard step.

View File

@@ -562,6 +562,8 @@ Other changes
and upgrade stages.
* Add support for editing document comments.
* Remove Internet Explorer specific markup.
* Fix optional metadata remove when mixed with required
metadata.
Removals

View File

@@ -117,7 +117,7 @@ class DocumentMetadataForm(forms.Form):
DocumentMetadataFormSet = formset_factory(DocumentMetadataForm, extra=0)
class DocumentAddMetadataForm(forms.Form):
class DocumentMetadataAddForm(forms.Form):
metadata_type = forms.ModelMultipleChoiceField(
help_text=_('Metadata types to be added to the selected documents.'),
label=_('Metadata type'), queryset=MetadataType.objects.all(),
@@ -138,11 +138,29 @@ class DocumentAddMetadataForm(forms.Form):
else:
queryset = MetadataType.objects.none()
super(DocumentAddMetadataForm, self).__init__(*args, **kwargs)
super(DocumentMetadataAddForm, self).__init__(*args, **kwargs)
self.fields['metadata_type'].queryset = queryset
class DocumentMetadataRemoveForm(DocumentMetadataForm):
update = forms.BooleanField(
initial=False, label=_('Remove'), required=False
)
def __init__(self, *args, **kwargs):
super(DocumentMetadataRemoveForm, self).__init__(*args, **kwargs)
self.fields.pop('value')
def clean(self):
return super(forms.Form, self).clean()
DocumentMetadataRemoveFormSet = formset_factory(
DocumentMetadataRemoveForm, extra=0
)
class MetadataTypeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MetadataTypeForm, self).__init__(*args, **kwargs)
@@ -157,21 +175,6 @@ class MetadataTypeForm(forms.ModelForm):
model = MetadataType
class DocumentMetadataRemoveForm(DocumentMetadataForm):
update = forms.BooleanField(
initial=False, label=_('Remove'), required=False
)
def __init__(self, *args, **kwargs):
super(DocumentMetadataRemoveForm, self).__init__(*args, **kwargs)
self.fields.pop('value')
DocumentMetadataRemoveFormSet = formset_factory(
DocumentMetadataRemoveForm, extra=0
)
class DocumentTypeMetadataTypeRelationshipForm(forms.Form):
RELATIONSHIP_TYPE_NONE = 'none'
RELATIONSHIP_TYPE_OPTIONAL = 'optional'

View File

@@ -234,7 +234,7 @@ class DocumentMetadata(models.Model):
It used set to False when deleting document metadata on document
type change.
"""
if enforce_required and self.metadata_type.pk in self.document.document_type.metadata.filter(required=True).values_list('metadata_type', flat=True):
if enforce_required and self.document.document_type.metadata.filter(required=True).filter(metadata_type=self.metadata_type).exists():
raise ValidationError(
_('Metadata type is required for this document type.')
)

View File

@@ -13,10 +13,8 @@ TEST_METADATA_TYPES_FIXTURES = [
{'name': 'test_metadata_type_1', 'label': 'test metadata type 1'},
{'name': 'test_metadata_type_2', 'label': 'test metadata type 2'},
]
TEST_METADATA_TYPE_LABEL = 'test metadata type'
TEST_METADATA_TYPE_LABEL_2 = 'test metadata type label 2'
TEST_METADATA_TYPE_LABEL_EDITED = 'test metadata type label edited'
TEST_METADATA_TYPE_NAME = 'test'
TEST_METADATA_TYPE_NAME_2 = 'test metadata type name 2'
TEST_METADATA_TYPE_NAME_EDITED = 'test metadata type name edited'
TEST_METADATA_VALUE = 'test value'

View File

@@ -10,34 +10,95 @@ from .literals import (
)
class MetadataTypeTestMixin(object):
test_metadata_types = []
def setUp(self):
super(MetadataTypeTestMixin, self).setUp()
self.test_metadata_types_fixtures = copy.copy(
TEST_METADATA_TYPES_FIXTURES
class DocumentMetadataViewTestMixin(object):
def _request_test_document_metadata_add_post_view(self):
return self.post(
viewname='metadata:metadata_add', kwargs={
'pk': self.test_document.pk
}, data={'metadata_type': self.test_metadata_type.pk}
)
def _create_test_metadata_type(self):
self.test_metadata_type = MetadataType.objects.create(
**self.test_metadata_types_fixtures.pop()
def _request_test_document_metadata_multiple_add_post_view(self):
return self.post(
viewname='metadata:metadata_add', kwargs={
'pk': self.test_document.pk
}, data={
'metadata_type': [
metadata_type.pk for metadata_type in self.test_metadata_types
],
}
)
def _request_test_document_metadata_remove_post_view(self, index=0):
return self.post(
viewname='metadata:metadata_remove',
kwargs={'pk': self.test_document.pk}, data={
'form-0-id': self.test_metadata_types[index].pk,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def _request_test_document_multiple_metadata_add_post_view(self):
return self.post(
viewname='metadata:metadata_multiple_add', data={
'id_list': '{},{}'.format(
self.test_documents[0].pk, self.test_documents[1].pk
),
'metadata_type': self.test_metadata_type.pk
}
)
self.test_metadata_types.append(self.test_metadata_type)
class MetadataTestMixin(object):
class MetadataTypeAPIViewTestMixin(object):
def setUp(self):
super(MetadataTestMixin, self).setUp()
self.test_metadata_types_fixtures = copy.copy(
super(MetadataTypeAPIViewTestMixin, self).setUp()
self.test_metadata_types_fixtures_api_views = copy.copy(
TEST_METADATA_TYPES_FIXTURES
)
def _request_test_metadata_type_create_view(self):
return self.post(
viewname='metadata:setup_metadata_type_create', data={
**self.test_metadata_types_fixtures.pop()
}
viewname='rest_api:metadatatype-list',
data=self.test_metadata_types_fixtures_api_views.pop()
)
class MetadataTypeTestMixin(object):
def setUp(self):
super(MetadataTypeTestMixin, self).setUp()
self.test_metadata_types_fixtures_models = copy.copy(
TEST_METADATA_TYPES_FIXTURES
)
self.test_metadata_types = []
def _get_test_metadata_type_queryset(self):
return MetadataType.objects.filter(
pk__in=[
metadata_type.pk for metadata_type in self.test_metadata_types
]
)
def _create_test_metadata_type(self):
self.test_metadata_type = MetadataType.objects.create(
**self.test_metadata_types_fixtures_models.pop()
)
self.test_metadata_types.append(self.test_metadata_type)
class MetadataTypeViewTestMixin(object):
def setUp(self):
super(MetadataTypeViewTestMixin, self).setUp()
self.test_metadata_types_fixtures_views = copy.copy(
TEST_METADATA_TYPES_FIXTURES
)
def _request_test_metadata_type_create_view(self):
return self.post(
viewname='metadata:setup_metadata_type_create',
data=self.test_metadata_types_fixtures_views.pop()
)
def _request_test_metadata_type_delete_view(self):
@@ -57,6 +118,11 @@ class MetadataTestMixin(object):
}
)
def _request_metadata_type_list_view(self):
return self.get(
viewname='metadata:setup_metadata_type_list',
)
def _request_test_metadata_type_relationship_edit_view(self):
# This request assumes there is only one document type and
# blindly sets the first form of the formset.
@@ -69,8 +135,3 @@ class MetadataTestMixin(object):
'form-0-relationship_type': 'required'
}
)
def _request_metadata_type_list_view(self):
return self.get(
viewname='metadata:setup_metadata_type_list',
)

View File

@@ -16,23 +16,13 @@ from ..permissions import (
permission_metadata_type_edit, permission_metadata_type_view
)
from .literals import (
TEST_METADATA_TYPE_LABEL, TEST_METADATA_TYPE_LABEL_2,
TEST_METADATA_TYPE_NAME, TEST_METADATA_TYPE_NAME_2,
TEST_METADATA_VALUE, TEST_METADATA_VALUE_EDITED
)
from .mixins import MetadataTypeTestMixin
from .literals import TEST_METADATA_VALUE, TEST_METADATA_VALUE_EDITED
from .mixins import MetadataTypeAPIViewTestMixin, MetadataTypeTestMixin
class MetadataTypeAPITestCase(MetadataTypeTestMixin, BaseAPITestCase):
def _request_test_metadata_type_create_view(self):
return self.post(
viewname='rest_api:metadatatype-list', data={
'label': TEST_METADATA_TYPE_LABEL,
'name': TEST_METADATA_TYPE_NAME
}
)
class MetadataTypeAPITestCase(
MetadataTypeAPIViewTestMixin, MetadataTypeTestMixin, BaseAPITestCase
):
def test_metadata_type_create_no_permission(self):
response = self._request_test_metadata_type_create_view()
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
@@ -45,11 +35,6 @@ class MetadataTypeAPITestCase(MetadataTypeTestMixin, BaseAPITestCase):
metadata_type = MetadataType.objects.first()
self.assertEqual(response.data['id'], metadata_type.pk)
self.assertEqual(response.data['label'], TEST_METADATA_TYPE_LABEL)
self.assertEqual(response.data['name'], TEST_METADATA_TYPE_NAME)
self.assertEqual(metadata_type.label, TEST_METADATA_TYPE_LABEL)
self.assertEqual(metadata_type.name, TEST_METADATA_TYPE_NAME)
def _request_test_metadata_type_delete_view(self):
return self.delete(
@@ -104,8 +89,8 @@ class MetadataTypeAPITestCase(MetadataTypeTestMixin, BaseAPITestCase):
return self.patch(
viewname='rest_api:metadatatype-detail',
kwargs={'metadata_type_pk': self.test_metadata_type.pk}, data={
'label': TEST_METADATA_TYPE_LABEL_2,
'name': TEST_METADATA_TYPE_NAME_2
'label': '{} edited'.format(self.test_metadata_type.label),
'name': '{}_edited'.format(self.test_metadata_type.name),
}
)
@@ -148,8 +133,8 @@ class MetadataTypeAPITestCase(MetadataTypeTestMixin, BaseAPITestCase):
return self.put(
viewname='rest_api:metadatatype-detail',
kwargs={'metadata_type_pk': self.test_metadata_type.pk}, data={
'label': TEST_METADATA_TYPE_LABEL_2,
'name': TEST_METADATA_TYPE_NAME_2
'label': '{} edited'.format(self.test_metadata_type.label),
'name': '{}_edited'.format(self.test_metadata_type.name),
}
)
@@ -214,14 +199,14 @@ class MetadataTypeAPITestCase(MetadataTypeTestMixin, BaseAPITestCase):
)
class DocumentTypeMetadataTypeAPITestCase(DocumentTestMixin, BaseAPITestCase):
class DocumentTypeMetadataTypeAPITestCase(
DocumentTestMixin, MetadataTypeTestMixin, BaseAPITestCase
):
auto_upload_document = False
def setUp(self):
super(DocumentTypeMetadataTypeAPITestCase, self).setUp()
self.test_metadata_type = MetadataType.objects.create(
label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME
)
self._create_test_metadata_type()
def _create_document_type_metadata_type(self):
self.test_document_type_metadata_type = self.test_document_type.metadata.create(
@@ -384,12 +369,12 @@ class DocumentTypeMetadataTypeAPITestCase(DocumentTestMixin, BaseAPITestCase):
self.assertEqual(document_type_metadata_type.required, True)
class DocumentMetadataAPITestCase(DocumentTestMixin, BaseAPITestCase):
class DocumentMetadataAPITestCase(
DocumentTestMixin, MetadataTypeTestMixin, BaseAPITestCase
):
def setUp(self):
super(DocumentMetadataAPITestCase, self).setUp()
self.test_metadata_type = MetadataType.objects.create(
label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME
)
self._create_test_metadata_type()
self.test_document_type.metadata.create(
metadata_type=self.test_metadata_type, required=False
)

View File

@@ -12,11 +12,11 @@ from ..permissions import (
permission_metadata_type_create, permission_metadata_type_edit
)
from .mixins import MetadataTestMixin, MetadataTypeTestMixin
from .mixins import MetadataTypeTestMixin, MetadataTypeViewTestMixin
class MetadataTypeEventsTestCase(
MetadataTestMixin, MetadataTypeTestMixin, GenericViewTestCase
MetadataTypeTestMixin, MetadataTypeViewTestMixin, GenericViewTestCase
):
def test_metadata_type_create_event_no_permissions(self):
Action.objects.all().delete()

View File

@@ -7,7 +7,7 @@ from mayan.apps.documents.permissions import (
permission_document_view
)
from mayan.apps.documents.tests import (
DocumentTestMixin, GenericDocumentViewTestCase, TEST_DOCUMENT_TYPE_2_LABEL
GenericDocumentViewTestCase, TEST_DOCUMENT_TYPE_2_LABEL
)
from ..models import MetadataType
@@ -19,32 +19,26 @@ from ..permissions import (
)
from .literals import (
TEST_DOCUMENT_METADATA_VALUE_2, TEST_METADATA_TYPE_LABEL,
TEST_METADATA_TYPE_LABEL_2, TEST_METADATA_TYPE_NAME,
TEST_DOCUMENT_METADATA_VALUE_2, TEST_METADATA_TYPE_LABEL_2,
TEST_METADATA_TYPE_NAME_2, TEST_METADATA_VALUE_EDITED
)
from .mixins import MetadataTypeTestMixin, MetadataTestMixin
from .mixins import (
DocumentMetadataViewTestMixin, MetadataTypeTestMixin,
MetadataTypeViewTestMixin
)
class DocumentMetadataTestCase(GenericDocumentViewTestCase):
class DocumentMetadataTestCase(
DocumentMetadataViewTestMixin, MetadataTypeTestMixin,
GenericDocumentViewTestCase
):
def setUp(self):
super(DocumentMetadataTestCase, self).setUp()
#self.test_metadata_type = MetadataType.objects.create(
# name=TEST_METADATA_TYPE_NAME, label=TEST_METADATA_TYPE_LABEL
#)
self._create_test_metadata_type()
self.test_document_type.metadata.create(
metadata_type=self.test_metadata_type
)
def _request_test_document_metadata_add_post_view(self):
return self.post(
viewname='metadata:metadata_add', kwargs={
'pk': self.test_document.pk
}, data={'metadata_type': self.test_metadata_type.pk}
)
def test_document_metadata_add_post_view_no_permission(self):
response = self._request_test_document_metadata_add_post_view()
self.assertEqual(response.status_code, 404)
@@ -61,16 +55,6 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase):
self.assertEqual(self.test_document.metadata.count(), 1)
def _request_test_document_multiple_metadata_add_post_view(self):
return self.post(
viewname='metadata:metadata_multiple_add', data={
'id_list': '{},{}'.format(
self.test_documents[0].pk, self.test_documents[1].pk
),
'metadata_type': self.test_metadata_type.pk
}
)
def test_document_multiple_metadata_add_post_view_with_document_access(self):
self.upload_document()
@@ -89,35 +73,23 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase):
self.assertEqual(self.test_documents[0].metadata.count(), 1)
self.assertEqual(self.test_documents[1].metadata.count(), 1)
def test_single_document_multiple_metadata_add_view(self):
def test_document_metadata_multiple_add_post_view_with_full_access(self):
self._create_test_metadata_type()
self.test_document_type.metadata.create(
metadata_type=self.test_metadata_types[1]
)
self.grant_permission(permission=permission_document_view)
self.grant_permission(permission=permission_document_metadata_add)
self.grant_permission(permission=permission_document_metadata_edit)
metadata_type_2 = MetadataType.objects.create(
name=TEST_METADATA_TYPE_NAME_2, label=TEST_METADATA_TYPE_LABEL_2
)
response = self._request_test_document_metadata_multiple_add_post_view()
self.assertEqual(response.status_code, 302)
self.test_document_type.metadata.create(
metadata_type=metadata_type_2
)
self.post(
viewname='metadata:metadata_add', kwargs={
'pk': self.test_document.pk
}, data={
'metadata_type': [self.test_metadata_type.pk, metadata_type_2.pk],
}
)
document_metadata_types = self.test_document.metadata.values_list(
'metadata_type', flat=True
)
self.assertTrue(
self.test_metadata_type.pk in document_metadata_types
)
self.assertTrue(
metadata_type_2.pk in document_metadata_types
self.assertEqual(
self.test_document.metadata.filter(
metadata_type__in=self._get_test_metadata_type_queryset()
).count(), self._get_test_metadata_type_queryset().count()
)
def test_metadata_edit_after_document_type_change(self):
@@ -209,22 +181,10 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase):
self.test_document_metadata in self.test_document.metadata.all()
)
def _request_document_metadata_remove_post_view(self):
return self.post(
viewname='metadata:metadata_remove',
kwargs={'pk': self.test_document.pk}, data={
'form-0-id': self.test_document_metadata.metadata_type.pk,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def test_document_metadata_remove_post_view_no_permission(self):
self._create_test_document_metadata()
response = self._request_document_metadata_remove_post_view()
response = self._request_test_document_metadata_remove_post_view()
self.assertNotContains(
response=response, text=self.test_metadata_type.label, status_code=404
)
@@ -240,7 +200,7 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase):
obj=self.test_document,
permission=permission_document_metadata_remove
)
response = self._request_document_metadata_remove_post_view()
response = self._request_test_document_metadata_remove_post_view()
self.assertEqual(response.status_code, 302)
self.assertTrue(
@@ -332,9 +292,8 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase):
)
class DocumentMetadataRequiredTestCase(
MetadataTestMixin, MetadataTypeTestMixin, GenericDocumentViewTestCase
DocumentMetadataViewTestMixin, MetadataTypeTestMixin, GenericDocumentViewTestCase
):
def setUp(self):
super(DocumentMetadataRequiredTestCase, self).setUp()
@@ -348,53 +307,67 @@ class DocumentMetadataRequiredTestCase(
)
def _create_test_document_metadata(self):
self.test_document_metadatas = []
self.test_document_metadatas.append(
self.test_document.metadata.get_or_create(
metadata_type=self.test_metadata_types[0], #defaults={'value': 'a'}
)
self.test_document_metadata = self.test_document.metadata.get_or_create(
metadata_type=self.test_metadata_types[0]
)
self.test_document_metadatas.append(
self.test_document.metadata.get_or_create(
metadata_type=self.test_metadata_types[1], #defaults={'value': 'b'}
)
self.test_document.metadata.get_or_create(
metadata_type=self.test_metadata_types[1]
)
def _request_document_metadata_remove_post_view(self):
return self.post(
viewname='metadata:metadata_remove',
kwargs={'pk': self.test_document.pk}, data={
'form-0-id': self.test_metadata_types[0].pk,
'form-0-update': True,
'form-TOTAL_FORMS': '1',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '',
}
)
def test_document_metadata_remove_post_view_with_access(self):
def test_document_metadata_remove_post_view_with_access_non_required_from_dual(self):
# Adds two metadata types to the document type: one required and
# one optional. Add both to a document. Attempts to remove the optional
# one.
self._create_test_document_metadata()
self.grant_access(
obj=self.test_document,
permission=permission_document_metadata_remove
)
response = self._request_document_metadata_remove_post_view()
response = self._request_test_document_metadata_remove_post_view(index=0)
self.assertEqual(response.status_code, 302)
self.assertFalse(
self.test_document.metadata.filter(
metadata_type=self.test_metadata_types[0]
).exists()
)
self.assertTrue(
self.test_document.metadata.filter(
metadata_type=self.test_metadata_types[1]
).exists()
)
def test_document_metadata_remove_post_view_with_access_required_from_dual(self):
# Adds two metadata types to the document type: one required and
# one optional. Add both to a document. Attempts to remove the required
# one.
self._create_test_document_metadata()
self.grant_access(
obj=self.test_document,
permission=permission_document_metadata_remove
)
response = self._request_test_document_metadata_remove_post_view(index=1)
self.assertEqual(response.status_code, 302)
self.assertTrue(
self.test_document_metadata not in self.test_document.metadata.all()
self.test_document.metadata.filter(
metadata_type=self.test_metadata_types[0]
).exists()
)
self.assertTrue(
self.test_document.metadata.filter(
metadata_type=self.test_metadata_types[1]
).exists()
)
class MetadataTypeViewTestCase(
DocumentTestMixin, MetadataTestMixin, MetadataTypeTestMixin,
GenericViewTestCase
MetadataTypeViewTestMixin, MetadataTypeTestMixin, GenericViewTestCase
):
auto_create_document_type = False
auto_upload_document = False
def test_metadata_type_create_view_no_permission(self):
metadata_type_count = MetadataType.objects.count()
@@ -502,9 +475,15 @@ class MetadataTypeViewTestCase(
response=response, text=self.test_metadata_type, status_code=200
)
class MetadataTypeDocumentTypeViewTestCase(
MetadataTypeViewTestMixin, MetadataTypeTestMixin,
GenericDocumentViewTestCase
):
auto_upload_document = False
def test_metadata_type_relationship_view_no_permission(self):
self._create_test_metadata_type()
self._create_document_type()
self.upload_document()
response = self._request_test_metadata_type_relationship_edit_view()
@@ -515,7 +494,6 @@ class MetadataTypeViewTestCase(
def test_metadata_type_relationship_view_with_document_type_access(self):
self._create_test_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(
@@ -531,7 +509,6 @@ class MetadataTypeViewTestCase(
def test_metadata_type_relationship_view_with_metadata_type_access(self):
self._create_test_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(
@@ -546,7 +523,6 @@ class MetadataTypeViewTestCase(
def test_metadata_type_relationship_view_with_metadata_type_and_document_type_access(self):
self._create_test_metadata_type()
self._create_document_type()
self.upload_document()
self.grant_access(

View File

@@ -23,7 +23,7 @@ from mayan.apps.documents.permissions import (
from .api import save_metadata_list
from .forms import (
DocumentAddMetadataForm, DocumentMetadataFormSet,
DocumentMetadataAddForm, DocumentMetadataFormSet,
DocumentMetadataRemoveFormSet,
DocumentTypeMetadataTypeRelationshipFormSet, MetadataTypeForm
)
@@ -45,7 +45,7 @@ from .permissions import (
class DocumentMetadataAddView(MultipleObjectFormActionView):
form_class = DocumentAddMetadataForm
form_class = DocumentMetadataAddForm
model = Document
object_permission = permission_document_metadata_add
success_message = _('Metadata add request performed on %(count)d document')
@@ -451,7 +451,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
DocumentMetadataRemoveView, self
).dispatch(request, *args, **kwargs)
queryset = self.get_object_list()
queryset = self.object_list
for document in queryset:
document.add_as_recent_document_for_user(request.user)
@@ -468,7 +468,6 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
def form_valid(self, form):
result = super(DocumentMetadataRemoveView, self).form_valid(form=form)
queryset = self.get_object_list()
if self.action_count == 1:
@@ -525,7 +524,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
return result
def get_initial(self):
queryset = self.get_object_list()
queryset = self.object_list
metadata = {}
for document in queryset:
@@ -571,7 +570,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
'document': instance
}, request=self.request
)
except Exception as exception:
except ValidationError as exception:
messages.error(
message=_(
'Error removing metadata type "%(metadata_type)s" from document: %(document)s; %(exception)s'