Convert document page zoom and rotation views to CBV.

This commit is contained in:
Roberto Rosario
2016-11-02 19:01:30 -04:00
parent 3ab4778814
commit 2777dc1070
4 changed files with 108 additions and 71 deletions

View File

@@ -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

View File

@@ -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):

View File

@@ -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<document_page_id>\d+)/zoom/in/$',
document_page_zoom_in, name='document_page_zoom_in'
r'^page/(?P<pk>\d+)/zoom/in/$',
DocumentPageZoomInView.as_view(), name='document_page_zoom_in'
),
url(
r'^page/(?P<document_page_id>\d+)/zoom/out/$',
document_page_zoom_out, name='document_page_zoom_out'
r'^page/(?P<pk>\d+)/zoom/out/$',
DocumentPageZoomOutView.as_view(), name='document_page_zoom_out'
),
url(
r'^page/(?P<document_page_id>\d+)/rotate/right/$',
document_page_rotate_right, name='document_page_rotate_right'
r'^page/(?P<pk>\d+)/rotate/left/$',
DocumentPageRotateLeftView.as_view(), name='document_page_rotate_left'
),
url(
r'^page/(?P<document_page_id>\d+)/rotate/left/$',
document_page_rotate_left, name='document_page_rotate_left'
r'^page/(?P<pk>\d+)/rotate/right/$',
DocumentPageRotateRightView.as_view(),
name='document_page_rotate_right'
),
url(
r'^page/(?P<pk>\d+)/reset/$', DocumentPageViewResetView.as_view(),

View File

@@ -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):