From ef8c21a01b60141143e01cadf1b5b0e41e9b14c9 Mon Sep 17 00:00:00 2001 From: Christopher Ormaza Date: Fri, 7 Jan 2022 15:27:54 -0500 Subject: [PATCH] [15.0][MIG] web_widget_mpld3_chart --- web_widget_mpld3_chart/README.rst | 31 +- web_widget_mpld3_chart/__init__.py | 1 + web_widget_mpld3_chart/__manifest__.py | 13 +- web_widget_mpld3_chart/models/__init__.py | 1 + .../models/abstract_mpld3_parser.py | 33 + .../readme/CONTRIBUTORS.rst | 1 + web_widget_mpld3_chart/readme/CREDITS.rst | 4 + web_widget_mpld3_chart/readme/USAGE.rst | 9 +- .../static/description/index.html | 21 +- .../src/js/web_widget_mpld3_chart.esm.js | 31 + .../static/src/js/web_widget_mpld3_chart.js | 17 - .../static/src/lib/d3/d3.v3.min.js | 5 - .../static/src/lib/d3/d3.v5.js | 18568 ++++++++++++++++ .../static/src/lib/mpld3/mpld3.v0.3.1.dev1.js | 1539 -- .../static/src/lib/mpld3/mpld3.v0.5.7.js | 2079 ++ .../views/web_widget_mpld3_chart.xml | 23 - 16 files changed, 20774 insertions(+), 1602 deletions(-) create mode 100644 web_widget_mpld3_chart/models/__init__.py create mode 100644 web_widget_mpld3_chart/models/abstract_mpld3_parser.py create mode 100644 web_widget_mpld3_chart/static/src/js/web_widget_mpld3_chart.esm.js delete mode 100644 web_widget_mpld3_chart/static/src/js/web_widget_mpld3_chart.js delete mode 100644 web_widget_mpld3_chart/static/src/lib/d3/d3.v3.min.js create mode 100644 web_widget_mpld3_chart/static/src/lib/d3/d3.v5.js delete mode 100644 web_widget_mpld3_chart/static/src/lib/mpld3/mpld3.v0.3.1.dev1.js create mode 100644 web_widget_mpld3_chart/static/src/lib/mpld3/mpld3.v0.5.7.js delete mode 100644 web_widget_mpld3_chart/views/web_widget_mpld3_chart.xml diff --git a/web_widget_mpld3_chart/README.rst b/web_widget_mpld3_chart/README.rst index 1584e586e..6360236e9 100644 --- a/web_widget_mpld3_chart/README.rst +++ b/web_widget_mpld3_chart/README.rst @@ -14,13 +14,13 @@ Web Widget mpld3 Chart :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-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_widget_mpld3_chart + :target: https://github.com/OCA/web/tree/15.0/web_widget_mpld3_chart :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_widget_mpld3_chart + :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_widget_mpld3_chart :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/162/14.0 + :target: https://runbot.odoo-community.org/runbot/162/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -48,9 +48,14 @@ Usage To insert a mpld3 chart in a view proceed as follows: +#. You should inherit from abstract class abstract.mpld3.parser:: + + _name = 'res.partner' + _inherit = ['res.partner', 'abstract.mpld3.parser'] + #. Import the required libraries:: - import matplotlib.pyplot as plt, mpld3 + import matplotlib.pyplot as plt #. Declare a text computed field like this:: @@ -66,7 +71,7 @@ To insert a mpld3 chart in a view proceed as follows: # Design your mpld3 figure: plt.scatter([1, 10], [5, 9]) figure = plt.figure() - rec.mpld3_chart = mpld3.fig_to_html(figure) + rec.mpld3_chart = self.convert_figure_to_json(figure) #. In the view, add something like this wherever you want to display your mpld3 chart:: @@ -81,7 +86,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -97,6 +102,7 @@ Contributors ~~~~~~~~~~~~ * Jordi Ballester Alomar +* Christopher Ormaza Other credits ~~~~~~~~~~~~~ @@ -119,6 +125,17 @@ 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 `_ project on GitHub. +.. |maintainer-JordiBForgeFlow| image:: https://github.com/JordiBForgeFlow.png?size=40px + :target: https://github.com/JordiBForgeFlow + :alt: JordiBForgeFlow +.. |maintainer-ChrisOForgeFlow| image:: https://github.com/ChrisOForgeFlow.png?size=40px + :target: https://github.com/ChrisOForgeFlow + :alt: ChrisOForgeFlow + +Current `maintainers `__: + +|maintainer-JordiBForgeFlow| |maintainer-ChrisOForgeFlow| + +This module is part of the `OCA/web `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_widget_mpld3_chart/__init__.py b/web_widget_mpld3_chart/__init__.py index b9a9d2d72..35038d03a 100644 --- a/web_widget_mpld3_chart/__init__.py +++ b/web_widget_mpld3_chart/__init__.py @@ -1 +1,2 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from . import models diff --git a/web_widget_mpld3_chart/__manifest__.py b/web_widget_mpld3_chart/__manifest__.py index 6e4e83385..b0b8abb47 100644 --- a/web_widget_mpld3_chart/__manifest__.py +++ b/web_widget_mpld3_chart/__manifest__.py @@ -6,11 +6,18 @@ "category": "Hidden", "summary": "This widget allows to display charts using MPLD3 library.", "author": "ForgeFlow, Odoo Community Association (OCA)", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "website": "https://github.com/OCA/web", "depends": ["web"], - "data": ["views/web_widget_mpld3_chart.xml"], - "external_dependencies": {"python": ["mpld3"]}, + "data": [], + "external_dependencies": {"python": ["mpld3", "beautifulsoup4"]}, "auto_install": False, + "development_status": "Beta", + "maintainers": ["JordiBForgeFlow", "ChrisOForgeFlow"], "license": "LGPL-3", + "assets": { + "web.assets_backend": [ + "web_widget_mpld3_chart/static/src/js/web_widget_mpld3_chart.esm.js", + ], + }, } diff --git a/web_widget_mpld3_chart/models/__init__.py b/web_widget_mpld3_chart/models/__init__.py new file mode 100644 index 000000000..d625132a9 --- /dev/null +++ b/web_widget_mpld3_chart/models/__init__.py @@ -0,0 +1 @@ +from . import abstract_mpld3_parser diff --git a/web_widget_mpld3_chart/models/abstract_mpld3_parser.py b/web_widget_mpld3_chart/models/abstract_mpld3_parser.py new file mode 100644 index 000000000..2235bc762 --- /dev/null +++ b/web_widget_mpld3_chart/models/abstract_mpld3_parser.py @@ -0,0 +1,33 @@ +# Copyright 2022 ForgeFlow S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +import json +import logging + +from odoo import api, models + +_logger = logging.getLogger(__name__) + +try: + import mpld3 + from bs4 import BeautifulSoup +except (ImportError, IOError) as err: + _logger.debug(err) + + +class AbstractMpld3Parser(models.AbstractModel): + + _name = "abstract.mpld3.parser" + _description = "Utility to parse ploot figure to json data for widget Mpld3" + + @api.model + def convert_figure_to_json(self, figure): + html_string = mpld3.fig_to_html(figure, no_extras=True, include_libraries=False) + soup = BeautifulSoup(html_string, "lxml") + json_data = { + "style": soup.style.decode(), + "div": soup.div.get("id"), + "script": soup.script.decode_contents(), + } + return json.dumps(json_data) diff --git a/web_widget_mpld3_chart/readme/CONTRIBUTORS.rst b/web_widget_mpld3_chart/readme/CONTRIBUTORS.rst index c84e2e8e0..68f3dbd59 100644 --- a/web_widget_mpld3_chart/readme/CONTRIBUTORS.rst +++ b/web_widget_mpld3_chart/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Jordi Ballester Alomar +* Christopher Ormaza diff --git a/web_widget_mpld3_chart/readme/CREDITS.rst b/web_widget_mpld3_chart/readme/CREDITS.rst index f8d7e1565..6c416e6ec 100644 --- a/web_widget_mpld3_chart/readme/CREDITS.rst +++ b/web_widget_mpld3_chart/readme/CREDITS.rst @@ -1,4 +1,8 @@ * This module uses the library `mpld3 `__ which is under the open-source BSD 3-clause "New" or "Revised" License. Copyright (c) 2013, Jake Vanderplas +* This module uses the library `BeautifulSoup 4 `__ + which is under the open-source MIT License. + Copyright (c) 2014, Leonard Richardson + * Odoo Community Association (OCA) diff --git a/web_widget_mpld3_chart/readme/USAGE.rst b/web_widget_mpld3_chart/readme/USAGE.rst index cd96ae47d..5a0da5062 100644 --- a/web_widget_mpld3_chart/readme/USAGE.rst +++ b/web_widget_mpld3_chart/readme/USAGE.rst @@ -1,8 +1,13 @@ To insert a mpld3 chart in a view proceed as follows: +#. You should inherit from abstract class abstract.mpld3.parser:: + + _name = 'res.partner' + _inherit = ['res.partner', 'abstract.mpld3.parser'] + #. Import the required libraries:: - import matplotlib.pyplot as plt, mpld3 + import matplotlib.pyplot as plt #. Declare a text computed field like this:: @@ -18,7 +23,7 @@ To insert a mpld3 chart in a view proceed as follows: # Design your mpld3 figure: plt.scatter([1, 10], [5, 9]) figure = plt.figure() - rec.mpld3_chart = mpld3.fig_to_html(figure) + rec.mpld3_chart = self.convert_figure_to_json(figure) #. In the view, add something like this wherever you want to display your mpld3 chart:: diff --git a/web_widget_mpld3_chart/static/description/index.html b/web_widget_mpld3_chart/static/description/index.html index 9cb28c529..b385031e7 100644 --- a/web_widget_mpld3_chart/static/description/index.html +++ b/web_widget_mpld3_chart/static/description/index.html @@ -3,7 +3,7 @@ - + Web Widget mpld3 Chart