From 06265292283185527bb5401f42ad099afd2b13bc Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 3 Aug 2018 18:52:13 -0400 Subject: [PATCH] Add natural key support to Document pages. Signed-off-by: Roberto Rosario --- mayan/apps/documents/managers.py | 40 +++++++++++++++++++++++++++++--- mayan/apps/documents/models.py | 16 +++++++++---- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index 5efb8d9f80..5a835ec83c 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -4,6 +4,7 @@ from datetime import timedelta import logging from django.apps import apps +from django.contrib.auth import get_user_model from django.db import models from django.db.models import F, Max from django.utils.encoding import force_text @@ -33,17 +34,30 @@ class DocumentManager(models.Manager): document.invalidate_cache() +class DocumentPageManager(models.Manager): + def get_by_natural_key(self, page_number, document_version_natural_key): + DocumentVersion = apps.get_model( + app_label='documents', model_name='DocumentVersion' + ) + try: + document_version = DocumentVersion.objects.get_by_natural_key(*document_version_natural_key) + except DocumentVersion.DoesNotExist: + raise self.model.DoesNotExist + + return self.get(document_version__pk=document_version.pk, page_number=page_number) + + class DocumentVersionManager(models.Manager): - def get_by_natural_key(self, document_natural_key, checksum): + def get_by_natural_key(self, checksum, document_natural_key): Document = apps.get_model( app_label='documents', model_name='Document' ) try: - document = Document.objects.get_by_natural_key(document_natural_key) + document = Document.objects.get_by_natural_key(*document_natural_key) except Document.DoesNotExist: raise self.model.DoesNotExist - return document.versions.get(checksum=checksum) + return self.get(document__pk=document.pk, checksum=checksum) class DocumentTypeManager(models.Manager): @@ -189,6 +203,26 @@ class RecentDocumentManager(models.Manager): self.filter(pk__in=list(recent_to_delete)).delete() return new_recent + def get_by_natural_key(self, datetime_accessed, document_natural_key, user_natural_key): + Document = apps.get_model( + app_label='documents', model_name='Document' + ) + User = get_user_model() + try: + document = Document.objects.get_by_natural_key(*document_natural_key) + except Document.DoesNotExist: + raise self.model.DoesNotExist + else: + try: + user = User.objects.get_by_natural_key(*user_natural_key) + except User.DoesNotExist: + raise self.model.DoesNotExist + + return self.get( + document__pk=document.pk, user__pk=user.pk, + datetime_accessed=datetime_accessed + ) + def get_for_user(self, user): document_model = apps.get_model('documents', 'document') diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 370cbd0ada..aeb8791e9a 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -33,9 +33,9 @@ from .events import ( ) from .literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from .managers import ( - DocumentManager, DocumentVersionManager, DocumentTypeManager, - DuplicatedDocumentManager, PassthroughManager, RecentDocumentManager, - TrashCanManager + DocumentManager, DocumentPageManager, DocumentVersionManager, + DocumentTypeManager, DuplicatedDocumentManager, PassthroughManager, + RecentDocumentManager, TrashCanManager ) from .permissions import permission_document_view from .settings import ( @@ -509,7 +509,7 @@ class DocumentVersion(models.Model): ) def natural_key(self): - return self.document.natural_key() + (self.checksum,) + return (self.checksum, self.document.natural_key()) natural_key.dependencies = ['documents.Document'] def invalidate_cache(self): @@ -735,6 +735,8 @@ class DocumentPage(models.Model): verbose_name=_('Page number') ) + objects = DocumentPageManager() + class Meta: ordering = ('page_number',) verbose_name = _('Document page') @@ -894,6 +896,10 @@ class DocumentPage(models.Model): for cached_image in self.cached_images.all(): cached_image.delete() + def natural_key(self): + return (self.page_number, self.document_version.natural_key()) + natural_key.dependencies = ['documents.DocumentVersion'] + @property def siblings(self): return DocumentPage.objects.filter( @@ -962,7 +968,7 @@ class RecentDocument(models.Model): return force_text(self.document) def natural_key(self): - return self.document.natural_key() + self.user.natural_key() + return (self.datetime_accessed, self.document.natural_key(), self.user.natural_key()) natural_key.dependencies = ['documents.Document', settings.AUTH_USER_MODEL]