Refactor the remove documents from folders view to allowing removing documents

from multiple folders at the same time.
This commit is contained in:
Roberto Rosario
2016-12-23 01:52:22 -04:00
parent 52fe5c556c
commit 6a13aaad4d
5 changed files with 119 additions and 92 deletions

View File

@@ -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
--------

View File

@@ -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'
)
)

View File

@@ -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'

View File

@@ -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<pk>\d+)/$', FolderDetailView.as_view(), name='folder_view'),
url(
r'^(?P<folder_id>\d+)/remove/document/multiple/$',
folder_document_multiple_remove,
name='folder_document_multiple_remove'
),
url(
r'^document/(?P<pk>\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<pk>\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<pk>\d+)/folder/list/$',
DocumentFolderListView.as_view(), name='document_folder_list'

View File

@@ -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(',')
)