Files
mayan-edms/mayan/apps/checkouts/views.py
2015-08-12 03:55:50 -04:00

216 lines
7.1 KiB
Python

from __future__ import absolute_import, unicode_literals
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from documents.models import Document
from documents.views import DocumentListView
from acls.models import AccessControlList
from common.generics import ConfirmView, SingleObjectCreateView
from common.utils import encapsulate
from permissions import Permission
from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut
from .forms import DocumentCheckoutForm
from .literals import STATE_LABELS
from .models import DocumentCheckout
from .permissions import (
permission_document_checkin, permission_document_checkin_override,
permission_document_checkout
)
class CheckoutDocumentView(SingleObjectCreateView):
form_class = DocumentCheckoutForm
def dispatch(self, request, *args, **kwargs):
self.document = get_object_or_404(Document, pk=self.kwargs['pk'])
try:
Permission.check_permissions(
request.user, [permission_document_checkout]
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_document_checkout, request.user, self.document
)
return super(
CheckoutDocumentView, self
).dispatch(request, *args, **kwargs)
def form_valid(self, form):
try:
instance = form.save(commit=False)
instance.user = self.request.user
instance.document = self.document
instance.save()
except DocumentAlreadyCheckedOut:
messages.error(self.request, _('Document already checked out.'))
except Exception as exception:
messages.error(
self.request,
_('Error trying to check out document; %s') % exception
)
else:
messages.success(
self.request,
_('Document "%s" checked out successfully.') % self.document
)
return HttpResponseRedirect(self.get_success_url())
def get_extra_context(self):
return {
'object': self.document,
'title': _('Check out document: %s') % self.document
}
def get_post_action_redirect(self):
return reverse('checkouts:checkout_info', args=[self.document.pk])
class CheckoutListView(DocumentListView):
def get_document_queryset(self):
return DocumentCheckout.objects.checked_out_documents()
extra_context = {
'title': _('Documents checked out'),
'hide_links': True,
'extra_columns': [
{
'name': _('User'),
'attribute': encapsulate(
lambda document: document.checkout_info().user.get_full_name() or document.checkout_info().user
)
},
{
'name': _('Checkout time and date'),
'attribute': encapsulate(
lambda document: document.checkout_info().checkout_datetime
)
},
{
'name': _('Checkout expiration'),
'attribute': encapsulate(
lambda document: document.checkout_info().expiration_datetime
)
},
],
}
def checkout_info(request, document_pk):
document = get_object_or_404(Document, pk=document_pk)
try:
Permission.check_permissions(
request.user, [
permission_document_checkout, permission_document_checkin
]
)
except PermissionDenied:
AccessControlList.objects.check_access(
[permission_document_checkout, permission_document_checkin],
request.user, document
)
paragraphs = [
_('Document status: %s') % STATE_LABELS[document.checkout_state()]
]
if document.is_checked_out():
checkout_info = document.checkout_info()
paragraphs.append(
_('User: %s') % (checkout_info.user.get_full_name() or checkout_info.user)
)
paragraphs.append(
_('Check out time: %s') % checkout_info.checkout_datetime
)
paragraphs.append(
_('Check out expiration: %s') % checkout_info.expiration_datetime
)
paragraphs.append(
_('New versions allowed: %s') % (_('Yes') if not checkout_info.block_new_version else _('No'))
)
return render_to_response(
'appearance/generic_template.html', {
'paragraphs': paragraphs,
'object': document,
'title': _('Check out details for document: %s') % document
},
context_instance=RequestContext(request)
)
class DocumentCheckinView(ConfirmView):
def get_object(self):
return get_object_or_404(Document, pk=self.kwargs['pk'])
def get_extra_context(self):
document = self.get_object()
context = {
'object': document,
}
if document.checkout_info().user != self.request.user:
context['title'] = _(
'You didn\'t originally checked out this document. '
'Forcefully check in the document: %s?'
) % document
else:
context['title'] = _('Check in the document: %s?') % document
return context
def object_action(self, request, obj):
document = obj
if document.checkout_info().user == request.user:
try:
Permission.check_permissions(
request.user, (permission_document_checkin,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_document_checkin, request.user, document
)
else:
try:
Permission.check_permissions(
request.user, (permission_document_checkin_override,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_document_checkin_override, request.user, document
)
try:
document.check_in(user=request.user)
except DocumentNotCheckedOut:
messages.error(request, _('Document has not been checked out.'))
except Exception as exception:
messages.error(
request, _('Error trying to check in document; %s') % exception
)
else:
messages.success(
request, _('Document "%s" checked in successfully.') % document
)
def get_post_action_redirect(self):
return reverse('checkouts:checkout_info', args=(self.get_object().pk,))
def post(self, request, *args, **kwargs):
self.object_action(request=request, obj=self.get_object())
return HttpResponseRedirect(self.get_success_url())