Add support for selectively blocking new document version uploads when checking out documents
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user