diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index ae83da89e2..39de85b960 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -49,14 +49,13 @@ from .handlers import ( from .links.document_links import ( link_document_clear_transformations, link_document_clone_transformations, link_document_document_type_edit, link_document_download, - link_document_duplicates_list, link_document_edit, link_document_list, - link_document_list_recent_access, link_document_list_recent_added, + link_document_edit, link_document_list, link_document_list_recent_access, + link_document_list_recent_added, link_document_multiple_clear_transformations, link_document_multiple_document_type_edit, link_document_multiple_download, link_document_preview, link_document_print, link_document_properties, - link_document_quick_download, link_duplicated_document_list, - link_duplicated_document_scan + link_document_quick_download ) from .links.document_version_links import ( link_document_version_download, link_document_version_list, @@ -81,6 +80,10 @@ from .links.document_version_page_links import ( link_document_page_zoom_in, link_document_page_zoom_out, link_document_pages, link_document_update_page_count ) +from .links.duplicated_document_links import ( + link_document_duplicates_list, link_duplicated_document_list, + link_duplicated_document_scan +) from .links.favorite_links import ( link_document_favorites_add, link_document_favorites_remove, link_document_list_favorites, link_document_multiple_favorites_add, diff --git a/mayan/apps/documents/links/document_links.py b/mayan/apps/documents/links/document_links.py index e0045566e9..eba6079c0a 100644 --- a/mayan/apps/documents/links/document_links.py +++ b/mayan/apps/documents/links/document_links.py @@ -44,11 +44,6 @@ link_document_download = Link( permissions=(permission_document_download,), text=_('Advanced download'), view='documents:document_download_form', ) -link_document_duplicates_list = Link( - args='resolved_object.id', icon_class=icon_duplicated_document_list, - permissions=(permission_document_view,), text=_('Duplicates'), - view='documents:document_duplicates_list', -) link_document_edit = Link( args='resolved_object.id', icon_class_path='mayan.apps.documents.icons.icon_document_edit', @@ -108,13 +103,3 @@ link_document_quick_download = Link( permissions=(permission_document_download,), text=_('Quick download'), view='documents:document_download', ) -link_duplicated_document_list = Link( - icon_class=icon_duplicated_document_list, text=_('Duplicated documents'), - view='documents:duplicated_document_list' -) -link_duplicated_document_scan = Link( - icon_class=icon_duplicated_document_scan, - permissions=(permission_document_tools,), - text=_('Duplicated document scan'), - view='documents:duplicated_document_scan' -) diff --git a/mayan/apps/documents/links/duplicated_document_links.py b/mayan/apps/documents/links/duplicated_document_links.py new file mode 100644 index 0000000000..6a9a1be49f --- /dev/null +++ b/mayan/apps/documents/links/duplicated_document_links.py @@ -0,0 +1,34 @@ +from __future__ import absolute_import, unicode_literals + +from django.utils.translation import ugettext_lazy as _ + +from mayan.apps.converter.permissions import ( + permission_transformation_delete, permission_transformation_edit +) +from mayan.apps.navigation.classes import Link + +from ..icons import ( + icon_document_list_recent_access, icon_recent_added_document_list, + icon_duplicated_document_list, icon_duplicated_document_scan +) +from ..permissions import ( + permission_document_download, permission_document_properties_edit, + permission_document_print, permission_document_tools, + permission_document_view +) + +link_document_duplicates_list = Link( + args='resolved_object.id', icon_class=icon_duplicated_document_list, + permissions=(permission_document_view,), text=_('Duplicates'), + view='documents:document_duplicates_list', +) +link_duplicated_document_list = Link( + icon_class=icon_duplicated_document_list, text=_('Duplicated documents'), + view='documents:duplicated_document_list' +) +link_duplicated_document_scan = Link( + icon_class=icon_duplicated_document_scan, + permissions=(permission_document_tools,), + text=_('Duplicated document scan'), + view='documents:duplicated_document_scan' +) diff --git a/mayan/apps/documents/tests/test_duplicated_document_views.py b/mayan/apps/documents/tests/test_duplicated_document_views.py index 1243437f2a..0923e0dcc2 100644 --- a/mayan/apps/documents/tests/test_duplicated_document_views.py +++ b/mayan/apps/documents/tests/test_duplicated_document_views.py @@ -9,7 +9,7 @@ class DuplicatedDocumentsViewsTestMixin(object): def _request_document_duplicates_list_view(self): return self.get( viewname='documents:document_duplicates_list', - kwargs={'pk': self.test_documents[0].pk} + kwargs={'document_id': self.test_documents[0].pk} ) def _request_duplicated_document_list_view(self): @@ -26,7 +26,7 @@ class DuplicatedDocumentsViewsTestCase( self._upload_duplicate_document() response = self._request_document_duplicates_list_view() - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) def test_document_duplicates_list_with_access(self): self._upload_duplicate_document() diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index d78a79905b..64640f12f2 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -39,12 +39,12 @@ from .views.document_views import ( DocumentView, RecentAccessDocumentListView, RecentAddedDocumentListView ) from .views.duplicated_document_views import ( - DocumentDuplicatesListView, DuplicatedDocumentListView + DocumentDuplicatesListView, DuplicatedDocumentListView, + ScanDuplicatedDocuments ) from .views.favorite_document_views import ( FavoriteAddView, FavoriteDocumentListView, FavoriteRemoveView ) -from .views.misc_views import ScanDuplicatedDocuments from .views.trashed_document_views import ( DocumentTrashView, EmptyTrashCanView, TrashedDocumentDeleteView, TrashedDocumentListView, TrashedDocumentRestoreView @@ -99,31 +99,6 @@ urlpatterns_document_types = [ ), ] -urlpatterns_favorite_documents = [ - url( - regex=r'^documents/favorites/$', view=FavoriteDocumentListView.as_view(), - name='document_list_favorites' - ), - url( - regex=r'^documents/(?P\d+)/add_to_favorites/$', - view=FavoriteAddView.as_view(), name='document_add_to_favorites' - ), - url( - regex=r'^documents/multiple/add_to_favorites/$', view=FavoriteAddView.as_view(), - name='document_multiple_add_to_favorites' - ), - url( - regex=r'^documents/(?P\d+)/remove_from_favorites/$', - view=FavoriteRemoveView.as_view(), - name='document_remove_from_favorites' - ), - url( - regex=r'^documents/multiple/remove_from_favorites/$', - view=FavoriteRemoveView.as_view(), - name='document_multiple_remove_from_favorites' - ), -] - urlpatterns_documents = [ url( regex=r'^documents/$', view=DocumentListView.as_view(), name='document_list' @@ -138,11 +113,6 @@ urlpatterns_documents = [ view=RecentAddedDocumentListView.as_view(), name='document_list_recent_added' ), - url( - regex=r'^documents/duplicated/$', - view=DuplicatedDocumentListView.as_view(), - name='duplicated_document_list' - ), url( regex=r'^documents/(?P\d+)/preview/$', view=DocumentPreviewView.as_view(), name='document_preview' @@ -151,11 +121,6 @@ urlpatterns_documents = [ regex=r'^documents/(?P\d+)/properties/$', view=DocumentView.as_view(), name='document_properties' ), - url( - regex=r'^documents/(?P\d+)/duplicates/$', - view=DocumentDuplicatesListView.as_view(), - name='document_duplicates_list' - ), url( regex=r'^documents/(?P\d+)/type/$', view=DocumentDocumentTypeEditView.as_view(), @@ -314,7 +279,17 @@ urlpatterns_document_versions = [ ), ] -urlpatterns_tools = [ +urlpatterns_duplicated_documents = [ + url( + regex=r'^documents/duplicated/$', + view=DuplicatedDocumentListView.as_view(), + name='duplicated_document_list' + ), + url( + regex=r'^documents/(?P\d+)/duplicates/$', + view=DocumentDuplicatesListView.as_view(), + name='document_duplicates_list' + ), url( regex=r'^tools/documents/duplicated/scan/$', view=ScanDuplicatedDocuments.as_view(), @@ -322,6 +297,31 @@ urlpatterns_tools = [ ), ] +urlpatterns_favorite_documents = [ + url( + regex=r'^documents/favorites/$', view=FavoriteDocumentListView.as_view(), + name='document_list_favorites' + ), + url( + regex=r'^documents/(?P\d+)/add_to_favorites/$', + view=FavoriteAddView.as_view(), name='document_add_to_favorites' + ), + url( + regex=r'^documents/multiple/add_to_favorites/$', view=FavoriteAddView.as_view(), + name='document_multiple_add_to_favorites' + ), + url( + regex=r'^documents/(?P\d+)/remove_from_favorites/$', + view=FavoriteRemoveView.as_view(), + name='document_remove_from_favorites' + ), + url( + regex=r'^documents/multiple/remove_from_favorites/$', + view=FavoriteRemoveView.as_view(), + name='document_multiple_remove_from_favorites' + ), +] + urlpatterns_trashed_documents = [ url( regex=r'^documents/(?P\d+)/trash/$', view=DocumentTrashView.as_view(), @@ -363,8 +363,8 @@ urlpatterns.extend(urlpatterns_documents) urlpatterns.extend(urlpatterns_document_pages) urlpatterns.extend(urlpatterns_document_types) urlpatterns.extend(urlpatterns_document_versions) +urlpatterns.extend(urlpatterns_duplicated_documents) urlpatterns.extend(urlpatterns_favorite_documents) -urlpatterns.extend(urlpatterns_tools) urlpatterns.extend(urlpatterns_trashed_documents) api_urls = [ diff --git a/mayan/apps/documents/views/__init__.py b/mayan/apps/documents/views/__init__.py index e3cf842816..959d7d8c03 100644 --- a/mayan/apps/documents/views/__init__.py +++ b/mayan/apps/documents/views/__init__.py @@ -4,5 +4,4 @@ from .document_version_views import * # NOQA from .document_views import * # NOQA from .duplicated_document_views import * # NOQA from .favorite_document_views import * # NOQA -from .misc_views import * # NOQA from .trashed_document_views import * # NOQA diff --git a/mayan/apps/documents/views/duplicated_document_views.py b/mayan/apps/documents/views/duplicated_document_views.py index ac9acc5337..a7a6c3bea3 100644 --- a/mayan/apps/documents/views/duplicated_document_views.py +++ b/mayan/apps/documents/views/duplicated_document_views.py @@ -2,45 +2,30 @@ from __future__ import absolute_import, unicode_literals import logging -from django.conf import settings from django.contrib import messages -from django.core.exceptions import PermissionDenied -from django.db import transaction -from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404 -from django.urls import reverse -from django.utils.translation import ugettext_lazy as _, ungettext +from django.utils.translation import ugettext_lazy as _ -from mayan.apps.acls.models import AccessControlList -from mayan.apps.common.generics import ( - FormView, MultipleObjectConfirmActionView, MultipleObjectFormActionView, - SingleObjectDetailView, SingleObjectListView -) +from mayan.apps.common.generics import ConfirmView +from mayan.apps.common.mixins import ExternalObjectMixin -from ..events import event_document_view -from ..icons import icon_document_list, icon_duplicated_document_list +from ..icons import icon_duplicated_document_list from ..models import Document, DuplicatedDocument -from ..permissions import permission_document_view +from ..permissions import permission_document_tools, permission_document_view +from ..tasks import task_scan_duplicates_all from .document_views import DocumentListView -__all__ = ('DocumentDuplicatesListView', 'DuplicatedDocumentListView') +__all__ = ( + 'DocumentDuplicatesListView', 'DuplicatedDocumentListView', + 'ScanDuplicatedDocuments' +) logger = logging.getLogger(__name__) -class DocumentDuplicatesListView(DocumentListView): - def dispatch(self, request, *args, **kwargs): - AccessControlList.objects.check_access( - obj=self.get_document(), permissions=(permission_document_view,), - user=self.request.user - ) - - return super( - DocumentDuplicatesListView, self - ).dispatch(request, *args, **kwargs) - - def get_document(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) +class DocumentDuplicatesListView(ExternalObjectMixin, DocumentListView): + external_object_class = Document + external_object_permission = permission_document_view + external_object_pk_url_kwarg = 'document_id' def get_extra_context(self): context = super(DocumentDuplicatesListView, self).get_extra_context() @@ -54,8 +39,10 @@ class DocumentDuplicatesListView(DocumentListView): 'no_results_title': _( 'There are no duplicates for this document' ), - 'object': self.get_document(), - 'title': _('Duplicates for document: %s') % self.get_document(), + 'object': self.external_object, + 'title': _( + 'Duplicates for document: %s' + ) % self.external_object, } ) return context @@ -63,7 +50,7 @@ class DocumentDuplicatesListView(DocumentListView): def get_source_queryset(self): try: return DuplicatedDocument.objects.get( - document=self.get_document() + document=self.external_object ).documents.all() except DuplicatedDocument.DoesNotExist: return Document.objects.none() @@ -92,3 +79,17 @@ class DuplicatedDocumentListView(DocumentListView): } ) return context + + +class ScanDuplicatedDocuments(ConfirmView): + extra_context = { + 'title': _('Scan for duplicated documents?') + } + view_permission = permission_document_tools + + def view_action(self): + task_scan_duplicates_all.apply_async() + messages.success( + message=_('Duplicated document scan queued successfully.'), + request=self.request + ) diff --git a/mayan/apps/documents/views/misc_views.py b/mayan/apps/documents/views/misc_views.py deleted file mode 100644 index b1f1712187..0000000000 --- a/mayan/apps/documents/views/misc_views.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import absolute_import, unicode_literals - -import logging - -from django.contrib import messages -from django.utils.translation import ugettext_lazy as _ - -from mayan.apps.common.generics import ConfirmView - -from ..permissions import permission_document_tools -from ..tasks import task_scan_duplicates_all - -__all__ = ('ScanDuplicatedDocuments',) -logger = logging.getLogger(__name__) - - -class ScanDuplicatedDocuments(ConfirmView): - extra_context = { - 'title': _('Scan for duplicated documents?') - } - view_permission = permission_document_tools - - def view_action(self): - task_scan_duplicates_all.apply_async() - messages.success( - message=_('Duplicated document scan queued successfully.'), - request=self.request - )