From 4322ac0a029ae07b98149c19491e997e6b990dbe Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 15 Jun 2012 19:30:08 -0400 Subject: [PATCH] Add support for selectively blocking new document version uploads when checking out documents --- apps/checkouts/__init__.py | 2 ++ apps/checkouts/forms.py | 2 +- apps/checkouts/managers.py | 12 ++++++++++-- apps/checkouts/models.py | 7 ++++++- apps/sources/views.py | 11 +++++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/apps/checkouts/__init__.py b/apps/checkouts/__init__.py index 701f1f1914..adb360a66c 100644 --- a/apps/checkouts/__init__.py +++ b/apps/checkouts/__init__.py @@ -19,6 +19,7 @@ def initialize_document_checkout_extra_methods(): Document.add_to_class('check_in', lambda document: DocumentCheckout.objects.check_in_document(document)) 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)) register_top_menu(name='checkouts', link=checkout_list) register_links(Document, [checkout_info], menu_name='form_header') @@ -37,3 +38,4 @@ initialize_document_checkout_extra_methods() #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 diff --git a/apps/checkouts/forms.py b/apps/checkouts/forms.py index 8f8aad89cb..d2032ed124 100644 --- a/apps/checkouts/forms.py +++ b/apps/checkouts/forms.py @@ -96,7 +96,7 @@ class DocumentCheckoutForm(forms.ModelForm): class Meta: model = DocumentCheckout - exclude = ('checkout_datetime', 'user_content_type', 'user_object_id', 'block_new_version') + exclude = ('checkout_datetime', 'user_content_type', 'user_object_id') widgets = { 'document': forms.widgets.HiddenInput(), diff --git a/apps/checkouts/managers.py b/apps/checkouts/managers.py index 75e323150c..68391106b4 100644 --- a/apps/checkouts/managers.py +++ b/apps/checkouts/managers.py @@ -26,10 +26,14 @@ class DocumentCheckoutManager(models.Manager): except self.model.DoesNotExist: raise DocumentNotCheckedOut else: + #create_history(HISTORY_DOCUMENT_DELETED, data={'user': request.user, 'document': document}) document_checkout.delete() def document_checkout_info(self, document): - return self.model.objects.get(document=document) + try: + return self.model.objects.get(document=document) + except self.model.DoesNotExist: + raise DocumentNotCheckedOut def document_checkout_state(self, document): if self.is_document_checked_out(document): @@ -37,4 +41,8 @@ class DocumentCheckoutManager(models.Manager): else: return STATE_CHECKED_IN - + def is_document_new_versions_allowed(self, document): + try: + return not self.document_checkout_info(document).block_new_version + except DocumentNotCheckedOut: + return True diff --git a/apps/checkouts/models.py b/apps/checkouts/models.py index 198cf78277..333703a746 100644 --- a/apps/checkouts/models.py +++ b/apps/checkouts/models.py @@ -23,11 +23,12 @@ class DocumentCheckout(models.Model): document = models.ForeignKey(Document, verbose_name=_(u'document'), unique=True) checkout_datetime = models.DateTimeField(verbose_name=_(u'check out date and time'), blank=True, null=True) expiration_datetime = models.DateTimeField(verbose_name=_(u'check out expiration date and time'), help_text=_(u'Amount of time to hold the document checked out in minutes.')) - block_new_version = models.BooleanField(verbose_name=_(u'block new version upload'), help_text=_(u'Do not allow new version of this document to be uploaded.')) user_content_type = models.ForeignKey(ContentType, null=True, blank=True) # blank and null added for ease of db migration user_object_id = models.PositiveIntegerField(null=True, blank=True) user_object = generic.GenericForeignKey(ct_field='user_content_type', fk_field='user_object_id') + block_new_version = models.BooleanField(default=True, verbose_name=_(u'block new version upload'), help_text=_(u'Do not allow new version of this document to be uploaded.')) + #block_metadata #block_editing #block tag add/remove @@ -47,6 +48,10 @@ class DocumentCheckout(models.Model): # raise DocumentAlreadyCheckedOut #else: raise + else: + #create_history(HISTORY_DOCUMENT_DELETED, data={'user': request.user, 'document': document}) + pass + #TODO: clean method that raises DocumentAlreadyCheckedOut diff --git a/apps/sources/views.py b/apps/sources/views.py index adb4df3611..c436e4daeb 100644 --- a/apps/sources/views.py +++ b/apps/sources/views.py @@ -15,6 +15,7 @@ from documents.permissions import (PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION) from documents.models import DocumentType, Document from documents.conf.settings import THUMBNAIL_SIZE +from documents.exceptions import NewDocumentVersionNotAllowed from metadata.api import decode_metadata_from_url, metadata_repr_as_list from permissions.models import Permission from common.utils import encapsulate @@ -174,6 +175,11 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No messages.warning(request, _(u'File was not a compressed file, uploaded as it was.')) return HttpResponseRedirect(request.get_full_path()) + except NewDocumentVersionNotAllowed: + if not document.is_new_versions_allowed(): + messages.error(request, _(u'The check out options for document currently don\'t allow new version uploads.')) + else: + messages.error(request, _(u'This document currently don\'t allow new version uploads.')) except Exception, e: if settings.DEBUG: raise @@ -253,6 +259,11 @@ def upload_interactive(request, source_type=None, source_id=None, document_pk=No return HttpResponseRedirect(reverse('document_view_simple', args=[document.pk])) else: return HttpResponseRedirect(request.get_full_path()) + except NewDocumentVersionNotAllowed: + if not document.is_new_versions_allowed: + messages.error(request, _(u'The check out options for document currently don\'t allow new version uploads.')) + else: + messages.error(request, _(u'This document currently don\'t allow new version uploads.')) except Exception, e: if settings.DEBUG: raise