Convert the document page view navigation views to CBV.

Fix the document page transformation navigation bug.
This commit is contained in:
Roberto Rosario
2017-01-18 01:10:30 -04:00
parent 5acdfee6bd
commit 83149a09e7
3 changed files with 123 additions and 79 deletions

View File

@@ -49,6 +49,7 @@ Other changes
- Make the lock_manager.backends.file_lock.FileLock the new default locking backend. - Make the lock_manager.backends.file_lock.FileLock the new default locking backend.
- Add view to clone a document page transformation to other pages. - Add view to clone a document page transformation to other pages.
- Document page transformation navigation bug fixed.
Removals Removals
-------- --------

View File

@@ -17,7 +17,9 @@ from .views import (
DeletedDocumentDeleteManyView, DeletedDocumentListView, DeletedDocumentDeleteManyView, DeletedDocumentListView,
DocumentDocumentTypeEditView, DocumentDownloadFormView, DocumentDocumentTypeEditView, DocumentDownloadFormView,
DocumentDownloadView, DocumentEditView, DocumentListView, DocumentDownloadView, DocumentEditView, DocumentListView,
DocumentPageListView, DocumentPageRotateLeftView, DocumentPageListView, DocumentPageNavigationFirst,
DocumentPageNavigationLast, DocumentPageNavigationNext,
DocumentPageNavigationPrevious, DocumentPageRotateLeftView,
DocumentPageRotateRightView, DocumentPageView, DocumentPageViewResetView, DocumentPageRotateRightView, DocumentPageView, DocumentPageViewResetView,
DocumentPageZoomInView, DocumentPageZoomOutView, DocumentPreviewView, DocumentPageZoomInView, DocumentPageZoomOutView, DocumentPreviewView,
DocumentPrint, DocumentRestoreView, DocumentRestoreManyView, DocumentPrint, DocumentRestoreView, DocumentRestoreManyView,
@@ -29,9 +31,7 @@ from .views import (
DocumentTypeListView, DocumentTypeEditView, DocumentUpdatePageCountView, DocumentTypeListView, DocumentTypeEditView, DocumentUpdatePageCountView,
DocumentVersionDownloadFormView, DocumentVersionDownloadView, DocumentVersionDownloadFormView, DocumentVersionDownloadView,
DocumentVersionListView, DocumentVersionRevertView, DocumentView, DocumentVersionListView, DocumentVersionRevertView, DocumentView,
EmptyTrashCanView, RecentDocumentListView, document_page_navigation_first, EmptyTrashCanView, RecentDocumentListView
document_page_navigation_last, document_page_navigation_next,
document_page_navigation_previous
) )
@@ -172,21 +172,24 @@ urlpatterns = [
name='document_page_view' name='document_page_view'
), ),
url( url(
r'^page/(?P<document_page_id>\d+)/navigation/next/$', r'^page/(?P<pk>\d+)/navigation/next/$',
document_page_navigation_next, name='document_page_navigation_next' DocumentPageNavigationNext.as_view(),
name='document_page_navigation_next'
), ),
url( url(
r'^page/(?P<document_page_id>\d+)/navigation/previous/$', r'^page/(?P<pk>\d+)/navigation/previous/$',
document_page_navigation_previous, DocumentPageNavigationPrevious.as_view(),
name='document_page_navigation_previous' name='document_page_navigation_previous'
), ),
url( url(
r'^page/(?P<document_page_id>\d+)/navigation/first/$', r'^page/(?P<pk>\d+)/navigation/first/$',
document_page_navigation_first, name='document_page_navigation_first' DocumentPageNavigationFirst.as_view(),
name='document_page_navigation_first'
), ),
url( url(
r'^page/(?P<document_page_id>\d+)/navigation/last/$', r'^page/(?P<pk>\d+)/navigation/last/$',
document_page_navigation_last, name='document_page_navigation_last' DocumentPageNavigationLast.as_view(),
name='document_page_navigation_last'
), ),
url( url(
r'^page/(?P<pk>\d+)/zoom/in/$', r'^page/(?P<pk>\d+)/zoom/in/$',

View File

@@ -6,7 +6,6 @@ import urlparse
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import resolve, reverse from django.core.urlresolvers import resolve, reverse
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.http import urlencode from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _ 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): class DocumentPageView(SimpleView):
template_name = 'appearance/generic_form.html' template_name = 'appearance/generic_form.html'
@@ -98,70 +201,6 @@ class DocumentPageViewResetView(RedirectView):
pattern_name = 'documents:document_page_view' 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): class DocumentPageInteractiveTransformation(RedirectView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
object = self.get_object() object = self.get_object()
@@ -184,8 +223,9 @@ class DocumentPageInteractiveTransformation(RedirectView):
) )
query_dict = { query_dict = {
'rotation': int(self.request.GET.get('rotation', DEFAULT_ROTATION)), 'rotation': int(
'zoom': int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) self.request.GET.get('rotation', DEFAULT_ROTATION)
), 'zoom': int(self.request.GET.get('zoom', DEFAULT_ZOOM_LEVEL))
} }
self.transformation_function(query_dict) self.transformation_function(query_dict)