From d29fb86c559ecf1c115f6d4b61af68a0c10f7fe2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 25 Sep 2019 00:08:32 -0400 Subject: [PATCH] Initial commit to support filename generators Signed-off-by: Roberto Rosario --- mayan/apps/documents/classes.py | 39 +++++++++++++++++++ .../documents/forms/document_type_forms.py | 9 +++++ .../documents/models/document_type_models.py | 11 ++++++ .../models/document_version_models.py | 9 +++-- .../documents/views/document_type_views.py | 4 +- 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 mayan/apps/documents/classes.py diff --git a/mayan/apps/documents/classes.py b/mayan/apps/documents/classes.py new file mode 100644 index 0000000000..c6cd841139 --- /dev/null +++ b/mayan/apps/documents/classes.py @@ -0,0 +1,39 @@ +from __future__ import absolute_import, unicode_literals + +import uuid + +from django.utils.translation import ugettext_lazy as _ + + +class BaseDocumentFilenameGenerator(object): + _registry = {} + + @classmethod + def get(cls, name): + return cls._registry[name] + + @classmethod + def get_choices(cls): + return sorted( + [ + (name, klass.label) for name, klass in cls._registry.items() + ] + ) + + @classmethod + def register(cls, klass): + cls._registry[klass.name] = klass + + def upload_to(self, instance, filename): + raise NotImplementedError + + +class UUIDDocumentFilenameGenerator(BaseDocumentFilenameGenerator): + name = 'uuid' + label = _('UUID') + + def upload_to(self, instance, filename): + return force_text(uuid.uuid4()) + + +BaseDocumentFilenameGenerator.register(klass=UUIDDocumentFilenameGenerator) diff --git a/mayan/apps/documents/forms/document_type_forms.py b/mayan/apps/documents/forms/document_type_forms.py index cc8a029a03..f15bef5455 100644 --- a/mayan/apps/documents/forms/document_type_forms.py +++ b/mayan/apps/documents/forms/document_type_forms.py @@ -5,11 +5,20 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.acls.models import AccessControlList +from ..classes import BaseDocumentFilenameGenerator from ..models import DocumentType, DocumentTypeFilename __all__ = ('DocumentTypeFilteredSelectForm', 'DocumentTypeFilenameForm_create') +class DocumentTypeForm(forms.ModelForm): + #filename_generator = forms. + + class Meta: + fields = ('label', 'filename_generator') + model = DocumentType + + class DocumentTypeFilteredSelectForm(forms.Form): """ Form to select the document type of a document to be created. This form diff --git a/mayan/apps/documents/models/document_type_models.py b/mayan/apps/documents/models/document_type_models.py index 15b0a2b9e6..c8ce07ad5a 100644 --- a/mayan/apps/documents/models/document_type_models.py +++ b/mayan/apps/documents/models/document_type_models.py @@ -11,6 +11,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.acls.models import AccessControlList from mayan.apps.common.literals import TIME_DELTA_UNIT_CHOICES +from ..classes import BaseDocumentFilenameGenerator from ..events import event_document_type_created, event_document_type_edited from ..literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from ..managers import DocumentTypeManager @@ -52,6 +53,12 @@ class DocumentType(models.Model): default=DEFAULT_DELETE_TIME_UNIT, max_length=8, null=True, verbose_name=_('Delete time unit') ) + filename_generator = models.CharField( + help_text=_( + 'The class responsible for producing the actual filename used ' + 'to store the uploaded documents.' + ), max_length=128, verbose_name=_('Filename generator') + ) objects = DocumentTypeManager() @@ -94,6 +101,10 @@ class DocumentType(models.Model): return queryset.count() + def get_upload_filename(self, instance, filename): + klass = BaseDocumentFilenameGenerator.get(name=self.filename_generator) + return klass.upload_to(instance=instance, filename=filename) + def natural_key(self): return (self.label,) diff --git a/mayan/apps/documents/models/document_version_models.py b/mayan/apps/documents/models/document_version_models.py index 78b837860d..391e44bf60 100644 --- a/mayan/apps/documents/models/document_version_models.py +++ b/mayan/apps/documents/models/document_version_models.py @@ -4,7 +4,6 @@ import hashlib import logging import os import shutil -import uuid from django.apps import apps from django.core.files.base import ContentFile @@ -37,8 +36,10 @@ def hash_function(): return hashlib.sha256() -def UUID_FUNCTION(*args, **kwargs): - return force_text(uuid.uuid4()) +def upload_to(instance, filename): + return instance.document.document_type.get_upload_filename( + instance=instance, filename=filename + ) @python_2_unicode_compatible @@ -86,7 +87,7 @@ class DocumentVersion(models.Model): # File related fields file = models.FileField( - storage=storage_documentversion, upload_to=UUID_FUNCTION, + storage=storage_documentversion, upload_to=upload_to, verbose_name=_('File') ) mimetype = models.CharField( diff --git a/mayan/apps/documents/views/document_type_views.py b/mayan/apps/documents/views/document_type_views.py index 6912751507..6fd2d48842 100644 --- a/mayan/apps/documents/views/document_type_views.py +++ b/mayan/apps/documents/views/document_type_views.py @@ -82,7 +82,9 @@ class DocumentTypeListView(SingleObjectListView): class DocumentTypeCreateView(SingleObjectCreateView): fields = ('label',) model = DocumentType - post_action_redirect = reverse_lazy(viewname='documents:document_type_list') + post_action_redirect = reverse_lazy( + viewname='documents:document_type_list' + ) view_permission = permission_document_type_create def get_extra_context(self):