From 2777dc1070738d79a7a5ab476014ec13fc39d27a Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 2 Nov 2016 19:01:30 -0400 Subject: [PATCH] Convert document page zoom and rotation views to CBV. --- mayan/apps/documents/links.py | 10 ++- mayan/apps/documents/tests/test_views.py | 32 +++++++ mayan/apps/documents/urls.py | 30 +++---- mayan/apps/documents/views.py | 107 ++++++++++++----------- 4 files changed, 108 insertions(+), 71 deletions(-) diff --git a/mayan/apps/documents/links.py b/mayan/apps/documents/links.py index 0b185627ce..8b1b70f7a8 100644 --- a/mayan/apps/documents/links.py +++ b/mayan/apps/documents/links.py @@ -194,12 +194,12 @@ link_document_page_return = Link( link_document_page_rotate_left = Link( icon='fa fa-rotate-left', permissions=(permission_document_view,), text=_('Rotate left'), view='documents:document_page_rotate_left', - args='resolved_object.pk' + args='resolved_object.pk', keep_query=True ) link_document_page_rotate_right = Link( icon='fa fa-rotate-right', permissions=(permission_document_view,), text=_('Rotate right'), view='documents:document_page_rotate_right', - args='resolved_object.pk' + args='resolved_object.pk', keep_query=True ) link_document_page_view = Link( permissions=(permission_document_view,), text=_('Page image'), @@ -212,12 +212,14 @@ link_document_page_view_reset = Link( link_document_page_zoom_in = Link( conditional_disable=is_max_zoom, icon='fa fa-search-plus', permissions=(permission_document_view,), text=_('Zoom in'), - view='documents:document_page_zoom_in', args='resolved_object.pk' + view='documents:document_page_zoom_in', args='resolved_object.pk', + keep_query=True ) link_document_page_zoom_out = Link( conditional_disable=is_min_zoom, icon='fa fa-search-minus', permissions=(permission_document_view,), text=_('Zoom out'), - view='documents:document_page_zoom_out', args='resolved_object.pk' + view='documents:document_page_zoom_out', args='resolved_object.pk', + keep_query=True ) # Document versions diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index 98ae7dc534..8505be80cd 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -571,6 +571,38 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertContains(response, 'reverted', status_code=200) self.assertEqual(self.document.versions.count(), 1) + def test_document_page_view_no_permissions(self): + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + response = self.get( + 'documents:document_page_view', args=( + self.document.pages.first().pk, + ) + ) + + self.assertEqual(response.status_code, 403) + + def test_document_page_view_with_permissions(self): + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_document_view.stored_permission + ) + response = self.get( + 'documents:document_page_view', args=( + self.document.pages.first().pk, + ), + follow=True + ) + + self.assertContains( + response, unicode(self.document.pages.first()), status_code=200 + ) + class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): def test_document_type_create_view_no_permission(self): diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 1810e3a6b3..310191e218 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -16,10 +16,11 @@ from .views import ( ClearImageCacheView, DeletedDocumentDeleteView, DeletedDocumentDeleteManyView, DeletedDocumentListView, DocumentDownloadFormView, DocumentDownloadView, DocumentEditView, - DocumentListView, DocumentPageView, DocumentPageListView, - DocumentPageViewResetView, DocumentPreviewView, DocumentRestoreView, - DocumentRestoreManyView, DocumentTrashView, DocumentTrashManyView, - DocumentTypeCreateView, DocumentTypeDeleteView, + DocumentListView, DocumentPageListView, DocumentPageRotateLeftView, + DocumentPageRotateRightView, DocumentPageView, DocumentPageViewResetView, + DocumentPageZoomInView, DocumentPageZoomOutView, DocumentPreviewView, + DocumentRestoreView, DocumentRestoreManyView, DocumentTrashView, + DocumentTrashManyView, DocumentTypeCreateView, DocumentTypeDeleteView, DocumentTypeDocumentListView, DocumentTypeFilenameCreateView, DocumentTypeFilenameDeleteView, DocumentTypeFilenameEditView, DocumentTypeFilenameListView, DocumentTypeListView, DocumentTypeEditView, @@ -30,9 +31,7 @@ from .views import ( document_multiple_document_type_edit, document_multiple_update_page_count, document_page_navigation_first, document_page_navigation_last, document_page_navigation_next, document_page_navigation_previous, - document_page_rotate_left, document_page_rotate_right, - document_page_zoom_in, document_page_zoom_out, document_print, - document_update_page_count + document_print, document_update_page_count ) @@ -184,20 +183,21 @@ urlpatterns = patterns( document_page_navigation_last, name='document_page_navigation_last' ), url( - r'^page/(?P\d+)/zoom/in/$', - document_page_zoom_in, name='document_page_zoom_in' + r'^page/(?P\d+)/zoom/in/$', + DocumentPageZoomInView.as_view(), name='document_page_zoom_in' ), url( - r'^page/(?P\d+)/zoom/out/$', - document_page_zoom_out, name='document_page_zoom_out' + r'^page/(?P\d+)/zoom/out/$', + DocumentPageZoomOutView.as_view(), name='document_page_zoom_out' ), url( - r'^page/(?P\d+)/rotate/right/$', - document_page_rotate_right, name='document_page_rotate_right' + r'^page/(?P\d+)/rotate/left/$', + DocumentPageRotateLeftView.as_view(), name='document_page_rotate_left' ), url( - r'^page/(?P\d+)/rotate/left/$', - document_page_rotate_left, name='document_page_rotate_left' + r'^page/(?P\d+)/rotate/right/$', + DocumentPageRotateRightView.as_view(), + name='document_page_rotate_right' ), url( r'^page/(?P\d+)/reset/$', DocumentPageViewResetView.as_view(), diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index cf42c29bd7..07c92ced58 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -22,7 +22,7 @@ from common.generics import ( SingleObjectEditView, SingleObjectListView ) from common.mixins import MultipleInstanceActionMixin -from converter.literals import DEFAULT_ZOOM_LEVEL +from converter.literals import DEFAULT_ROTATION, DEFAULT_ZOOM_LEVEL from converter.models import Transformation from converter.permissions import permission_transformation_delete @@ -241,8 +241,9 @@ class DocumentPageView(SimpleView): ).dispatch(request, *args, **kwargs) def get_extra_context(self): - zoom = self.request.GET.get('zoom') - rotation = self.request.GET.get('rotation') + zoom = int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) + rotation = int(self.request.GET.get('rotation', DEFAULT_ROTATION)) + document_page_form = DocumentPageForm( instance=self.get_object(), zoom=zoom, rotation=rotation ) @@ -250,7 +251,7 @@ class DocumentPageView(SimpleView): base_title = _('Image of: %s') % self.get_object() if zoom != DEFAULT_ZOOM_LEVEL: - zoom_text = '(%d%%)' % zoom + zoom_text = '({}%)'.format(zoom) else: zoom_text = '' @@ -260,7 +261,7 @@ class DocumentPageView(SimpleView): 'navigation_object_list': ('page',), 'page': self.get_object(), 'rotation': rotation, - 'title': ' '.join([base_title, zoom_text]), + 'title': ' '.join((base_title, zoom_text,)), 'read_only': True, 'zoom': zoom, } @@ -1075,67 +1076,69 @@ def document_page_navigation_last(request, document_page_id): return HttpResponseRedirect('{0}?{1}'.format(reverse(view, args=(document_page.pk,)), request.GET.urlencode())) -def transform_page(request, document_page_id, zoom_function=None, rotation_function=None): - document_page = get_object_or_404(DocumentPage, pk=document_page_id) +class DocumentPageInteractiveTransformation(RedirectView): + def dispatch(self, request, *args, **kwargs): + object = self.get_object() - AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=document_page.document - ) + AccessControlList.objects.check_access( + permissions=permission_document_view, user=request.user, + obj=object + ) - view = resolve(urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).path).view_name + return super(DocumentPageInteractiveTransformation, self).dispatch( + request, *args, **kwargs + ) - # Get the query string from the referer url - query = urlparse.urlparse(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))).query - # Parse the query string and get the zoom value - # parse_qs return a dictionary whose values are lists - zoom = int(urlparse.parse_qs(query).get('zoom', ['100'])[0]) - rotation = int(urlparse.parse_qs(query).get('rotation', ['0'])[0]) + def get_object(self): + return get_object_or_404(DocumentPage, pk=self.kwargs['pk']) - if zoom_function: - zoom = zoom_function(zoom) + def get_redirect_url(self, *args, **kwargs): + url = reverse( + 'documents:document_page_view', args=(self.kwargs['pk'],) + ) - if rotation_function: - rotation = rotation_function(rotation) + query_dict = { + 'rotation': int(self.request.GET.get('rotation', DEFAULT_ROTATION)), + 'zoom': int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) + } - return HttpResponseRedirect( - '?'.join([ - reverse(view, args=(document_page.pk,)), - urlencode({'zoom': zoom, 'rotation': rotation}) - ]) - ) + self.transformation_function(query_dict) + + return '{}?{}'.format(url, urlencode(query_dict)) -def document_page_zoom_in(request, document_page_id): - return transform_page( - request, - document_page_id, - zoom_function=lambda x: setting_zoom_max_level.value if x + setting_zoom_percent_step.value > setting_zoom_max_level.value else x + setting_zoom_percent_step.value - ) +class DocumentPageZoomInView(DocumentPageInteractiveTransformation): + def transformation_function(self, query_dict): + zoom = query_dict['zoom'] + setting_zoom_percent_step.value + + if zoom > setting_zoom_max_level.value: + zoom = setting_zoom_max_level.value + + query_dict['zoom'] = zoom -def document_page_zoom_out(request, document_page_id): - return transform_page( - request, - document_page_id, - zoom_function=lambda x: setting_zoom_min_level.value if x - setting_zoom_percent_step.value < setting_zoom_min_level.value else x - setting_zoom_percent_step.value - ) +class DocumentPageZoomOutView(DocumentPageInteractiveTransformation): + def transformation_function(self, query_dict): + zoom = query_dict['zoom'] - setting_zoom_percent_step.value + + if zoom < setting_zoom_min_level.value: + zoom = setting_zoom_min_level.value + + query_dict['zoom'] = zoom -def document_page_rotate_right(request, document_page_id): - return transform_page( - request, - document_page_id, - rotation_function=lambda x: (x + setting_rotation_step.value) % 360 - ) +class DocumentPageRotateLeftView(DocumentPageInteractiveTransformation): + def transformation_function(self, query_dict): + query_dict['rotation'] = ( + query_dict['rotation'] - setting_rotation_step.value + ) % 360 -def document_page_rotate_left(request, document_page_id): - return transform_page( - request, - document_page_id, - rotation_function=lambda x: (x - setting_rotation_step.value) % 360 - ) +class DocumentPageRotateRightView(DocumentPageInteractiveTransformation): + def transformation_function(self, query_dict): + query_dict['rotation'] = ( + query_dict['rotation'] + setting_rotation_step.value + ) % 360 def document_print(request, document_id):