mirror of
https://github.com/camptocamp/odoo-cloud-platform.git
synced 2026-06-24 16:48:36 +00:00
[IMP] route file to db base on size and mimetype
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
'category': 'Knowledge Management',
|
'category': 'Knowledge Management',
|
||||||
'depends': ['base'],
|
'depends': ['base'],
|
||||||
'website': 'http://www.camptocamp.com',
|
'website': 'http://www.camptocamp.com',
|
||||||
'data': [],
|
'data': ['data/res_config_settings_data.xml'],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'auto_install': True,
|
'auto_install': True,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<odoo noupdate="1">
|
||||||
|
<record id="default_mimes_type_storedb" model="ir.config_parameter">
|
||||||
|
<field name="key">mimetypes.list.storedb</field>
|
||||||
|
<field name="value">image</field>
|
||||||
|
</record>
|
||||||
|
<record id="default_file_maxsize_storedb" model="ir.config_parameter">
|
||||||
|
<field name="key">file.maxsize.storedb</field>
|
||||||
|
<field name="value">50000</field>
|
||||||
|
</record>
|
||||||
|
<record id="excluded_model_storedb" model="ir.config_parameter">
|
||||||
|
<field name="key">excluded.models.storedb</field>
|
||||||
|
<field name="value">mail.message,mail.mail</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -10,6 +10,7 @@ import odoo
|
|||||||
|
|
||||||
from contextlib import closing, contextmanager
|
from contextlib import closing, contextmanager
|
||||||
from odoo import api, exceptions, models, _
|
from odoo import api, exceptions, models, _
|
||||||
|
from odoo.tools.mimetypes import guess_mimetype
|
||||||
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
@@ -37,8 +38,6 @@ def clean_fs(files):
|
|||||||
class IrAttachment(models.Model):
|
class IrAttachment(models.Model):
|
||||||
_inherit = 'ir.attachment'
|
_inherit = 'ir.attachment'
|
||||||
|
|
||||||
_local_fields = ('image_small', 'image_medium', 'web_icon_data')
|
|
||||||
|
|
||||||
def _register_hook(self):
|
def _register_hook(self):
|
||||||
super()._register_hook()
|
super()._register_hook()
|
||||||
location = self.env.context.get('storage_location') or self._storage()
|
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':
|
if self.res_model == 'ir.ui.view':
|
||||||
# assets are stored in 'ir.ui.view'
|
# assets are stored in 'ir.ui.view'
|
||||||
return True
|
return True
|
||||||
|
# Check if model must never be stored on DB
|
||||||
# Binary fields
|
excluded_model_settings = self.env['ir.config_parameter'].sudo().\
|
||||||
if self.res_field:
|
get_param('excluded.models.storedb', default='')
|
||||||
# Binary fields are stored with the name of the field in
|
excluded_model_for_db_store = excluded_model_settings.split(',')
|
||||||
# 'res_field'
|
if self.res_model in excluded_model_for_db_store:
|
||||||
# 'image' fields can be rather large and should usually
|
return False
|
||||||
# not be requests in bulk in lists
|
# Check if file size and mimetype fit requirements
|
||||||
if self.res_field and self.res_field in self._local_fields:
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user