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:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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.')
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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',
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user