diff --git a/mayan/apps/metadata/apps.py b/mayan/apps/metadata/apps.py index 7e2a641989..6058d3b977 100644 --- a/mayan/apps/metadata/apps.py +++ b/mayan/apps/metadata/apps.py @@ -33,9 +33,9 @@ from .events import ( event_metadata_type_relationship ) from .handlers import ( - handler_post_document_type_metadata_type_add, + handler_index_document, handler_post_document_type_metadata_type_add, handler_post_document_type_metadata_type_delete, - handler_post_document_type_change_metadata, handler_index_document, + handler_post_document_type_change, ) from .links import ( link_document_metadata_add, link_document_metadata_edit, @@ -255,8 +255,8 @@ class MetadataApp(MayanAppConfig): sender=DocumentTypeMetadataType ) post_document_type_change.connect( - dispatch_uid='metadata_handler_post_document_type_change_metadata', - receiver=handler_post_document_type_change_metadata, + dispatch_uid='metadata_handler_post_document_type_change', + receiver=handler_post_document_type_change, sender=Document ) post_save.connect( diff --git a/mayan/apps/metadata/events.py b/mayan/apps/metadata/events.py index 769eb07119..73c650ee74 100644 --- a/mayan/apps/metadata/events.py +++ b/mayan/apps/metadata/events.py @@ -4,31 +4,24 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.events import EventTypeNamespace -namespace = EventTypeNamespace(name='metadata', label=_('Metadata')) +namespace = EventTypeNamespace(label=_('Metadata'), name='metadata') event_document_metadata_added = namespace.add_event_type( - name='document_metadata_added', label=_( - 'Document metadata added' - ) + label=_('Document metadata added'), name='document_metadata_added' ) event_document_metadata_edited = namespace.add_event_type( - name='document_metadata_edited', label=_( - 'Document metadata edited' - ) + label=_('Document metadata edited'), name='document_metadata_edited' ) event_document_metadata_removed = namespace.add_event_type( - name='document_metadata_removed', label=_( - 'Document metadata removed' - ) + label=_('Document metadata removed'), name='document_metadata_removed' ) event_metadata_type_created = namespace.add_event_type( - name='metadata_type_created', label=_('Metadata type created') + label=_('Metadata type created'), name='metadata_type_created' ) event_metadata_type_edited = namespace.add_event_type( - name='metadata_type_edited', label=_('Metadata type edited') + label=_('Metadata type edited'), name='metadata_type_edited' ) event_metadata_type_relationship = namespace.add_event_type( - name='metadata_type_relationship', label=_( - 'Metadata type relationship updated' - ) + label=_('Metadata type relationship updated'), + name='metadata_type_relationship' ) diff --git a/mayan/apps/metadata/handlers.py b/mayan/apps/metadata/handlers.py index efe21b0faa..97da1133a1 100644 --- a/mayan/apps/metadata/handlers.py +++ b/mayan/apps/metadata/handlers.py @@ -11,29 +11,7 @@ from .tasks import task_add_required_metadata_type, task_remove_metadata_type logger = logging.getLogger(__name__) -def handler_post_document_type_metadata_type_add(sender, instance, created, **kwargs): - logger.debug('instance: %s', instance) - - if created and instance.required: - task_add_required_metadata_type.apply_async( - kwargs={ - 'document_type_id': instance.document_type.pk, - 'metadata_type_id': instance.metadata_type.pk - } - ) - - -def handler_post_document_type_metadata_type_delete(sender, instance, **kwargs): - logger.debug('instance: %s', instance) - task_remove_metadata_type.apply_async( - kwargs={ - 'document_type_id': instance.document_type.pk, - 'metadata_type_id': instance.metadata_type.pk - } - ) - - -def handler_post_document_type_change_metadata(sender, instance, **kwargs): +def handler_post_document_type_change(sender, instance, **kwargs): logger.debug('received post_document_type_change') logger.debug('instance: %s', instance) @@ -73,6 +51,28 @@ def handler_post_document_type_change_metadata(sender, instance, **kwargs): ) +def handler_post_document_type_metadata_type_add(sender, instance, created, **kwargs): + logger.debug('instance: %s', instance) + + if created and instance.required: + task_add_required_metadata_type.apply_async( + kwargs={ + 'document_type_id': instance.document_type.pk, + 'metadata_type_id': instance.metadata_type.pk + } + ) + + +def handler_post_document_type_metadata_type_delete(sender, instance, **kwargs): + logger.debug('instance: %s', instance) + task_remove_metadata_type.apply_async( + kwargs={ + 'document_type_id': instance.document_type.pk, + 'metadata_type_id': instance.metadata_type.pk + } + ) + + def handler_index_document(sender, **kwargs): task_index_document.apply_async( kwargs=dict(document_id=kwargs['instance'].document.pk) diff --git a/mayan/apps/metadata/links.py b/mayan/apps/metadata/links.py index c7c1181a5f..75869e0525 100644 --- a/mayan/apps/metadata/links.py +++ b/mayan/apps/metadata/links.py @@ -22,15 +22,27 @@ from .permissions import ( ) link_document_metadata_add = Link( - args='object.pk', icon_class=icon_document_metadata_add, + icon_class=icon_document_metadata_add, kwargs={'document_id': 'object.pk'}, permissions=(permission_document_metadata_add,), text=_('Add metadata'), view='metadata:document_metadata_add', ) link_document_metadata_edit = Link( - args='object.pk', icon_class=icon_document_metadata_edit, + icon_class=icon_document_metadata_edit, kwargs={'document_id': 'object.pk'}, permissions=(permission_document_metadata_edit,), text=_('Edit metadata'), view='metadata:document_metadata_edit' ) +link_document_metadata_remove = Link( + icon_class=icon_document_metadata_remove, + kwargs={'document_id': 'object.pk'}, + permissions=(permission_document_metadata_remove,), + text=_('Remove metadata'), view='metadata:document_metadata_remove', +) +link_document_metadata_view = Link( + icon_class=icon_document_metadata_view, + kwargs={'document_id': 'resolved_object.pk'}, + permissions=(permission_document_metadata_view,), text=_('Metadata'), + view='metadata:document_metadata_view', +) link_document_multiple_metadata_add = Link( icon_class=icon_document_multiple_metadata_add, text=_('Add metadata'), view='metadata:document_multiple_metadata_add' @@ -44,23 +56,15 @@ link_document_multiple_metadata_remove = Link( text=_('Remove metadata'), view='metadata:document_multiple_metadata_remove' ) -link_document_metadata_remove = Link( - args='object.pk', icon_class=icon_document_metadata_remove, - permissions=(permission_document_metadata_remove,), - text=_('Remove metadata'), view='metadata:document_metadata_remove', -) -link_document_metadata_view = Link( - args='resolved_object.pk', icon_class=icon_document_metadata_view, - permissions=(permission_document_metadata_view,), text=_('Metadata'), - view='metadata:document_metadata_view', -) link_document_type_metadata_types = Link( - args='resolved_object.pk', icon_class=icon_document_type_metadata_types, + icon_class=icon_document_type_metadata_types, + kwargs={'document_type_id': 'resolved_object.pk'}, permissions=(permission_document_type_edit,), text=_('Metadata types'), view='metadata:document_type_metadata_types', ) link_metadata_type_document_types = Link( - args='resolved_object.pk', icon_class=icon_document_type, + icon_class=icon_document_type, + kwargs={'metadata_type_id': 'resolved_object.pk'}, permissions=(permission_document_type_edit,), text=_('Document types'), view='metadata:metadata_type_document_types', ) @@ -70,12 +74,14 @@ link_metadata_type_create = Link( view='metadata:metadata_type_create' ) link_metadata_type_delete = Link( - args='object.pk', icon_class=icon_metadata_type_delete, + icon_class=icon_metadata_type_delete, + kwargs={'metadata_type_id': 'object.pk'}, permissions=(permission_metadata_type_delete,), tags='dangerous', text=_('Delete'), view='metadata:metadata_type_delete', ) link_metadata_type_edit = Link( - args='object.pk', icon_class=icon_metadata_type_edit, + icon_class=icon_metadata_type_edit, + kwargs={'metadata_type_id': 'object.pk'}, permissions=(permission_metadata_type_edit,), text=_('Edit'), view='metadata:metadata_type_edit' ) diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index c7ac3e883b..f5ccdb319e 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -98,7 +98,10 @@ class MetadataType(models.Model): return self.label def get_absolute_url(self): - return reverse('metadata:metadata_type_edit', kwargs={'pk': self.pk}) + return reverse( + viewname='metadata:metadata_type_edit', + kwargs={'metadata_type_id': self.pk} + ) if PY2: # Python 2 non unicode version diff --git a/mayan/apps/metadata/parsers.py b/mayan/apps/metadata/parsers.py index a3f7beb984..f1fb558a3b 100644 --- a/mayan/apps/metadata/parsers.py +++ b/mayan/apps/metadata/parsers.py @@ -8,10 +8,6 @@ from django.core.exceptions import ValidationError class MetadataParser(object): _registry = [] - @classmethod - def register(cls, parser): - cls._registry.append(parser) - @classmethod def get_all(cls): return cls._registry @@ -24,6 +20,10 @@ class MetadataParser(object): def get_import_paths(cls): return [validator.get_import_path() for validator in cls.get_all()] + @classmethod + def register(cls, parser): + cls._registry.append(parser) + def execute(self, input_data): raise NotImplementedError diff --git a/mayan/apps/metadata/permissions.py b/mayan/apps/metadata/permissions.py index 0d809d89a1..e1c35fa460 100644 --- a/mayan/apps/metadata/permissions.py +++ b/mayan/apps/metadata/permissions.py @@ -4,35 +4,34 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='metadata', label=_('Metadata')) +namespace = PermissionNamespace(label=_('Metadata'), name='metadata') permission_document_metadata_add = namespace.add_permission( - name='metadata_document_add', label=_('Add metadata to a document') + label=_('Add metadata to a document'), name='metadata_document_add' ) permission_document_metadata_edit = namespace.add_permission( - name='metadata_document_edit', label=_('Edit a document\'s metadata') + label=_('Edit a document\'s metadata'), name='metadata_document_edit' ) permission_document_metadata_remove = namespace.add_permission( - name='metadata_document_remove', - label=_('Remove metadata from a document') + label=_('Remove metadata from a document'), name='metadata_document_remove' ) permission_document_metadata_view = namespace.add_permission( - name='metadata_document_view', label=_('View metadata from a document') + label=_('View metadata from a document'), name='metadata_document_view' ) setup_namespace = PermissionNamespace( - name='metadata_setup', label=_('Metadata setup') + label=_('Metadata setup'), name='metadata_setup' ) permission_metadata_type_create = setup_namespace.add_permission( - name='metadata_type_create', label=_('Create new metadata types') + label=_('Create new metadata types'), name='metadata_type_create' ) permission_metadata_type_delete = setup_namespace.add_permission( - name='metadata_type_delete', label=_('Delete metadata types') + label=_('Delete metadata types'), name='metadata_type_delete' ) permission_metadata_type_edit = setup_namespace.add_permission( - name='metadata_type_edit', label=_('Edit metadata types') + label=_('Edit metadata types'), name='metadata_type_edit' ) permission_metadata_type_view = setup_namespace.add_permission( - name='metadata_type_view', label=_('View metadata types') + label=_('View metadata types'), name='metadata_type_view' ) diff --git a/mayan/apps/metadata/queues.py b/mayan/apps/metadata/queues.py index 16775657fb..c57d66cc4c 100644 --- a/mayan/apps/metadata/queues.py +++ b/mayan/apps/metadata/queues.py @@ -5,13 +5,13 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.task_manager.classes import CeleryQueue queue_metadata = CeleryQueue( - name='metadata', label=_('Metadata') + label=_('Metadata'), name='metadata' ) queue_metadata.add_task_type( - name='mayan.apps.metadata.tasks.task_remove_metadata_type', - label=_('Remove metadata type') + label=_('Remove metadata type'), + name='mayan.apps.metadata.tasks.task_remove_metadata_type' ) queue_metadata.add_task_type( - name='mayan.apps.metadata.tasks.task_add_required_metadata_type', - label=_('Add required metadata type') + label=_('Add required metadata type'), + name='mayan.apps.metadata.tasks.task_add_required_metadata_type' ) diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index c611e55556..c8f47d2bf9 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -40,9 +40,9 @@ class DocumentTypeMetadataTypeSerializer(serializers.HyperlinkedModelSerializer) def get_url(self, instance): return reverse( - 'rest_api:documenttypemetadatatype-detail', args=( - instance.document_type.pk, instance.pk - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documenttypemetadatatype-detail', kwargs={ + 'document_type_pk': instance.document_type.pk, 'metadata_type': instance.pk + }, request=self.context['request'], format=self.context['format'] ) @@ -61,9 +61,9 @@ class NewDocumentTypeMetadataTypeSerializer(serializers.ModelSerializer): def get_url(self, instance): return reverse( - 'rest_api:documenttypemetadatatype-detail', args=( - instance.document_type.pk, instance.pk - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documenttypemetadatatype-detail', kwargs={ + 'document_type': instance.document_type.pk, 'metadata_type': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def validate(self, attrs): @@ -92,9 +92,10 @@ class WritableDocumentTypeMetadataTypeSerializer(serializers.ModelSerializer): def get_url(self, instance): return reverse( - 'rest_api:documenttypemetadatatype-detail', args=( - instance.document_type.pk, instance.pk - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documenttypemetadatatype-detail', kwargs={ + 'document_type_pk': instance.document_type.pk, + 'metadata_type': instance.pk + }, request=self.context['request'], format=self.context['format'] ) @@ -110,9 +111,9 @@ class DocumentMetadataSerializer(serializers.HyperlinkedModelSerializer): def get_url(self, instance): return reverse( - 'rest_api:documentmetadata-detail', args=( - instance.document.pk, instance.pk - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentmetadata-detail', kwargs={ + 'document_pk': instance.document.pk, 'metadata_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def validate(self, attrs): @@ -141,9 +142,9 @@ class NewDocumentMetadataSerializer(serializers.ModelSerializer): def get_url(self, instance): return reverse( - 'rest_api:documentmetadata-detail', args=( - instance.document.pk, instance.pk - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentmetadata-detail', kwargs={ + 'document_pk': instance.document.pk, 'metadata_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def validate(self, attrs): diff --git a/mayan/apps/metadata/settings.py b/mayan/apps/metadata/settings.py index 9dfaffa4e5..ce7aa6de35 100644 --- a/mayan/apps/metadata/settings.py +++ b/mayan/apps/metadata/settings.py @@ -7,7 +7,7 @@ from mayan.apps.smart_settings import Namespace from .parsers import MetadataParser from .validators import MetadataValidator -namespace = Namespace(name='metadata', label=_('Metadata')) +namespace = Namespace(label=_('Metadata'), name='metadata') setting_available_validators = namespace.add_setting( global_name='METADATA_AVAILABLE_VALIDATORS', diff --git a/mayan/apps/metadata/tests/mixins.py b/mayan/apps/metadata/tests/mixins.py index 83ef32c2b6..1ec5dcd64e 100644 --- a/mayan/apps/metadata/tests/mixins.py +++ b/mayan/apps/metadata/tests/mixins.py @@ -33,15 +33,15 @@ class MetadataTestsMixin(object): def _request_metadata_type_delete_view(self): return self.post( - viewname='metadata:metadata_type_delete', args=( - self.metadata_type.pk, - ), + viewname='metadata:metadata_type_delete', + kwargs={'metadata_type_id': self.metadata_type.pk} ) def _request_metadata_type_edit_view(self): return self.post( - viewname='metadata:metadata_type_edit', args=( - self.metadata_type.pk,), data={ + viewname='metadata:metadata_type_edit', + kwargs={'metadata_type_id': self.metadata_type.pk}, + data={ 'label': TEST_METADATA_TYPE_LABEL_EDITED, 'name': TEST_METADATA_TYPE_NAME_EDITED } @@ -53,7 +53,8 @@ class MetadataTestsMixin(object): return self.post( viewname='metadata:metadata_type_document_types', - args=(self.metadata_type.pk,), data={ + kwargs={'metadata_type_id': self.metadata_type.pk}, + data={ 'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-0-relationship_type': 'required', diff --git a/mayan/apps/metadata/tests/test_views.py b/mayan/apps/metadata/tests/test_views.py index 7eff3c794b..b76afbbdf4 100644 --- a/mayan/apps/metadata/tests/test_views.py +++ b/mayan/apps/metadata/tests/test_views.py @@ -38,13 +38,13 @@ class DocumentMetadataTestCase(MetadataTestsMixin, GenericDocumentViewTestCase): def _request_get_document_metadata_add_view(self): return self.get( viewname='metadata:document_metadata_add', - kwargs={'pk': self.document.pk}, + kwargs={'document_id': self.document.pk}, ) def _request_post_document_metadata_add_view(self): return self.post( viewname='metadata:document_metadata_add', - kwargs={'pk': self.document.pk}, + kwargs={'document_id': self.document.pk}, data={'metadata_type': self.metadata_type.pk} ) @@ -109,14 +109,14 @@ class DocumentMetadataTestCase(MetadataTestsMixin, GenericDocumentViewTestCase): response = self.get( viewname='metadata:document_metadata_edit', - kwargs={'pk': self.document.pk} + kwargs={'document_id': self.document.pk} ) self.assertContains(response, 'Edit', status_code=200) response = self.post( viewname='metadata:document_metadata_edit', - kwargs={'pk': self.document.pk}, data={ + kwargs={'document_id': self.document.pk}, data={ 'form-0-id': document_metadata_2.metadata_type.pk, 'form-0-update': True, 'form-0-value': TEST_DOCUMENT_METADATA_VALUE_2, @@ -136,13 +136,13 @@ class DocumentMetadataTestCase(MetadataTestsMixin, GenericDocumentViewTestCase): def _request_get_document_document_metadata_remove_view(self): return self.get( viewname='metadata:document_metadata_remove', - kwargs={'pk': self.document.pk} + kwargs={'document_id': self.document.pk} ) def _request_post_document_document_metadata_remove_view(self): return self.post( viewname='metadata:document_metadata_remove', - kwargs={'pk': self.document.pk}, data={ + kwargs={'document_id': self.document.pk}, data={ 'form-0-id': self.document_metadata.metadata_type.pk, 'form-0-update': True, 'form-TOTAL_FORMS': '1', @@ -338,7 +338,7 @@ class DocumentMetadataTestCase(MetadataTestsMixin, GenericDocumentViewTestCase): self.post( viewname='metadata:document_metadata_add', - kwargs={'pk': self.document.pk}, data={ + kwargs={'document_id': self.document.pk}, data={ 'metadata_type': [self.metadata_type.pk, metadata_type_2.pk], } ) @@ -385,7 +385,7 @@ class MetadataTypeViewTestCase(DocumentTestMixin, MetadataTestsMixin, GenericVie response = self._request_metadata_type_delete_view() - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) self.assertQuerysetEqual( qs=MetadataType.objects.values('label', 'name'), values=[ @@ -414,7 +414,7 @@ class MetadataTypeViewTestCase(DocumentTestMixin, MetadataTestsMixin, GenericVie response = self._request_metadata_type_edit_view() - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) self.assertQuerysetEqual( qs=MetadataType.objects.values('label', 'name'), values=[ @@ -472,8 +472,7 @@ class MetadataTypeViewTestCase(DocumentTestMixin, MetadataTestsMixin, GenericVie self.upload_document() response = self._request_metadata_type_relationship_edit_view() - - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) self.document_type.refresh_from_db() @@ -489,8 +488,7 @@ class MetadataTypeViewTestCase(DocumentTestMixin, MetadataTestsMixin, GenericVie ) response = self._request_metadata_type_relationship_edit_view() - - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) self.document_type.refresh_from_db() diff --git a/mayan/apps/metadata/tests/test_wizard_steps.py b/mayan/apps/metadata/tests/test_wizard_steps.py index 045324a457..b513ba4922 100644 --- a/mayan/apps/metadata/tests/test_wizard_steps.py +++ b/mayan/apps/metadata/tests/test_wizard_steps.py @@ -36,7 +36,7 @@ class DocumentUploadMetadataTestCase(MetadataTypeTestMixin, GenericDocumentViewT ) def test_upload_interactive_with_unicode_metadata(self): - url = furl(reverse('sources:upload_interactive')) + url = furl(reverse(viewname='sources:upload_interactive')) url.args['metadata0_id'] = self.metadata_type.pk url.args['metadata0_value'] = TEST_METADATA_VALUE_UNICODE @@ -60,7 +60,7 @@ class DocumentUploadMetadataTestCase(MetadataTypeTestMixin, GenericDocumentViewT ) def test_upload_interactive_with_ampersand_metadata(self): - url = furl(reverse('sources:upload_interactive')) + url = furl(reverse(viewname='sources:upload_interactive')) url.args['metadata0_id'] = self.metadata_type.pk url.args['metadata0_value'] = TEST_METADATA_VALUE_WITH_AMPERSAND diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index bf5a94dfa2..d070ed5576 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -17,8 +17,34 @@ from .views import ( urlpatterns = [ url( - regex=r'^documents/(?P\d+)/edit/$', name='document_metadata_edit', - view=DocumentMetadataEditView.as_view() + regex=r'^metadata_types/$', name='metadata_type_list', + view=MetadataTypeListView.as_view() + ), + url( + regex=r'^metadata_types/create/$', name='metadata_type_create', + view=MetadataTypeCreateView.as_view() + ), + url( + regex=r'^metadata_types/(?P\d+)/delete/$', + name='metadata_type_delete', view=MetadataTypeDeleteView.as_view() + ), + url( + regex=r'^metadata_types/(?P\d+)/edit/$', + name='metadata_type_edit', view=MetadataTypeEditView.as_view() + ), + url( + regex=r'^metadata_types/(?P\d+)/document_types/$', + name='metadata_type_document_types', + view=SetupMetadataTypesDocumentTypes.as_view() + ), + url( + regex=r'^document_types/(?P\d+)/metadata_types/$', + name='document_type_metadata_types', + view=SetupDocumentTypeMetadataTypes.as_view() + ), + url( + regex=r'^documents/(?P\d+)/edit/$', + name='document_metadata_edit', view=DocumentMetadataEditView.as_view() ), url( regex=r'^documents/multiple/edit/$', @@ -26,12 +52,13 @@ urlpatterns = [ view=DocumentMetadataEditView.as_view() ), url( - regex=r'^documents/(?P\d+)/view/$', name='document_metadata_view', + regex=r'^documents/(?P\d+)/view/$', + name='document_metadata_view', view=DocumentMetadataListView.as_view() ), url( - regex=r'^documents/(?P\d+)/add/$', name='document_metadata_add', - view=DocumentMetadataAddView.as_view() + regex=r'^documents/(?P\d+)/add/$', + name='document_metadata_add', view=DocumentMetadataAddView.as_view() ), url( regex=r'^documents/multiple/add/$', @@ -39,7 +66,7 @@ urlpatterns = [ view=DocumentMetadataAddView.as_view() ), url( - regex=r'^documents/(?P\d+)/remove/$', + regex=r'^documents/(?P\d+)/remove/$', name='document_metadata_remove', view=DocumentMetadataRemoveView.as_view() ), @@ -47,34 +74,7 @@ urlpatterns = [ regex=r'^documents/multiple/remove/$', name='document_multiple_metadata_remove', view=DocumentMetadataRemoveView.as_view() - ), - - url( - regex=r'^types/list/$', name='metadata_type_list', - view=MetadataTypeListView.as_view() - ), - url( - regex=r'^types/create/$', name='metadata_type_create', - view=MetadataTypeCreateView.as_view() - ), - url( - regex=r'^types/(?P\d+)/edit/$', name='metadata_type_edit', - view=MetadataTypeEditView.as_view() - ), - url( - regex=r'^types/(?P\d+)/delete/$', name='metadata_type_delete', - view=MetadataTypeDeleteView.as_view() - ), - url( - regex=r'^document_types/(?P\d+)/metadata_types/$', - name='document_type_metadata_types', - view=SetupDocumentTypeMetadataTypes.as_view() - ), - url( - regex=r'^metadata_types/(?P\d+)/document_types/$', - name='metadata_type_document_types', - view=SetupMetadataTypesDocumentTypes.as_view() - ), + ) ] api_urls = [ @@ -83,28 +83,28 @@ api_urls = [ view=APIMetadataTypeListView.as_view() ), url( - regex=r'^metadata_types/(?P\d+)/$', + regex=r'^metadata_types/(?P\d+)/$', name='metadatatype-detail', view=APIMetadataTypeView.as_view() ), url( - regex=r'^document_types/(?P\d+)/metadata_types/$', + regex=r'^document_types/(?P\d+)/metadata_types/$', name='documenttypemetadatatype-list', view=APIDocumentTypeMetadataTypeListView.as_view() ), url( - regex=r'^document_types/(?P\d+)/metadata_types/(?P\d+)/$', + regex=r'^document_types/(?P\d+)/metadata_types/(?P\d+)/$', name='documenttypemetadatatype-detail', view=APIDocumentTypeMetadataTypeView.as_view() ), url( - regex=r'^documents/(?P\d+)/metadata/$', + regex=r'^documents/(?P\d+)/metadata/$', name='documentmetadata-list', view=APIDocumentMetadataListView.as_view() ), url( - regex=r'^documents/(?P\d+)/metadata/(?P\d+)/$', + regex=r'^documents/(?P\d+)/metadata/(?P\d+)/$', name='documentmetadata-detail', view=APIDocumentMetadataView.as_view() - ), + ) ] diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 3c988b9f4d..8bf89b90a6 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -45,6 +45,7 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): form_class = DocumentMetadataAddForm model = Document object_permission = permission_document_metadata_add + pk_url_kwarg = 'document_id' success_message = _('Metadata add request performed on %(count)d document') success_message_plural = _( 'Metadata add request performed on %(count)d documents' @@ -62,9 +63,11 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): if len(set([document.document_type.pk for document in queryset])) > 1: messages.error( - request, _('Selected documents must be of the same type.') + message=_( + 'Selected documents must be of the same type.' + ), request=request ) - return HttpResponseRedirect(self.previous_url) + return HttpResponseRedirect(redirect_to=self.previous_url) return result @@ -75,14 +78,14 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): if self.action_count == 1: return HttpResponseRedirect( - reverse( + redirect_to=reverse( viewname='metadata:document_metadata_edit', - args=(queryset.first().pk,) + kwargs={'document_id': queryset.first().pk} ) ) elif self.action_count > 1: return HttpResponseRedirect( - '%s?%s' % ( + redirect_to='%s?%s' % ( reverse( viewname='metadata:document_multiple_metadata_edit' ), urlencode( @@ -106,9 +109,9 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): result = { 'submit_label': _('Add'), 'title': ungettext( - 'Add metadata types to document', - 'Add metadata types to documents', - queryset.count() + singular='Add metadata types to document', + plural='Add metadata types to documents', + number=queryset.count() ) } @@ -169,8 +172,7 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): created = True except Exception as exception: messages.error( - self.request, - _( + message=_( 'Error adding metadata type ' '"%(metadata_type)s" to document: ' '%(document)s; %(exception)s' @@ -180,29 +182,30 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): 'exception': ', '.join( getattr(exception, 'messages', exception) ) - } + }, + request=self.request ) else: if created: messages.success( - self.request, - _( + message=_( 'Metadata type: %(metadata_type)s ' 'successfully added to document %(document)s.' ) % { 'metadata_type': metadata_type, 'document': instance - } + }, + request=self.request ) else: messages.warning( - self.request, _( + message=_( 'Metadata type: %(metadata_type)s already ' 'present in document %(document)s.' ) % { 'metadata_type': metadata_type, 'document': instance - } + }, request=self.request ) @@ -210,6 +213,7 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): form_class = DocumentMetadataFormSet model = Document object_permission = permission_document_metadata_edit + pk_url_kwarg = 'document_id' success_message = _( 'Metadata edit request performed on %(count)d document' ) @@ -229,9 +233,11 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): if len(set([document.document_type.pk for document in queryset])) > 1: messages.error( - request, _('Selected documents must be of the same type.') + message=_( + 'Selected documents must be of the same type.' + ), request=request ) - return HttpResponseRedirect(self.previous_url) + return HttpResponseRedirect(redirect_to=self.previous_url) return result @@ -242,14 +248,14 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): if self.action_count == 1: return HttpResponseRedirect( - reverse( + redirect_to=reverse( viewname='metadata:document_metadata_edit', - args=(queryset.first().pk,) + kwargs={'document_id': queryset.first().pk} ) ) elif self.action_count > 1: return HttpResponseRedirect( - '%s?%s' % ( + redirect_to='%s?%s' % ( reverse( viewname='metadata:document_multiple_metadata_edit' ), urlencode( @@ -303,9 +309,9 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): 'no_results_title': _('There is no metadata to edit'), 'submit_label': _('Edit'), 'title': ungettext( - 'Edit document metadata', - 'Edit documents metadata', - queryset.count() + singular='Edit document metadata', + plural='Edit documents metadata', + number=queryset.count() ) } @@ -371,36 +377,31 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): exception_message = force_text(error) messages.error( - self.request, _( + message=_( 'Error editing metadata for document: ' '%(document)s; %(exception)s.' ) % { 'document': instance, 'exception': exception_message - } + }, request=self.request ) else: messages.success( - self.request, - _( + message=_( 'Metadata for document %s edited successfully.' - ) % instance + ) % instance, request=self.request ) class DocumentMetadataListView(SingleObjectListView): - def dispatch(self, request, *args, **kwargs): - AccessControlList.objects.check_access( - permissions=permission_document_metadata_view, - user=self.request.user, obj=self.get_document() - ) - - return super(DocumentMetadataListView, self).dispatch( - request, *args, **kwargs - ) - def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + queryset = AccessControlList.objects.restrict_queryset( + permission=permission_document_metadata_view, + queryset=Document.objects.all(), + user=self.request.user + ) + + return get_object_or_404(klass=queryset, pk=self.kwargs['document_id']) def get_extra_context(self): document = self.get_document() @@ -431,6 +432,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): form_class = DocumentMetadataRemoveFormSet model = Document object_permission = permission_document_metadata_remove + pk_url_kwarg = 'document_id' success_message = _( 'Metadata remove request performed on %(count)d document' ) @@ -450,9 +452,11 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): if len(set([document.document_type.pk for document in queryset])) > 1: messages.error( - request, _('Selected documents must be of the same type.') + message=_( + 'Selected documents must be of the same type.' + ), request=request ) - return HttpResponseRedirect(self.previous_url) + return HttpResponseRedirect(redirect_to=self.previous_url) return result @@ -463,14 +467,14 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): if self.action_count == 1: return HttpResponseRedirect( - reverse( + redirect_to=reverse( viewname='metadata:document_metadata_edit', - args=(queryset.first().pk,) + kwargs={'document_id': queryset.first().pk} ) ) elif self.action_count > 1: return HttpResponseRedirect( - '%s?%s' % ( + redirect_to='%s?%s' % ( reverse( viewname='metadata:document_multiple_metadata_edit' ), urlencode( @@ -495,9 +499,9 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): 'form_display_mode_table': True, 'submit_label': _('Remove'), 'title': ungettext( - 'Remove metadata types from the document', - 'Remove metadata types from the documents', - queryset.count() + singular='Remove metadata types from the document', + plural='Remove metadata types from the documents', + number=queryset.count() ) } @@ -553,24 +557,22 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView): ) document_metadata.delete(_user=self.request.user) messages.success( - self.request, - _( + message=_( 'Successfully remove metadata type "%(metadata_type)s" from document: %(document)s.' ) % { 'metadata_type': metadata_type, 'document': instance - } + }, request=self.request ) except Exception as exception: messages.error( - self.request, - _( + message=_( 'Error removing metadata type "%(metadata_type)s" from document: %(document)s; %(exception)s' ) % { 'metadata_type': metadata_type, 'document': instance, 'exception': ', '.join(exception.messages) - } + }, request=self.request ) @@ -593,6 +595,7 @@ class MetadataTypeCreateView(SingleObjectCreateView): class MetadataTypeDeleteView(SingleObjectDeleteView): model = MetadataType object_permission = permission_metadata_type_delete + pk_url_kwarg = 'metadata_type_id' post_action_redirect = reverse_lazy( viewname='metadata:metadata_type_list' ) @@ -609,6 +612,7 @@ class MetadataTypeEditView(SingleObjectEditView): form_class = MetadataTypeForm model = MetadataType object_permission = permission_metadata_type_edit + pk_url_kwarg = 'metadata_type_id' post_action_redirect = reverse_lazy( viewname='metadata:metadata_type_list' ) @@ -663,12 +667,14 @@ class SetupDocumentTypeMetadataTypes(FormView): instance.save() except Exception as exception: messages.error( - self.request, - _('Error updating relationship; %s') % exception + message=_('Error updating relationship; %s') % exception, + request=self.request ) else: messages.success( - self.request, _('Relationships updated successfully') + message=_( + 'Relationships updated successfully' + ), request=self.request ) return super( @@ -703,24 +709,27 @@ class SetupDocumentTypeMetadataTypes(FormView): initial = [] for element in self.get_queryset(): - initial.append({ - 'document_type': obj, - 'main_model': self.main_model, - 'metadata_type': element, - }) + initial.append( + { + 'document_type': obj, + 'main_model': self.main_model, + 'metadata_type': element, + } + ) return initial def get_object(self): - obj = get_object_or_404(klass=self.model, pk=self.kwargs['pk']) - - AccessControlList.objects.check_access( - permissions=(permission_metadata_type_edit,), - user=self.request.user, obj=obj + queryset = AccessControlList.objects.restrict_queryset( + permission=permission_metadata_type_edit, + queryset=self.model.objects.all(), + user=self.request.user + ) + return get_object_or_404( + klass=queryset, pk=self.kwargs['document_type_id'] ) - return obj def get_post_action_redirect(self): - return reverse('documents:document_type_list') + return reverse(viewname='documents:document_type_list') def get_queryset(self): queryset = self.submodel.objects.all() @@ -749,12 +758,24 @@ class SetupMetadataTypesDocumentTypes(SetupDocumentTypeMetadataTypes): initial = [] for element in self.get_queryset(): - initial.append({ - 'document_type': element, - 'main_model': self.main_model, - 'metadata_type': obj, - }) + initial.append( + { + 'document_type': element, + 'main_model': self.main_model, + 'metadata_type': obj, + } + ) return initial + def get_object(self): + queryset = AccessControlList.objects.restrict_queryset( + permission=permission_metadata_type_edit, + queryset=self.model.objects.all(), + user=self.request.user + ) + return get_object_or_404( + klass=queryset, pk=self.kwargs['metadata_type_id'] + ) + def get_post_action_redirect(self): return reverse(viewname='metadata:metadata_type_list')