Files
mayan-edms/mayan/apps/file_metadata/models.py
Roberto Rosario 0a7908baca File metadata: Add file metadata app
Add the file metadata app. This app uses binary wrappers called drivers
to extract properties from the file of documents. The default driver
uses the exiftool to extract the EXIF record from JPEG images.
The exiftool can also extra some properties from other files like
PDFs, office files and sound file.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2018-12-14 02:16:38 -04:00

118 lines
3.4 KiB
Python

from __future__ import unicode_literals
import logging
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.functional import cached_property
from django.utils.module_loading import import_string
from django.utils.translation import force_text
from django.utils.translation import ugettext_lazy as _
from mayan.apps.documents.models import DocumentType, DocumentVersion
from .managers import DocumentTypeSettingsManager
logger = logging.getLogger(__name__)
@python_2_unicode_compatible
class StoredDriver(models.Model):
driver_path = models.CharField(
max_length=255, verbose_name=_('Driver path')
)
internal_name = models.CharField(
db_index=True, max_length=128, verbose_name=_('Internal name')
)
class Meta:
ordering = ('internal_name',)
verbose_name = _('Driver')
verbose_name_plural = _('Drivers')
def __str__(self):
return force_text(self.driver_label)
@cached_property
def driver_class(self):
return import_string(self.driver_path)
@cached_property
def driver_label(self):
return self.driver_class.label
@python_2_unicode_compatible
class DocumentVersionDriverEntry(models.Model):
driver = models.ForeignKey(
related_name='driver_entries', to=StoredDriver,
verbose_name=_('Driver')
)
document_version = models.ForeignKey(
related_name='file_metadata_drivers', to=DocumentVersion,
verbose_name=_('Document version')
)
class Meta:
ordering = ('document_version', 'driver')
unique_together = ('driver', 'document_version')
verbose_name = _('Document version driver entry')
verbose_name_plural = _('Document version driver entries')
def __str__(self):
return force_text(self.driver)
def get_attribute_count(self):
return self.entries.count()
get_attribute_count.short_description = _('Attribute count')
class DocumentTypeSettings(models.Model):
"""
Model to store the file metadata settings for a document type.
"""
document_type = models.OneToOneField(
on_delete=models.CASCADE, related_name='file_metadata_settings',
to=DocumentType, unique=True, verbose_name=_('Document type')
)
auto_process = models.BooleanField(
default=True, verbose_name=_(
'Automatically queue newly created documents for processing.'
)
)
objects = DocumentTypeSettingsManager()
class Meta:
verbose_name = _('Document type settings')
verbose_name_plural = _('Document types settings')
def natural_key(self):
return self.document_type.natural_key()
natural_key.dependencies = ['documents.DocumentType']
@python_2_unicode_compatible
class FileMetadataEntry(models.Model):
document_version_driver_entry = models.ForeignKey(
related_name='entries', to=DocumentVersionDriverEntry,
verbose_name=_('Document version driver entry')
)
key = models.CharField(
db_index=True, max_length=255, verbose_name=_('Key')
)
value = models.CharField(
db_index=True, max_length=255, verbose_name=_('Value')
)
class Meta:
ordering = ('key', 'value')
verbose_name = _('File metadata entry')
verbose_name_plural = _('File metadata entries')
def __str__(self):
return '{}: {}: {}'.format(
self.document_version_driver_entry, self.key, self.value
)