Files
mayan-edms/mayan/apps/folders/views.py
2017-07-21 00:25:18 -04:00

288 lines
8.3 KiB
Python

from __future__ import absolute_import, unicode_literals
import logging
from django.contrib import messages
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _, ungettext
from acls.models import AccessControlList
from common.views import (
MultipleObjectFormActionView, SingleObjectCreateView,
SingleObjectDeleteView, SingleObjectEditView, SingleObjectListView
)
from documents.permissions import permission_document_view
from documents.models import Document
from documents.views import DocumentListView
from .forms import FolderListForm
from .models import Folder
from .permissions import (
permission_folder_add_document, permission_folder_create,
permission_folder_delete, permission_folder_edit, permission_folder_view,
permission_folder_remove_document
)
logger = logging.getLogger(__name__)
class FolderCreateView(SingleObjectCreateView):
fields = ('label',)
model = Folder
view_permission = permission_folder_create
def get_extra_context(self):
return {
'title': _('Create folder'),
}
class FolderDeleteView(SingleObjectDeleteView):
model = Folder
object_permission = permission_folder_delete
post_action_redirect = reverse_lazy('folders:folder_list')
def get_extra_context(self):
return {
'object': self.get_object(),
'title': _('Delete the folder: %s?') % self.get_object(),
}
class FolderDetailView(DocumentListView):
def get_document_queryset(self):
return self.get_folder().documents.all()
def get_extra_context(self):
return {
'hide_links': True,
'object': self.get_folder(),
'title': _('Documents in folder: %s') % self.get_folder(),
}
def get_folder(self):
folder = get_object_or_404(Folder, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permissions=permission_folder_view, user=self.request.user,
obj=folder
)
return folder
class FolderEditView(SingleObjectEditView):
fields = ('label',)
model = Folder
object_permission = permission_folder_edit
post_action_redirect = reverse_lazy('folders:folder_list')
def get_extra_context(self):
return {
'object': self.get_object(),
'title': _('Edit folder: %s') % self.get_object(),
}
class FolderListView(SingleObjectListView):
model = Folder
object_permission = permission_folder_view
def get_extra_context(self):
return {
'hide_link': True,
'title': _('Folders'),
}
class DocumentFolderListView(FolderListView):
def dispatch(self, request, *args, **kwargs):
self.document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user,
obj=self.document
)
return super(DocumentFolderListView, self).dispatch(
request, *args, **kwargs
)
def get_extra_context(self):
return {
'hide_link': True,
'object': self.document,
'title': _('Folders containing document: %s') % self.document,
}
def get_queryset(self):
return self.document.document_folders().all()
class DocumentAddToFolderView(MultipleObjectFormActionView):
form_class = FolderListForm
model = Document
success_message = _(
'Add to folder request performed on %(count)d document'
)
success_message_plural = _(
'Add to folder request performed on %(count)d documents'
)
def get_extra_context(self):
queryset = self.get_queryset()
result = {
'submit_label': _('Add'),
'title': ungettext(
'Add document to folders',
'Add documents to folders',
queryset.count()
)
}
if queryset.count() == 1:
result.update(
{
'object': queryset.first(),
'title': _(
'Add document "%s" to folders'
) % queryset.first()
}
)
return result
def get_form_extra_kwargs(self):
queryset = self.get_queryset()
result = {
'help_text': _(
'Folders to which the selected documents will be added.'
),
'permission': permission_folder_add_document,
'user': self.request.user
}
if queryset.count() == 1:
result.update(
{
'queryset': Folder.objects.exclude(
pk__in=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_add_document,
user=self.request.user
)
if folder in folder_membership:
messages.warning(
self.request, _(
'Document: %(document)s is already in '
'folder: %(folder)s.'
) % {
'document': instance, 'folder': folder
}
)
else:
folder.documents.add(instance)
messages.success(
self.request, _(
'Document: %(document)s added to folder: '
'%(folder)s successfully.'
) % {
'document': instance, 'folder': folder
}
)
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'
)
def get_extra_context(self):
queryset = self.get_queryset()
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': instance, 'folder': folder
}
)
else:
folder.documents.remove(instance)
messages.success(
self.request, _(
'Document: %(document)s removed from folder: '
'%(folder)s.'
) % {
'document': instance, 'folder': folder
}
)