From e9210c5f7a55a78683f15caca6b5f1819fdc8f25 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 28 Jun 2012 15:56:43 -0400 Subject: [PATCH] Implement forcefull document check ins --- apps/checkouts/managers.py | 8 ++++++-- apps/checkouts/views.py | 29 +++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/apps/checkouts/managers.py b/apps/checkouts/managers.py index 0b7ab1ab39..b4c241bd3e 100644 --- a/apps/checkouts/managers.py +++ b/apps/checkouts/managers.py @@ -13,7 +13,8 @@ from acls.models import AccessEntry from .exceptions import DocumentNotCheckedOut from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN -from .events import HISTORY_DOCUMENT_CHECKED_IN, HISTORY_DOCUMENT_AUTO_CHECKED_IN +from .events import (HISTORY_DOCUMENT_CHECKED_IN, HISTORY_DOCUMENT_AUTO_CHECKED_IN, + HISTORY_DOCUMENT_FORCEFUL_CHECK_IN) from .permissions import PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE from history.api import create_history @@ -46,7 +47,10 @@ class DocumentCheckoutManager(models.Manager): raise DocumentNotCheckedOut else: if user: - create_history(HISTORY_DOCUMENT_CHECKED_IN, source_object=document, data={'user': user, 'document': document}) + if self.document_checkout_info(document).user_object != user: + create_history(HISTORY_DOCUMENT_FORCEFUL_CHECK_IN, source_object=document, data={'user': user, 'document': document}) + else: + create_history(HISTORY_DOCUMENT_CHECKED_IN, source_object=document, data={'user': user, 'document': document}) else: create_history(HISTORY_DOCUMENT_AUTO_CHECKED_IN, source_object=document, data={'document': document}) diff --git a/apps/checkouts/views.py b/apps/checkouts/views.py index ff52336f38..8ba2930ada 100644 --- a/apps/checkouts/views.py +++ b/apps/checkouts/views.py @@ -17,7 +17,8 @@ from common.utils import get_object_name from common.utils import encapsulate from .models import DocumentCheckout -from .permissions import PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN +from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, + PERMISSION_DOCUMENT_CHECKIN_OVERRIDE) from .forms import DocumentCheckoutForm from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN, STATE_ICONS, STATE_LABELS @@ -99,13 +100,21 @@ def checkout_document(request, document_pk): def checkin_document(request, document_pk): document = get_object_or_404(Document, pk=document_pk) post_action_redirect = reverse('checkout_info', args=[document.pk]) - # TODO: add forcefull checkin - # TODO: check user - try: - Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKIN]) - except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKIN, request.user, document) + # If the user trying to check in the document is the same as the check out + # user just check for the normal permission otherwise check for the forceful + # checkin permission + if document.checkout_info().user_object == request.user: + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKIN]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKIN, request.user, document) + else: + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKIN_OVERRIDE]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_CHECKIN_OVERRIDE, request.user, document) + 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', '/'))) @@ -127,8 +136,12 @@ def checkin_document(request, document_pk): 'next': next, 'form_icon': u'basket_remove.png', 'object': document, - 'title': _(u'Are you sure you wish to check in document: %s') % document } + if document.checkout_info().user_object != request.user: + context['title'] = _(u'You didn\'t originally checked out this document. Are you sure you wish to forcefully check in document: %s?') % document + else: + context['title'] = _(u'Are you sure you wish to check in document: %s?') % document + return render_to_response('generic_confirm.html', context, context_instance=RequestContext(request))