From 29e6271a700fd119cbfe86701382b1fd76a5a47d Mon Sep 17 00:00:00 2001 From: vrenaville Date: Tue, 3 Dec 2019 14:44:15 +0100 Subject: [PATCH] [IMP] route file to db base on size and mimetype --- .../__manifest__.py | 2 +- .../data/res_config_settings_data.xml | 16 ++++++++++ .../models/ir_attachment.py | 30 ++++++++++++------- 3 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 base_attachment_object_storage/data/res_config_settings_data.xml diff --git a/base_attachment_object_storage/__manifest__.py b/base_attachment_object_storage/__manifest__.py index ed66fea..76a1a13 100644 --- a/base_attachment_object_storage/__manifest__.py +++ b/base_attachment_object_storage/__manifest__.py @@ -10,7 +10,7 @@ 'category': 'Knowledge Management', 'depends': ['base'], 'website': 'http://www.camptocamp.com', - 'data': [], + 'data': ['data/res_config_settings_data.xml'], 'installable': True, 'auto_install': True, } diff --git a/base_attachment_object_storage/data/res_config_settings_data.xml b/base_attachment_object_storage/data/res_config_settings_data.xml new file mode 100644 index 0000000..199d1f5 --- /dev/null +++ b/base_attachment_object_storage/data/res_config_settings_data.xml @@ -0,0 +1,16 @@ + + + + mimetypes.list.storedb + image + + + file.maxsize.storedb + 50000 + + + excluded.models.storedb + mail.message,mail.mail + + + diff --git a/base_attachment_object_storage/models/ir_attachment.py b/base_attachment_object_storage/models/ir_attachment.py index 0caa39a..596fb1e 100644 --- a/base_attachment_object_storage/models/ir_attachment.py +++ b/base_attachment_object_storage/models/ir_attachment.py @@ -10,6 +10,7 @@ import odoo from contextlib import closing, contextmanager from odoo import api, exceptions, models, _ +from odoo.tools.mimetypes import guess_mimetype _logger = logging.getLogger(__name__) @@ -37,8 +38,6 @@ def clean_fs(files): class IrAttachment(models.Model): _inherit = 'ir.attachment' - _local_fields = ('image_small', 'image_medium', 'web_icon_data') - def _register_hook(self): super()._register_hook() location = self.env.context.get('storage_location') or self._storage() @@ -87,14 +86,25 @@ class IrAttachment(models.Model): if self.res_model == 'ir.ui.view': # assets are stored in 'ir.ui.view' return True - - # Binary fields - if self.res_field: - # Binary fields are stored with the name of the field in - # 'res_field' - # 'image' fields can be rather large and should usually - # not be requests in bulk in lists - if self.res_field and self.res_field in self._local_fields: + # Check if model must never be stored on DB + excluded_model_settings = self.env['ir.config_parameter'].sudo().\ + get_param('excluded.models.storedb', default='') + excluded_model_for_db_store = excluded_model_settings.split(',') + if self.res_model in excluded_model_for_db_store: + return False + # Check if file size and mimetype fit requirements + data_to_store = self.datas + bin_data = base64.b64decode(data_to_store) if data_to_store else '' + current_mimetype = guess_mimetype(bin_data) + mimetypes_settings = self.env['ir.config_parameter'].sudo().get_param( + 'mimetypes.list.storedb', default='') + mimetypes_for_db_store = mimetypes_settings.split(',') + if any(current_mimetype.startswith(val) for val in + mimetypes_for_db_store): + # get allowed size + filesize = self.env['ir.config_parameter'].sudo().get_param( + 'file.maxsize.storedb', default='0') + if len(bin_data) < int(filesize): return True return False