3
0
Fork 0
web_techsystech/web_assets_warmup/hooks.py

71 lines
2.3 KiB
Python

# Copyright 2020 Camptocamp SA
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
import logging
import os
import psycopg2
from odoo import fields, registry
logger = logging.getLogger(__name__)
def active_cron_assets():
"""Plan the next execution of the cron responsible to generate assets."""
if os.environ.get("RUNNING_ENV") == "dev":
return
dbname = os.environ.get("DB_NAME")
reg = registry(dbname)
with reg.cursor() as cr:
cron_module, cron_ref = "web_assets_warmup", "cron_generate_assets"
query = """
SELECT model, res_id
FROM ir_model_data
WHERE module=%s
AND name=%s;
"""
args = (cron_module, cron_ref)
cr.execute(query, args)
row = cr.fetchone()
# post_load hook is called before the update of the module so the
# ir_cron record doesn't exist on first install
if row:
model, res_id = row
if model != "ir.cron":
return
# if there is already someone doing the same or already being executed
# we can skip the update of ir_cron
try:
with cr.savepoint():
cr.execute(
"SELECT * FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT;",
(res_id,),
)
query = """
UPDATE ir_cron
SET active=true, nextcall=%s, priority=%s
WHERE id=%s
"""
nextcall = fields.Datetime.to_string(fields.Datetime.now())
args = (nextcall, -99, res_id)
cr.execute(query, args)
logger.info(
"Cron '%s.%s' planned for execution at %s",
cron_module,
cron_ref,
nextcall,
)
except psycopg2.OperationalError as e:
if e.pgcode == "55P03":
logger.info(
"Cron '%s.%s' is currently being executed or updated",
cron_module,
cron_ref,
)
def post_load_hook():
active_cron_assets()