mirror of
https://github.com/OCA/reporting-engine.git
synced 2025-02-16 16:30:38 +02:00
[IMP] kpi: pre-commit auto fixes
This commit is contained in:
@@ -17,32 +17,32 @@ Key Performance Indicator
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/reporting-engine/tree/13.0/kpi
|
||||
:target: https://github.com/OCA/reporting-engine/tree/17.0/kpi
|
||||
:alt: OCA/reporting-engine
|
||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||
:target: https://translation.odoo-community.org/projects/reporting-engine-13-0/reporting-engine-13-0-kpi
|
||||
:target: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-kpi
|
||||
: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/reporting-engine&target_branch=13.0
|
||||
:target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0
|
||||
:alt: Try me on Runboat
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
|
||||
This module provides the basis for creating key performance indicators,
|
||||
including static and dynamic thresholds (SQL query or Python code),
|
||||
on local and remote data sources.
|
||||
including static and dynamic thresholds (SQL query or Python code), on
|
||||
local and remote data sources.
|
||||
|
||||
The module also provides the mecanism to update KPIs automatically.
|
||||
A scheduler is executed every hour and updates the KPI values, based
|
||||
on the periodicity of each KPI. KPI computation can also be done
|
||||
manually.
|
||||
The module also provides the mecanism to update KPIs automatically. A
|
||||
scheduler is executed every hour and updates the KPI values, based on
|
||||
the periodicity of each KPI. KPI computation can also be done manually.
|
||||
|
||||
A threshold is a list of ranges and a range is:
|
||||
|
||||
* a name (like Good, Warning, Bad)
|
||||
* a minimum value (fixed, sql query or python code)
|
||||
* a maximum value (fixed, sql query or python code)
|
||||
* color (RGB code like #00FF00 for green, #FFA500 for orange, #FF0000 for red)
|
||||
- a name (like Good, Warning, Bad)
|
||||
- a minimum value (fixed, sql query or python code)
|
||||
- a maximum value (fixed, sql query or python code)
|
||||
- color (RGB code like #00FF00 for green, #FFA500 for orange, #FF0000
|
||||
for red)
|
||||
|
||||
**Table of contents**
|
||||
|
||||
@@ -52,8 +52,7 @@ A threshold is a list of ranges and a range is:
|
||||
Usage
|
||||
=====
|
||||
|
||||
Example of usage:
|
||||
https://www.youtube.com/watch?v=OC4-y2klzIk
|
||||
Example of usage: https://www.youtube.com/watch?v=OC4-y2klzIk
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
@@ -61,7 +60,7 @@ Bug Tracker
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/reporting-engine/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/reporting-engine/issues/new?body=module:%20kpi%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
`feedback <https://github.com/OCA/reporting-engine/issues/new?body=module:%20kpi%0Aversion:%2017.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.
|
||||
|
||||
@@ -69,26 +68,26 @@ Credits
|
||||
=======
|
||||
|
||||
Authors
|
||||
~~~~~~~
|
||||
-------
|
||||
|
||||
* Savoir-faire Linux
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
------------
|
||||
|
||||
* Daniel Reis <dreis.pt@hotmail.com>
|
||||
* Glen Dromgoole <gdromgoole@tier1engineering.com>
|
||||
* Loic Lacroix <loic.lacroix@savoirfairelinux.com>
|
||||
* Sandy Carter <sandy.carter@savoirfairelinux.com>
|
||||
* Gervais Naoussi <gervaisnaoussi@gmail.com>
|
||||
* Iván Todorovich <ivan.todorovich@gmail.com>
|
||||
* Adrià Gil <adria.gil@eficent.com>
|
||||
* `Guadaltech <https://www.guadaltech.es>`_:
|
||||
- Daniel Reis <dreis.pt@hotmail.com>
|
||||
- Glen Dromgoole <gdromgoole@tier1engineering.com>
|
||||
- Loic Lacroix <loic.lacroix@savoirfairelinux.com>
|
||||
- Sandy Carter <sandy.carter@savoirfairelinux.com>
|
||||
- Gervais Naoussi <gervaisnaoussi@gmail.com>
|
||||
- Iván Todorovich <ivan.todorovich@gmail.com>
|
||||
- Adrià Gil <adria.gil@eficent.com>
|
||||
- `Guadaltech <https://www.guadaltech.es>`__:
|
||||
|
||||
* Fernando La Chica <fernando.lachica@guadaltech.es>
|
||||
- Fernando La Chica <fernando.lachica@guadaltech.es>
|
||||
|
||||
Maintainers
|
||||
~~~~~~~~~~~
|
||||
-----------
|
||||
|
||||
This module is maintained by the OCA.
|
||||
|
||||
@@ -100,6 +99,6 @@ 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/reporting-engine <https://github.com/OCA/reporting-engine/tree/13.0/kpi>`_ project on GitHub.
|
||||
This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/17.0/kpi>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
||||
@@ -56,8 +56,16 @@ class KPI(models.Model):
|
||||
|
||||
name = fields.Char("Name", required=True)
|
||||
description = fields.Text("Description")
|
||||
category_id = fields.Many2one("kpi.category", "Category", required=True,)
|
||||
threshold_id = fields.Many2one("kpi.threshold", "Threshold", required=True,)
|
||||
category_id = fields.Many2one(
|
||||
"kpi.category",
|
||||
"Category",
|
||||
required=True,
|
||||
)
|
||||
threshold_id = fields.Many2one(
|
||||
"kpi.threshold",
|
||||
"Threshold",
|
||||
required=True,
|
||||
)
|
||||
periodicity = fields.Integer("Periodicity", default=1)
|
||||
|
||||
periodicity_uom = fields.Selection(
|
||||
@@ -73,11 +81,21 @@ class KPI(models.Model):
|
||||
default="day",
|
||||
)
|
||||
|
||||
next_execution_date = fields.Datetime("Next execution date", readonly=True,)
|
||||
value = fields.Float(string="Value", compute="_compute_display_last_kpi_value",)
|
||||
color = fields.Text("Color", compute="_compute_display_last_kpi_value",)
|
||||
next_execution_date = fields.Datetime(
|
||||
"Next execution date",
|
||||
readonly=True,
|
||||
)
|
||||
value = fields.Float(
|
||||
string="Value",
|
||||
compute="_compute_display_last_kpi_value",
|
||||
)
|
||||
color = fields.Text(
|
||||
"Color",
|
||||
compute="_compute_display_last_kpi_value",
|
||||
)
|
||||
last_execution = fields.Datetime(
|
||||
"Last execution", compute="_compute_display_last_kpi_value",
|
||||
"Last execution",
|
||||
compute="_compute_display_last_kpi_value",
|
||||
)
|
||||
kpi_type = fields.Selection(
|
||||
[
|
||||
@@ -88,14 +106,21 @@ class KPI(models.Model):
|
||||
"KPI Computation Type",
|
||||
)
|
||||
|
||||
dbsource_id = fields.Many2one("base.external.dbsource", "External DB Source",)
|
||||
dbsource_id = fields.Many2one(
|
||||
"base.external.dbsource",
|
||||
"External DB Source",
|
||||
)
|
||||
kpi_code = fields.Text(
|
||||
"KPI Code",
|
||||
help=(
|
||||
"SQL code must return the result as 'value' " "(i.e. 'SELECT 5 AS value')."
|
||||
),
|
||||
)
|
||||
history_ids = fields.One2many("kpi.history", "kpi_id", "History",)
|
||||
history_ids = fields.One2many(
|
||||
"kpi.history",
|
||||
"kpi_id",
|
||||
"History",
|
||||
)
|
||||
active = fields.Boolean(
|
||||
"Active",
|
||||
help=(
|
||||
|
||||
@@ -11,7 +11,12 @@ class KPIHistory(models.Model):
|
||||
_description = "History of the KPI"
|
||||
_order = "date desc"
|
||||
|
||||
name = fields.Char("Name", size=150, required=True, default=fields.Datetime.now(),)
|
||||
name = fields.Char(
|
||||
"Name",
|
||||
size=150,
|
||||
required=True,
|
||||
default=fields.Datetime.now(),
|
||||
)
|
||||
kpi_id = fields.Many2one("kpi", "KPI", required=True)
|
||||
date = fields.Datetime(
|
||||
"Execution Date",
|
||||
|
||||
@@ -73,7 +73,8 @@ class KPIThresholdRange(models.Model):
|
||||
min_code = fields.Text("Minimum Computation Code")
|
||||
min_error = fields.Char("Minimum Error", compute="_compute_min_value")
|
||||
min_dbsource_id = fields.Many2one(
|
||||
"base.external.dbsource", "External DB Source Minimum",
|
||||
"base.external.dbsource",
|
||||
"External DB Source Minimum",
|
||||
)
|
||||
max_type = fields.Selection(
|
||||
selection="_selection_value_type", string="Max Type", required=True
|
||||
@@ -83,7 +84,8 @@ class KPIThresholdRange(models.Model):
|
||||
max_code = fields.Text("Maximum Computation Code")
|
||||
max_error = fields.Char("Maximum Error", compute="_compute_max_value")
|
||||
max_dbsource_id = fields.Many2one(
|
||||
"base.external.dbsource", "External DB Source Maximum",
|
||||
"base.external.dbsource",
|
||||
"External DB Source Maximum",
|
||||
)
|
||||
|
||||
color = fields.Char(string="Color", help="Choose your color")
|
||||
|
||||
3
kpi/pyproject.toml
Normal file
3
kpi/pyproject.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[build-system]
|
||||
requires = ["whool"]
|
||||
build-backend = "whool.buildapi"
|
||||
9
kpi/readme/CONTRIBUTORS.md
Normal file
9
kpi/readme/CONTRIBUTORS.md
Normal file
@@ -0,0 +1,9 @@
|
||||
- Daniel Reis \<<dreis.pt@hotmail.com>\>
|
||||
- Glen Dromgoole \<<gdromgoole@tier1engineering.com>\>
|
||||
- Loic Lacroix \<<loic.lacroix@savoirfairelinux.com>\>
|
||||
- Sandy Carter \<<sandy.carter@savoirfairelinux.com>\>
|
||||
- Gervais Naoussi \<<gervaisnaoussi@gmail.com>\>
|
||||
- Iván Todorovich \<<ivan.todorovich@gmail.com>\>
|
||||
- Adrià Gil \<<adria.gil@eficent.com>\>
|
||||
- [Guadaltech](https://www.guadaltech.es):
|
||||
- Fernando La Chica \<<fernando.lachica@guadaltech.es>\>
|
||||
@@ -1,10 +0,0 @@
|
||||
* Daniel Reis <dreis.pt@hotmail.com>
|
||||
* Glen Dromgoole <gdromgoole@tier1engineering.com>
|
||||
* Loic Lacroix <loic.lacroix@savoirfairelinux.com>
|
||||
* Sandy Carter <sandy.carter@savoirfairelinux.com>
|
||||
* Gervais Naoussi <gervaisnaoussi@gmail.com>
|
||||
* Iván Todorovich <ivan.todorovich@gmail.com>
|
||||
* Adrià Gil <adria.gil@eficent.com>
|
||||
* `Guadaltech <https://www.guadaltech.es>`_:
|
||||
|
||||
* Fernando La Chica <fernando.lachica@guadaltech.es>
|
||||
15
kpi/readme/DESCRIPTION.md
Normal file
15
kpi/readme/DESCRIPTION.md
Normal file
@@ -0,0 +1,15 @@
|
||||
This module provides the basis for creating key performance indicators,
|
||||
including static and dynamic thresholds (SQL query or Python code), on
|
||||
local and remote data sources.
|
||||
|
||||
The module also provides the mecanism to update KPIs automatically. A
|
||||
scheduler is executed every hour and updates the KPI values, based on
|
||||
the periodicity of each KPI. KPI computation can also be done manually.
|
||||
|
||||
A threshold is a list of ranges and a range is:
|
||||
|
||||
- a name (like Good, Warning, Bad)
|
||||
- a minimum value (fixed, sql query or python code)
|
||||
- a maximum value (fixed, sql query or python code)
|
||||
- color (RGB code like \#00FF00 for green, \#FFA500 for orange, \#FF0000
|
||||
for red)
|
||||
@@ -1,15 +0,0 @@
|
||||
This module provides the basis for creating key performance indicators,
|
||||
including static and dynamic thresholds (SQL query or Python code),
|
||||
on local and remote data sources.
|
||||
|
||||
The module also provides the mecanism to update KPIs automatically.
|
||||
A scheduler is executed every hour and updates the KPI values, based
|
||||
on the periodicity of each KPI. KPI computation can also be done
|
||||
manually.
|
||||
|
||||
A threshold is a list of ranges and a range is:
|
||||
|
||||
* a name (like Good, Warning, Bad)
|
||||
* a minimum value (fixed, sql query or python code)
|
||||
* a maximum value (fixed, sql query or python code)
|
||||
* color (RGB code like #00FF00 for green, #FFA500 for orange, #FF0000 for red)
|
||||
1
kpi/readme/USAGE.md
Normal file
1
kpi/readme/USAGE.md
Normal file
@@ -0,0 +1 @@
|
||||
Example of usage: <https://www.youtube.com/watch?v=OC4-y2klzIk>
|
||||
@@ -1,2 +0,0 @@
|
||||
Example of usage:
|
||||
https://www.youtube.com/watch?v=OC4-y2klzIk
|
||||
@@ -1,4 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
@@ -9,10 +8,11 @@
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
|
||||
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
Despite the name, some widely supported CSS2 features are used.
|
||||
|
||||
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
@@ -275,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code .ln { color: gray; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
@@ -301,7 +301,7 @@ span.option {
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
span.problematic, pre.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
@@ -369,20 +369,20 @@ ul.auto-toc {
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:cfa60f307c1347dd86421388daf4ddf0cef49cfe864c034368a4b031d2dc045c
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/reporting-engine/tree/13.0/kpi"><img alt="OCA/reporting-engine" src="https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/reporting-engine-13-0/reporting-engine-13-0-kpi"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=13.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
||||
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/reporting-engine/tree/17.0/kpi"><img alt="OCA/reporting-engine" src="https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-kpi"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
||||
<p>This module provides the basis for creating key performance indicators,
|
||||
including static and dynamic thresholds (SQL query or Python code),
|
||||
on local and remote data sources.</p>
|
||||
<p>The module also provides the mecanism to update KPIs automatically.
|
||||
A scheduler is executed every hour and updates the KPI values, based
|
||||
on the periodicity of each KPI. KPI computation can also be done
|
||||
manually.</p>
|
||||
including static and dynamic thresholds (SQL query or Python code), on
|
||||
local and remote data sources.</p>
|
||||
<p>The module also provides the mecanism to update KPIs automatically. A
|
||||
scheduler is executed every hour and updates the KPI values, based on
|
||||
the periodicity of each KPI. KPI computation can also be done manually.</p>
|
||||
<p>A threshold is a list of ranges and a range is:</p>
|
||||
<ul class="simple">
|
||||
<li>a name (like Good, Warning, Bad)</li>
|
||||
<li>a minimum value (fixed, sql query or python code)</li>
|
||||
<li>a maximum value (fixed, sql query or python code)</li>
|
||||
<li>color (RGB code like #00FF00 for green, #FFA500 for orange, #FF0000 for red)</li>
|
||||
<li>color (RGB code like #00FF00 for green, #FFA500 for orange, #FF0000
|
||||
for red)</li>
|
||||
</ul>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
@@ -399,15 +399,14 @@ manually.</p>
|
||||
</div>
|
||||
<div class="section" id="usage">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
|
||||
<p>Example of usage:
|
||||
<a class="reference external" href="https://www.youtube.com/watch?v=OC4-y2klzIk">https://www.youtube.com/watch?v=OC4-y2klzIk</a></p>
|
||||
<p>Example of usage: <a class="reference external" href="https://www.youtube.com/watch?v=OC4-y2klzIk">https://www.youtube.com/watch?v=OC4-y2klzIk</a></p>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/reporting-engine/issues">GitHub Issues</a>.
|
||||
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
|
||||
<a class="reference external" href="https://github.com/OCA/reporting-engine/issues/new?body=module:%20kpi%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<a class="reference external" href="https://github.com/OCA/reporting-engine/issues/new?body=module:%20kpi%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
@@ -437,11 +436,13 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
|
||||
<p>This module is maintained by the OCA.</p>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org">
|
||||
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
|
||||
</a>
|
||||
<p>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.</p>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/reporting-engine/tree/13.0/kpi">OCA/reporting-engine</a> project on GitHub.</p>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/reporting-engine/tree/17.0/kpi">OCA/reporting-engine</a> project on GitHub.</p>
|
||||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user