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

[18.0][MIG] web_assets_warmup: Migration to 18.0 #3028

Open
wants to merge 7 commits into
base: 18.0
Choose a base branch
from
Open
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
93 changes: 93 additions & 0 deletions web_assets_warmup/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
================================
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/18.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-18-0/web-18-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=18.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:%2018.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]>
- Do Anh Duy <[email protected]>

Other credits
-------------

The migration of this module from 14.0 to 18.0 was financially supported
by Camptocamp.

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/18.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": "18.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,
}
18 changes: 18 additions & 0 deletions web_assets_warmup/data/ir_cron.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?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="active" eval="True" />
<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>
72 changes: 72 additions & 0 deletions web_assets_warmup/hooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# 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
from odoo.modules.registry import Registry
from odoo.tools import config

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

Check warning on line 20 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L20

Added line #L20 was not covered by tests
dbname = config["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

Check warning on line 37 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L37

Added line #L37 was not covered by tests
if model != "ir.cron":
return

Check warning on line 39 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L39

Added line #L39 was not covered by tests
# 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(

Check warning on line 44 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L42-L44

Added lines #L42 - L44 were not covered by tests
"SELECT * FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT;",
(res_id,),
)
query = """

Check warning on line 48 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L48

Added line #L48 was not covered by tests
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(

Check warning on line 56 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L53-L56

Added lines #L53 - L56 were not covered by tests
"Cron '%s.%s' planned for execution at %s",
cron_module,
cron_ref,
nextcall,
)
except psycopg2.OperationalError as e:

Check warning on line 62 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L62

Added line #L62 was not covered by tests
if e.pgcode == "55P03":
logger.info(

Check warning on line 64 in web_assets_warmup/hooks.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/hooks.py#L64

Added line #L64 was not covered by tests
"Cron '%s.%s' is currently being executed or updated",
cron_module,
cron_ref,
)


def post_load_hook():
active_cron_assets()
42 changes: 42 additions & 0 deletions web_assets_warmup/i18n/it.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# 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: Automatically generated\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\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 ""
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
27 changes: 27 additions & 0 deletions web_assets_warmup/models/ir_actions_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 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...")
bundles = [

Check warning on line 18 in web_assets_warmup/models/ir_actions_report.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/models/ir_actions_report.py#L17-L18

Added lines #L17 - L18 were not covered by tests
"web.report_assets_common",
"web.report_assets_pdf",
]
for bundle in bundles:
files = self.env["ir.qweb"]._get_asset_bundle(bundle, css=True, js=True)
files.js()
files.css()
logger.info("Ensure that assets are generated and stored in the database: done")
return True

Check warning on line 27 in web_assets_warmup/models/ir_actions_report.py

View check run for this annotation

Codecov / codecov/patch

web_assets_warmup/models/ir_actions_report.py#L23-L27

Added lines #L23 - L27 were not covered by tests
3 changes: 3 additions & 0 deletions web_assets_warmup/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
3 changes: 3 additions & 0 deletions web_assets_warmup/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Sébastien Alix \<<[email protected]>\>
- Michael Tietz (MT Software) \<<[email protected]>\>
- Do Anh Duy \<<[email protected]>\>
1 change: 1 addition & 0 deletions web_assets_warmup/readme/CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The migration of this module from 14.0 to 18.0 was financially supported by Camptocamp.
10 changes: 10 additions & 0 deletions web_assets_warmup/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
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