Files
mayan-edms/mayan/apps/documents/managers.py

207 lines
6.8 KiB
Python

from __future__ import unicode_literals
from datetime import timedelta
import logging
from django.apps import apps
from django.conf import settings
from django.db import models
from django.utils.timezone import now
from .literals import STUB_EXPIRATION_INTERVAL
from .settings import setting_recent_count
logger = logging.getLogger(__name__)
class DocumentManager(models.Manager):
def delete_stubs(self):
for stale_stub_document in self.filter(is_stub=True, date_added__lt=now() - timedelta(seconds=STUB_EXPIRATION_INTERVAL)):
stale_stub_document.delete(trash=False)
def get_by_natural_key(self, uuid):
return self.get(uuid=uuid)
def get_queryset(self):
return TrashedDocumentQuerySet(
self.model, using=self._db
)
def invalidate_cache(self):
for document in self.model.objects.all():
document.invalidate_cache()
class DocumentTypeManager(models.Manager):
def check_delete_periods(self):
logger.info('Executing')
for document_type in self.all():
logger.info(
'Checking deletion period of document type: %s', document_type
)
if document_type.delete_time_period and document_type.delete_time_unit:
delta = timedelta(
**{
document_type.delete_time_unit: document_type.delete_time_period
}
)
logger.info(
'Document type: %s, has a deletion period delta of: %s',
document_type, delta
)
for document in document_type.trashed_documents.filter(deleted_date_time__lt=now() - delta):
logger.info(
'Document "%s" with id: %d, trashed on: %s, exceded '
'delete period', document, document.pk,
document.deleted_date_time
)
document.delete()
else:
logger.info(
'Document type: %s, has a no retention delta', document_type
)
logger.info('Finshed')
def check_trash_periods(self):
logger.info('Executing')
for document_type in self.all():
logger.info(
'Checking trash period of document type: %s', document_type
)
if document_type.trash_time_period and document_type.trash_time_unit:
delta = timedelta(
**{
document_type.trash_time_unit: document_type.trash_time_period
}
)
logger.info(
'Document type: %s, has a trash period delta of: %s',
document_type, delta
)
for document in document_type.documents.filter(date_added__lt=now() - delta):
logger.info(
'Document "%s" with id: %d, added on: %s, exceded '
'trash period', document, document.pk,
document.date_added
)
document.delete()
else:
logger.info(
'Document type: %s, has a no retention delta', document_type
)
logger.info('Finshed')
def get_by_natural_key(self, label):
return self.get(label=label)
class NewVersionBlockManager(models.Manager):
def block(self, document):
self.get_or_create(document=document)
def unblock(self, document):
self.filter(document=document).delete()
def is_blocked(self, document):
return self.filter(document=document).exists()
class OrganizationDocumentManager(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return TrashedDocumentQuerySet(
self.model, using=self._db
).filter(in_trash=False).filter(
document_type__in=DocumentType.on_organization.all()
)
class OrganizationDocumentVersionManager(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return super(
OrganizationDocumentVersionManager, self
).get_queryset().filter(
document__document_type__in=DocumentType.on_organization.all()
)
class OrganizationDocumentTypeFilenameManager(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return super(
OrganizationDocumentTypeFilenameManager, self
).get_queryset().filter(
document_type__in=DocumentType.on_organization.all()
)
class OrganizationDocumentPage(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return super(
OrganizationDocumentPage, self
).get_queryset().filter(
document_version__document__document_type__in=DocumentType.on_organization.all()
)
class RecentDocumentManager(models.Manager):
def add_document_for_user(self, user, document):
if user.is_authenticated():
new_recent, created = self.model.objects.get_or_create(
user=user, document=document
)
if not created:
# document already in the recent list, just save to force
# accessed date and time update
new_recent.save()
recent_to_delete = self.filter(user=user).values_list('pk', flat=True)[setting_recent_count.value:]
self.filter(pk__in=list(recent_to_delete)).delete()
return new_recent
def get_for_user(self, user):
Document = apps.get_model('documents', 'Document')
if user.is_authenticated():
return Document.objects.filter(
recentdocument__user=user,
).order_by('-recentdocument__datetime_accessed')
else:
return Document.objects.none()
class TrashedDocumentManager(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return super(
TrashedDocumentManager, self
).get_queryset().filter(in_trash=True)
class OrganizationTrashedDocumentManager(models.Manager):
def get_queryset(self):
DocumentType = apps.get_model('documents', 'DocumentType')
return super(
OrganizationTrashedDocumentManager, self
).get_queryset().filter(in_trash=True).filter(
document_type__in=DocumentType.on_organization.all()
)
class TrashedDocumentQuerySet(models.QuerySet):
def delete(self, to_trash=True):
for instance in self:
instance.delete(to_trash=to_trash)