diff --git a/docs/releases/2.2.rst b/docs/releases/2.2.rst index af0b3a41ed..c5dcb89214 100644 --- a/docs/releases/2.2.rst +++ b/docs/releases/2.2.rst @@ -49,6 +49,7 @@ Other changes - Make the lock_manager.backends.file_lock.FileLock the new default locking backend. - Add view to clone a document page transformation to other pages. +- Document page transformation navigation bug fixed. Removals -------- diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 5d13519187..39f1cd4ba2 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -17,7 +17,9 @@ from .views import ( DeletedDocumentDeleteManyView, DeletedDocumentListView, DocumentDocumentTypeEditView, DocumentDownloadFormView, DocumentDownloadView, DocumentEditView, DocumentListView, - DocumentPageListView, DocumentPageRotateLeftView, + DocumentPageListView, DocumentPageNavigationFirst, + DocumentPageNavigationLast, DocumentPageNavigationNext, + DocumentPageNavigationPrevious, DocumentPageRotateLeftView, DocumentPageRotateRightView, DocumentPageView, DocumentPageViewResetView, DocumentPageZoomInView, DocumentPageZoomOutView, DocumentPreviewView, DocumentPrint, DocumentRestoreView, DocumentRestoreManyView, @@ -29,9 +31,7 @@ from .views import ( DocumentTypeListView, DocumentTypeEditView, DocumentUpdatePageCountView, DocumentVersionDownloadFormView, DocumentVersionDownloadView, DocumentVersionListView, DocumentVersionRevertView, DocumentView, - EmptyTrashCanView, RecentDocumentListView, document_page_navigation_first, - document_page_navigation_last, document_page_navigation_next, - document_page_navigation_previous + EmptyTrashCanView, RecentDocumentListView ) @@ -172,21 +172,24 @@ urlpatterns = [ name='document_page_view' ), url( - r'^page/(?P\d+)/navigation/next/$', - document_page_navigation_next, name='document_page_navigation_next' + r'^page/(?P\d+)/navigation/next/$', + DocumentPageNavigationNext.as_view(), + name='document_page_navigation_next' ), url( - r'^page/(?P\d+)/navigation/previous/$', - document_page_navigation_previous, + r'^page/(?P\d+)/navigation/previous/$', + DocumentPageNavigationPrevious.as_view(), name='document_page_navigation_previous' ), url( - r'^page/(?P\d+)/navigation/first/$', - document_page_navigation_first, name='document_page_navigation_first' + r'^page/(?P\d+)/navigation/first/$', + DocumentPageNavigationFirst.as_view(), + name='document_page_navigation_first' ), url( - r'^page/(?P\d+)/navigation/last/$', - document_page_navigation_last, name='document_page_navigation_last' + r'^page/(?P\d+)/navigation/last/$', + DocumentPageNavigationLast.as_view(), + name='document_page_navigation_last' ), url( r'^page/(?P\d+)/zoom/in/$', diff --git a/mayan/apps/documents/views/document_page_views.py b/mayan/apps/documents/views/document_page_views.py index 8a1cb08045..45de60424b 100644 --- a/mayan/apps/documents/views/document_page_views.py +++ b/mayan/apps/documents/views/document_page_views.py @@ -6,7 +6,6 @@ import urlparse from django.conf import settings from django.contrib import messages from django.core.urlresolvers import resolve, reverse -from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ @@ -51,6 +50,110 @@ class DocumentPageListView(SingleObjectListView): } +class DocumentPageNavigationBase(RedirectView): + def dispatch(self, request, *args, **kwargs): + document_page = self.get_object() + + AccessControlList.objects.check_access( + permissions=permission_document_view, user=request.user, + obj=document_page.document + ) + + return super(DocumentPageNavigationBase, self).dispatch( + request, *args, **kwargs + ) + + def get_object(self): + return get_object_or_404(DocumentPage, pk=self.kwargs['pk']) + + def get_redirect_url(self, *args, **kwargs): + parse_result = urlparse.urlparse( + self.request.META.get( + 'HTTP_REFERER', reverse( + settings.LOGIN_REDIRECT_URL + ) + ) + ) + + query_dict = urlparse.parse_qs(parse_result.query) + + resolver_match = resolve(parse_result.path) + + # Default is to stay on the same view + url = parse_result.path, query_dict + + new_object = self.navigation_function() + + # 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 + 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 + ) + else: + messages.warning( + self.request, _( + 'Unknown view keyword argument schema, unable to ' + 'redirect.' + ) + ) + + return '{}?{}'.format(url, urlencode(query_dict)) + + +class DocumentPageNavigationFirst(DocumentPageNavigationBase): + def navigation_function(self): + document_page = self.get_object() + + return document_page.siblings.first() + + +class DocumentPageNavigationLast(DocumentPageNavigationBase): + def navigation_function(self): + document_page = self.get_object() + + return document_page.siblings.last() + + +class DocumentPageNavigationNext(DocumentPageNavigationBase): + def navigation_function(self): + document_page = self.get_object() + + try: + document_page = document_page.siblings.get( + page_number=document_page.page_number + 1 + ) + except DocumentPage.DoesNotExist: + messages.warning( + self.request, _('There are no more pages in this document') + ) + finally: + return document_page + + +class DocumentPageNavigationPrevious(DocumentPageNavigationBase): + def navigation_function(self): + document_page = self.get_object() + + try: + document_page = document_page.siblings.get( + page_number=document_page.page_number - 1 + ) + except DocumentPage.DoesNotExist: + messages.warning( + self.request, _( + 'You are already at the first page of this document' + ) + ) + finally: + return document_page + + class DocumentPageView(SimpleView): template_name = 'appearance/generic_form.html' @@ -98,70 +201,6 @@ class DocumentPageViewResetView(RedirectView): pattern_name = 'documents:document_page_view' -def document_page_navigation_next(request, document_page_id): - document_page = get_object_or_404(DocumentPage, pk=document_page_id) - - AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=document_page.document - ) - - view = resolve(urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).path).view_name - - if document_page.page_number >= document_page.siblings.count(): - messages.warning(request, _('There are no more pages in this document')) - return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))) - else: - document_page = get_object_or_404(document_page.siblings, page_number=document_page.page_number + 1) - return HttpResponseRedirect('{0}?{1}'.format(reverse(view, args=(document_page.pk,)), request.GET.urlencode())) - - -def document_page_navigation_previous(request, document_page_id): - document_page = get_object_or_404(DocumentPage, pk=document_page_id) - - AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=document_page.document - ) - - view = resolve(urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).path).view_name - - if document_page.page_number <= 1: - messages.warning(request, _('You are already at the first page of this document')) - return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))) - else: - document_page = get_object_or_404(document_page.siblings, page_number=document_page.page_number - 1) - return HttpResponseRedirect('{0}?{1}'.format(reverse(view, args=(document_page.pk,)), request.GET.urlencode())) - - -def document_page_navigation_first(request, document_page_id): - document_page = get_object_or_404(DocumentPage, pk=document_page_id) - document_page = get_object_or_404(document_page.siblings, page_number=1) - - AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=document_page.document - ) - - view = resolve(urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).path).view_name - - return HttpResponseRedirect('{0}?{1}'.format(reverse(view, args=(document_page.pk,)), request.GET.urlencode())) - - -def document_page_navigation_last(request, document_page_id): - document_page = get_object_or_404(DocumentPage, pk=document_page_id) - document_page = get_object_or_404(document_page.siblings, page_number=document_page.siblings.count()) - - AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=document_page.document - ) - - view = resolve(urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).path).view_name - - return HttpResponseRedirect('{0}?{1}'.format(reverse(view, args=(document_page.pk,)), request.GET.urlencode())) - - class DocumentPageInteractiveTransformation(RedirectView): def dispatch(self, request, *args, **kwargs): object = self.get_object() @@ -184,8 +223,9 @@ class DocumentPageInteractiveTransformation(RedirectView): ) query_dict = { - 'rotation': int(self.request.GET.get('rotation', DEFAULT_ROTATION)), - 'zoom': int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) + 'rotation': int( + self.request.GET.get('rotation', DEFAULT_ROTATION) + ), 'zoom': int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) } self.transformation_function(query_dict)