From ca40b3f703c6458dc601c7504accefbfb63d51cf Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 12 Dec 2012 00:37:32 -0400 Subject: [PATCH] Implement bulk document move into folders, issue #39 --- apps/folders/__init__.py | 7 ++++-- apps/folders/urls.py | 2 +- apps/folders/views.py | 54 +++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index 8bbc3126b2..b75f58df2a 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -19,9 +19,10 @@ folder_list = {'text': _(u'folder list'), 'view': 'folder_list', 'famfam': 'fold folder_create = {'text': _('create folder'), 'view': 'folder_create', 'famfam': 'folder_add', 'permissions': [PERMISSION_FOLDER_CREATE]} folder_edit = {'text': _('edit'), 'view': 'folder_edit', 'args': 'object.pk', 'famfam': 'folder_edit', 'permissions': [PERMISSION_FOLDER_EDIT]} folder_delete = {'text': _('delete'), 'view': 'folder_delete', 'args': 'object.pk', 'famfam': 'folder_delete', 'permissions': [PERMISSION_FOLDER_DELETE]} -folder_document_multiple_remove = {'text': _('remove from folder'), 'view': 'folder_document_multiple_remove', 'args': 'object.pk', 'famfam': 'delete', 'permissions': [PERMISSION_FOLDER_REMOVE_DOCUMENT]} +folder_document_multiple_remove = {'text': _('remove from folder'), 'view': 'folder_document_multiple_remove', 'args': 'object.pk', 'famfam': 'folder_delete', 'permissions': [PERMISSION_FOLDER_REMOVE_DOCUMENT]} folder_view = {'text': _(u'folder documents'), 'view': 'folder_view', 'args': 'object.pk', 'famfam': 'folder_go', 'permissions': [PERMISSION_FOLDER_VIEW]} -folder_add_document = {'text': _('add to a folder'), 'view': 'folder_add_document', 'args': 'object.pk', 'famfam': 'add', 'permissions': [PERMISSION_FOLDER_ADD_DOCUMENT]} +folder_add_document = {'text': _('add to a folder'), 'view': 'folder_add_document', 'args': 'object.pk', 'famfam': 'folder_add', 'permissions': [PERMISSION_FOLDER_ADD_DOCUMENT]} +folder_add_multiple_documents = {'text': _('add to folder'), 'view': 'folder_add_multiple_documents', 'famfam': 'folder_add', 'permissions': [PERMISSION_FOLDER_ADD_DOCUMENT]} document_folder_list = {'text': _(u'folders'), 'view': 'document_folder_list', 'args': 'object.pk', 'famfam': 'folder_user', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'children_view_regex': [r'folder']} folder_acl_list = {'text': _(u'ACLs'), 'view': 'folder_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]} @@ -40,6 +41,8 @@ register_sidebar_template(['folder_list'], 'folders_help.html') register_links(['document_folder_list', 'folder_add_document'], [folder_add_document], menu_name="sidebar") +register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_node_view', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent', 'tag_tagged_item_list'], [folder_add_multiple_documents]) + class_permissions(Folder, [ PERMISSION_FOLDER_EDIT, PERMISSION_FOLDER_DELETE, diff --git a/apps/folders/urls.py b/apps/folders/urls.py index 9f35d24c69..a3f2a4c0d2 100644 --- a/apps/folders/urls.py +++ b/apps/folders/urls.py @@ -1,6 +1,5 @@ from django.conf.urls.defaults import patterns, url - urlpatterns = patterns('folders.views', url(r'^list/$', 'folder_list', (), 'folder_list'), url(r'^create/$', 'folder_create', (), 'folder_create'), @@ -10,6 +9,7 @@ urlpatterns = patterns('folders.views', url(r'^(?P\d+)/remove/document/multiple/$', 'folder_document_multiple_remove', (), 'folder_document_multiple_remove'), url(r'^document/(?P\d+)/folder/add/$', 'folder_add_document', (), 'folder_add_document'), + url(r'^document/multiple/folder/add/$', 'folder_add_multiple_documents', (), 'folder_add_multiple_documents'), url(r'^document/(?P\d+)/folder/list/$', 'document_folder_list', (), 'document_folder_list'), url(r'^(?P\d+)/acl/list/$', 'folder_acl_list', (), 'folder_acl_list'), diff --git a/apps/folders/views.py b/apps/folders/views.py index 3c4a494aa6..f5e4ed69b5 100644 --- a/apps/folders/views.py +++ b/apps/folders/views.py @@ -170,38 +170,56 @@ def folder_view(request, folder_id): ) -def folder_add_document(request, document_id): - document = get_object_or_404(Document, pk=document_id) +def folder_add_document(request, document_id=None, document_id_list=None): + + if document_id: + documents = [get_object_or_404(Document, pk=document_id)] + elif document_id_list: + documents = [get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',')] + else: + messages.error(request, _(u'Must provide at least one document.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) try: Permission.objects.check_permissions(request.user, [PERMISSION_FOLDER_ADD_DOCUMENT]) except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_FOLDER_ADD_DOCUMENT, request.user, document) + documents = AccessEntry.objects.filter_objects_by_access(PERMISSION_FOLDER_ADD_DOCUMENT, request.user, documents) - next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) + post_action_redirect = None + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) + next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/'))) if request.method == 'POST': form = FolderListForm(request.POST, user=request.user) if form.is_valid(): folder = form.cleaned_data['folder'] - if folder.add_document(document): - messages.success(request, _(u'Document: %(document)s added to folder: %(folder)s successfully.') % { - 'document': document, 'folder': folder}) - else: - messages.warning(request, _(u'Document: %(document)s is already in folder: %(folder)s.') % { - 'document': document, 'folder': folder}) + for document in documents: + if folder.add_document(document): + messages.success(request, _(u'Document: %(document)s added to folder: %(folder)s successfully.') % { + 'document': document, 'folder': folder}) + else: + messages.warning(request, _(u'Document: %(document)s is already in folder: %(folder)s.') % { + 'document': document, 'folder': folder}) return HttpResponseRedirect(next) else: form = FolderListForm(user=request.user) - return render_to_response('generic_form.html', { - 'title': _(u'add document "%s" to a folder') % document, + context = { + 'object_name': _(u'document'), 'form': form, - 'object': document, + 'previous': previous, 'next': next, - }, - context_instance=RequestContext(request)) + } + + if len(documents) == 1: + context['object'] = documents[0] + context['title'] = _(u'Add document: %s to folder.') % documents[0] + elif len(documents) > 1: + context['title'] = _(u'Add documents: %s to folder.') % ', '.join([unicode(d) for d in documents]) + + return render_to_response('generic_form.html', context, + context_instance=RequestContext(request)) def document_folder_list(request, document_id): @@ -291,3 +309,9 @@ def folder_acl_list(request, folder_pk): 'object': folder, } ) + + +def folder_add_multiple_documents(request): + return folder_add_document( + request, document_id_list=request.GET.get('id_list', []) + )