Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Syncing from upstream OCA/web (14.0) #1197

Merged
merged 5 commits into from
Jan 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading