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>
This commit is contained in:
Roberto Rosario
2018-12-14 02:16:38 -04:00
parent 1efec6bd41
commit 0a7908baca
33 changed files with 1309 additions and 22 deletions

View File

@@ -0,0 +1,80 @@
from __future__ import unicode_literals
import logging
from django.apps import apps
from .events import event_file_metadata_document_version_finish
from .exceptions import FileMetadataDriverError
from .signals import post_document_version_file_metadata_processing
logger = logging.getLogger(__name__)
class FileMetadataDriver(object):
_registry = {}
@classmethod
def register(cls, mimetypes):
for mimetype in mimetypes:
cls._registry.setdefault(mimetype, []).append(cls)
@classmethod
def process_document_version(cls, document_version):
for driver_class in cls._registry.get(document_version.mimetype, ()):
try:
driver = driver_class()
driver.process(document_version=document_version)
except FileMetadataDriverError:
# If driver raises error, try next in the list
pass
else:
# If driver was successfull there is no need to try
# others in the list for this mimetype
event_file_metadata_document_version_finish.commit(
action_object=document_version.document,
target=document_version
)
post_document_version_file_metadata_processing.send(
sender=document_version.__class__,
instance=document_version
)
return
def process(self, document_version):
logger.info(
'Starting processing document version: %s', document_version
)
StoredDriver = apps.get_model(
app_label='file_metadata', model_name='StoredDriver'
)
driver_path = '.'.join([self.__module__, self.__class__.__name__])
driver, created = StoredDriver.objects.get_or_create(
driver_path=driver_path, defaults={
'internal_name': self.internal_name
}
)
driver.driver_entries.filter(
document_version=document_version
).delete()
document_version_driver_entry = driver.driver_entries.create(
document_version=document_version
)
for key, value in self._process(document_version=document_version).items():
document_version_driver_entry.entries.create(
key=key, value=value
)
def _process(self, document_version):
raise NotImplementedError(
'Your %s class has not defined the required '
'process_document_version() method.' % self.__class__.__name__
)