Compare commits

...

1 Commits

Author SHA1 Message Date
Roberto Rosario
d29fb86c55 Initial commit to support filename generators
Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
2019-09-25 00:08:32 -04:00
5 changed files with 67 additions and 5 deletions

View File

@@ -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)

View File

@@ -5,11 +5,20 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList from mayan.apps.acls.models import AccessControlList
from ..classes import BaseDocumentFilenameGenerator
from ..models import DocumentType, DocumentTypeFilename from ..models import DocumentType, DocumentTypeFilename
__all__ = ('DocumentTypeFilteredSelectForm', 'DocumentTypeFilenameForm_create') __all__ = ('DocumentTypeFilteredSelectForm', 'DocumentTypeFilenameForm_create')
class DocumentTypeForm(forms.ModelForm):
#filename_generator = forms.
class Meta:
fields = ('label', 'filename_generator')
model = DocumentType
class DocumentTypeFilteredSelectForm(forms.Form): class DocumentTypeFilteredSelectForm(forms.Form):
""" """
Form to select the document type of a document to be created. This form Form to select the document type of a document to be created. This form

View File

@@ -11,6 +11,7 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList from mayan.apps.acls.models import AccessControlList
from mayan.apps.common.literals import TIME_DELTA_UNIT_CHOICES 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 ..events import event_document_type_created, event_document_type_edited
from ..literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from ..literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT
from ..managers import DocumentTypeManager from ..managers import DocumentTypeManager
@@ -52,6 +53,12 @@ class DocumentType(models.Model):
default=DEFAULT_DELETE_TIME_UNIT, max_length=8, null=True, default=DEFAULT_DELETE_TIME_UNIT, max_length=8, null=True,
verbose_name=_('Delete time unit') 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() objects = DocumentTypeManager()
@@ -94,6 +101,10 @@ class DocumentType(models.Model):
return queryset.count() 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): def natural_key(self):
return (self.label,) return (self.label,)

View File

@@ -4,7 +4,6 @@ import hashlib
import logging import logging
import os import os
import shutil import shutil
import uuid
from django.apps import apps from django.apps import apps
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
@@ -37,8 +36,10 @@ def hash_function():
return hashlib.sha256() return hashlib.sha256()
def UUID_FUNCTION(*args, **kwargs): def upload_to(instance, filename):
return force_text(uuid.uuid4()) return instance.document.document_type.get_upload_filename(
instance=instance, filename=filename
)
@python_2_unicode_compatible @python_2_unicode_compatible
@@ -86,7 +87,7 @@ class DocumentVersion(models.Model):
# File related fields # File related fields
file = models.FileField( file = models.FileField(
storage=storage_documentversion, upload_to=UUID_FUNCTION, storage=storage_documentversion, upload_to=upload_to,
verbose_name=_('File') verbose_name=_('File')
) )
mimetype = models.CharField( mimetype = models.CharField(

View File

@@ -82,7 +82,9 @@ class DocumentTypeListView(SingleObjectListView):
class DocumentTypeCreateView(SingleObjectCreateView): class DocumentTypeCreateView(SingleObjectCreateView):
fields = ('label',) fields = ('label',)
model = DocumentType 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 view_permission = permission_document_type_create
def get_extra_context(self): def get_extra_context(self):