From 6a13aaad4dd158a58bdf879c1c6f93b516480fd1 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 23 Dec 2016 01:52:22 -0400 Subject: [PATCH] Refactor the remove documents from folders view to allowing removing documents from multiple folders at the same time. --- docs/releases/2.2.rst | 1 + mayan/apps/folders/apps.py | 23 +++--- mayan/apps/folders/links.py | 22 ++++-- mayan/apps/folders/urls.py | 24 +++--- mayan/apps/folders/views.py | 141 ++++++++++++++++++++---------------- 5 files changed, 119 insertions(+), 92 deletions(-) diff --git a/docs/releases/2.2.rst b/docs/releases/2.2.rst index d795eeb1b7..536b8eac2e 100644 --- a/docs/releases/2.2.rst +++ b/docs/releases/2.2.rst @@ -32,6 +32,7 @@ the user links - Production settings don't override the DEBUG variable. DEBUG can be set to True on production install to debug errors live. - Refactor add document to folder view to allow adding a documents to multiple folders at the same time. +- Refactor the remove document from folder view to allow removing documents from multiple folders at the same time. Removals -------- diff --git a/mayan/apps/folders/apps.py b/mayan/apps/folders/apps.py index b81df5a013..0d1a0eed95 100644 --- a/mayan/apps/folders/apps.py +++ b/mayan/apps/folders/apps.py @@ -14,11 +14,10 @@ from navigation import SourceColumn from rest_api.classes import APIEndPoint from .links import ( - link_folder_list, - link_document_folder_list, link_folder_add_document, - link_folder_add_multiple_documents, link_folder_create, - link_folder_delete, link_folder_document_multiple_remove, - link_folder_edit, link_folder_view + link_folder_list, link_document_folder_list, link_document_folder_remove, + link_folder_add_document, link_folder_add_multiple_documents, + link_folder_create, link_folder_delete, + link_folder_edit, link_folder_view, link_multiple_document_folder_remove ) from .menus import menu_folders from .permissions import ( @@ -87,11 +86,10 @@ class FoldersApp(MayanAppConfig): menu_main.bind_links(links=(menu_folders,), position=98) menu_multi_item.bind_links( - links=(link_folder_add_multiple_documents,), sources=(Document,) - ) - menu_multi_item.bind_links( - links=(link_folder_document_multiple_remove,), - sources=('folders:folder_view',) + links=( + link_folder_add_multiple_documents, + link_multiple_document_folder_remove + ), sources=(Document,) ) menu_object.bind_links( links=( @@ -105,8 +103,9 @@ class FoldersApp(MayanAppConfig): ), sources=(Folder,) ) menu_sidebar.bind_links( - links=(link_folder_add_document,), + links=(link_folder_add_document, link_document_folder_remove), sources=( - 'folders:document_folder_list', 'folders:folder_add_document' + 'folders:document_folder_list', 'folders:folder_add_document', + 'folders:document_folder_remove' ) ) diff --git a/mayan/apps/folders/links.py b/mayan/apps/folders/links.py index 3c3bcfdeb7..2d9b9c4797 100644 --- a/mayan/apps/folders/links.py +++ b/mayan/apps/folders/links.py @@ -11,18 +11,31 @@ from .permissions import ( permission_folder_remove_document ) +# Document links + link_document_folder_list = Link( icon='fa fa-folder', permissions=(permission_document_view,), text=_('Folders'), view='folders:document_folder_list', args='resolved_object.pk' ) +link_document_folder_remove = Link( + args='resolved_object.pk', text=_('Remove from folders'), + view='folders:document_folder_remove' +) link_folder_add_document = Link( - permissions=(permission_folder_add_document,), text=_('Add to a folder'), + permissions=(permission_folder_add_document,), text=_('Add to a folders'), view='folders:folder_add_document', args='object.pk' ) link_folder_add_multiple_documents = Link( - text=_('Add to folder'), view='folders:folder_add_multiple_documents' + text=_('Add to folders'), view='folders:folder_add_multiple_documents' ) +link_multiple_document_folder_remove = Link( + text=_('Remove from folders'), + view='folders:multiple_document_folder_remove' +) + +# Folder links + link_folder_create = Link( icon='fa fa-plus', permissions=(permission_folder_create,), text=_('Create folder'), view='folders:folder_create' @@ -31,11 +44,6 @@ link_folder_delete = Link( permissions=(permission_folder_delete,), tags='dangerous', text=_('Delete'), view='folders:folder_delete', args='object.pk' ) -link_folder_document_multiple_remove = Link( - permissions=(permission_folder_remove_document,), - text=_('Remove from folder'), - view='folders:folder_document_multiple_remove', args='object.pk' -) link_folder_edit = Link( permissions=(permission_folder_edit,), text=_('Edit'), view='folders:folder_edit', args='object.pk' diff --git a/mayan/apps/folders/urls.py b/mayan/apps/folders/urls.py index 2f6746f15c..e8b3496bb9 100644 --- a/mayan/apps/folders/urls.py +++ b/mayan/apps/folders/urls.py @@ -7,9 +7,9 @@ from .api_views import ( APIFolderDocumentView, APIFolderListView, APIFolderView ) from .views import ( - DocumentFolderListView, FolderAddDocumentView, FolderCreateView, - FolderDeleteView, FolderDetailView, FolderEditView, FolderListView, - folder_document_multiple_remove + DocumentAddToFolderView, DocumentFolderListView, + DocumentRemoveFromFolderView, FolderCreateView, FolderDeleteView, + FolderDetailView, FolderEditView, FolderListView, ) urlpatterns = [ @@ -21,20 +21,24 @@ urlpatterns = [ name='folder_delete' ), url(r'^(?P\d+)/$', FolderDetailView.as_view(), name='folder_view'), - url( - r'^(?P\d+)/remove/document/multiple/$', - folder_document_multiple_remove, - name='folder_document_multiple_remove' - ), url( r'^document/(?P\d+)/folder/add/$', - FolderAddDocumentView.as_view(), name='folder_add_document' + DocumentAddToFolderView.as_view(), name='folder_add_document' ), url( - r'^document/multiple/folder/add/$', FolderAddDocumentView.as_view(), + r'^document/multiple/folder/add/$', DocumentAddToFolderView.as_view(), name='folder_add_multiple_documents' ), + url( + r'^document/(?P\d+)/folder/remove/$', + DocumentRemoveFromFolderView.as_view(), name='document_folder_remove' + ), + url( + r'^document/multiple/folder/remove/$', + DocumentRemoveFromFolderView.as_view(), + name='multiple_document_folder_remove' + ), url( r'^document/(?P\d+)/folder/list/$', DocumentFolderListView.as_view(), name='document_folder_list' diff --git a/mayan/apps/folders/views.py b/mayan/apps/folders/views.py index f78eea7b79..4ea3ac4290 100644 --- a/mayan/apps/folders/views.py +++ b/mayan/apps/folders/views.py @@ -123,7 +123,7 @@ class DocumentFolderListView(FolderListView): return self.document.document_folders().all() -class FolderAddDocumentView(MultipleObjectFormActionView): +class DocumentAddToFolderView(MultipleObjectFormActionView): form_class = FolderListForm model = Document success_message = _( @@ -160,7 +160,9 @@ class FolderAddDocumentView(MultipleObjectFormActionView): def get_form_extra_kwargs(self): queryset = self.get_queryset() result = { - 'help_text': _('Folders to which the selected documents will be added.'), + 'help_text': _( + 'Folders to which the selected documents will be added.' + ), 'permission': permission_folder_add_document, 'user': self.request.user } @@ -206,70 +208,83 @@ class FolderAddDocumentView(MultipleObjectFormActionView): ) -def folder_document_remove(request, folder_id, document_id=None, document_id_list=None): - post_action_redirect = None - - folder = get_object_or_404(Folder, pk=folder_id) - - if document_id: - queryset = Document.objects.filter(pk=document_id) - elif document_id_list: - queryset = Document.objects.filter(pk__in=document_id_list) - - if not queryset: - messages.error(request, _('Must provide at least one folder document.')) - return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))) - - queryset = AccessControlList.objects.filter_by_access( - permission_folder_remove_document, request.user, queryset=queryset +class DocumentRemoveFromFolderView(MultipleObjectFormActionView): + form_class = FolderListForm + model = Document + success_message = _( + 'Remove from folder request performed on %(count)d document' + ) + success_message_plural = _( + 'Remove from folder request performed on %(count)d documents' ) - previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) - next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) + def get_extra_context(self): + queryset = self.get_queryset() - if request.method == 'POST': - for folder_document in queryset: - try: - folder.documents.remove(folder_document) - messages.success( - request, _( - 'Document: %s removed successfully.' - ) % folder_document - ) - except Exception as exception: - messages.error( - request, _( - 'Document: %(document)s delete error: %(error)s' + result = { + 'submit_label': _('Remove'), + 'title': ungettext( + 'Remove document from folders', + 'Remove documents from folders', + queryset.count() + ) + } + + if queryset.count() == 1: + result.update( + { + 'object': queryset.first(), + 'title': _( + 'Remove document "%s" to folders' + ) % queryset.first() + } + ) + + return result + + def get_form_extra_kwargs(self): + queryset = self.get_queryset() + result = { + 'help_text': _( + 'Folders from which the selected documents will be removed.' + ), + 'permission': permission_folder_remove_document, + 'user': self.request.user + } + + if queryset.count() == 1: + result.update( + { + 'queryset': queryset.first().folders.all() + } + ) + + return result + + def object_action(self, form, instance): + folder_membership = instance.folders.all() + + for folder in form.cleaned_data['folders']: + AccessControlList.objects.check_access( + obj=folder, permissions=permission_folder_remove_document, + user=self.request.user + ) + + if folder not in folder_membership: + messages.warning( + self.request, _( + 'Document: %(document)s is not in folder: %(folder)s.' ) % { - 'document': folder_document, 'error': exception + 'document': instance, 'folder': folder + } + ) + else: + folder.documents.remove(instance) + messages.success( + self.request, _( + 'Document: %(document)s removed from folder: ' + '%(folder)s.' + ) % { + 'document': instance, 'folder': folder } ) - - return HttpResponseRedirect(next) - - context = { - 'next': next, - 'object': folder, - 'previous': previous, - 'title': ungettext( - 'Remove the selected document from the folder: %(folder)s?', - 'Remove the selected documents from the folder: %(folder)s?', - queryset.count() - ) % {'folder': folder} - } - - if queryset.count() == 1: - context['object'] = queryset.first() - - return render_to_response( - 'appearance/generic_confirm.html', context, - context_instance=RequestContext(request) - ) - - -def folder_document_multiple_remove(request, folder_id): - return folder_document_remove( - request, folder_id, document_id_list=request.GET.get( - 'id_list', request.POST.get('id_list', '') - ).split(',') - )