diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index f646985e45..215d803056 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -46,6 +46,7 @@ class APIDeletedDocumentListView(generics.ListAPIView): Returns a list of all the trashed documents. """ filter_backends = (MayanObjectPermissionsFilter,) + lookup_url_kwarg = 'document_pk' mayan_object_permissions = {'GET': (permission_document_view,)} permission_classes = (MayanPermission,) queryset = Document.trash.all() @@ -58,6 +59,7 @@ class APIDeletedDocumentView(generics.RetrieveDestroyAPIView): delete: Delete the trashed document. get: Retreive the details of the trashed document. """ + lookup_url_kwarg = 'document_pk' mayan_object_permissions = { 'DELETE': (permission_document_delete,), 'GET': (permission_document_view,) @@ -71,6 +73,7 @@ class APIDeletedDocumentRestoreView(generics.GenericAPIView): """ post: Restore a trashed document. """ + lookup_url_kwarg = 'document_pk' mayan_object_permissions = { 'POST': (permission_document_restore,) } @@ -92,6 +95,7 @@ class APIDocumentDownloadView(DownloadMixin, generics.RetrieveAPIView): """ get: Download the latest version of a document. """ + lookup_url_kwarg = 'document_pk' mayan_object_permissions = { 'GET': (permission_document_download,) } @@ -152,7 +156,7 @@ class APIDocumentPageImageView(generics.RetrieveAPIView): """ get: Returns an image representation of the selected document. """ - lookup_url_kwarg = 'page_pk' + lookup_url_kwarg = 'document_page_pk' def get_document(self): if self.request.method == 'GET': @@ -160,7 +164,9 @@ class APIDocumentPageImageView(generics.RetrieveAPIView): else: permission_required = permission_document_edit - document = get_object_or_404(klass=Document.passthrough, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document.passthrough, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permission_required, self.request.user, document @@ -169,7 +175,7 @@ class APIDocumentPageImageView(generics.RetrieveAPIView): def get_document_version(self): return get_object_or_404( - klass=self.get_document().versions.all(), pk=self.kwargs['version_pk'] + klass=self.get_document().versions.all(), pk=self.kwargs['document_version_pk'] ) def get_queryset(self): @@ -247,7 +253,7 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView): patch: Edit the selected document page. put: Edit the selected document page. """ - lookup_url_kwarg = 'page_pk' + lookup_url_kwarg = 'document_page_pk' serializer_class = DocumentPageSerializer def get_document(self): @@ -256,7 +262,9 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView): else: permission_required = permission_document_edit - document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permission_required, self.request.user, document @@ -265,7 +273,8 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView): def get_document_version(self): return get_object_or_404( - klass=self.get_document().versions.all(), pk=self.kwargs['version_pk'] + klass=self.get_document().versions.all(), + pk=self.kwargs['document_version_pk'] ) def get_queryset(self): @@ -278,6 +287,7 @@ class APIDocumentTypeListView(generics.ListCreateAPIView): post: Create a new document type. """ filter_backends = (MayanObjectPermissionsFilter,) + lookup_url_kwarg = 'document_type_pk' mayan_object_permissions = {'GET': (permission_document_type_view,)} mayan_view_permissions = {'POST': (permission_document_type_create,)} permission_classes = (MayanPermission,) @@ -304,6 +314,7 @@ class APIDocumentTypeView(generics.RetrieveUpdateDestroyAPIView): patch: Edit the properties of the selected document type. put: Edit the properties of the selected document type. """ + lookup_url_kwarg = 'document_type_pk' mayan_object_permissions = { 'GET': (permission_document_type_view,), 'PUT': (permission_document_type_edit,), @@ -331,11 +342,14 @@ class APIDocumentTypeDocumentListView(generics.ListAPIView): Returns a list of all the documents of a particular document type. """ filter_backends = (MayanObjectPermissionsFilter,) + lookup_url_kwarg = 'document_type_pk' mayan_object_permissions = {'GET': (permission_document_view,)} serializer_class = DocumentSerializer def get_queryset(self): - document_type = get_object_or_404(klass=DocumentType, pk=self.kwargs['pk']) + document_type = get_object_or_404( + klass=DocumentType, pk=self.kwargs['document_type_pk'] + ) AccessControlList.objects.check_access( permissions=permission_document_type_view, user=self.request.user, obj=document_type @@ -348,10 +362,12 @@ class APIDocumentVersionDownloadView(DownloadMixin, generics.RetrieveAPIView): """ get: Download a document version. """ - lookup_url_kwarg = 'version_pk' + lookup_url_kwarg = 'document_version_pk' def get_document(self): - document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permissions=(permission_document_download,), user=self.request.user, @@ -402,6 +418,7 @@ class APIDocumentView(generics.RetrieveUpdateDestroyAPIView): patch: Edit the properties of the selected document. put: Edit the properties of the selected document. """ + lookup_url_kwarg = 'document_pk' mayan_object_permissions = { 'GET': (permission_document_view,), 'PUT': (permission_document_properties_edit,), @@ -445,7 +462,9 @@ class APIDocumentVersionPageListView(generics.ListAPIView): serializer_class = DocumentPageSerializer def get_document(self): - document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permission_document_view, self.request.user, document @@ -454,7 +473,8 @@ class APIDocumentVersionPageListView(generics.ListAPIView): def get_document_version(self): return get_object_or_404( - klass=self.get_document().versions.all(), pk=self.kwargs['version_pk'] + klass=self.get_document().versions.all(), + pk=self.kwargs['document_version_pk'] ) def get_queryset(self): @@ -493,10 +513,14 @@ class APIDocumentVersionsListView(generics.ListCreateAPIView): return NewDocumentVersionSerializer def get_queryset(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']).versions.all() + return get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ).versions.all() def perform_create(self, serializer): - document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permissions=(permission_document_new_version,), @@ -512,7 +536,7 @@ class APIDocumentVersionView(generics.RetrieveUpdateDestroyAPIView): patch: Edit the selected document version. put: Edit the selected document version. """ - lookup_url_kwarg = 'version_pk' + lookup_url_kwarg = 'document_version_pk' def get_document(self): if self.request.method == 'GET': @@ -522,7 +546,9 @@ class APIDocumentVersionView(generics.RetrieveUpdateDestroyAPIView): else: permission_required = permission_document_edit - document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( permission_required, self.request.user, document diff --git a/mayan/apps/documents/dashboard_widgets.py b/mayan/apps/documents/dashboard_widgets.py index e5a8b70e3b..e862c98b1c 100644 --- a/mayan/apps/documents/dashboard_widgets.py +++ b/mayan/apps/documents/dashboard_widgets.py @@ -21,8 +21,8 @@ class DashboardWidgetDocumentPagesTotal(DashboardWidgetNumeric): icon_class = icon_dashboard_pages_per_month label = _('Total pages') link = reverse_lazy( - 'statistics:statistic_detail', - args=('total-document-pages-at-each-month',) + viewname='statistics:statistic_detail', + kwargs={'slug': 'total-document-pages-at-each-month'} ) def render(self, request): @@ -100,8 +100,8 @@ class DashboardWidgetDocumentsNewThisMonth(DashboardWidgetNumeric): icon_class = icon_dashboard_new_documents_this_month label = _('New documents this month') link = reverse_lazy( - 'statistics:statistic_detail', - args=('new-documents-per-month',) + viewname='statistics:statistic_detail', + kwargs={'slug': 'new-documents-per-month'} ) def render(self, request): @@ -113,8 +113,8 @@ class DashboardWidgetDocumentsPagesNewThisMonth(DashboardWidgetNumeric): icon_class = icon_dashboard_pages_per_month label = _('New pages this month') link = reverse_lazy( - 'statistics:statistic_detail', - args=('new-document-pages-per-month',) + viewname='statistics:statistic_detail', + kwargs={'slug': 'new-document-pages-per-month'} ) def render(self, request): diff --git a/mayan/apps/documents/models/document_models.py b/mayan/apps/documents/models/document_models.py index 142a9e9159..83d7e5167d 100644 --- a/mayan/apps/documents/models/document_models.py +++ b/mayan/apps/documents/models/document_models.py @@ -135,7 +135,10 @@ class Document(models.Model): return False def get_absolute_url(self): - return reverse('documents:document_preview', args=(self.pk,)) + return reverse( + viewname='documents:document_preview', + kwargs={'document_pk': self.pk} + ) def get_api_image_url(self, *args, **kwargs): latest_version = self.latest_version diff --git a/mayan/apps/documents/models/document_page_models.py b/mayan/apps/documents/models/document_page_models.py index 24dc445afa..6e59882360 100644 --- a/mayan/apps/documents/models/document_page_models.py +++ b/mayan/apps/documents/models/document_page_models.py @@ -101,7 +101,10 @@ class DocumentPage(models.Model): return combined_cache_filename def get_absolute_url(self): - return reverse('documents:document_page_view', args=(self.pk,)) + return reverse( + viewname='documents:document_page_view', + kwargs={'document_page_pk': self.pk} + ) def get_api_image_url(self, *args, **kwargs): """ @@ -123,9 +126,11 @@ class DocumentPage(models.Model): final_url = furl() final_url.args = kwargs final_url.path = reverse( - 'rest_api:documentpage-image', args=( - self.document.pk, self.document_version.pk, self.pk - ) + viewname='rest_api:documentpage-image', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document_version.pk, + 'document_page_pk': self.pk + } ) final_url.args['_hash'] = transformations_hash count = 1 diff --git a/mayan/apps/documents/models/document_type_models.py b/mayan/apps/documents/models/document_type_models.py index 0617c6abcc..b57c123920 100644 --- a/mayan/apps/documents/models/document_type_models.py +++ b/mayan/apps/documents/models/document_type_models.py @@ -82,7 +82,8 @@ class DocumentType(models.Model): def get_absolute_url(self): return reverse( - 'documents:document_type_document_list', args=(self.pk,) + viewname='documents:document_type_document_list', + kwargs={'document_type_pk': self.pk} ) def get_document_count(self, user): diff --git a/mayan/apps/documents/models/document_version_models.py b/mayan/apps/documents/models/document_version_models.py index 81dd48d740..102ec6d7f8 100644 --- a/mayan/apps/documents/models/document_version_models.py +++ b/mayan/apps/documents/models/document_version_models.py @@ -149,7 +149,10 @@ class DocumentVersion(models.Model): ) def get_absolute_url(self): - return reverse('documents:document_version_view', args=(self.pk,)) + return reverse( + viewname='documents:document_version_view', + kwargs={'document_version_pk': self.pk} + ) def get_api_image_url(self, *args, **kwargs): first_page = self.pages.first() diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index 283aa4b5f4..3811779877 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -26,25 +26,28 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer): def get_document_version_url(self, instance): return reverse( - 'rest_api:documentversion-detail', args=( - instance.document.pk, instance.document_version.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.document_version.pk + }, request=self.context['request'], format=self.context['format'] ) def get_image_url(self, instance): return reverse( - 'rest_api:documentpage-image', args=( - instance.document.pk, instance.document_version.pk, - instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentpage-image', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.document_version.pk, + 'document_page_pk': instance.pk, + }, request=self.context['request'], format=self.context['format'] ) def get_url(self, instance): return reverse( - 'rest_api:documentpage-detail', args=( - instance.document.pk, instance.document_version.pk, - instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentpage-detail', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.document_version.pk, + 'document_page_pk': instance.pk, + }, request=self.context['request'], format=self.context['format'] ) @@ -56,14 +59,18 @@ class DocumentTypeFilenameSerializer(serializers.ModelSerializer): class DocumentTypeSerializer(serializers.HyperlinkedModelSerializer): documents_url = serializers.HyperlinkedIdentityField( - view_name='rest_api:documenttype-document-list', + lookup_field='pk', lookup_url_kwarg='document_type_pk', + view_name='rest_api:documenttype-document-list' ) documents_count = serializers.SerializerMethodField() filenames = DocumentTypeFilenameSerializer(many=True, read_only=True) class Meta: extra_kwargs = { - 'url': {'view_name': 'rest_api:documenttype-detail'}, + 'url': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_type_pk', + 'view_name': 'rest_api:documenttype-detail' + } } fields = ( 'delete_time_period', 'delete_time_unit', 'documents_url', @@ -78,13 +85,17 @@ class DocumentTypeSerializer(serializers.HyperlinkedModelSerializer): class WritableDocumentTypeSerializer(serializers.ModelSerializer): documents_url = serializers.HyperlinkedIdentityField( - view_name='rest_api:documenttype-document-list', + lookup_field='pk', lookup_url_kwarg='document_type_pk', + view_name='rest_api:documenttype-document-list' ) documents_count = serializers.SerializerMethodField() class Meta: extra_kwargs = { - 'url': {'view_name': 'rest_api:documenttype-detail'}, + 'url': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_type_pk', + 'view_name': 'rest_api:documenttype-detail' + } } fields = ( 'delete_time_period', 'delete_time_unit', 'documents_url', @@ -106,7 +117,10 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer): class Meta: extra_kwargs = { - 'document': {'view_name': 'rest_api:document-detail'}, + 'document': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_pk', + 'view_name': 'rest_api:document-detail' + }, 'file': {'use_url': False}, } fields = ( @@ -121,30 +135,33 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer): def get_document_url(self, instance): return reverse( - 'rest_api:document-detail', args=( - instance.document.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:document-detail', kwargs={ + 'document_pk': instance.document.pk + }, request=self.context['request'], format=self.context['format'] ) def get_download_url(self, instance): return reverse( - 'rest_api:documentversion-download', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-download', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def get_pages_url(self, instance): return reverse( - 'rest_api:documentversion-page-list', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-page-list', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def get_url(self, instance): return reverse( - 'rest_api:documentversion-detail', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) @@ -167,30 +184,33 @@ class WritableDocumentVersionSerializer(serializers.ModelSerializer): def get_document_url(self, instance): return reverse( - 'rest_api:document-detail', args=( - instance.document.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:document-detail', kwargs={ + 'document_pk': instance.document.pk + }, request=self.context['request'], format=self.context['format'] ) def get_download_url(self, instance): return reverse( - 'rest_api:documentversion-download', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-download', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def get_pages_url(self, instance): return reverse( - 'rest_api:documentversion-page-list', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-page-list', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) def get_url(self, instance): return reverse( - 'rest_api:documentversion-detail', args=( - instance.document.pk, instance.pk, - ), request=self.context['request'], format=self.context['format'] + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': instance.document.pk, + 'document_version_pk': instance.pk + }, request=self.context['request'], format=self.context['format'] ) @@ -213,13 +233,20 @@ class NewDocumentVersionSerializer(serializers.Serializer): class DeletedDocumentSerializer(serializers.HyperlinkedModelSerializer): document_type_label = serializers.SerializerMethodField() restore = serializers.HyperlinkedIdentityField( + lookup_field='pk', lookup_url_kwarg='document_pk', view_name='rest_api:trasheddocument-restore' ) class Meta: extra_kwargs = { - 'document_type': {'view_name': 'rest_api:documenttype-detail'}, - 'url': {'view_name': 'rest_api:trasheddocument-detail'} + 'document_type': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_type_pk', + 'view_name': 'rest_api:documenttype-detail' + }, + 'url': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_pk', + 'view_name': 'rest_api:trasheddocument-detail' + } } fields = ( 'date_added', 'deleted_date_time', 'description', 'document_type', @@ -240,13 +267,20 @@ class DocumentSerializer(serializers.HyperlinkedModelSerializer): document_type = DocumentTypeSerializer() latest_version = DocumentVersionSerializer(many=False, read_only=True) versions_url = serializers.HyperlinkedIdentityField( - view_name='rest_api:document-version-list', + lookup_field='pk', lookup_url_kwarg='document_pk', + view_name='rest_api:document-version-list' ) class Meta: extra_kwargs = { - 'document_type': {'view_name': 'rest_api:documenttype-detail'}, - 'url': {'view_name': 'rest_api:document-detail'} + 'document_type': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_type_pk', + 'view_name': 'rest_api:documenttype-detail' + }, + 'url': { + 'lookup_field': 'pk', 'lookup_url_kwarg': 'document_pk', + 'view_name': 'rest_api:document-detail' + } } fields = ( 'date_added', 'description', 'document_type', 'id', 'label', @@ -260,9 +294,11 @@ class WritableDocumentSerializer(serializers.ModelSerializer): document_type = DocumentTypeSerializer(read_only=True) latest_version = DocumentVersionSerializer(many=False, read_only=True) versions = serializers.HyperlinkedIdentityField( - view_name='rest_api:document-version-list', + lookup_field='pk', lookup_url_kwarg='document_pk', + view_name='rest_api:document-version-list' ) url = serializers.HyperlinkedIdentityField( + lookup_field='pk', lookup_url_kwarg='document_pk', view_name='rest_api:document-detail', ) diff --git a/mayan/apps/documents/tests/test_api.py b/mayan/apps/documents/tests/test_api.py index d97a5487a5..6fe4fa78e0 100644 --- a/mayan/apps/documents/tests/test_api.py +++ b/mayan/apps/documents/tests/test_api.py @@ -60,9 +60,9 @@ class DocumentTypeAPITestCase(BaseAPITestCase): def _request_document_type_patch(self): return self.patch( - viewname='rest_api:documenttype-detail', args=( - self.document_type.pk, - ), data={'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} + viewname='rest_api:documenttype-detail', kwargs={ + 'document_type_pk': self.document_type.pk + }, data={'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} ) def test_document_type_edit_via_patch_no_permission(self): @@ -89,9 +89,9 @@ class DocumentTypeAPITestCase(BaseAPITestCase): def _request_document_type_put(self): return self.put( - viewname='rest_api:documenttype-detail', args=( - self.document_type.pk, - ), data={'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} + viewname='rest_api:documenttype-detail', kwargs={ + 'document_type_pk': self.document_type.pk + }, data={'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} ) def test_document_type_edit_via_put_no_permission(self): @@ -118,9 +118,9 @@ class DocumentTypeAPITestCase(BaseAPITestCase): def _request_document_type_delete(self): return self.delete( - viewname='rest_api:documenttype-detail', args=( - self.document_type.pk, - ) + viewname='rest_api:documenttype-detail', kwargs={ + 'document_type_pk': self.document_type.pk + } ) def test_document_type_delete_no_permission(self): @@ -206,9 +206,9 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): with open(TEST_DOCUMENT_PATH, mode='rb') as file_descriptor: return self.post( - viewname='rest_api:document-version-list', args=( - self.document.pk, - ), data={ + viewname='rest_api:document-version-list', kwargs={ + 'document_pk': self.document.pk + }, data={ 'comment': '', 'file': file_descriptor, } ) @@ -246,9 +246,10 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_version_revert(self): return self.delete( - viewname='rest_api:documentversion-detail', args=( - self.document.pk, self.document.latest_version.pk - ) + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document.latest_version.pk + } ) def test_document_version_revert_no_permission(self): @@ -273,7 +274,8 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_version_list(self): return self.get( - viewname='rest_api:document-version-list', args=(self.document.pk,) + viewname='rest_api:document-version-list', + kwargs={'document_pk': self.document.pk} ) def test_document_version_list_no_permission(self): @@ -298,7 +300,8 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_download(self): return self.get( - viewname='rest_api:document-download', args=(self.document.pk,) + viewname='rest_api:document-download', + kwargs={'document_pk': self.document.pk} ) def test_document_download_no_permission(self): @@ -325,9 +328,10 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_version_download(self): return self.get( - viewname='rest_api:documentversion-download', args=( - self.document.pk, self.document.latest_version.pk, - ) + viewname='rest_api:documentversion-download', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document.latest_version.pk, + } ) def test_document_version_download_no_permission(self): @@ -357,9 +361,10 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): self.document = self.upload_document() response = self.get( - viewname='rest_api:documentversion-download', args=( - self.document.pk, self.document.latest_version.pk, - ), data={'preserve_extension': True} + viewname='rest_api:documentversion-download', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document.latest_version.pk, + }, data={'preserve_extension': True} ) with self.document.latest_version.open() as file_object: @@ -374,9 +379,10 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_version_edit_via_patch(self): return self.patch( - viewname='rest_api:documentversion-detail', args=( - self.document.pk, self.document.latest_version.pk, - ), data={'comment': TEST_DOCUMENT_VERSION_COMMENT_EDITED} + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document.latest_version.pk, + }, data={'comment': TEST_DOCUMENT_VERSION_COMMENT_EDITED} ) def test_document_version_edit_via_patch_no_permission(self): @@ -400,9 +406,10 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_version_edit_via_put(self): return self.put( - viewname='rest_api:documentversion-detail', args=( - self.document.pk, self.document.latest_version.pk, - ), data={'comment': TEST_DOCUMENT_VERSION_COMMENT_EDITED} + viewname='rest_api:documentversion-detail', kwargs={ + 'document_pk': self.document.pk, + 'document_version_pk': self.document.latest_version.pk, + }, data={'comment': TEST_DOCUMENT_VERSION_COMMENT_EDITED} ) def test_document_version_edit_via_put_no_permission(self): @@ -426,7 +433,8 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_description_edit_via_patch(self): return self.patch( - viewname='rest_api:document-detail', args=(self.document.pk,), + viewname='rest_api:document-detail', + kwargs={'document_pk': self.document.pk}, data={'description': TEST_DOCUMENT_DESCRIPTION_EDITED} ) @@ -450,7 +458,8 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_description_edit_via_put(self): return self.put( - viewname='rest_api:document-detail', args=(self.document.pk,), + viewname='rest_api:document-detail', + kwargs={'document_pk': self.document.pk}, data={'description': TEST_DOCUMENT_DESCRIPTION_EDITED} ) @@ -481,9 +490,10 @@ class DocumentPageAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_page_image(self): page = self.document.pages.first() return self.get( - viewname='rest_api:documentpage-image', args=( - page.document.pk, page.document_version.pk, page.pk - ), + viewname='rest_api:documentpage-image', kwargs={ + 'document_pk': page.document.pk, + 'document_version_pk': page.document_version.pk, 'document_page_pk': page.pk + } ) def test_document_page_image_view_no_access(self): @@ -507,7 +517,8 @@ class TrashedDocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_document_move_to_trash(self): return self.delete( - viewname='rest_api:document-detail', args=(self.document.pk,) + viewname='rest_api:document-detail', + kwargs={'document_pk': self.document.pk} ) def test_document_move_to_trash_no_permission(self): @@ -528,7 +539,8 @@ class TrashedDocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_trashed_document_delete_view(self): return self.delete( - viewname='rest_api:trasheddocument-detail', args=(self.document.pk,) + viewname='rest_api:trasheddocument-detail', + kwargs={'document_pk': self.document.pk} ) def test_trashed_document_delete_from_trash_no_access(self): @@ -550,7 +562,8 @@ class TrashedDocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_trashed_document_detail_view(self): return self.get( - viewname='rest_api:trasheddocument-detail', args=(self.document.pk,) + viewname='rest_api:trasheddocument-detail', + kwargs={'document_pk': self.document.pk} ) def test_trashed_document_detail_view_no_access(self): @@ -594,7 +607,8 @@ class TrashedDocumentAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_trashed_document_restore_view(self): return self.post( - viewname='rest_api:trasheddocument-restore', args=(self.document.pk,) + viewname='rest_api:trasheddocument-restore', + kwargs={'document_pk': self.document.pk} ) def test_trashed_document_restore_no_access(self): diff --git a/mayan/apps/documents/tests/test_deleted_document_views.py b/mayan/apps/documents/tests/test_deleted_document_views.py index f5f16a24d0..f54ff227e2 100644 --- a/mayan/apps/documents/tests/test_deleted_document_views.py +++ b/mayan/apps/documents/tests/test_deleted_document_views.py @@ -16,7 +16,8 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): def _request_document_restore_view(self): return self.post( - viewname='documents:document_restore', args=(self.document.pk,) + viewname='documents:document_restore', + kwargs={'document_pk': self.document.pk} ) def test_document_restore_view_no_permission(self): @@ -42,7 +43,8 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): def _request_document_trash_view(self): return self.post( - viewname='documents:document_trash', args=(self.document.pk,) + viewname='documents:document_trash', + kwargs={'document_pk': self.document.pk} ) def test_document_trash_no_permissions(self): @@ -63,7 +65,8 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): def _request_document_delete_view(self): return self.post( - viewname='documents:document_delete', args=(self.document.pk,), + viewname='documents:document_delete', + kwargs={'document_pk': self.document.pk} ) def test_document_delete_no_permissions(self): diff --git a/mayan/apps/documents/tests/test_document_page_views.py b/mayan/apps/documents/tests/test_document_page_views.py index 10ffaa3c5c..7b85e54dec 100644 --- a/mayan/apps/documents/tests/test_document_page_views.py +++ b/mayan/apps/documents/tests/test_document_page_views.py @@ -1,8 +1,11 @@ from __future__ import unicode_literals +from django.utils.encoding import force_text + from ..permissions import permission_document_view from .base import GenericDocumentViewTestCase +from .literals import TEST_MULTI_PAGE_TIFF class DocumentPageViewTestCase(GenericDocumentViewTestCase): @@ -12,7 +15,8 @@ class DocumentPageViewTestCase(GenericDocumentViewTestCase): def _document_page_list_view(self): return self.get( - viewname='documents:document_pages', args=(self.document.pk,) + viewname='documents:document_pages', + kwargs={'document_pk': self.document.pk} ) def test_document_page_list_view_no_permission(self): @@ -27,3 +31,87 @@ class DocumentPageViewTestCase(GenericDocumentViewTestCase): self.assertContains( response=response, text=self.document.label, status_code=200 ) + + +class DocumentPageNavigationViewTestCase(GenericDocumentViewTestCase): + test_document_filename = TEST_MULTI_PAGE_TIFF + + def setUp(self): + super(DocumentPageNavigationViewTestCase, self).setUp() + self.login_user() + + def _request_document_page_navigation_next_view(self): + return self.get( + viewname='documents:document_page_navigation_next', + kwargs={'document_page_pk': self.document.pages.first().pk}, + follow=True + ) + + def test_document_page_navigation_next_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) + + response = self._request_document_page_navigation_next_view() + + self.assertContains( + response=response, status_code=200, + text=force_text(self.document.pages.last()) + ) + + def _request_document_page_navigation_last_view(self): + return self.get( + viewname='documents:document_page_navigation_last', + kwargs={'document_page_pk': self.document.pages.first().pk}, + follow=True + ) + + def test_document_page_navigation_last_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) + + response = self._request_document_page_navigation_last_view() + + self.assertContains( + response=response, status_code=200, + text=force_text(self.document.pages.last()) + ) + + def _request_document_page_navigation_previous_view(self): + return self.get( + viewname='documents:document_page_navigation_previous', + kwargs={'document_page_pk': self.document.pages.last().pk}, + follow=True + ) + + def test_document_page_navigation_previous_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) + + response = self._request_document_page_navigation_previous_view() + + self.assertContains( + response=response, status_code=200, + text=force_text(self.document.pages.first()) + ) + + def _request_document_page_navigation_first_view(self): + return self.get( + viewname='documents:document_page_navigation_first', + kwargs={'document_page_pk': self.document.pages.last().pk}, + follow=True + ) + + def test_document_page_navigation_first_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) + + response = self._request_document_page_navigation_first_view() + + self.assertContains( + response=response, status_code=200, + text=force_text(self.document.pages.first()) + ) diff --git a/mayan/apps/documents/tests/test_document_type_views.py b/mayan/apps/documents/tests/test_document_type_views.py index 14bb0d2b5c..c2b891975b 100644 --- a/mayan/apps/documents/tests/test_document_type_views.py +++ b/mayan/apps/documents/tests/test_document_type_views.py @@ -50,7 +50,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): def _request_document_type_delete(self): return self.post( viewname='documents:document_type_delete', - args=(self.document_type.pk,) + kwargs={'document_type_pk': self.document_type.pk} ) def test_document_type_delete_view_no_permission(self): @@ -69,7 +69,7 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): def _request_document_type_edit(self): return self.post( viewname='documents:document_type_edit', - args=(self.document_type.pk,), + kwargs={'document_type_pk': self.document_type.pk}, data={ 'label': TEST_DOCUMENT_TYPE_LABEL_EDITED, 'delete_time_period': DEFAULT_DELETE_PERIOD, @@ -105,7 +105,7 @@ class DocumentTypeQuickLabelViewsTestCase(DocumentTypeQuickLabelTestMixin, Gener def _request_quick_label_create(self): return self.post( viewname='documents:document_type_filename_create', - args=(self.document_type.pk,), + kwargs={'document_type_pk': self.document_type.pk}, data={ 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, } @@ -132,7 +132,7 @@ class DocumentTypeQuickLabelViewsTestCase(DocumentTypeQuickLabelTestMixin, Gener def _request_quick_label_delete(self): return self.post( viewname='documents:document_type_filename_delete', - args=(self.document_type_filename.pk,), + kwargs={'filename_pk': self.document_type_filename.pk}, ) def test_document_type_quick_label_delete_no_access(self): @@ -158,7 +158,7 @@ class DocumentTypeQuickLabelViewsTestCase(DocumentTypeQuickLabelTestMixin, Gener def _request_quick_label_edit(self): return self.post( viewname='documents:document_type_filename_edit', - args=(self.document_type_filename.pk,), + kwargs={'filename_pk': self.document_type_filename.pk}, data={ 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, } @@ -193,7 +193,7 @@ class DocumentTypeQuickLabelViewsTestCase(DocumentTypeQuickLabelTestMixin, Gener def _request_quick_label_list_view(self): return self.get( viewname='documents:document_type_filename_list', - args=(self.document_type.pk,), + kwargs={'document_type_pk': self.document_type.pk}, ) def test_document_type_quick_label_list_no_access(self): diff --git a/mayan/apps/documents/tests/test_document_version_views.py b/mayan/apps/documents/tests/test_document_version_views.py index 9a5adf7005..ae65ec32ec 100644 --- a/mayan/apps/documents/tests/test_document_version_views.py +++ b/mayan/apps/documents/tests/test_document_version_views.py @@ -22,7 +22,7 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): def _request_document_version_list_view(self): return self.get( viewname='documents:document_version_list', - args=(self.document.pk,) + kwargs={'document_pk': self.document.pk} ) def test_document_version_list_no_permission(self): @@ -43,7 +43,7 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): def _request_document_version_revert_view(self, document_version): return self.post( viewname='documents:document_version_revert', - args=(document_version.pk,) + kwargs={'document_version_pk': document_version.pk} ) def test_document_version_revert_no_permission(self): diff --git a/mayan/apps/documents/tests/test_document_views.py b/mayan/apps/documents/tests/test_document_views.py index c5c217b594..c5e80a178c 100644 --- a/mayan/apps/documents/tests/test_document_views.py +++ b/mayan/apps/documents/tests/test_document_views.py @@ -33,7 +33,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_properties_view(self): return self.get( viewname='documents:document_properties', - args=(self.document.pk,) + kwargs={'document_pk': self.document.pk} ) def test_document_view_no_permissions(self): @@ -69,7 +69,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_type_edit(self, document_type): return self.post( viewname='documents:document_document_type_edit', - args=(self.document.pk,), + kwargs={'document_pk': self.document.pk}, data={'document_type': document_type.pk} ) @@ -177,7 +177,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_download_form_view(self): return self.get( viewname='documents:document_download_form', - args=(self.document.pk,), + kwargs={'document_pk': self.document.pk} ) def test_document_download_form_view_no_permission(self): @@ -199,7 +199,8 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_download_view(self): return self.get( - viewname='documents:document_download', args=(self.document.pk,) + viewname='documents:document_download', + kwargs={'document_pk': self.document.pk} ) def test_document_download_view_no_permission(self): @@ -259,9 +260,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_version_download(self, data=None): data = data or {} return self.get( - viewname='documents:document_version_download', args=( - self.document.latest_version.pk, - ), data=data + viewname='documents:document_version_download', kwargs={ + 'document_version_pk': self.document.latest_version.pk, + }, data=data ) def test_document_version_download_view_no_permission(self): @@ -319,7 +320,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_update_page_count_view(self): return self.post( viewname='documents:document_update_page_count', - args=(self.document.pk,) + kwargs={'document_pk': self.document.pk} ) def test_document_update_page_count_view_no_permission(self): @@ -371,7 +372,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_clear_transformations_view(self): return self.post( viewname='documents:document_clear_transformations', - args=(self.document.pk,) + kwargs={'document_pk': self.document.pk} ) def test_document_clear_transformations_view_no_permission(self): @@ -505,9 +506,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_page_view(self, document_page): return self.get( - viewname='documents:document_page_view', args=( - document_page.pk, - ) + viewname='documents:document_page_view', kwargs={ + 'document_page_pk': document_page.pk + } ) def test_document_page_view_no_permissions(self): @@ -530,9 +531,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_print_view(self): return self.get( - viewname='documents:document_print', args=( - self.document.pk, - ), data={ + viewname='documents:document_print', kwargs={ + 'document_pk': self.document.pk + }, data={ 'page_group': PAGE_RANGE_ALL } ) @@ -564,7 +565,8 @@ class DocumentsQuickLabelViewsTestCase(DocumentTypeQuickLabelTestMixin, GenericD data.update(extra_data or {}) return self.post( - viewname='documents:document_edit', args=(self.document.pk,), + viewname='documents:document_edit', + kwargs={'document_pk': self.document.pk}, data=data ) diff --git a/mayan/apps/documents/tests/test_duplicated_document_views.py b/mayan/apps/documents/tests/test_duplicated_document_views.py index 6a3627c4b8..7dea4e1123 100644 --- a/mayan/apps/documents/tests/test_duplicated_document_views.py +++ b/mayan/apps/documents/tests/test_duplicated_document_views.py @@ -23,7 +23,7 @@ class DuplicatedDocumentsViewsTestCase(GenericDocumentViewTestCase): def _request_document_duplicates_list_view(self): return self.get( viewname='documents:document_duplicates_list', - args=(self.document.pk,) + kwargs={'document_pk': self.document.pk} ) def test_duplicated_document_list_no_permissions(self): diff --git a/mayan/apps/documents/tests/test_events.py b/mayan/apps/documents/tests/test_events.py index 4688358183..bd3b8859b4 100644 --- a/mayan/apps/documents/tests/test_events.py +++ b/mayan/apps/documents/tests/test_events.py @@ -29,7 +29,8 @@ class DocumentEventsTestCase(GenericDocumentViewTestCase): Action.objects.all().delete() response = self.get( - 'documents:document_download', args=(self.document.pk,) + viewname='documents:document_download', + kwargs={'document_pk': self.document.pk} ) self.assertEqual(response.status_code, 403) @@ -49,7 +50,8 @@ class DocumentEventsTestCase(GenericDocumentViewTestCase): self.expected_content_type = 'image/png; charset=utf-8' response = self.get( - viewname='documents:document_download', args=(self.document.pk,), + viewname='documents:document_download', + kwargs={'document_pk': self.document.pk} ) # Download the file to close the file descriptor @@ -73,7 +75,8 @@ class DocumentEventsTestCase(GenericDocumentViewTestCase): Action.objects.all().delete() response = self.get( - viewname='documents:document_preview', args=(self.document.pk,) + viewname='documents:document_preview', + kwargs={'document_pk': self.document.pk} ) self.assertEqual(response.status_code, 403) @@ -90,7 +93,8 @@ class DocumentEventsTestCase(GenericDocumentViewTestCase): permission_document_view.stored_permission ) self.get( - viewname='documents:document_preview', args=(self.document.pk,), + viewname='documents:document_preview', + kwargs={'document_pk': self.document.pk} ) event = Action.objects.any(obj=self.document).first() diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index fca24f900e..92847752e4 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -37,333 +37,354 @@ from .views import ( ) urlpatterns = [ - url(r'^list/$', DocumentListView.as_view(), name='document_list'), url( - r'^list/recent_access/$', RecentAccessDocumentListView.as_view(), - name='document_list_recent_access' + regex=r'^documents/all/$', name='document_list', + view=DocumentListView.as_view() ), url( - r'^list/recent_added/$', RecentAddedDocumentListView.as_view(), - name='document_list_recent_added' + regex=r'^documents/recent_access/$', + name='document_list_recent_access', + view=RecentAccessDocumentListView.as_view() ), url( - r'^list/deleted/$', DeletedDocumentListView.as_view(), - name='document_list_deleted' + regex=r'^documents/recent_added/$', name='document_list_recent_added', + view=RecentAddedDocumentListView.as_view() ), url( - r'^list/duplicated/$', - DuplicatedDocumentListView.as_view(), - name='duplicated_document_list' + regex=r'^documents/deleted/$', name='document_list_deleted', + view=DeletedDocumentListView.as_view() ), url( - r'^list/favorites/$', FavoriteDocumentListView.as_view(), - name='document_list_favorites' + regex=r'^documents/duplicated/$', name='duplicated_document_list', + view=DuplicatedDocumentListView.as_view() ), url( - r'^(?P\d+)/preview/$', DocumentPreviewView.as_view(), - name='document_preview' + regex=r'^documents/favorites/$', name='document_list_favorites', + view=FavoriteDocumentListView.as_view() ), url( - r'^(?P\d+)/properties/$', DocumentView.as_view(), - name='document_properties' + regex=r'^documents/(?P\d+)/preview/$', + name='document_preview', view=DocumentPreviewView.as_view() ), url( - r'^(?P\d+)/duplicates/$', DocumentDuplicatesListView.as_view(), - name='document_duplicates_list' + regex=r'^documents/(?P\d+)/properties/$', + name='document_properties', view=DocumentView.as_view() ), url( - r'^(?P\d+)/add_to_favorites/$', FavoriteAddView.as_view(), - name='document_add_to_favorites' + regex=r'^documents/(?P\d+)/duplicates/$', + name='document_duplicates_list', + view=DocumentDuplicatesListView.as_view() ), url( - r'^multiple/add_to_favorites/$', FavoriteAddView.as_view(), - name='document_multiple_add_to_favorites' + regex=r'^documents/(?P\d+)/add_to_favorites/$', + name='document_add_to_favorites', view=FavoriteAddView.as_view() ), url( - r'^(?P\d+)/remove_from_favorites/$', FavoriteRemoveView.as_view(), - name='document_remove_from_favorites' + regex=r'^documents/multiple/add_to_favorites/$', + name='document_multiple_add_to_favorites', + view=FavoriteAddView.as_view() ), url( - r'^multiple/remove_from_favorites/$', FavoriteRemoveView.as_view(), - name='document_multiple_remove_from_favorites' + regex=r'^documents/(?P\d+)/remove_from_favorites/$', + name='document_remove_from_favorites', + view=FavoriteRemoveView.as_view() ), url( - r'^(?P\d+)/restore/$', DocumentRestoreView.as_view(), - name='document_restore' + regex=r'^documents/multiple/remove_from_favorites/$', + name='document_multiple_remove_from_favorites', + view=FavoriteRemoveView.as_view() ), url( - r'^multiple/restore/$', DocumentRestoreManyView.as_view(), - name='document_multiple_restore' + regex=r'^documents/(?P\d+)/restore/$', + name='document_restore', view=DocumentRestoreView.as_view() ), url( - r'^(?P\d+)/delete/$', DeletedDocumentDeleteView.as_view(), - name='document_delete' + regex=r'^documents/multiple/restore/$', + name='document_multiple_restore', + view=DocumentRestoreManyView.as_view() ), url( - r'^multiple/delete/$', DeletedDocumentDeleteManyView.as_view(), - name='document_multiple_delete' + regex=r'^documents/(?P\d+)/delete/$', + name='document_delete', view=DeletedDocumentDeleteView.as_view() ), url( - r'^(?P\d+)/type/$', DocumentDocumentTypeEditView.as_view(), - name='document_document_type_edit' + regex=r'^documents/multiple/delete/$', name='document_multiple_delete', + view=DeletedDocumentDeleteManyView.as_view() ), url( - r'^multiple/type/$', DocumentDocumentTypeEditView.as_view(), - name='document_multiple_document_type_edit' + regex=r'^documents/(?P\d+)/type/$', + name='document_document_type_edit', + view=DocumentDocumentTypeEditView.as_view() ), url( - r'^(?P\d+)/trash/$', DocumentTrashView.as_view(), - name='document_trash' + regex=r'^documents/multiple/type/$', + name='document_multiple_document_type_edit', + view=DocumentDocumentTypeEditView.as_view() ), url( - r'^multiple/trash/$', DocumentTrashManyView.as_view(), - name='document_multiple_trash' + regex=r'^documents/(?P\d+)/trash/$', + name='document_trash', view=DocumentTrashView.as_view() ), url( - r'^(?P\d+)/edit/$', DocumentEditView.as_view(), - name='document_edit' + regex=r'^documents/multiple/trash/$', name='document_multiple_trash', + view=DocumentTrashManyView.as_view() ), url( - r'^(?P\d+)/print/$', DocumentPrint.as_view(), - name='document_print' + regex=r'^documents/(?P\d+)/edit/$', name='document_edit', + view=DocumentEditView.as_view() ), url( - r'^(?P\d+)/reset_page_count/$', - DocumentUpdatePageCountView.as_view(), - name='document_update_page_count' + regex=r'^documents/(?P\d+)/print/$', + name='document_print', view=DocumentPrint.as_view() ), url( - r'^multiple/reset_page_count/$', - DocumentUpdatePageCountView.as_view(), - name='document_multiple_update_page_count' + regex=r'^documents/(?P\d+)/reset_page_count/$', + name='document_update_page_count', + view=DocumentUpdatePageCountView.as_view() ), url( - r'^(?P\d+)/download/form/$', - DocumentDownloadFormView.as_view(), name='document_download_form' + regex=r'^documents/multiple/reset_page_count/$', + name='document_multiple_update_page_count', + view=DocumentUpdatePageCountView.as_view() ), url( - r'^(?P\d+)/download/$', DocumentDownloadView.as_view(), - name='document_download' + regex=r'^documents/(?P\d+)/download/form/$', + name='document_download_form', view=DocumentDownloadFormView.as_view() ), url( - r'^multiple/download/form/$', DocumentDownloadFormView.as_view(), - name='document_multiple_download_form' + regex=r'^documents/(?P\d+)/download/$', + name='document_download', view=DocumentDownloadView.as_view() ), url( - r'^multiple/download/$', DocumentDownloadView.as_view(), - name='document_multiple_download' + regex=r'^documents/multiple/download/form/$', + name='document_multiple_download_form', + view=DocumentDownloadFormView.as_view() ), url( - r'^(?P\d+)/clear_transformations/$', - DocumentTransformationsClearView.as_view(), - name='document_clear_transformations' + regex=r'^documents/multiple/download/$', + name='document_multiple_download', view=DocumentDownloadView.as_view() ), url( - r'^(?P\d+)/clone_transformations/$', - DocumentTransformationsCloneView.as_view(), - name='document_clone_transformations' + regex=r'^documents/(?P\d+)/clear_transformations/$', + name='document_clear_transformations', + view=DocumentTransformationsClearView.as_view() ), url( - r'^(?P\d+)/version/all/$', DocumentVersionListView.as_view(), - name='document_version_list' + regex=r'^documents/(?P\d+)/clone_transformations/$', + name='document_clone_transformations', + view=DocumentTransformationsCloneView.as_view() ), url( - r'^document/version/(?P\d+)/download/form/$', - DocumentVersionDownloadFormView.as_view(), - name='document_version_download_form' + regex=r'^documents/(?P\d+)/version/all/$', + name='document_version_list', + view=DocumentVersionListView.as_view() ), url( - r'^document/version/(?P\d+)/$', DocumentVersionView.as_view(), - name='document_version_view' + regex=r'^documents/versions/(?P\d+)/download/form/$', + name='document_version_download_form', + view=DocumentVersionDownloadFormView.as_view() ), url( - r'^document/version/(?P\d+)/download/$', - DocumentVersionDownloadView.as_view(), name='document_version_download' + regex=r'^documents/versions/(?P\d+)/$', + name='document_version_view', view=DocumentVersionView.as_view() ), url( - r'^document/version/(?P\d+)/revert/$', - DocumentVersionRevertView.as_view(), name='document_version_revert' - ), - - url( - r'^(?P\d+)/pages/all/$', DocumentPageListView.as_view(), - name='document_pages' - ), - - url( - r'^multiple/clear_transformations/$', - DocumentTransformationsClearView.as_view(), - name='document_multiple_clear_transformations' + regex=r'^documents/versions/(?P\d+)/download/$', + name='document_version_download', + view=DocumentVersionDownloadView.as_view() ), url( - r'^cache/clear/$', ClearImageCacheView.as_view(), - name='document_clear_image_cache' + regex=r'^documents/versions/(?P\d+)/revert/$', + name='document_version_revert', + view=DocumentVersionRevertView.as_view() ), url( - r'^trash_can/empty/$', EmptyTrashCanView.as_view(), - name='trash_can_empty' - ), - - url( - r'^page/(?P\d+)/$', DocumentPageView.as_view(), - name='document_page_view' + regex=r'^documents/(?P\d+)/pages/$', + name='document_pages', + view=DocumentPageListView.as_view() ), url( - r'^page/(?P\d+)/navigation/next/$', - DocumentPageNavigationNext.as_view(), - name='document_page_navigation_next' + regex=r'^documents/multiple/clear_transformations/$', + name='document_multiple_clear_transformations', + view=DocumentTransformationsClearView.as_view() ), url( - r'^page/(?P\d+)/navigation/previous/$', - DocumentPageNavigationPrevious.as_view(), - name='document_page_navigation_previous' + regex=r'^documents/cache/clear/$', name='document_clear_image_cache', + view=ClearImageCacheView.as_view() ), url( - r'^page/(?P\d+)/navigation/first/$', - DocumentPageNavigationFirst.as_view(), - name='document_page_navigation_first' + regex=r'^trash_can/empty/$', name='trash_can_empty', + view=EmptyTrashCanView.as_view() ), url( - r'^page/(?P\d+)/navigation/last/$', - DocumentPageNavigationLast.as_view(), - name='document_page_navigation_last' + regex=r'^pages/(?P\d+)/$', + name='document_page_view', view=DocumentPageView.as_view() ), url( - r'^page/(?P\d+)/zoom/in/$', - DocumentPageZoomInView.as_view(), name='document_page_zoom_in' + regex=r'^pages/(?P\d+)/navigation/next/$', + name='document_page_navigation_next', + view=DocumentPageNavigationNext.as_view() ), url( - r'^page/(?P\d+)/zoom/out/$', - DocumentPageZoomOutView.as_view(), name='document_page_zoom_out' + regex=r'^pages/(?P\d+)/navigation/previous/$', + name='document_page_navigation_previous', + view=DocumentPageNavigationPrevious.as_view() ), url( - r'^page/(?P\d+)/rotate/left/$', - DocumentPageRotateLeftView.as_view(), name='document_page_rotate_left' + regex=r'^pages/(?P\d+)/navigation/first/$', + name='document_page_navigation_first', + view=DocumentPageNavigationFirst.as_view() ), url( - r'^page/(?P\d+)/rotate/right/$', - DocumentPageRotateRightView.as_view(), - name='document_page_rotate_right' + regex=r'^pages/(?P\d+)/navigation/last/$', + name='document_page_navigation_last', + view=DocumentPageNavigationLast.as_view() ), url( - r'^page/(?P\d+)/reset/$', DocumentPageViewResetView.as_view(), - name='document_page_view_reset' + regex=r'^pages/(?P\d+)/zoom/in/$', + name='document_page_zoom_in', view=DocumentPageZoomInView.as_view() + ), + url( + regex=r'^pages/(?P\d+)/zoom/out/$', + name='document_page_zoom_out', view=DocumentPageZoomOutView.as_view() + ), + url( + regex=r'^pages/(?P\d+)/rotate/left/$', + name='document_page_rotate_left', + view=DocumentPageRotateLeftView.as_view() + ), + url( + regex=r'^pages/(?P\d+)/rotate/right/$', + name='document_page_rotate_right', + view=DocumentPageRotateRightView.as_view() + ), + url( + regex=r'^pages/(?P\d+)/reset/$', + name='document_page_view_reset', + view=DocumentPageViewResetView.as_view() ), # Admin views url( - r'^type/list/$', DocumentTypeListView.as_view(), - name='document_type_list' + regex=r'^types/$', name='document_type_list', + view=DocumentTypeListView.as_view() ), url( - r'^type/create/$', DocumentTypeCreateView.as_view(), - name='document_type_create' + regex=r'^types/create/$', name='document_type_create', + view=DocumentTypeCreateView.as_view() ), url( - r'^type/(?P\d+)/edit/$', DocumentTypeEditView.as_view(), - name='document_type_edit' + regex=r'^types/(?P\d+)/edit/$', name='document_type_edit', + view=DocumentTypeEditView.as_view() ), url( - r'^type/(?P\d+)/delete/$', DocumentTypeDeleteView.as_view(), - name='document_type_delete' + regex=r'^types/(?P\d+)/delete/$', name='document_type_delete', + view=DocumentTypeDeleteView.as_view() ), url( - r'^type/(?P\d+)/documents/$', - DocumentTypeDocumentListView.as_view(), - name='document_type_document_list' + regex=r'^types/(?P\d+)/documents/$', + name='document_type_document_list', + view=DocumentTypeDocumentListView.as_view() ), url( - r'^type/(?P\d+)/filename/list/$', - DocumentTypeFilenameListView.as_view(), - name='document_type_filename_list' + regex=r'^types/(?P\d+)/filenames/create/$', + name='document_type_filename_create', + view=DocumentTypeFilenameCreateView.as_view() ), url( - r'^type/filename/(?P\d+)/edit/$', - DocumentTypeFilenameEditView.as_view(), - name='document_type_filename_edit' + regex=r'^types/(?P\d+)/filenames/$', + name='document_type_filename_list', + view=DocumentTypeFilenameListView.as_view() ), url( - r'^type/filename/(?P\d+)/delete/$', - DocumentTypeFilenameDeleteView.as_view(), - name='document_type_filename_delete' + regex=r'^types/filenames/(?P\d+)/edit/$', + name='document_type_filename_edit', + view=DocumentTypeFilenameEditView.as_view() ), url( - r'^type/(?P\d+)/filename/create/$', - DocumentTypeFilenameCreateView.as_view(), - name='document_type_filename_create' + regex=r'^types/filenames/(?P\d+)/delete/$', + name='document_type_filename_delete', + view=DocumentTypeFilenameDeleteView.as_view() ), # Tools url( - r'^tools/documents/duplicated/scan/$', - ScanDuplicatedDocuments.as_view(), - name='duplicated_document_scan' + regex=r'^tools/documents/duplicated/scan/$', + name='duplicated_document_scan', + view=ScanDuplicatedDocuments.as_view() ), ] api_urls = [ url( - r'^document_types/(?P[0-9]+)/$', APIDocumentTypeView.as_view(), - name='documenttype-detail' + regex=r'^document_types/$', name='documenttype-list', + view=APIDocumentTypeListView.as_view() ), url( - r'^document_types/$', APIDocumentTypeListView.as_view(), - name='documenttype-list' + regex=r'^document_types/(?P\d+)/$', + name='documenttype-detail', view=APIDocumentTypeView.as_view() ), url( - r'^document_types/(?P[0-9]+)/documents/$', - APIDocumentTypeDocumentListView.as_view(), - name='documenttype-document-list' - ), - url(r'^documents/$', APIDocumentListView.as_view(), name='document-list'), - url( - r'^documents/(?P[0-9]+)/$', APIDocumentView.as_view(), - name='document-detail' + regex=r'^document_types/(?P\d+)/documents/$', + name='documenttype-document-list', + view=APIDocumentTypeDocumentListView.as_view() ), url( - r'^documents/(?P[0-9]+)/download/$', - APIDocumentDownloadView.as_view(), name='document-download' + regex=r'^documents/$', name='document-list', + view=APIDocumentListView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/$', - APIDocumentVersionsListView.as_view(), name='document-version-list' + regex=r'^documents/(?P\d+)/$', name='document-detail', + view=APIDocumentView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/(?P[0-9]+)/$', - APIDocumentVersionView.as_view(), name='documentversion-detail' + regex=r'^documents/(?P\d+)/download/$', + name='document-download', view=APIDocumentDownloadView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/(?P[0-9]+)/pages/$', - APIDocumentVersionPageListView.as_view(), name='documentversion-page-list' + regex=r'^documents/(?P\d+)/versions/$', + name='document-version-list', + view=APIDocumentVersionsListView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/(?P[0-9]+)/download/$', - APIDocumentVersionDownloadView.as_view(), - name='documentversion-download' + regex=r'^documents/(?P\d+)/versions/(?P\d+)/$', + name='documentversion-detail', + view=APIDocumentVersionView.as_view() ), url( - r'^documents/recent/$', APIRecentDocumentListView.as_view(), - name='document-recent-list' + regex=r'^documents/(?P\d+)/versions/(?P\d+)/pages/$', + name='documentversion-page-list', + view=APIDocumentVersionPageListView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/(?P[0-9]+)/pages/(?P[0-9]+)$', - APIDocumentPageView.as_view(), name='documentpage-detail' + regex=r'^documents/(?P\d+)/versions/(?P\d+)/download/$', + name='documentversion-download', + view=APIDocumentVersionDownloadView.as_view() ), url( - r'^documents/(?P[0-9]+)/versions/(?P[0-9]+)/pages/(?P[0-9]+)/image/$', - APIDocumentPageImageView.as_view(), name='documentpage-image' + regex=r'^documents/recent/$', name='document-recent-list', + view=APIRecentDocumentListView.as_view() ), url( - r'^trashed_documents/$', APIDeletedDocumentListView.as_view(), - name='trasheddocument-list' + regex=r'^documents/(?P\d+)/versions/(?P\d+)/pages/(?P\d+)$', + name='documentpage-detail', view=APIDocumentPageView.as_view() ), url( - r'^trashed_documents/(?P[0-9]+)/$', - APIDeletedDocumentView.as_view(), name='trasheddocument-detail' + regex=r'^documents/(?P\d+)/versions/(?P\d+)/pages/(?P\d+)/image/$', + name='documentpage-image', view=APIDocumentPageImageView.as_view() ), url( - r'^trashed_documents/(?P[0-9]+)/restore/$', - APIDeletedDocumentRestoreView.as_view(), name='trasheddocument-restore' + regex=r'^trashed_documents/$', name='trasheddocument-list', + view=APIDeletedDocumentListView.as_view() + ), + url( + regex=r'^trashed_documents/(?P\d+)/$', + name='trasheddocument-detail', view=APIDeletedDocumentView.as_view() + ), + url( + regex=r'^trashed_documents/(?P\d+)/restore/$', + name='trasheddocument-restore', + view=APIDeletedDocumentRestoreView.as_view() ), ] diff --git a/mayan/apps/documents/views/document_page_views.py b/mayan/apps/documents/views/document_page_views.py index 04f6ea0ad1..b4405c54ed 100644 --- a/mayan/apps/documents/views/document_page_views.py +++ b/mayan/apps/documents/views/document_page_views.py @@ -2,12 +2,14 @@ from __future__ import absolute_import, unicode_literals import logging +from furl import furl + from django.conf import settings from django.contrib import messages from django.shortcuts import get_object_or_404, resolve_url from django.urls import reverse +from django.utils.encoding import force_text from django.utils.http import urlencode -from django.utils.six.moves.urllib.parse import parse_qs, urlparse from django.utils.translation import ugettext_lazy as _ from django.views.generic import RedirectView @@ -37,11 +39,10 @@ logger = logging.getLogger(__name__) class DocumentPageInteractiveTransformation(RedirectView): def dispatch(self, request, *args, **kwargs): - object = self.get_object() + obj = self.get_object() AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=object + obj=obj, permissions=permission_document_view, user=request.user, ) return super(DocumentPageInteractiveTransformation, self).dispatch( @@ -49,11 +50,14 @@ class DocumentPageInteractiveTransformation(RedirectView): ) def get_object(self): - return get_object_or_404(klass=DocumentPage, pk=self.kwargs['pk']) + return get_object_or_404( + klass=DocumentPage, pk=self.kwargs['document_page_pk'] + ) def get_redirect_url(self, *args, **kwargs): url = reverse( - 'documents:document_page_view', args=(self.kwargs['pk'],) + viewname='documents:document_page_view', + kwargs={'document_page_pk': self.kwargs['document_page_pk']} ) query_dict = { @@ -70,8 +74,8 @@ class DocumentPageInteractiveTransformation(RedirectView): class DocumentPageListView(SingleObjectListView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_document_view, user=self.request.user, - obj=self.get_document() + obj=self.get_document(), permissions=permission_document_view, + user=self.request.user, ) return super( @@ -79,7 +83,7 @@ class DocumentPageListView(SingleObjectListView): ).dispatch(request, *args, **kwargs) def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_extra_context(self): return { @@ -109,64 +113,63 @@ class DocumentPageNavigationBase(RedirectView): ) def get_object(self): - return get_object_or_404(klass=DocumentPage, pk=self.kwargs['pk']) - - def get_redirect_url(self, *args, **kwargs): - parse_result = urlparse( - self.request.META.get( - 'HTTP_REFERER', resolve_url( - settings.LOGIN_REDIRECT_URL - ) - ) + return get_object_or_404( + klass=DocumentPage, pk=self.kwargs['document_page_pk'] ) - query_dict = parse_qs(parse_result.query) + def get_redirect_url(self, *args, **kwargs): + """ + Attempt to jump to the same kind of view but resolved to a new + object of the same kind. + """ + previous_url = self.request.META.get('HTTP_REFERER', None) - resolver_match = resolve(parse_result.path) + if not previous_url: + try: + previous_url = self.get_object().get_absolute_url() + except AttributeError: + previous_url = resolve_url(settings.LOGIN_REDIRECT_URL) - # Default is to stay on the same view - url = parse_result.path + parsed_url = furl(url=previous_url) - new_object = self.navigation_function() + # Obtain the view name to be able to resolve it back with new keyword + # arguments. + resolver_match = resolve(path=force_text(parsed_url.path)) - # Inject new_object pk in the referer's view pk or object_id kwargs - if 'pk' in resolver_match.kwargs: - resolver_match.kwargs['pk'] = new_object.pk + new_kwargs = self.get_new_kwargs() + + if set(new_kwargs) == set(resolver_match.kwargs): + # It is the same type of object, reuse the URL to stay in the + # same kind of view but pointing to a new object url = reverse( - resolver_match.view_name, kwargs=resolver_match.kwargs - ) - elif 'object_id' in resolver_match.kwargs: - resolver_match.kwargs['object_id'] = new_object.pk - url = reverse( - resolver_match.view_name, kwargs=resolver_match.kwargs + viewname=resolver_match.view_name, kwargs=new_kwargs ) else: - messages.warning( - self.request, _( - 'Unknown view keyword argument schema, unable to ' - 'redirect.' - ) - ) + url = parsed_url.path - return '{}?{}'.format(url, urlencode(query_dict, doseq=True)) + # Update just the path to retain the querystring in case there is + # transformation data. + parsed_url.path = url + + return parsed_url.tostr() class DocumentPageNavigationFirst(DocumentPageNavigationBase): - def navigation_function(self): + def get_new_kwargs(self): document_page = self.get_object() - return document_page.siblings.first() + return {'document_page_pk': document_page.siblings.first().pk} class DocumentPageNavigationLast(DocumentPageNavigationBase): - def navigation_function(self): + def get_new_kwargs(self): document_page = self.get_object() - return document_page.siblings.last() + return {'document_page_pk': document_page.siblings.last().pk} class DocumentPageNavigationNext(DocumentPageNavigationBase): - def navigation_function(self): + def get_new_kwargs(self): document_page = self.get_object() try: @@ -175,14 +178,16 @@ class DocumentPageNavigationNext(DocumentPageNavigationBase): ) except DocumentPage.DoesNotExist: messages.warning( - self.request, _('There are no more pages in this document') + request=self.request, message=_( + 'There are no more pages in this document' + ) ) finally: - return document_page + return {'document_page_pk': document_page.pk} class DocumentPageNavigationPrevious(DocumentPageNavigationBase): - def navigation_function(self): + def get_new_kwargs(self): document_page = self.get_object() try: @@ -191,12 +196,12 @@ class DocumentPageNavigationPrevious(DocumentPageNavigationBase): ) except DocumentPage.DoesNotExist: messages.warning( - self.request, _( + request=self.request, message=_( 'You are already at the first page of this document' ) ) finally: - return document_page + return {'document_page_pk': document_page.pk} class DocumentPageRotateLeftView(DocumentPageInteractiveTransformation): @@ -253,7 +258,9 @@ class DocumentPageView(SimpleView): } def get_object(self): - return get_object_or_404(klass=DocumentPage, pk=self.kwargs['pk']) + return get_object_or_404( + klass=DocumentPage, pk=self.kwargs['document_page_pk'] + ) class DocumentPageViewResetView(RedirectView): diff --git a/mayan/apps/documents/views/document_type_views.py b/mayan/apps/documents/views/document_type_views.py index c3936cdadb..8835754ef5 100644 --- a/mayan/apps/documents/views/document_type_views.py +++ b/mayan/apps/documents/views/document_type_views.py @@ -42,7 +42,7 @@ class DocumentTypeCreateView(SingleObjectCreateView): 'delete_time_unit' ) model = DocumentType - post_action_redirect = reverse_lazy('documents:document_type_list') + post_action_redirect = reverse_lazy(viewname='documents:document_type_list') view_permission = permission_document_type_create def get_extra_context(self): @@ -59,7 +59,8 @@ class DocumentTypeCreateView(SingleObjectCreateView): class DocumentTypeDeleteView(SingleObjectDeleteView): model = DocumentType object_permission = permission_document_type_delete - post_action_redirect = reverse_lazy('documents:document_type_list') + post_action_redirect = reverse_lazy(viewname='documents:document_type_list') + pk_url_kwarg = 'document_type_pk' def get_extra_context(self): return { @@ -71,7 +72,7 @@ class DocumentTypeDeleteView(SingleObjectDeleteView): class DocumentTypeDocumentListView(DocumentListView): def get_document_type(self): - return get_object_or_404(klass=DocumentType, pk=self.kwargs['pk']) + return get_object_or_404(klass=DocumentType, pk=self.kwargs['document_type_pk']) def get_document_queryset(self): return self.get_document_type().documents.all() @@ -94,7 +95,10 @@ class DocumentTypeEditView(SingleObjectEditView): ) model = DocumentType object_permission = permission_document_type_edit - post_action_redirect = reverse_lazy('documents:document_type_list') + pk_url_kwarg = 'document_type_pk' + post_action_redirect = reverse_lazy( + viewname='documents:document_type_list' + ) def get_extra_context(self): return { @@ -146,7 +150,7 @@ class DocumentTypeFilenameCreateView(SingleObjectCreateView): ) def get_document_type(self): - return get_object_or_404(klass=DocumentType, pk=self.kwargs['pk']) + return get_object_or_404(klass=DocumentType, pk=self.kwargs['document_type_pk']) def get_extra_context(self): return { @@ -164,6 +168,7 @@ class DocumentTypeFilenameCreateView(SingleObjectCreateView): class DocumentTypeFilenameDeleteView(SingleObjectDeleteView): model = DocumentTypeFilename object_permission = permission_document_type_edit + pk_url_kwarg = 'filename_pk' def get_extra_context(self): return { @@ -181,8 +186,8 @@ class DocumentTypeFilenameDeleteView(SingleObjectDeleteView): def get_post_action_redirect(self): return reverse( - 'documents:document_type_filename_list', - args=(self.get_object().document_type.pk,) + viewname='documents:document_type_filename_list', + kwargs={'document_type_pk': self.get_object().document_type.pk} ) @@ -190,6 +195,7 @@ class DocumentTypeFilenameEditView(SingleObjectEditView): fields = ('enabled', 'filename',) model = DocumentTypeFilename object_permission = permission_document_type_edit + pk_url_kwarg = 'filename_pk' def get_extra_context(self): document_type_filename = self.get_object() @@ -209,8 +215,8 @@ class DocumentTypeFilenameEditView(SingleObjectEditView): def get_post_action_redirect(self): return reverse( - 'documents:document_type_filename_list', - args=(self.get_object().document_type.pk,) + viewname='documents:document_type_filename_list', + kwargs={'document_type_pk': self.get_object().document_type.pk} ) @@ -219,7 +225,7 @@ class DocumentTypeFilenameListView(SingleObjectListView): object_permission = permission_document_type_view def get_document_type(self): - return get_object_or_404(klass=DocumentType, pk=self.kwargs['pk']) + return get_object_or_404(klass=DocumentType, pk=self.kwargs['document_type_pk']) def get_extra_context(self): return { diff --git a/mayan/apps/documents/views/document_version_views.py b/mayan/apps/documents/views/document_version_views.py index 42e599a2ed..4473ec41be 100644 --- a/mayan/apps/documents/views/document_version_views.py +++ b/mayan/apps/documents/views/document_version_views.py @@ -27,18 +27,18 @@ logger = logging.getLogger(__name__) class DocumentVersionListView(SingleObjectListView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_document_version_view, user=request.user, - obj=self.get_document() + obj=self.get_document(), + permissions=permission_document_version_view, user=request.user ) - self.get_document().add_as_recent_document_for_user(request.user) + self.get_document().add_as_recent_document_for_user(user=request.user) return super( DocumentVersionListView, self ).dispatch(request, *args, **kwargs) def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_extra_context(self): return { @@ -67,18 +67,22 @@ class DocumentVersionRevertView(ConfirmView): } def get_object(self): - return get_object_or_404(klass=DocumentVersion, pk=self.kwargs['pk']) + return get_object_or_404( + klass=DocumentVersion, pk=self.kwargs['document_version_pk'] + ) def view_action(self): try: self.get_object().revert(_user=self.request.user) messages.success( - self.request, _('Document version reverted successfully') + request=self.request, message=_( + 'Document version reverted successfully' + ) ) except Exception as exception: messages.error( - self.request, - _('Error reverting document version; %s') % exception + request=self.request, + message=_('Error reverting document version; %s') % exception ) @@ -86,6 +90,7 @@ class DocumentVersionDownloadFormView(DocumentDownloadFormView): form_class = DocumentVersionDownloadForm model = DocumentVersion multiple_download_view = None + pk_url_kwarg = 'document_version_pk' querystring_form_fields = ( 'compressed', 'zip_filename', 'preserve_extension' ) @@ -108,7 +113,7 @@ class DocumentVersionDownloadFormView(DocumentDownloadFormView): ) if not id_list: - id_list = self.kwargs['pk'] + id_list = self.kwargs['document_version_pk'] return self.model.objects.filter( pk__in=id_list.split(',') @@ -118,6 +123,7 @@ class DocumentVersionDownloadFormView(DocumentDownloadFormView): class DocumentVersionDownloadView(DocumentDownloadView): model = DocumentVersion object_permission = permission_document_download + pk_url_kwarg = 'document_version_pk' @staticmethod def get_item_file(item): diff --git a/mayan/apps/documents/views/document_views.py b/mayan/apps/documents/views/document_views.py index 269988d5d2..8f57427117 100644 --- a/mayan/apps/documents/views/document_views.py +++ b/mayan/apps/documents/views/document_views.py @@ -66,7 +66,7 @@ class DocumentListView(SingleObjectListView): return super(DocumentListView, self).get_context_data(**kwargs) except Exception as exception: messages.error( - self.request, _( + request=self.request, message=_( 'Error retrieving document list: %(exception)s.' ) % { 'exception': exception @@ -105,10 +105,11 @@ class DeletedDocumentDeleteView(ConfirmView): extra_context = { 'title': _('Delete the selected document?') } + pk_url_kwarg = 'document_pk' def object_action(self, instance): source_document = get_object_or_404( - Document.passthrough, pk=instance.pk + klass=Document.passthrough, pk=instance.pk ) AccessControlList.objects.check_access( @@ -121,10 +122,14 @@ class DeletedDocumentDeleteView(ConfirmView): ) def view_action(self): - instance = get_object_or_404(DeletedDocument, pk=self.kwargs['pk']) + instance = get_object_or_404( + klass=DeletedDocument, pk=self.kwargs['document_pk'] + ) self.object_action(instance=instance) messages.success( - self.request, _('Document: %(document)s deleted.') % { + request=self.request, message=_( + 'Document: %(document)s deleted.' + ) % { 'document': instance } ) @@ -144,8 +149,8 @@ class DeletedDocumentListView(DocumentListView): def get_document_queryset(self): return AccessControlList.objects.filter_by_access( - permission_document_view, self.request.user, - queryset=DeletedDocument.trash.all() + permission=permission_document_view, + queryset=DeletedDocument.trash.all(), user=self.request.user ) def get_extra_context(self): @@ -172,6 +177,7 @@ class DocumentDocumentTypeEditView(MultipleObjectFormActionView): form_class = DocumentTypeFilteredSelectForm model = Document object_permission = permission_document_properties_edit + pk_url_kwarg = 'document_pk' success_message = _( 'Document type change request performed on %(count)d document' ) @@ -216,7 +222,7 @@ class DocumentDocumentTypeEditView(MultipleObjectFormActionView): ) messages.success( - self.request, _( + request=self.request, message=_( 'Document type for "%s" changed successfully.' ) % instance ) @@ -225,8 +231,8 @@ class DocumentDocumentTypeEditView(MultipleObjectFormActionView): class DocumentDuplicatesListView(DocumentListView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_document_view, user=self.request.user, - obj=self.get_document() + obj=self.get_document(), permissions=permission_document_view, + user=self.request.user ) return super( @@ -234,7 +240,7 @@ class DocumentDuplicatesListView(DocumentListView): ).dispatch(request, *args, **kwargs) def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_extra_context(self): context = super(DocumentDuplicatesListView, self).get_extra_context() @@ -262,6 +268,7 @@ class DocumentEditView(SingleObjectEditView): form_class = DocumentForm model = Document object_permission = permission_document_properties_edit + pk_url_kwarg = 'document_pk' def dispatch(self, request, *args, **kwargs): result = super( @@ -283,7 +290,8 @@ class DocumentEditView(SingleObjectEditView): def get_post_action_redirect(self): return reverse( - 'documents:document_properties', args=(self.get_object().pk,) + viewname='documents:document_properties', + kwargs={'document_pk': self.get_object().pk} ) @@ -291,6 +299,7 @@ class DocumentPreviewView(SingleObjectDetailView): form_class = DocumentPreviewForm model = Document object_permission = permission_document_view + pk_url_kwarg = 'document_pk' def dispatch(self, request, *args, **kwargs): result = super( @@ -322,19 +331,23 @@ class DocumentRestoreView(ConfirmView): ) AccessControlList.objects.check_access( - permissions=permission_document_restore, user=self.request.user, - obj=source_document + obj=source_document, permissions=permission_document_restore, + user=self.request.user ) instance.restore() def view_action(self): - instance = get_object_or_404(klass=DeletedDocument, pk=self.kwargs['pk']) + instance = get_object_or_404( + klass=DeletedDocument, pk=self.kwargs['document_pk'] + ) self.object_action(instance=instance) messages.success( - self.request, _('Document: %(document)s restored.') % { + request=self.request, message=_( + 'Document: %(document)s restored.' + ) % { 'document': instance } ) @@ -357,15 +370,15 @@ class DocumentTrashView(ConfirmView): } def get_object(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_post_action_redirect(self): - return reverse('documents:document_list_recent_access') + return reverse(viewname='documents:document_list_recent_access') def object_action(self, instance): AccessControlList.objects.check_access( - permissions=permission_document_trash, user=self.request.user, - obj=instance + obj=instance, permissions=permission_document_trash, + user=self.request.user ) instance.delete() @@ -376,7 +389,9 @@ class DocumentTrashView(ConfirmView): self.object_action(instance=instance) messages.success( - self.request, _('Document: %(document)s moved to trash successfully.') % { + request=self.request, message=_( + 'Document: %(document)s moved to trash successfully.' + ) % { 'document': instance } ) @@ -397,6 +412,7 @@ class DocumentView(SingleObjectDetailView): form_class = DocumentPropertiesForm model = Document object_permission = permission_document_view + pk_url_kwarg = 'document_pk' def dispatch(self, request, *args, **kwargs): result = super(DocumentView, self).dispatch(request, *args, **kwargs) @@ -417,7 +433,7 @@ class EmptyTrashCanView(ConfirmView): } view_permission = permission_empty_trash action_cancel_redirect = post_action_redirect = reverse_lazy( - 'documents:document_list_deleted' + viewname='documents:document_list_deleted' ) def view_action(self): @@ -426,7 +442,9 @@ class EmptyTrashCanView(ConfirmView): kwargs={'deleted_document_id': deleted_document.pk} ) - messages.success(self.request, _('Trash emptied successfully')) + messages.success( + request=self.request, message=_('Trash emptied successfully') + ) class DocumentDownloadFormView(FormView): @@ -458,7 +476,8 @@ class DocumentDownloadFormView(FormView): url = reverse(self.multiple_download_view) else: url = reverse( - self.single_download_view, args=(self.queryset.first().pk,) + viewname=self.single_download_view, + kwargs={'document_pk': self.queryset.first().pk} ) return HttpResponseRedirect('{}?{}'.format(url, querystring)) @@ -469,7 +488,7 @@ class DocumentDownloadFormView(FormView): ) if not id_list: - id_list = self.kwargs['pk'] + id_list = self.kwargs['document_pk'] return self.model.objects.filter( pk__in=id_list.split(',') @@ -480,10 +499,10 @@ class DocumentDownloadFormView(FormView): { 'name': 'appearance/generic_list_items_subtemplate.html', 'context': { - 'object_list': self.queryset, 'hide_link': True, 'hide_links': True, 'hide_multi_item_actions': True, + 'object_list': self.queryset } } ] @@ -507,8 +526,8 @@ class DocumentDownloadFormView(FormView): def get_queryset(self): return AccessControlList.objects.filter_by_access( - permission_document_download, self.request.user, - queryset=self.get_document_queryset() + permission=permission_document_download, + queryset=self.get_document_queryset(), user=self.request.user ) @@ -516,6 +535,7 @@ class DocumentDownloadView(SingleObjectDownloadView): model = Document # Set to None to disable the .get_object call object_permission = None + pk_url_kwarg = 'document_pk' @staticmethod def commit_event(item, request): @@ -541,7 +561,7 @@ class DocumentDownloadView(SingleObjectDownloadView): ) if not id_list: - id_list = self.kwargs['pk'] + id_list = self.kwargs[self.pk_url_kwarg] queryset = self.model.objects.filter(pk__in=id_list.split(',')) @@ -594,6 +614,8 @@ class DocumentDownloadView(SingleObjectDownloadView): class DocumentUpdatePageCountView(MultipleObjectConfirmActionView): model = Document object_permission = permission_document_tools + pk_url_kwarg = 'document_pk' + success_message = _( '%(count)d document queued for page count recalculation' ) @@ -632,7 +654,7 @@ class DocumentUpdatePageCountView(MultipleObjectConfirmActionView): ) else: messages.error( - self.request, _( + request=self.request, message=_( 'Document "%(document)s" is empty. Upload at least one ' 'document version before attempting to detect the ' 'page count.' @@ -645,6 +667,7 @@ class DocumentUpdatePageCountView(MultipleObjectConfirmActionView): class DocumentTransformationsClearView(MultipleObjectConfirmActionView): model = Document object_permission = permission_transformation_delete + pk_url_kwarg = 'document_pk' success_message = _( 'Transformation clear request processed for %(count)d document' ) @@ -682,7 +705,7 @@ class DocumentTransformationsClearView(MultipleObjectConfirmActionView): Transformation.objects.get_for_model(page).delete() except Exception as exception: messages.error( - self.request, _( + request=self.request, message=_( 'Error deleting the page transformations for ' 'document: %(document)s; %(error)s.' ) % { @@ -710,7 +733,7 @@ class DocumentTransformationsCloneView(FormView): ) except Exception as exception: messages.error( - self.request, _( + request=self.request, message=_( 'Error deleting the page transformations for ' 'document: %(document)s; %(error)s.' ) % { @@ -719,7 +742,9 @@ class DocumentTransformationsCloneView(FormView): ) else: messages.success( - self.request, _('Transformations cloned successfully.') + request=self.request, message=_( + 'Transformations cloned successfully.' + ) ) return super(DocumentTransformationsCloneView, self).form_valid(form=form) @@ -743,14 +768,16 @@ class DocumentTransformationsCloneView(FormView): return context def get_object(self): - instance = get_object_or_404(klass=Document, pk=self.kwargs['pk']) - - AccessControlList.objects.check_access( - permissions=permission_transformation_edit, - user=self.request.user, obj=instance + instance = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] ) - instance.add_as_recent_document_for_user(self.request.user) + AccessControlList.objects.check_access( + obj=instance, permissions=permission_transformation_edit, + user=self.request.user + ) + + instance.add_as_recent_document_for_user(user=self.request.user) return instance @@ -761,11 +788,11 @@ class DocumentPrint(FormView): def dispatch(self, request, *args, **kwargs): instance = self.get_object() AccessControlList.objects.check_access( - permissions=permission_document_print, user=self.request.user, - obj=instance + obj=instance, permissions=permission_document_print, + user=self.request.user ) - instance.add_as_recent_document_for_user(self.request.user) + instance.add_as_recent_document_for_user(user=self.request.user) self.page_group = self.request.GET.get('page_group') self.page_range = self.request.GET.get('page_range') @@ -792,8 +819,8 @@ class DocumentPrint(FormView): { 'appearance_type': 'plain', 'pages': pages, - 'width': setting_print_width.value, 'height': setting_print_height.value, + 'width': setting_print_width.value } ) @@ -804,7 +831,8 @@ class DocumentPrint(FormView): context = { 'form_action': reverse( - 'documents:document_print', args=(instance.pk,) + viewname='documents:document_print', + kwargs={'document_pk': instance.pk} ), 'object': instance, 'submit_label': _('Submit'), @@ -816,7 +844,7 @@ class DocumentPrint(FormView): return context def get_object(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_template_names(self): if self.page_group or self.page_range: