From 37d6070cabc80d271ebfb9eb9b40555109d6050e Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 21 Mar 2016 02:37:39 -0400 Subject: [PATCH] Convert the document version revert view to CBV. Add document version revert view tests. --- mayan/apps/documents/tests/test_views.py | 47 ++++++++++++++++++-- mayan/apps/documents/urls.py | 7 +-- mayan/apps/documents/views.py | 56 ++++++++++++------------ 3 files changed, 77 insertions(+), 33 deletions(-) diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index 1fbb17a9be..f12a2066e8 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -23,8 +23,8 @@ from ..permissions import ( permission_document_restore, permission_document_tools, permission_document_trash, permission_document_type_create, permission_document_type_delete, permission_document_type_edit, - permission_document_type_view, permission_document_view, - permission_empty_trash + permission_document_type_view, permission_document_version_revert, + permission_document_view, permission_empty_trash ) from .literals import ( @@ -505,10 +505,51 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): ) response = self.post('documents:trash_can_empty', follow=True) - self.assertContains(response, text='emptied successfully', status_code=200) + self.assertContains( + response, text='emptied successfully', status_code=200 + ) self.assertEqual(DeletedDocument.objects.count(), 0) self.assertEqual(Document.objects.count(), 0) + def test_document_version_revert_no_permission(self): + first_version = self.document.latest_version + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + file_object=file_object + ) + + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + response = self.post( + 'documents:document_version_revert', args=(first_version.pk,) + ) + + self.assertEqual(response.status_code, 403) + self.assertEqual(self.document.versions.count(), 2) + + def test_document_version_revert_with_permission(self): + first_version = self.document.latest_version + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document.new_version( + file_object=file_object + ) + + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_document_version_revert.stored_permission + ) + + response = self.post( + 'documents:document_version_revert', args=(first_version.pk,), + follow=True + ) + + self.assertContains(response, 'reverted', status_code=200) + self.assertEqual(self.document.versions.count(), 1) + 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 fdadf42de1..4b31d90c71 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -23,7 +23,8 @@ from .views import ( DocumentTypeDocumentListView, DocumentTypeFilenameDeleteView, DocumentTypeFilenameEditView, DocumentTypeFilenameListView, DocumentTypeListView, DocumentTypeEditView, DocumentVersionListView, - DocumentView, EmptyTrashCanView, RecentDocumentListView + DocumentVersionRevertView, DocumentView, EmptyTrashCanView, + RecentDocumentListView ) urlpatterns = patterns( @@ -130,8 +131,8 @@ urlpatterns = patterns( 'document_download', name='document_version_download' ), url( - r'^document/version/(?P\d+)/revert/$', - 'document_version_revert', name='document_version_revert' + r'^document/version/(?P\d+)/revert/$', + DocumentVersionRevertView.as_view(), name='document_version_revert' ), url( diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index d415b78fe9..74f3858bf9 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -548,6 +548,35 @@ class DocumentVersionListView(SingleObjectListView): return self.get_document().versions.order_by('-timestamp') +class DocumentVersionRevertView(ConfirmView): + object_permission = permission_document_version_revert + object_permission_related = 'document' + + def get_extra_context(self): + return { + 'message': _( + 'All later version after this one will be deleted too.' + ), + 'object': self.get_object().document, + 'title': _('Revert to this version?'), + } + + def get_object(self): + return get_object_or_404(DocumentVersion, pk=self.kwargs['pk']) + + def view_action(self): + try: + self.get_object().revert(_user=self.request.user) + messages.success( + self.request, _('Document version reverted successfully') + ) + except Exception as exception: + messages.error( + self.request, + _('Error reverting document version; %s') % exception + ) + + class DocumentView(SingleObjectDetailView): form_class = DocumentPropertiesForm model = Document @@ -1190,30 +1219,3 @@ def document_type_filename_create(request, document_type_id): 'navigation_object_list': ('document_type',), 'title': _('Create quick label for document type: %s') % document_type, }, context_instance=RequestContext(request)) - - -def document_version_revert(request, document_version_pk): - document_version = get_object_or_404(DocumentVersion, pk=document_version_pk) - - try: - Permission.check_permissions(request.user, (permission_document_version_revert,)) - except PermissionDenied: - AccessControlList.objects.check_access(permission_document_version_revert, request.user, document_version.document) - - previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) - - if request.method == 'POST': - try: - document_version.revert(_user=request.user) - messages.success(request, _('Document version reverted successfully')) - except Exception as exception: - messages.error(request, _('Error reverting document version; %s') % exception) - - return HttpResponseRedirect(previous) - - return render_to_response('appearance/generic_confirm.html', { - 'previous': previous, - 'object': document_version.document, - 'title': _('Revert to this version?'), - 'message': _('All later version after this one will be deleted too.'), - }, context_instance=RequestContext(request))