server-tools/server_action_logging/models/ir_actions_server.py

42 lines
1.5 KiB
Python

# Copyright 2024 Camptocamp (https://www.camptocamp.com).
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
import logging
from odoo import fields, models
_logger = logging.getLogger(__name__)
class IrActionsServer(models.Model):
_inherit = "ir.actions.server"
enable_sql_debug = fields.Boolean(
string="Enable SQL Debug",
help="Enable SQL Debug for this action",
default=False, # Avoid too much log pollution
)
def run(self):
if self.env.context.get("server_action_run_with_logs"): # Avoid recursion
return super().run()
actions = self.with_context(server_action_run_with_logs=True)
odoo_sql_db_logger = logging.getLogger("odoo.sql_db")
odoo_sql_db_logger_level = odoo_sql_db_logger.level
odoo_sql_db_logger_has_debug = odoo_sql_db_logger.isEnabledFor(logging.DEBUG)
res = False
for act in actions:
force_sql_debug = not odoo_sql_db_logger_has_debug and act.enable_sql_debug
if force_sql_debug:
odoo_sql_db_logger.setLevel(logging.DEBUG)
subject = f"Action {act.display_name} ({act})"
_logger.info(f"{subject} started")
start = fields.Datetime.now()
res = act.run()
delta = (fields.Datetime.now() - start).total_seconds()
_logger.info(f"{subject} completed in {delta:.3f} seconds")
if force_sql_debug:
odoo_sql_db_logger.setLevel(odoo_sql_db_logger_level)
return res or False