Skip to content

Commit

Permalink
Merge pull request #1197 from OCA/14.0
Browse files Browse the repository at this point in the history
Syncing from upstream OCA/web (14.0)
  • Loading branch information
bt-admin authored Jan 13, 2024
2 parents db87797 + f10d729 commit 27d6c82
Show file tree
Hide file tree
Showing 17 changed files with 723 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ addon | version | maintainers | summary
[web_access_rule_buttons](web_access_rule_buttons/) | 14.0.1.0.1 | | Disable Edit button if access rules prevent this action
[web_action_conditionable](web_action_conditionable/) | 14.0.1.0.1 | | web_action_conditionable
[web_advanced_search](web_advanced_search/) | 14.0.1.0.1 | | Easier and more powerful searching tools
[web_assets_warmup](web_assets_warmup/) | 14.0.1.0.0 | | Ensure that assets are generated when Odoo starts.
[web_button_visibility](web_button_visibility/) | 14.0.1.0.0 | [![ilyasProgrammer](https://github.com/ilyasProgrammer.png?size=30px)](https://github.com/ilyasProgrammer) | Web Button Visibility
[web_calendar_color_field](web_calendar_color_field/) | 14.0.1.0.0 | | Calendar Color Field
[web_calendar_slot_duration](web_calendar_slot_duration/) | 14.0.1.0.0 | [![Yajo](https://github.com/Yajo.png?size=30px)](https://github.com/Yajo) | Customizable calendar slot durations
Expand Down
2 changes: 1 addition & 1 deletion setup/_metapackage/VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
14.0.20231127.0
14.0.20240112.0
1 change: 1 addition & 0 deletions setup/_metapackage/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
'odoo14-addon-web_access_rule_buttons',
'odoo14-addon-web_action_conditionable',
'odoo14-addon-web_advanced_search',
'odoo14-addon-web_assets_warmup',
'odoo14-addon-web_button_visibility',
'odoo14-addon-web_calendar_color_field',
'odoo14-addon-web_calendar_slot_duration',
Expand Down
1 change: 1 addition & 0 deletions setup/web_assets_warmup/odoo/addons/web_assets_warmup
6 changes: 6 additions & 0 deletions setup/web_assets_warmup/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
85 changes: 85 additions & 0 deletions web_assets_warmup/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
================================
Generate assets when Odoo starts
================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:358b7dda724b89b5345f039e82740006a3fd671e7f0dfb824dc67af6ae97a4df
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github
:target: https://github.com/OCA/web/tree/14.0/web_assets_warmup
:alt: OCA/web
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_assets_warmup
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=14.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Ensure that assets are generated and stored in the DB when Odoo starts

If the assets from the database are not up-to-date, they are regenerated by
Odoo when we print a report, but to do so Odoo forces the commit, so if an
exception occurs after (or during) the report rendering, it let the database in
a broken state (picking have been validated in this case).

To prevent this issue, we need to ensure that the assets are well-generated
when Odoo starts, not when the report is printed.

**Table of contents**

.. contents::
:local:

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/web/issues/new?body=module:%20web_assets_warmup%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* Camptocamp

Contributors
~~~~~~~~~~~~

* Sébastien Alix <[email protected]>
* Michael Tietz (MT Software) <[email protected]>

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/web <https://github.com/OCA/web/tree/14.0/web_assets_warmup>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 2 additions & 0 deletions web_assets_warmup/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from .hooks import post_load_hook
17 changes: 17 additions & 0 deletions web_assets_warmup/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2020 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
{
"name": "Generate assets when Odoo starts",
"summary": "Ensure that assets are generated when Odoo starts.",
"version": "14.0.1.0.0",
"category": "Hidden",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"depends": [
"web",
],
"website": "https://github.com/OCA/web",
"data": ["data/ir_cron.xml"],
"post_load": "post_load_hook",
"installable": True,
}
22 changes: 22 additions & 0 deletions web_assets_warmup/data/ir_cron.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2020 Camptocamp SA
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo noupdate="1">

<record model="ir.cron" id="cron_generate_assets">
<field name='name'>Generate report assets</field>
<field name='interval_number'>1</field>
<field name='interval_type'>months</field>
<field name="numbercall">-1</field>
<field name="active" eval="True" />
<field name="doall" eval="False" />
<field
name="nextcall"
eval="(datetime.now() + timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:00')"
/>
<field name="model_id" ref="base.model_ir_actions_report" />
<field name="state">code</field>
<field name="code">model.cron_generate_assets()</field>
</record>

</odoo>
70 changes: 70 additions & 0 deletions web_assets_warmup/hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Copyright 2020 Camptocamp SA
# Copyright 2023 Michael Tietz (MT Software) <[email protected]>
# 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()
41 changes: 41 additions & 0 deletions web_assets_warmup/i18n/web_assets_warmup.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_assets_warmup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

#. module: web_assets_warmup
#: model:ir.model.fields,field_description:web_assets_warmup.field_ir_actions_report__display_name
msgid "Display Name"
msgstr ""

#. module: web_assets_warmup
#: model:ir.actions.server,name:web_assets_warmup.cron_generate_assets_ir_actions_server
#: model:ir.cron,cron_name:web_assets_warmup.cron_generate_assets
#: model:ir.cron,name:web_assets_warmup.cron_generate_assets
msgid "Generate report assets"
msgstr ""

#. module: web_assets_warmup
#: model:ir.model.fields,field_description:web_assets_warmup.field_ir_actions_report__id
msgid "ID"
msgstr ""

#. module: web_assets_warmup
#: model:ir.model.fields,field_description:web_assets_warmup.field_ir_actions_report____last_update
msgid "Last Modified on"
msgstr ""

#. module: web_assets_warmup
#: model:ir.model,name:web_assets_warmup.model_ir_actions_report
msgid "Report Action"
msgstr ""
1 change: 1 addition & 0 deletions web_assets_warmup/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import ir_actions_report
37 changes: 37 additions & 0 deletions web_assets_warmup/models/ir_actions_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2020 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)

import logging

from odoo import api, models

logger = logging.getLogger(__name__)


class IrActionsReport(models.Model):
_inherit = "ir.actions.report"

@api.model
def cron_generate_assets(self):
"""Ensure that the assets are well-generated in the database."""
logger.info("Ensure that assets are generated and stored in the database...")
# Call `_get_asset_nodes` as done when printing a report based on
# `web.report_layout` template (used by `web.html_container`)
options = {
"commit_assetsbundle": False,
"debug": False,
"inherit_branding": False,
"dev_mode": False,
"caller_template": "web.html_container",
}
assets_template_ids = [
"web.report_assets_common",
"web.assets_common",
"web.report_assets_pdf",
]
for xml_id in assets_template_ids:
self.env["ir.qweb"]._get_asset_nodes(
xmlid=xml_id, options=options, css=True, js=True
)
logger.info("Ensure that assets are generated and stored in the database: done")
return True
2 changes: 2 additions & 0 deletions web_assets_warmup/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Sébastien Alix <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
9 changes: 9 additions & 0 deletions web_assets_warmup/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Ensure that assets are generated and stored in the DB when Odoo starts

If the assets from the database are not up-to-date, they are regenerated by
Odoo when we print a report, but to do so Odoo forces the commit, so if an
exception occurs after (or during) the report rendering, it let the database in
a broken state (picking have been validated in this case).

To prevent this issue, we need to ensure that the assets are well-generated
when Odoo starts, not when the report is printed.
Binary file added web_assets_warmup/static/description/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 27d6c82

Please sign in to comment.