diff --git a/mayan/apps/common/managers.py b/mayan/apps/common/managers.py index c99c8f631d..9dbcbe97d4 100644 --- a/mayan/apps/common/managers.py +++ b/mayan/apps/common/managers.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django.apps import apps +from django.contrib.auth import get_user_model from django.contrib.contenttypes.fields import GenericRelation from django.db import models @@ -11,3 +12,14 @@ class ErrorLogEntryManager(models.Manager): app_label='common', model_name='ErrorLogEntry' ) model.add_to_class('error_logs', GenericRelation(ErrorLogEntry)) + + +class UserLocaleProfileManager(models.Manager): + def get_by_natural_key(self, user_natural_key): + User = get_user_model() + try: + user = User.objects.get_by_natural_key(user_natural_key) + except User.DoesNotExist: + raise self.model.DoesNotExist + + return self.get(user__pk=user.pk) diff --git a/mayan/apps/common/models.py b/mayan/apps/common/models.py index 298f1dba0b..2bcc9232c0 100644 --- a/mayan/apps/common/models.py +++ b/mayan/apps/common/models.py @@ -11,7 +11,7 @@ from django.db import models from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ -from .managers import ErrorLogEntryManager +from .managers import ErrorLogEntryManager, UserLocaleProfileManager from .storages import storage_sharedupload @@ -88,9 +88,16 @@ class UserLocaleProfile(models.Model): choices=settings.LANGUAGES, max_length=8, verbose_name=_('Language') ) + objects = UserLocaleProfileManager() + class Meta: verbose_name = _('User locale profile') verbose_name_plural = _('User locale profiles') def __str__(self): return force_text(self.user) + + def natural_key(self): + return self.user.natural_key() + natural_key.dependencies = [settings.AUTH_USER_MODEL] + diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index d6d3dc7946..5efb8d9f80 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -6,6 +6,7 @@ import logging from django.apps import apps from django.db import models from django.db.models import F, Max +from django.utils.encoding import force_text from django.utils.timezone import now from .literals import STUB_EXPIRATION_INTERVAL @@ -20,7 +21,7 @@ class DocumentManager(models.Manager): stale_stub_document.delete(trash=False) def get_by_natural_key(self, uuid): - return self.model.passthrough.get(uuid=uuid) + return self.model.passthrough.get(uuid=force_text(uuid)) def get_queryset(self): return TrashCanQuerySet( @@ -33,7 +34,7 @@ class DocumentManager(models.Manager): class DocumentVersionManager(models.Manager): - def get_by_natural_key(self, checksum, document_natural_key): + def get_by_natural_key(self, document_natural_key, checksum): Document = apps.get_model( app_label='documents', model_name='Document' ) diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index f98afd2b5f..370cbd0ada 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -509,7 +509,7 @@ class DocumentVersion(models.Model): ) def natural_key(self): - return (self.checksum,) + self.document.natural_key() + return self.document.natural_key() + (self.checksum,) natural_key.dependencies = ['documents.Document'] def invalidate_cache(self): diff --git a/mayan/apps/metadata/managers.py b/mayan/apps/metadata/managers.py index 2a07fc459a..76f8830d19 100644 --- a/mayan/apps/metadata/managers.py +++ b/mayan/apps/metadata/managers.py @@ -24,16 +24,24 @@ class MetadataTypeManager(models.Manager): class DocumentTypeMetadataTypeManager(models.Manager): - def get_by_natural_key(self, metadata_type_name, document_natural_key): + def get_by_natural_key(self, document_natural_key, metadata_type_natural_key): Document = apps.get_model( app_label='documents', model_name='Document' ) + MetadataType = apps.get_model( + app_label='metadata', model_name='MetadataType' + ) try: document = Document.objects.get_by_natural_key(document_natural_key) except Document.DoesNotExist: raise self.model.DoesNotExist + else: + try: + metadata_type = MetadataType.objects.get_by_natural_key(metadata_type_natural_key) + except MetadataType.DoesNotExist: + raise self.model.DoesNotExist - return document.metadata.get(metadata_type_name=metadata_type_name) + return self.get(document__pk=document.pk, metadata_type__pk=metadata_type.pk) def get_metadata_types_for(self, document_type): DocumentType = apps.get_model( diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index 89d312d1b0..be67f0093b 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -111,7 +111,7 @@ class MetadataType(models.Model): ).exists() def natural_key(self): - return self.name + return (self.name,) def validate_value(self, document_type, value): # Check default @@ -190,7 +190,7 @@ class DocumentMetadata(models.Model): return super(DocumentMetadata, self).delete(*args, **kwargs) def natural_key(self): - return (self.metadata_type.name,) + self.document.natural_key() + return self.document.natural_key() + self.metadata_type.natural_key() natural_key.dependencies = ['documents.Document', 'metadata.MetadataType'] @property diff --git a/mayan/apps/ocr/managers.py b/mayan/apps/ocr/managers.py index 20de7b30b6..c6723e1926 100644 --- a/mayan/apps/ocr/managers.py +++ b/mayan/apps/ocr/managers.py @@ -102,4 +102,4 @@ class DocumentTypeSettingsManager(models.Manager): except DocumentType.DoesNotExist: raise self.model.DoesNotExist - return document_type.ocr_settings + return self.get(document_type__pk=document_type.pk)