diff --git a/HISTORY.rst b/HISTORY.rst index e00fd4b067..1b91c2a195 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -94,6 +94,7 @@ management app. * Move the purge permission logic to the StorePermission manager. +* Remove the MIMETYPE_FILE_READ_SIZE setting. 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index 31b74c858b..2262aaaeec 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -126,6 +126,7 @@ Other changes management app. * Move the purge permission logic to the StorePermission manager. +* Remove the MIMETYPE_FILE_READ_SIZE setting. Removals -------- diff --git a/mayan/apps/mimetype/api.py b/mayan/apps/mimetype/api.py index f6e8555b9e..c004b80721 100644 --- a/mayan/apps/mimetype/api.py +++ b/mayan/apps/mimetype/api.py @@ -1,8 +1,10 @@ from __future__ import unicode_literals +from shutil import copyfileobj + import magic -from .settings import setting_file_read_size +from mayan.apps.storage.utils import NamedTemporaryFile def get_mimetype(file_object, mimetype_only=False): @@ -13,22 +15,27 @@ def get_mimetype(file_object, mimetype_only=False): file_mimetype = None file_mime_encoding = None - read_size = setting_file_read_size.value - if read_size == 0: - # If the setting value is 0 that means disable read limit. To disable - # the read limit passing None won't work, we pass -1 instead as per - # the Python documentation. - # https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects - read_size = -1 - - mime = magic.Magic(mime=True) - file_mimetype = mime.from_buffer(file_object.read(read_size)) + temporary_file_object = NamedTemporaryFile() file_object.seek(0) + copyfileobj(fsrc=file_object, fdst=temporary_file_object) + file_object.seek(0) + temporary_file_object.seek(0) + + kwargs = {'mime': True} if not mimetype_only: - file_object.seek(0) - mime_encoding = magic.Magic(mime_encoding=True) - file_mime_encoding = mime_encoding.from_buffer(file_object.read(read_size)) - file_object.seek(0) + kwargs['mime_encoding'] = True + + try: + mime = magic.Magic(**kwargs) + + if mimetype_only: + file_mimetype = mime.from_file(filename=temporary_file_object.name) + else: + file_mimetype, file_mime_encoding = mime.from_file( + filename=temporary_file_object.name + ).split('; charset=') + finally: + temporary_file_object.close() return file_mimetype, file_mime_encoding diff --git a/mayan/apps/mimetype/literals.py b/mayan/apps/mimetype/literals.py deleted file mode 100644 index 6d082d12c4..0000000000 --- a/mayan/apps/mimetype/literals.py +++ /dev/null @@ -1,3 +0,0 @@ -from __future__ import unicode_literals - -DEFAULT_MIMETYPE_FILE_READ_SIZE = 1024 diff --git a/mayan/apps/mimetype/settings.py b/mayan/apps/mimetype/settings.py deleted file mode 100644 index 7b1bd05b72..0000000000 --- a/mayan/apps/mimetype/settings.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import unicode_literals - -from django.utils.translation import ugettext_lazy as _ - -from mayan.apps.smart_settings import Namespace - -from .literals import DEFAULT_MIMETYPE_FILE_READ_SIZE - -namespace = Namespace(label=_('MIME type'), name='mimetype') - -setting_file_read_size = namespace.add_setting( - default=DEFAULT_MIMETYPE_FILE_READ_SIZE, - global_name='MIMETYPE_FILE_READ_SIZE', help_text=_( - 'Amount of bytes to read from a document to determine its MIME type. ' - 'Setting it to 0 disables the feature and attempts to read the entire ' - 'document file into memory.' - ) -)