Refactor the remove documents from folders view to allowing removing documents
from multiple folders at the same time.
This commit is contained in:
@@ -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
|
||||
--------
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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(',')
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user