From 74ec939779e832255d0bc58a45590d0e687154f3 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 11 May 2019 18:02:10 -0400 Subject: [PATCH] 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 --- HISTORY.rst | 4 +- docs/releases/3.2.rst | 2 + mayan/apps/metadata/forms.py | 37 ++--- mayan/apps/metadata/models.py | 2 +- mayan/apps/metadata/tests/literals.py | 2 - mayan/apps/metadata/tests/mixins.py | 105 +++++++++++--- mayan/apps/metadata/tests/test_api.py | 49 +++---- mayan/apps/metadata/tests/test_events.py | 4 +- mayan/apps/metadata/tests/test_views.py | 176 ++++++++++------------- mayan/apps/metadata/views.py | 11 +- 10 files changed, 209 insertions(+), 183 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index f3201a923f..d6aecd57c3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -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. diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index 3e85fbba06..b31fbf20e1 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -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 diff --git a/mayan/apps/metadata/forms.py b/mayan/apps/metadata/forms.py index 9c6c2663dc..d2d090dd15 100644 --- a/mayan/apps/metadata/forms.py +++ b/mayan/apps/metadata/forms.py @@ -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' diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index 20c2321802..c160a98e4f 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -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.') ) diff --git a/mayan/apps/metadata/tests/literals.py b/mayan/apps/metadata/tests/literals.py index b8d5f98203..2f49f390ca 100644 --- a/mayan/apps/metadata/tests/literals.py +++ b/mayan/apps/metadata/tests/literals.py @@ -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' diff --git a/mayan/apps/metadata/tests/mixins.py b/mayan/apps/metadata/tests/mixins.py index d61a7fe7d8..34033748bc 100644 --- a/mayan/apps/metadata/tests/mixins.py +++ b/mayan/apps/metadata/tests/mixins.py @@ -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', - ) diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py index 8eda7c3cdc..ab06e11725 100644 --- a/mayan/apps/metadata/tests/test_api.py +++ b/mayan/apps/metadata/tests/test_api.py @@ -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 ) diff --git a/mayan/apps/metadata/tests/test_events.py b/mayan/apps/metadata/tests/test_events.py index 41b7905870..cdd8e1b45c 100644 --- a/mayan/apps/metadata/tests/test_events.py +++ b/mayan/apps/metadata/tests/test_events.py @@ -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() diff --git a/mayan/apps/metadata/tests/test_views.py b/mayan/apps/metadata/tests/test_views.py index 9529dbb5f2..b882526b91 100644 --- a/mayan/apps/metadata/tests/test_views.py +++ b/mayan/apps/metadata/tests/test_views.py @@ -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( diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 35ca74defd..c209dccc7f 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -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'