diff --git a/apps/checkouts/__init__.py b/apps/checkouts/__init__.py index 3c9cc51b0b..1b3f2b740a 100644 --- a/apps/checkouts/__init__.py +++ b/apps/checkouts/__init__.py @@ -9,16 +9,18 @@ from scheduler.api import register_interval_job from documents.models import Document from documents.permissions import PERMISSION_DOCUMENT_VIEW from acls.api import class_permissions +from history.api import register_history_type from .permissions import (PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE) from .links import checkout_list, checkout_document, checkout_info, checkin_document from .models import DocumentCheckout from .tasks import task_check_expired_check_outs +from .events import HISTORY_DOCUMENT_CHECKED_OUT, HISTORY_DOCUMENT_CHECKED_IN def initialize_document_checkout_extra_methods(): Document.add_to_class('is_checked_out', lambda document: DocumentCheckout.objects.is_document_checked_out(document)) - Document.add_to_class('check_in', lambda document: DocumentCheckout.objects.check_in_document(document)) + Document.add_to_class('check_in', lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)) Document.add_to_class('checkout_info', lambda document: DocumentCheckout.objects.document_checkout_info(document)) Document.add_to_class('checkout_state', lambda document: DocumentCheckout.objects.document_checkout_state(document)) Document.add_to_class('is_new_versions_allowed', lambda document: DocumentCheckout.objects.is_document_new_versions_allowed(document)) @@ -34,15 +36,11 @@ class_permissions(Document, [ ]) CHECK_EXPIRED_CHECK_OUTS_INTERVAL=60 # Lowest check out expiration allowed -register_interval_job('task_check_expired_check_outs', _(u'Checks the OCR queue for pending documents.'), task_check_expired_check_outs, seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL) - +register_interval_job('task_check_expired_check_outs', _(u'Check expired check out documents and checks them in.'), task_check_expired_check_outs, seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL) initialize_document_checkout_extra_methods() +register_history_type(HISTORY_DOCUMENT_CHECKED_OUT) +register_history_type(HISTORY_DOCUMENT_CHECKED_IN) -#TODO: default checkout time #TODO: forcefull check in -#TODO: specify checkout option check (document.allows_new_versions()) -#TODO: out check in after expiration datetime #TODO: add checkin out history #TODO: limit restrictions to non checkout user and admins? - - diff --git a/apps/checkouts/events.py b/apps/checkouts/events.py new file mode 100644 index 0000000000..6d91d8d4ea --- /dev/null +++ b/apps/checkouts/events.py @@ -0,0 +1,15 @@ +from django.utils.translation import ugettext_lazy as _ + +HISTORY_DOCUMENT_CHECKED_OUT = { + 'namespace': 'checkouts', 'name': 'document_checked_out', + 'label': _(u'Document checked out'), + 'summary': _(u'Document "%(document)s" checked out by %(fullname)s.'), + 'expressions': {'fullname': 'user.get_full_name() if user.get_full_name() else user'} +} + +HISTORY_DOCUMENT_CHECKED_IN = { + 'namespace': 'checkouts', 'name': 'document_checked_in', + 'label': _(u'Document checked in'), + 'summary': _(u'Document "%(document)s" checked in by %(fullname)s.'), + 'expressions': {'fullname': 'user.get_full_name() if user.get_full_name() else user'} +} diff --git a/apps/checkouts/managers.py b/apps/checkouts/managers.py index bd995ac43d..bd3d815a12 100644 --- a/apps/checkouts/managers.py +++ b/apps/checkouts/managers.py @@ -1,22 +1,28 @@ from __future__ import absolute_import import datetime +import logging + from django.db import models from documents.models import Document +from history.api import create_history from .exceptions import DocumentNotCheckedOut from .literals import STATE_CHECKED_OUT, STATE_CHECKED_IN +from .events import HISTORY_DOCUMENT_CHECKED_IN + +logger = logging.getLogger(__name__) class DocumentCheckoutManager(models.Manager): - #TODO: 'check_expiration' method - def checked_out_documents(self): return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True)) def expired_check_outs(self): - return Document.objects.filter(pk__in=self.model.objects.filter(expiration_datetime__gt=datetime.datetime.now()).values_list('document__pk', flat=True)) + expired_list = Document.objects.filter(pk__in=self.model.objects.filter(expiration_datetime__lte=datetime.datetime.now()).values_list('document__pk', flat=True)) + logger.debug('expired_list: %s' % expired_list) + return expired_list def check_in_expired_check_outs(self): for document in self.expired_check_outs(): @@ -28,13 +34,14 @@ class DocumentCheckoutManager(models.Manager): else: return False - def check_in_document(self, document): + def check_in_document(self, document, user=None): try: document_checkout = self.model.objects.get(document=document) except self.model.DoesNotExist: raise DocumentNotCheckedOut else: - #create_history(HISTORY_DOCUMENT_DELETED, data={'user': request.user, 'document': document}) + if user: + create_history(HISTORY_DOCUMENT_CHECKED_IN, source_object=document, data={'user': user, 'document': document}) document_checkout.delete() def document_checkout_info(self, document): diff --git a/apps/checkouts/models.py b/apps/checkouts/models.py index 4600a99b1a..819b8856c3 100644 --- a/apps/checkouts/models.py +++ b/apps/checkouts/models.py @@ -9,9 +9,11 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from documents.models import Document +from history.api import create_history from .managers import DocumentCheckoutManager from .exceptions import DocumentAlreadyCheckedOut +from .events import HISTORY_DOCUMENT_CHECKED_OUT logger = logging.getLogger(__name__) @@ -42,7 +44,7 @@ class DocumentCheckout(models.Model): if not self.pk: self.checkout_datetime = datetime.datetime.now() result = super(DocumentCheckout, self).save(*args, **kwargs) - #create_history(HISTORY_DOCUMENT_DELETED, data={'user': request.user, 'document': document}) + create_history(HISTORY_DOCUMENT_CHECKED_OUT, source_object=self.document, data={'user': self.user_object, 'document': self.document}) return result @models.permalink diff --git a/apps/checkouts/views.py b/apps/checkouts/views.py index 97a28ba446..ff52336f38 100644 --- a/apps/checkouts/views.py +++ b/apps/checkouts/views.py @@ -111,7 +111,7 @@ def checkin_document(request, document_pk): if request.method == 'POST': try: - document.check_in() + document.check_in(user=request.user) except DocumentNotCheckedOut: messages.error(request, _(u'Document has not been checked out.')) except Exception, exc: