Files

62 lines
2.1 KiB
Python
Raw Permalink Normal View History

2026-07-01 14:41:49 +07:00
from odoo import models, _, api, fields
from odoo.exceptions import UserError
class IrAttachment(models.Model):
_inherit = 'ir.attachment'
def create(self, vals_list):
# 1. Get the limit from system parameters (set via res.config.settings)
# Default to 2048 MB (2 GB) if not set in settings
max_size_mb = float(self.env['ir.config_parameter'].sudo().get_param(
'attachment_size.max_attachment_size', default=2048.0
))
# 2. Convert MB to bytes
max_size_bytes = max_size_mb * 1024 * 1024
# 3. Validate file size
for vals in vals_list:
if vals.get('datas'):
# Base64 increases size by ~33%, so we check against max_size_bytes * 4 / 3
if len(vals['datas']) > (max_size_bytes * 4 / 3):
raise UserError(_(
"File size exceeds the maximum allowed limit of %(max_size)s MB.",
max_size=max_size_mb
))
return super().create(vals_list)
class FileSizeConfigSetting(models.TransientModel):
_inherit = 'res.config.settings'
max_attachment_size = fields.Float(
string="Maximum Attachment Size (MB)",
config_parameter='attachment_size.max_attachment_size',
help="Set the maximum size for attachments in MB. Default is 2048 MB (2 GB)."
)
class Http(models.AbstractModel):
_inherit = "ir.http"
@api.model
def session_info(self):
session_info = super().session_info()
# Get the limit from system parameters, default to 2048 MB (2 GB)
max_size_mb = float(self.env['ir.config_parameter'].sudo().get_param(
'attachment_size.max_attachment_size', default=2048.0
))
max_attachment_size_bytes = max_size_mb * 1024 * 1024 # Convert MB to Bytes
# Always update session_info so JS always has a value (no more undefined)
session_info.update({
"max_attachment_size": max_attachment_size_bytes,
"max_size": max_size_mb,
"max_file_upload_size": max_attachment_size_bytes,
})
return session_info