Convert document page zoom and rotation views to CBV.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user