Files
mayan-edms/mayan/apps/checkouts/models.py
Roberto Rosario 8e69178e07 Project: Switch to full app paths
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.

This app name claves with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.

Every app reference is now prepended with 'mayan.apps'.

Existing config.yml files need to be updated manually.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2018-12-05 02:04:20 -04:00

118 lines
3.6 KiB
Python

from __future__ import unicode_literals
import logging
from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import models
from django.urls import reverse
from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from mayan.apps.documents.models import Document
from .events import event_document_check_out
from .exceptions import DocumentAlreadyCheckedOut
from .managers import DocumentCheckoutManager, NewVersionBlockManager
logger = logging.getLogger(__name__)
@python_2_unicode_compatible
class DocumentCheckout(models.Model):
"""
Model to store the state and information of a document checkout.
"""
document = models.OneToOneField(
on_delete=models.CASCADE, to=Document, verbose_name=_('Document')
)
checkout_datetime = models.DateTimeField(
auto_now_add=True, verbose_name=_('Check out date and time')
)
expiration_datetime = models.DateTimeField(
help_text=_(
'Amount of time to hold the document checked out in minutes.'
),
verbose_name=_('Check out expiration date and time')
)
user = models.ForeignKey(
on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL,
verbose_name=_('User')
)
block_new_version = models.BooleanField(
default=True,
help_text=_(
'Do not allow new version of this document to be uploaded.'
),
verbose_name=_('Block new version upload')
)
objects = DocumentCheckoutManager()
class Meta:
ordering = ('pk',)
verbose_name = _('Document checkout')
verbose_name_plural = _('Document checkouts')
def __str__(self):
return force_text(self.document)
def clean(self):
if self.expiration_datetime < now():
raise ValidationError(
_('Check out expiration date and time must be in the future.')
)
def delete(self, *args, **kwargs):
# TODO: enclose in transaction
NewVersionBlock.objects.unblock(self.document)
super(DocumentCheckout, self).delete(*args, **kwargs)
def get_absolute_url(self):
return reverse('checkout:checkout_info', args=(self.document.pk,))
def natural_key(self):
return self.document.natural_key()
natural_key.dependencies = ['documents.Document']
def save(self, *args, **kwargs):
# TODO: enclose in transaction
new_checkout = not self.pk
if not new_checkout or self.document.is_checked_out():
raise DocumentAlreadyCheckedOut
result = super(DocumentCheckout, self).save(*args, **kwargs)
if new_checkout:
event_document_check_out.commit(
actor=self.user, target=self.document
)
if self.block_new_version:
NewVersionBlock.objects.block(self.document)
logger.info(
'Document "%s" checked out by user "%s"',
self.document, self.user
)
return result
class NewVersionBlock(models.Model):
"""
Model to keep track of which documents have new version upload restricted.
"""
document = models.ForeignKey(
on_delete=models.CASCADE, to=Document, verbose_name=_('Document')
)
objects = NewVersionBlockManager()
class Meta:
verbose_name = _('New version block')
verbose_name_plural = _('New version blocks')
def natural_key(self):
return self.document.natural_key()
natural_key.dependencies = ['documents.Document']