.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
===========================
2D matrix for x2many fields
===========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1fd96971f9d15f75718700c6fd3d0f1c351739783008f0453cc24ec0d72e4eef
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
:alt: Production/Stable
.. |badge2| image:: https://img.shields.io/badge/license-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_widget_x2many_2d_matrix
: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_widget_x2many_2d_matrix
: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|
This module allows to show an x2many field with 3-tuples ($x_value,
$y_value, $value) in a table
========= =========== ===========
\ $x_value1 $x_value2
========= =========== ===========
$y_value1 $value(1/1) $value(2/1)
$y_value2 $value(1/2) $value(2/2)
========= =========== ===========
where value(n/n) is editable.
An example use case would be: Select some projects and some employees so
that a manager can easily fill in the planned_hours for one task per
employee. The result could look like this:
|Screenshot|
The beauty of this is that you have an arbitrary amount of columns with
this widget, trying to get this in standard x2many lists involves some
quite ugly hacks.
.. |Screenshot| image:: https://raw.githubusercontent.com/OCA/web/12.0/web_widget_x2many_2d_matrix/static/description/screenshot.png
**Table of contents**
.. contents::
:local:
Usage
=====
Use this widget by saying:
::
<field name="my_field" widget="x2many_2d_matrix" />
This assumes that my_field refers to a model with the fields x, y and
value. If your fields are named differently, pass the correct names as
attributes:
.. code:: xml
<field name="my_field" widget="x2many_2d_matrix" field_x_axis="my_field1" field_y_axis="my_field2" field_value="my_field3">
<list>
<field name="my_field"/>
<field name="my_field1"/>
<field name="my_field2"/>
<field name="my_field3"/>
</list>
</field>
You can pass the following parameters:
field_x_axis The field that indicates the x value of a point
field_y_axis The field that indicates the y value of a point
field_value Show this field as value
show_row_totals If field_value is a numeric field, it indicates if you
want to calculate row totals. True by default
show_column_totals If field_value is a numeric field, it indicates if
you want to calculate column totals. True by default
x_axis_clickable If the x axis field is a many2one field, render the
values as links to the record in question
y_axis_clickable If the y axis field is a many2one field, render the
values as links to the record in question
For the value field, you can set any attributes you'd set in a normal
list view, ie if your value field is a many2one field and you want to
disable creating records via this field, you'd write
.. code:: xml
<field name="my_field3" options="{'no_create': true}"/>
or if you want to have a custom domain or context
.. code:: xml
<field name="my_field3" domain="[('some_field', '=', my_field1)]" context="{'default_some_field': my_field1}" />
Note that to be able to refer to other fields than the ones used as
coordinates or value, you have to add them inside the ``list`` node.
Example
-------
You need a data structure already filled with values. Let's assume we
want to use this widget in a wizard that lets the user fill in planned
hours for one task per project per user. In this case, we can use
``project.task`` as our data model and point to it from our wizard. The
crucial part is that we fill the field in the default function:
.. code:: python
from odoo import fields, models
class MyWizard(models.TransientModel):
_name = 'my.wizard'
def _default_task_ids(self):
# your list of project should come from the context, some selection
# in a previous wizard or wherever else
projects = self.env['project.project'].browse([1, 2, 3])
# same with users
users = self.env['res.users'].browse([1, 2, 3])
return [
(0, 0, {
'name': 'Sample task name',
'project_id': p.id,
'user_id': u.id,
'planned_hours': 0,
'message_needaction': False,
'date_deadline': fields.Date.today(),
})
# if the project doesn't have a task for the user,
# create a new one
if not p.task_ids.filtered(lambda x: x.user_id == u) else
# otherwise, return the task
(4, p.task_ids.filtered(lambda x: x.user_id == u)[0].id)
for p in projects
for u in users
]
task_ids = fields.Many2many('project.task', default=_default_task_ids)
Now in our wizard, we can use:
.. code:: xml
<field name="task_ids" widget="x2many_2d_matrix" field_x_axis="project_id" field_y_axis="user_id" field_value="planned_hours">
<list>
<field name="task_ids"/>
<field name="project_id"/>
<field name="user_id"/>
<field name="planned_hours"/>
</list>
</field>
Known issues / Roadmap
======================
- Support limit total records in the matrix. Ref:
https://github.com/OCA/web/issues/901
- Support cell traversal through keyboard arrows.
- Entering the widget from behind by pressing ``Shift+TAB`` in your
keyboard will enter into the 1st cell until
https://github.com/odoo/odoo/pull/26490 is merged.
- Support kanban mode. Current behaviour forces list mode.
Changelog
=========
12.0.1.0.1 (2018-12-07)
-----------------------
- [FIX] Cells are unable to render property.
(`#1126 <https://github.com/OCA/web/issues/1126>`__)
12.0.1.0.0 (2018-11-20)
-----------------------
- [12.0][MIG] web_widget_x2many_2d_matrix
(`#1101 <https://github.com/OCA/web/issues/1101>`__)
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_widget_x2many_2d_matrix%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
-------
* Hunki Enterprises BV
* Therp BV
* Tecnativa
* Camptocamp
* CorporateHub
* Onestein
Contributors
------------
- Holger Brunn <mail@hunki-enterprises.com>
- Pedro M. Baeza <pedro.baeza@tecnativa.com>
- Artem Kostyuk <a.kostyuk@mobilunity.com>
- Simone Orsi <simone.orsi@camptocamp.com>
- Timon Tschanz <timon.tschanz@camptocamp.com>
- Jairo Llopis <jairo.llopis@tecnativa.com>
- Dennis Sluijk <d.sluijk@onestein.nl>
- `CorporateHub <https://corporatehub.eu/>`__
- Alexey Pelykh <alexey.pelykh@corphub.eu>
- Adrià Gil Sorribes <adria.gil@forgeflow.com>
- Christopher Ormaza <chris.ormaza@forgeflow.com>
- SodexisTeam <dev@sodexis.com>
- Jasmin Solanki jasmin.solanki@forgeflow.com
- David Jiménez david.jimenez@forgeflow.com
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.
.. |maintainer-JasminSForgeFlow| image:: https://github.com/JasminSForgeFlow.png?size=40px
:target: https://github.com/JasminSForgeFlow
:alt: JasminSForgeFlow
.. |maintainer-DavidJForgeFlow| image:: https://github.com/DavidJForgeFlow.png?size=40px
:target: https://github.com/DavidJForgeFlow
:alt: DavidJForgeFlow
.. |maintainer-hbrunn| image:: https://github.com/hbrunn.png?size=40px
:target: https://github.com/hbrunn
:alt: hbrunn
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-JasminSForgeFlow| |maintainer-DavidJForgeFlow| |maintainer-hbrunn|
This module is part of the `OCA/web <https://github.com/OCA/web/tree/18.0/web_widget_x2many_2d_matrix>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
Raw data
{
"_id": null,
"home_page": "https://github.com/OCA/web",
"name": "odoo-addon-web-widget-x2many-2d-matrix",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": null,
"author": "Hunki Enterprises BV, Therp BV, Tecnativa, Camptocamp, CorporateHub, Onestein, Odoo Community Association (OCA)",
"author_email": "support@odoo-community.org",
"download_url": null,
"platform": null,
"description": ".. image:: https://odoo-community.org/readme-banner-image\n :target: https://odoo-community.org/get-involved?utm_source=readme\n :alt: Odoo Community Association\n\n===========================\n2D matrix for x2many fields\n===========================\n\n.. \n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n !! This file is generated by oca-gen-addon-readme !!\n !! changes will be overwritten. !!\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n !! source digest: sha256:1fd96971f9d15f75718700c6fd3d0f1c351739783008f0453cc24ec0d72e4eef\n !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png\n :target: https://odoo-community.org/page/development-status\n :alt: Production/Stable\n.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png\n :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html\n :alt: License: AGPL-3\n.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github\n :target: https://github.com/OCA/web/tree/18.0/web_widget_x2many_2d_matrix\n :alt: OCA/web\n.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png\n :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_x2many_2d_matrix\n :alt: Translate me on Weblate\n.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png\n :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=18.0\n :alt: Try me on Runboat\n\n|badge1| |badge2| |badge3| |badge4| |badge5|\n\nThis module allows to show an x2many field with 3-tuples ($x_value,\n$y_value, $value) in a table\n\n========= =========== ===========\n\\ $x_value1 $x_value2\n========= =========== ===========\n$y_value1 $value(1/1) $value(2/1)\n$y_value2 $value(1/2) $value(2/2)\n========= =========== ===========\n\nwhere value(n/n) is editable.\n\nAn example use case would be: Select some projects and some employees so\nthat a manager can easily fill in the planned_hours for one task per\nemployee. The result could look like this:\n\n|Screenshot|\n\nThe beauty of this is that you have an arbitrary amount of columns with\nthis widget, trying to get this in standard x2many lists involves some\nquite ugly hacks.\n\n.. |Screenshot| image:: https://raw.githubusercontent.com/OCA/web/12.0/web_widget_x2many_2d_matrix/static/description/screenshot.png\n\n**Table of contents**\n\n.. contents::\n :local:\n\nUsage\n=====\n\nUse this widget by saying:\n\n::\n\n <field name=\"my_field\" widget=\"x2many_2d_matrix\" />\n\nThis assumes that my_field refers to a model with the fields x, y and\nvalue. If your fields are named differently, pass the correct names as\nattributes:\n\n.. code:: xml\n\n <field name=\"my_field\" widget=\"x2many_2d_matrix\" field_x_axis=\"my_field1\" field_y_axis=\"my_field2\" field_value=\"my_field3\">\n <list>\n <field name=\"my_field\"/>\n <field name=\"my_field1\"/>\n <field name=\"my_field2\"/>\n <field name=\"my_field3\"/>\n </list>\n </field>\n\nYou can pass the following parameters:\n\nfield_x_axis The field that indicates the x value of a point\n\nfield_y_axis The field that indicates the y value of a point\n\nfield_value Show this field as value\n\nshow_row_totals If field_value is a numeric field, it indicates if you\nwant to calculate row totals. True by default\n\nshow_column_totals If field_value is a numeric field, it indicates if\nyou want to calculate column totals. True by default\n\nx_axis_clickable If the x axis field is a many2one field, render the\nvalues as links to the record in question\n\ny_axis_clickable If the y axis field is a many2one field, render the\nvalues as links to the record in question\n\nFor the value field, you can set any attributes you'd set in a normal\nlist view, ie if your value field is a many2one field and you want to\ndisable creating records via this field, you'd write\n\n.. code:: xml\n\n <field name=\"my_field3\" options=\"{'no_create': true}\"/>\n\nor if you want to have a custom domain or context\n\n.. code:: xml\n\n <field name=\"my_field3\" domain=\"[('some_field', '=', my_field1)]\" context=\"{'default_some_field': my_field1}\" />\n\nNote that to be able to refer to other fields than the ones used as\ncoordinates or value, you have to add them inside the ``list`` node.\n\nExample\n-------\n\nYou need a data structure already filled with values. Let's assume we\nwant to use this widget in a wizard that lets the user fill in planned\nhours for one task per project per user. In this case, we can use\n``project.task`` as our data model and point to it from our wizard. The\ncrucial part is that we fill the field in the default function:\n\n.. code:: python\n\n from odoo import fields, models\n\n class MyWizard(models.TransientModel):\n _name = 'my.wizard'\n\n def _default_task_ids(self):\n # your list of project should come from the context, some selection\n # in a previous wizard or wherever else\n projects = self.env['project.project'].browse([1, 2, 3])\n # same with users\n users = self.env['res.users'].browse([1, 2, 3])\n return [\n (0, 0, {\n 'name': 'Sample task name',\n 'project_id': p.id,\n 'user_id': u.id,\n 'planned_hours': 0,\n 'message_needaction': False,\n 'date_deadline': fields.Date.today(),\n })\n # if the project doesn't have a task for the user,\n # create a new one\n if not p.task_ids.filtered(lambda x: x.user_id == u) else\n # otherwise, return the task\n (4, p.task_ids.filtered(lambda x: x.user_id == u)[0].id)\n for p in projects\n for u in users\n ]\n\n task_ids = fields.Many2many('project.task', default=_default_task_ids)\n\nNow in our wizard, we can use:\n\n.. code:: xml\n\n <field name=\"task_ids\" widget=\"x2many_2d_matrix\" field_x_axis=\"project_id\" field_y_axis=\"user_id\" field_value=\"planned_hours\">\n <list>\n <field name=\"task_ids\"/>\n <field name=\"project_id\"/>\n <field name=\"user_id\"/>\n <field name=\"planned_hours\"/>\n </list>\n </field>\n\nKnown issues / Roadmap\n======================\n\n- Support limit total records in the matrix. Ref:\n https://github.com/OCA/web/issues/901\n- Support cell traversal through keyboard arrows.\n- Entering the widget from behind by pressing ``Shift+TAB`` in your\n keyboard will enter into the 1st cell until\n https://github.com/odoo/odoo/pull/26490 is merged.\n- Support kanban mode. Current behaviour forces list mode.\n\nChangelog\n=========\n\n12.0.1.0.1 (2018-12-07)\n-----------------------\n\n- [FIX] Cells are unable to render property.\n (`#1126 <https://github.com/OCA/web/issues/1126>`__)\n\n12.0.1.0.0 (2018-11-20)\n-----------------------\n\n- [12.0][MIG] web_widget_x2many_2d_matrix\n (`#1101 <https://github.com/OCA/web/issues/1101>`__)\n\nBug Tracker\n===========\n\nBugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.\nIn case of trouble, please check there if your issue has already been reported.\nIf you spotted it first, help us to smash it by providing a detailed and welcomed\n`feedback <https://github.com/OCA/web/issues/new?body=module:%20web_widget_x2many_2d_matrix%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.\n\nDo not contact contributors directly about support or help with technical issues.\n\nCredits\n=======\n\nAuthors\n-------\n\n* Hunki Enterprises BV\n* Therp BV\n* Tecnativa\n* Camptocamp\n* CorporateHub\n* Onestein\n\nContributors\n------------\n\n- Holger Brunn <mail@hunki-enterprises.com>\n- Pedro M. Baeza <pedro.baeza@tecnativa.com>\n- Artem Kostyuk <a.kostyuk@mobilunity.com>\n- Simone Orsi <simone.orsi@camptocamp.com>\n- Timon Tschanz <timon.tschanz@camptocamp.com>\n- Jairo Llopis <jairo.llopis@tecnativa.com>\n- Dennis Sluijk <d.sluijk@onestein.nl>\n- `CorporateHub <https://corporatehub.eu/>`__\n\n - Alexey Pelykh <alexey.pelykh@corphub.eu>\n\n- Adri\u00e0 Gil Sorribes <adria.gil@forgeflow.com>\n- Christopher Ormaza <chris.ormaza@forgeflow.com>\n- SodexisTeam <dev@sodexis.com>\n- Jasmin Solanki jasmin.solanki@forgeflow.com\n- David Jim\u00e9nez david.jimenez@forgeflow.com\n\nMaintainers\n-----------\n\nThis module is maintained by the OCA.\n\n.. image:: https://odoo-community.org/logo.png\n :alt: Odoo Community Association\n :target: https://odoo-community.org\n\nOCA, or the Odoo Community Association, is a nonprofit organization whose\nmission is to support the collaborative development of Odoo features and\npromote its widespread use.\n\n.. |maintainer-JasminSForgeFlow| image:: https://github.com/JasminSForgeFlow.png?size=40px\n :target: https://github.com/JasminSForgeFlow\n :alt: JasminSForgeFlow\n.. |maintainer-DavidJForgeFlow| image:: https://github.com/DavidJForgeFlow.png?size=40px\n :target: https://github.com/DavidJForgeFlow\n :alt: DavidJForgeFlow\n.. |maintainer-hbrunn| image:: https://github.com/hbrunn.png?size=40px\n :target: https://github.com/hbrunn\n :alt: hbrunn\n\nCurrent `maintainers <https://odoo-community.org/page/maintainer-role>`__:\n\n|maintainer-JasminSForgeFlow| |maintainer-DavidJForgeFlow| |maintainer-hbrunn| \n\nThis module is part of the `OCA/web <https://github.com/OCA/web/tree/18.0/web_widget_x2many_2d_matrix>`_ project on GitHub.\n\nYou are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.\n",
"bugtrack_url": null,
"license": "AGPL-3",
"summary": "Show list fields as a matrix",
"version": "18.0.2.0.1",
"project_urls": {
"Homepage": "https://github.com/OCA/web"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c534ffb2e77fc84f965d65cf081061e88ea28e45d20cfa1cb669d63191ae53a4",
"md5": "2072bae8eae9d69d5cd65bee2deedf20",
"sha256": "146ecb572503e2bca58592e9ff68d9650b600ed2093de0dca1b7a8ec5913023f"
},
"downloads": -1,
"filename": "odoo_addon_web_widget_x2many_2d_matrix-18.0.2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2072bae8eae9d69d5cd65bee2deedf20",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 67681,
"upload_time": "2025-07-25T15:47:54",
"upload_time_iso_8601": "2025-07-25T15:47:54.923018Z",
"url": "https://files.pythonhosted.org/packages/c5/34/ffb2e77fc84f965d65cf081061e88ea28e45d20cfa1cb669d63191ae53a4/odoo_addon_web_widget_x2many_2d_matrix-18.0.2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-25 15:47:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "OCA",
"github_project": "web",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "beautifulsoup4",
"specs": []
},
{
"name": "bokeh",
"specs": [
[
"==",
"3.6.3"
]
]
},
{
"name": "mpld3",
"specs": [
[
"==",
"0.5.10"
]
]
}
],
"lcname": "odoo-addon-web-widget-x2many-2d-matrix"
}