diff --git a/web_m2x_options/README.rst b/web_m2x_options/README.rst index 13d0293dd..4019504ed 100644 --- a/web_m2x_options/README.rst +++ b/web_m2x_options/README.rst @@ -7,7 +7,7 @@ web_m2x_options !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3a852d89e5cd927339a18898b21556fc15d261782fca8783b728cdc6a8ffa574 + !! source digest: sha256:0afece0246fa101b62c0522c1df2070cea624097713b5c6991fce8a2903dc1ef !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -32,9 +32,8 @@ This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display control options. Options provided includes possibility to remove "Create..." and/or -"Create and Edit..." entries from many2one drop down. You can also -change default number of proposition appearing in the drop-down. Or -prevent the dialog box poping in case of validation error. +"Create and Edit..." entries drop down. You can also change default +number of proposition appearing in the drop-down. If not specified, the module will avoid proposing any of the create options if the current user has no permission rights to create the @@ -53,16 +52,13 @@ in the field's options dict ``create`` *boolean* (Default: depends if user have create rights) - Whether to display the "Create..." entry in dropdown panel. + Whether to display the "Create..." entry in dropdown panel. Only for + m2o fields. ``create_edit`` *boolean* (Default: depends if user have create rights) Whether to display "Create and Edit..." entry in dropdown panel -``m2o_dialog`` *boolean* (Default: depends if user have create rights) - - Whether to display the many2one dialog in case of validation error. - ``limit`` *int* (Default: odoo default value is ``8``) Number of displayed record in drop-down panel @@ -81,21 +77,9 @@ in the field's options dict A dictionary to link field value with a HTML color. This option has to be used with field_color. -``no_open_edit`` *boolean* (Default: value of ``no_open`` which is -``False`` if not set) - - Causes a many2one not to offer to click through in edit mode, but - well in read mode - ``open`` *boolean* (Default: ``False``) - Makes many2many_tags and one2many rows buttons that open the linked - resource - -``no_color_picker`` *boolean* (Default: ``False``) - - Deactivates the color picker on many2many_tags buttons to do nothing - (ignored if open is set) + Makes many2one buttons that open the linked resource. ir.config_parameter options --------------------------- @@ -117,12 +101,6 @@ create rights) Whether to display "Create and Edit..." entry in dropdown panel for all fields in the odoo instance. -``web_m2x_options.m2o_dialog`` *boolean* (Default: depends if user have -create rights) - - Whether to display the many2one dialog in case of validation error - for all fields in the odoo instance. - ``web_m2x_options.limit`` *int* (Default: odoo default value is ``8``) Number of displayed record in drop-down panel for all fields in the @@ -142,7 +120,6 @@ To add these parameters go to Configuration -> Technical -> Parameters - web_m2x_options.create: False - web_m2x_options.create_edit: False -- web_m2x_options.m2o_dialog: False - web_m2x_options.limit: 10 - web_m2x_options.search_more: True - web_m2x_options.field_limit_entries: 5 @@ -155,7 +132,7 @@ Your XML form view definition could contain: .. code:: xml ... - + ... Known issues / Roadmap @@ -170,10 +147,6 @@ verify your installation. - Instead of making the tags rectangle clickable, I think it's better to put the text as a clickable link, so we will get a consistent behaviour/aspect with other clickable elements (many2one...). -- In edit mode, it would be great to add an icon like the one on - many2one fields to allow to open the many2many in a popup window. -- Include this feature as a configurable option via parameter to have - this behaviour by default in all many2many tags. Bug Tracker =========== @@ -195,6 +168,7 @@ Authors * ACSONE SA/NV * 0k.io * Tecnativa +* Sygel Contributors ------------ @@ -226,6 +200,12 @@ Contributors - Hoang Diep +- `Sygel `__: + + - Manuel Regidor + - Valentín Vinagre + - Harald Panten + Other credits ------------- diff --git a/web_m2x_options/__manifest__.py b/web_m2x_options/__manifest__.py index 28161df9b..88887baf1 100644 --- a/web_m2x_options/__manifest__.py +++ b/web_m2x_options/__manifest__.py @@ -6,16 +6,26 @@ { "name": "web_m2x_options", - "version": "16.0.1.1.3", + "version": "17.0.1.0.0", "category": "Web", "author": "initOS GmbH," "ACSONE SA/NV, " "0k.io, " "Tecnativa, " + "Sygel, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/web", "license": "AGPL-3", "depends": ["web"], - "assets": {"web.assets_backend": ["web_m2x_options/static/src/components/*"]}, + "assets": { + "web.assets_backend": [ + ( + "before", + "web/static/src/views/fields/*", + "web_m2x_options/static/src/components/form.esm.js", + ), + "web_m2x_options/static/src/components/base.xml", + ] + }, "installable": True, } diff --git a/web_m2x_options/i18n/de.po b/web_m2x_options/i18n/de.po index 2ac3cf217..763e4afd5 100644 --- a/web_m2x_options/i18n/de.po +++ b/web_m2x_options/i18n/de.po @@ -154,6 +154,3 @@ msgstr "als neu" #~ msgstr "" #~ "Sie legen eine neue %s an, sind Sie sicher, dass diese nicht bereits " #~ "vorhanden ist?" - -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" diff --git a/web_m2x_options/i18n/fr.po b/web_m2x_options/i18n/fr.po index 52eb29c83..be621c1cd 100644 --- a/web_m2x_options/i18n/fr.po +++ b/web_m2x_options/i18n/fr.po @@ -153,6 +153,3 @@ msgstr "" #~ msgstr "" #~ "Vous créez un nouveau %s, est-ce que vous êtes sur qu'il n'existe pas " #~ "déjà ?" - -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" diff --git a/web_m2x_options/i18n/hr.po b/web_m2x_options/i18n/hr.po index d828c7182..f5f3c3a7d 100644 --- a/web_m2x_options/i18n/hr.po +++ b/web_m2x_options/i18n/hr.po @@ -144,7 +144,3 @@ msgstr "" #, python-format #~ msgid "You are creating a new %s, are you sure it does not exist yet?" #~ msgstr "Želite kreirati novi %s, jeste li sigurni da već ne postoji?" - -#, fuzzy -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(opcije isključuju otvaranje ili uređivanje)" diff --git a/web_m2x_options/i18n/nl.po b/web_m2x_options/i18n/nl.po index d14e5e621..a526a9254 100644 --- a/web_m2x_options/i18n/nl.po +++ b/web_m2x_options/i18n/nl.po @@ -149,9 +149,6 @@ msgstr "" #~ msgid "You are creating a new %s, are you sure it does not exist yet?" #~ msgstr "U maakt een nieuw %s, weet u het zeker dat dit nog niet bestaat?" -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" - #~ msgid "Display Name" #~ msgstr "Weergavenaam" diff --git a/web_m2x_options/i18n/pt_BR.po b/web_m2x_options/i18n/pt_BR.po index f91171bdd..7859dcab8 100644 --- a/web_m2x_options/i18n/pt_BR.po +++ b/web_m2x_options/i18n/pt_BR.po @@ -151,6 +151,3 @@ msgstr "como um novo" #~ msgid "You are creating a new %s, are you sure it does not exist yet?" #~ msgstr "" #~ "Você está criando um novo %s, você tem certeza de que ainda não existe?" - -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(widget.options.no_open || widget.nodeOptions.no_open_edit)" diff --git a/web_m2x_options/i18n/zh_CN.po b/web_m2x_options/i18n/zh_CN.po index df164a1e0..8097ff93d 100644 --- a/web_m2x_options/i18n/zh_CN.po +++ b/web_m2x_options/i18n/zh_CN.po @@ -148,6 +148,3 @@ msgstr "" #, python-format #~ msgid "You are creating a new %s, are you sure it does not exist yet?" #~ msgstr "你正在创建一个新的%s,你确定它还不存在吗?" - -#~ msgid "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" -#~ msgstr "!(widget.nodeOptions.no_open || widget.nodeOptions.no_open_edit)" diff --git a/web_m2x_options/models/ir_config_parameter.py b/web_m2x_options/models/ir_config_parameter.py index c24506dd8..9841b57b1 100644 --- a/web_m2x_options/models/ir_config_parameter.py +++ b/web_m2x_options/models/ir_config_parameter.py @@ -11,8 +11,8 @@ class IrConfigParameter(models.Model): "web_m2x_options.create_edit", "web_m2x_options.limit", "web_m2x_options.search_more", - "web_m2x_options.m2o_dialog", "web_m2x_options.field_limit_entries", + "web_m2x_options.open", ] values = self.sudo().search_read([["key", "in", opts]], ["key", "value"]) return {res["key"]: res["value"] for res in values} diff --git a/web_m2x_options/readme/CONTRIBUTORS.md b/web_m2x_options/readme/CONTRIBUTORS.md index 2ffc113d6..df85534e3 100644 --- a/web_m2x_options/readme/CONTRIBUTORS.md +++ b/web_m2x_options/readme/CONTRIBUTORS.md @@ -22,3 +22,8 @@ - [Trobz](https://trobz.com): - Hoang Diep \<\> + +- [Sygel](https://sygel.es): + - Manuel Regidor \<\> + - Valentín Vinagre \<\> + - Harald Panten \<\> diff --git a/web_m2x_options/readme/DESCRIPTION.md b/web_m2x_options/readme/DESCRIPTION.md index 5e4ccd0cf..ad2c87666 100644 --- a/web_m2x_options/readme/DESCRIPTION.md +++ b/web_m2x_options/readme/DESCRIPTION.md @@ -2,9 +2,8 @@ This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display control options. Options provided includes possibility to remove "Create..." and/or -"Create and Edit..." entries from many2one drop down. You can also -change default number of proposition appearing in the drop-down. Or -prevent the dialog box poping in case of validation error. +"Create and Edit..." entries drop down. You can also change default +number of proposition appearing in the drop-down. If not specified, the module will avoid proposing any of the create options if the current user has no permission rights to create the diff --git a/web_m2x_options/readme/ROADMAP.md b/web_m2x_options/readme/ROADMAP.md index f445a6c3b..48e3fe771 100644 --- a/web_m2x_options/readme/ROADMAP.md +++ b/web_m2x_options/readme/ROADMAP.md @@ -7,7 +7,3 @@ your installation. - Instead of making the tags rectangle clickable, I think it's better to put the text as a clickable link, so we will get a consistent behaviour/aspect with other clickable elements (many2one...). -- In edit mode, it would be great to add an icon like the one on - many2one fields to allow to open the many2many in a popup window. -- Include this feature as a configurable option via parameter to have - this behaviour by default in all many2many tags. diff --git a/web_m2x_options/readme/USAGE.md b/web_m2x_options/readme/USAGE.md index 73507a0f9..22cda9e22 100644 --- a/web_m2x_options/readme/USAGE.md +++ b/web_m2x_options/readme/USAGE.md @@ -2,16 +2,12 @@ `create` *boolean* (Default: depends if user have create rights) -> Whether to display the "Create..." entry in dropdown panel. +> Whether to display the "Create..." entry in dropdown panel. Only for m2o fields. `create_edit` *boolean* (Default: depends if user have create rights) > Whether to display "Create and Edit..." entry in dropdown panel -`m2o_dialog` *boolean* (Default: depends if user have create rights) - -> Whether to display the many2one dialog in case of validation error. - `limit` *int* (Default: odoo default value is `8`) > Number of displayed record in drop-down panel @@ -30,21 +26,9 @@ > A dictionary to link field value with a HTML color. This option has to > be used with field_color. -`no_open_edit` *boolean* (Default: value of `no_open` which is `False` -if not set) - -> Causes a many2one not to offer to click through in edit mode, but well -> in read mode - `open` *boolean* (Default: `False`) -> Makes many2many_tags and one2many rows buttons that open the linked -> resource - -`no_color_picker` *boolean* (Default: `False`) - -> Deactivates the color picker on many2many_tags buttons to do nothing -> (ignored if open is set) +> Makes many2one buttons that open the linked resource. ## ir.config_parameter options @@ -65,12 +49,6 @@ create rights) > Whether to display "Create and Edit..." entry in dropdown panel for > all fields in the odoo instance. -`web_m2x_options.m2o_dialog` *boolean* (Default: depends if user have -create rights) - -> Whether to display the many2one dialog in case of validation error for -> all fields in the odoo instance. - `web_m2x_options.limit` *int* (Default: odoo default value is `8`) > Number of displayed record in drop-down panel for all fields in the @@ -90,7 +68,6 @@ To add these parameters go to Configuration -\> Technical -\> Parameters - web_m2x_options.create: False - web_m2x_options.create_edit: False -- web_m2x_options.m2o_dialog: False - web_m2x_options.limit: 10 - web_m2x_options.search_more: True - web_m2x_options.field_limit_entries: 5 @@ -101,6 +78,6 @@ Your XML form view definition could contain: ``` xml ... - + ... ``` diff --git a/web_m2x_options/static/description/index.html b/web_m2x_options/static/description/index.html index bf406ab18..f2dab10fc 100644 --- a/web_m2x_options/static/description/index.html +++ b/web_m2x_options/static/description/index.html @@ -1,20 +1,19 @@ - - -Add new options for many2one field + +web_m2x_options -
-

Add new options for many2one field

+
+

web_m2x_options

-
-

Description

-

This modules modifies "many2one" and "many2manytags" form widgets so as to add some new display -control options.

-

New: support many2manytags widget !

-

New: support global option management with ir.config_parameter !

-

Options provided includes possibility to remove "Create..." and/or "Create and -Edit..." entries from many2one drop down. You can also change default number of -proposition appearing in the drop-down. Or prevent the dialog box poping in -case of validation error.

-

If not specified, the module will avoid proposing any of the create options -if the current user have no permission rights to create the related object.

+ +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This modules modifies “many2one” and “many2manytags” form widgets so as +to add some new display control options.

+

Options provided includes possibility to remove “Create…” and/or +“Create and Edit…” entries drop down. You can also change default +number of proposition appearing in the drop-down.

+

If not specified, the module will avoid proposing any of the create +options if the current user has no permission rights to create the +related object.

+

Table of contents

+ -
-

Requirements

-

Was tested on openerp 8.0, trunk, saas-5 branch. New way to import js file. (thanks to tfossoul)

-
-
-

New options

+
+

Usage

+
+

in the field’s options dict

create boolean (Default: depends if user have create rights)

-Whether to display the "Create..." entry in dropdown panel.
+Whether to display the “Create…” entry in dropdown panel. Only for +m2o fields.

create_edit boolean (Default: depends if user have create rights)

-Whether to display "Create and Edit..." entry in dropdown panel
-

m2o_dialog boolean (Default: depends if user have create rights)

-
-Whether to display the many2one dialog in case of validation error.
-

limit int (Default: openerp default value is 7)

+Whether to display “Create and Edit…” entry in dropdown panel +

limit int (Default: odoo default value is 8)

Number of displayed record in drop-down panel
+

search_more boolean

+
+Used to force disable/enable search more button.
+

field_color string

+
+A string to define the field used to define color. This option has to +be used with colors.
+

colors dictionary

+
+A dictionary to link field value with a HTML color. This option has +to be used with field_color.
+

open boolean (Default: False)

+
+Makes many2one buttons that open the linked resource.
-

ir.config_parameter options

-

Now you can disable "Create..." and "Create and Edit..." entry for all widgets in the odoo instance. -If you disable one option, you can enable it for particular field by setting "create: True" option directly on the field definition.

-

web_m2x_options.create boolean (Default: depends if user have create rights)

+

ir.config_parameter options

+

Now you can disable “Create…” and “Create and Edit…” entry for all +widgets in the odoo instance. If you disable one option, you can enable +it for particular field by setting “create: True” option directly on the +field definition.

+

web_m2x_options.create boolean (Default: depends if user have +create rights)

-Whether to display the "Create..." entry in dropdown panel for all fields in the odoo instance.
-

web_m2x_options.create_edit boolean (Default: depends if user have create rights)

+Whether to display the “Create…” entry in dropdown panel for all +fields in the odoo instance. +

web_m2x_options.create_edit boolean (Default: depends if user have +create rights)

-Whether to display "Create and Edit..." entry in dropdown panel for all fields in the odoo instance.
-

web_m2x_options.limit int (Default: openerp default value is 7)

+Whether to display “Create and Edit…” entry in dropdown panel for +all fields in the odoo instance. +

web_m2x_options.limit int (Default: odoo default value is 8)

-Number of displayed record in drop-down panel for all fields in the odoo instance
-

To add these parameters go to Configuration -> Technical -> Parameters -> System Parameters and add new parameters like:

+Number of displayed record in drop-down panel for all fields in the +odoo instance +

web_m2x_options.search_more boolean (Default: default value is +False)

+
+Whether the field should always show “Search more…” entry or not.
+

web_m2x_options.field_limit_entries int

+
+Number of displayed lines on all One2many fields
+

To add these parameters go to Configuration -> Technical -> Parameters +-> System Parameters and add new parameters like:

  • web_m2x_options.create: False
  • web_m2x_options.create_edit: False
  • web_m2x_options.limit: 10
  • +
  • web_m2x_options.search_more: True
  • +
  • web_m2x_options.field_limit_entries: 5
-

Example

+

Example

Your XML form view definition could contain:

-
-...
-<field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false}"/>
-...
+
+...
+<field name="partner_id" options="{'limit': 10, 'create': false, 'create_edit': false, 'search_more': true, 'field_color':'type', 'colors':{'contact':'green', 'invoice': 'red', 'delivery': 'blue'}}"/>
+...
 
-
-

Note

-

Double check that you have no inherited view that remote options you set on a field ! -If nothing work, add a debugger in the first ligne of get_search_result method and enable debug mode in OpenERP. When you write something in a many2one field, javascript debugger should pause. If not verify your installation.

+
+
+

Known issues / Roadmap

+

Double check that you have no inherited view that remove options you +set on a field ! If nothing works, add a debugger in the first line of +_search method and enable debug mode in Odoo. When you write +something in a many2one field, javascript debugger should pause. If not +verify your installation.

+
    +
  • Instead of making the tags rectangle clickable, I think it’s better +to put the text as a clickable link, so we will get a consistent +behaviour/aspect with other clickable elements (many2one…).
  • +
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • initOS GmbH
  • +
  • ACSONE SA/NV
  • +
  • 0k.io
  • +
  • Tecnativa
  • +
  • Sygel
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The migration of this module from 15.0 to 16.0 was financially supported +by Camptocamp

+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
diff --git a/web_m2x_options/static/src/components/base.xml b/web_m2x_options/static/src/components/base.xml index d8719f7d0..8cab2b7a0 100644 --- a/web_m2x_options/static/src/components/base.xml +++ b/web_m2x_options/static/src/components/base.xml @@ -3,7 +3,6 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> - - - props.nodeOptions + props.searchLimit + props.fieldColor + props.fieldColorOptions - - -
- You are creating a new as a new , are you sure it does not exist yet? -
- - - - - -
-
diff --git a/web_m2x_options/static/src/components/form.esm.js b/web_m2x_options/static/src/components/form.esm.js index ecb37d270..51c3c69ac 100644 --- a/web_m2x_options/static/src/components/form.esm.js +++ b/web_m2x_options/static/src/components/form.esm.js @@ -1,403 +1,362 @@ /** @odoo-module **/ - import { Many2ManyTagsField, Many2ManyTagsFieldColorEditable, + many2ManyTagsField, } from "@web/views/fields/many2many_tags/many2many_tags_field"; - -import {Dialog} from "@web/core/dialog/dialog"; +import {Many2OneField, many2OneField} from "@web/views/fields/many2one/many2one_field"; import {FormController} from "@web/views/form/form_controller"; -import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog"; import {Many2OneAvatarField} from "@web/views/fields/many2one_avatar/many2one_avatar_field"; -import {Many2OneBarcodeField} from "@web/views/fields/many2one_barcode/many2one_barcode_field"; -import {Many2OneField} from "@web/views/fields/many2one/many2one_field"; -import {ReferenceField} from "@web/views/fields/reference/reference_field"; -import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; +import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {evaluateBooleanExpr} from "@web/core/py_js/py"; import {isX2Many} from "@web/views/utils"; -import {is_option_set} from "@web_m2x_options/components/relational_utils.esm"; import {patch} from "@web/core/utils/patch"; -import {sprintf} from "@web/core/utils/strings"; -import {useService} from "@web/core/utils/hooks"; - -const {Component} = owl; - -/** - * Patch Many2ManyTagsField - **/ -patch(Many2ManyTagsField.prototype, "web_m2x_options.Many2ManyTagsField", { - setup() { - this._super(...arguments); - this.actionService = useService("action"); - }, - /** - * @override - */ - getTagProps(record) { - const props = this._super(...arguments); - props.onClick = (ev) => this.onMany2ManyBadgeClick(ev, record); - return props; - }, - async onMany2ManyBadgeClick(event, record) { - var self = this; - if (self.props.open) { - var context = self.context; - var id = record.data.id; - if (self.props.readonly) { - event.preventDefault(); - event.stopPropagation(); - const action = await self.orm.call( - self.props.relation, - "get_formview_action", - [[id]], - {context: context} - ); - self.actionService.doAction(action); - } else { - const view_id = await self.orm.call( - self.props.relation, - "get_formview_id", - [[id]], - {context: context} - ); - - const write_access = await self.orm.call( - self.props.relation, - "check_access_rights", - [], - {operation: "write", raise_exception: false} - ); - var can_write = self.props.canWrite; - self.dialog.add(FormViewDialog, { - resModel: self.props.relation, - resId: id, - context: context, - title: self.env._t("Open: ") + self.string, - viewId: view_id, - mode: !can_write || !write_access ? "readonly" : "edit", - onRecordSaved: () => self.props.value.model.load(), - }); - } - } - }, -}); - -Many2ManyTagsField.props = { - ...Many2ManyTagsField.props, - open: {type: Boolean, optional: true}, - canWrite: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, -}; - -const Many2ManyTagsFieldExtractProps = Many2ManyTagsField.extractProps; -Many2ManyTagsField.extractProps = ({attrs, field}) => { - const canOpen = Boolean(attrs.options.open); - const canWrite = attrs.can_write && Boolean(JSON.parse(attrs.can_write)); - return Object.assign(Many2ManyTagsFieldExtractProps({attrs, field}), { - open: canOpen, - canWrite: canWrite, - nodeOptions: attrs.options, - }); -}; - -/** - * Many2ManyTagsFieldColorEditable - **/ -patch( - Many2ManyTagsFieldColorEditable.prototype, - "web_m2x_options.Many2ManyTagsFieldColorEditable", - { - async onBadgeClick(event, record) { - if (this.props.canEditColor && !this.props.open) { - this._super(...arguments); - } - if (this.props.open) { - Many2ManyTagsField.prototype.onMany2ManyBadgeClick.bind(this)( - event, - record - ); - } - }, - } -); - -Many2ManyTagsFieldColorEditable.props = { - ...Many2ManyTagsFieldColorEditable.props, - open: {type: Boolean, optional: true}, - canWrite: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, -}; - -/** - * CreateConfirmationDialog - * New customized component for Many2One Field - **/ - -class CreateConfirmationDialog extends Component { - get title() { - return sprintf(this.env._t("New: %s"), this.props.name); - } - - async onCreate() { - await this.props.create(); - this.props.close(); - } - async onCreateEdit() { - await this.props.createEdit(); - this.props.close(); - } -} -CreateConfirmationDialog.components = {Dialog}; -CreateConfirmationDialog.template = - "web_m2x_options.Many2OneField.CreateConfirmationDialog"; - -/** - * Many2OneField - **/ - -patch(Many2OneField.prototype, "web_m2x_options.Many2OneField", { - setup() { - this._super(...arguments); - this.ir_options = Component.env.session.web_m2x_options; - }, - /** - * @override - */ - get Many2XAutocompleteProps() { - const props = this._super(...arguments); - return { - ...props, - searchLimit: this.props.searchLimit, - searchMore: this.props.searchMore, - canCreate: this.props.canCreate, - nodeOptions: this.props.nodeOptions, - }; - }, - - async openConfirmationDialog(request) { - var m2o_dialog_opt = - is_option_set(this.props.nodeOptions.m2o_dialog) || - (_.isUndefined(this.props.nodeOptions.m2o_dialog) && - is_option_set(this.ir_options["web_m2x_options.m2o_dialog"])) || - (_.isUndefined(this.props.nodeOptions.m2o_dialog) && - _.isUndefined(this.ir_options["web_m2x_options.m2o_dialog"])); - if (this.props.canCreate && this.state.isFloating && m2o_dialog_opt) { - return new Promise((resolve, reject) => { - this.addDialog(CreateConfirmationDialog, { - value: request, - name: this.props.string, - create: async () => { - try { - await this.quickCreate(request); - resolve(); - } catch (e) { - reject(e); - } - }, - createEdit: async () => { - try { - await this.quickCreate(request); - await this.props.record.model.load(); - this.openMany2X({ - resId: this.props.value[0], - context: this.user_context, - }); - resolve(); - } catch (e) { - reject(e); - } - }, - }); - }); - } - }, -}); - -const Many2OneFieldExtractProps = Many2OneField.extractProps; -Many2OneField.extractProps = ({attrs, field}) => { - return Object.assign(Many2OneFieldExtractProps({attrs, field}), { - searchLimit: attrs.options.limit, - searchMore: attrs.options.search_more, - nodeOptions: attrs.options, - }); -}; +import {session} from "@web/session"; Many2OneField.props = { ...Many2OneField.props, - searchMore: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, + noSearchMore: {type: Boolean, optional: true}, + fieldColor: {type: String, optional: true}, + fieldColorOptions: {type: Object, optional: true}, +}; +Many2XAutocomplete.props = { + ...Many2XAutocomplete.props, + fieldColor: {type: String, optional: true}, + fieldColorOptions: {type: Object, optional: true}, }; -/** - * FIXME: find better way to extend props in Many2OneField - * Override ReferenceField - * Since extracted/added props: nodeOptions and searchMore into Many2OneField props - * and this component inherited props from Many2OneField - * So, must override props here to avoid constraint validateProps (props schema) in owl core - */ - -ReferenceField.props = { - ...ReferenceField.props, - searchMore: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, -}; - -/** - * FIXME: find better way to extend props in Many2OneField - * Override Many2OneBarcodeField - * Since extracted/added props: nodeOptions and searchMore into Many2OneField props - * and this component inherited props from Many2OneField - * So, must override props here to avoid constraint validateProps (props schema) in owl core - */ - -Many2OneBarcodeField.props = { - ...Many2OneBarcodeField.props, - searchMore: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, -}; - -/** - * FIXME: find better way to extend props in Many2OneField - * Override Many2OneAvatarField - * Since extracted/added props: nodeOptions and searchMore into Many2OneField props - * and this component inherited props from Many2OneField - * So, must override props here to avoid constraint validateProps (props schema) in owl core - */ Many2OneAvatarField.props = { ...Many2OneAvatarField.props, - searchMore: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, + noSearchMore: {type: Boolean, optional: true}, + fieldColor: {type: String, optional: true}, + fieldColorOptions: {type: Object, optional: true}, }; -/** - * FIXME: find better way to extend props in Many2OneField - * Override mailing_m2o_filter - * Since extracted/added props: nodeOptions and searchMore into Many2OneField props - * and this component inherited props from Many2OneField - * So, must override props here to avoid constraint validateProps (props schema) in owl core - * This component is in module mass_mailing as optional module, - * So need to import dynamic way - */ -try { - (async () => { - // Make sure component mailing_m2o_filter in mass mailing module loaded - const installed_mass_mailing = await odoo.ready( - "@mass_mailing/js/mailing_m2o_filter" - ); - if (installed_mass_mailing) { - const {FieldMany2OneMailingFilter} = await odoo.runtimeImport( - "@mass_mailing/js/mailing_m2o_filter" - ); - FieldMany2OneMailingFilter.props = { - ...FieldMany2OneMailingFilter.props, - searchMore: {type: Boolean, optional: true}, - nodeOptions: {type: Object, optional: true}, - }; - } - })(); -} catch { - console.log( - "Ignore overriding props of component mailing_m2o_filter since the module is not installed" - ); -} +Many2ManyTagsField.props = { + ...Many2ManyTagsField.props, + searchLimit: {type: Number, optional: true}, + fieldColor: {type: String, optional: true}, + fieldColorOptions: {type: Object, optional: true}, +}; -/** - * X2ManyField - **/ -patch(X2ManyField.prototype, "web_m2x_options.X2ManyField", { - /** - * @override - */ - async openRecord(record) { - var self = this; - var open = this.props.open; - if (open && self.props.readonly) { - var res_id = record.data.id; - const action = await self.env.model.orm.call( - self.props.value.resModel, - "get_formview_action", - [[res_id]] - ); - return self.env.model.actionService.doAction(action); +Many2ManyTagsFieldColorEditable.props = { + ...Many2ManyTagsFieldColorEditable.props, + searchLimit: {type: Number, optional: true}, + fieldColor: {type: String, optional: true}, + fieldColorOptions: {type: Object, optional: true}, +}; + +patch(many2OneField, { + m2o_options_props_create(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.create === false) { + props.canQuickCreate = false; + } else if (options.create) { + props.canQuickCreate = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } else if ( + ir_options["web_m2x_options.create"] === "False" && + props.canQuickCreate + ) { + props.canQuickCreate = false; + } else if ( + ir_options["web_m2x_options.create"] === "True" && + !props.canQuickCreate + ) { + props.canQuickCreate = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; } - return this._super.apply(this, arguments); + return props; + }, + + m2o_options_props_create_edit(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.create_edit === false) { + props.canCreateEdit = false; + } else if (options.create_edit) { + // Same condition set in web/views/fields/many2one/many2one_field + props.canCreateEdit = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } else if ( + ir_options["web_m2x_options.create_edit"] === "False" && + props.canCreateEdit + ) { + props.canCreateEdit = false; + } else if ( + ir_options["web_m2x_options.create_edit"] === "True" && + !props.canCreateEdit + ) { + // Same condition set in web/views/fields/many2one/many2one_field + props.canCreateEdit = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } + return props; + }, + + m2o_options_props_limit(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (Number(options.limit)) { + props.searchLimit = Number(options.limit); + } else if (Number(ir_options["web_m2x_options.limit"])) { + props.searchLimit = Number(ir_options["web_m2x_options.limit"]); + } + return props; + }, + + m2o_options_props_search_more(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.search_more) { + props.noSearchMore = false; + } else if (options.search_more === false) { + props.noSearchMore = true; + } else if ( + ir_options["web_m2x_options.search_more"] === "True" && + props.noSearchMore + ) { + props.noSearchMore = false; + } else if (ir_options["web_m2x_options.search_more"] === "False") { + props.noSearchMore = true; + } + return props; + }, + + m2o_options_props_open(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.open) { + props.canOpen = true; + } else if (options.open === false) { + props.canOpen = false; + } else if (ir_options["web_m2x_options.open"] === "True") { + props.canOpen = true; + } else if (ir_options["web_m2x_options.open"] === "False") { + props.canOpen = false; + } + return props; + }, + + m2o_options_props(props, attrs, options) { + props = this.m2o_options_props_create(props, attrs, options); + props = this.m2o_options_props_create_edit(props, attrs, options); + props = this.m2o_options_props_limit(props, attrs, options); + props = this.m2o_options_props_search_more(props, attrs, options); + props = this.m2o_options_props_open(props, attrs, options); + props.fieldColor = options.field_color; + props.fieldColorOptions = options.colors; + return props; + }, + extractProps({attrs, context, decorations, options, string}, dynamicInfo) { + const props = super.extractProps( + {attrs, context, decorations, options, string}, + dynamicInfo + ); + const new_props = this.m2o_options_props(props, attrs, options); + return new_props; }, }); -const X2ManyFieldExtractProps = X2ManyField.extractProps; -X2ManyField.extractProps = ({attrs}) => { - const canOpen = Boolean(attrs.options.open); - return Object.assign(X2ManyFieldExtractProps({attrs}), { - open: canOpen, - }); -}; +patch(Many2OneField.prototype, { + get Many2XAutocompleteProps() { + const search_limit = this.props.searchLimit; + const no_search_more = this.props.noSearchMore; + const field_color = this.props.fieldColor; + const field_color_options = this.props.fieldColorOptions; + const props = super.Many2XAutocompleteProps; + const ret_props = {...props}; + if (Number(search_limit) && Number(search_limit) > 1) { + ret_props.searchLimit = search_limit - 1; + } + if (no_search_more) { + ret_props.noSearchMore = no_search_more; + } + if (field_color && field_color_options) { + ret_props.fieldColor = field_color; + ret_props.fieldColorOptions = field_color_options; + } + return ret_props; + }, +}); -X2ManyField.props = { - ...X2ManyField.props, - open: {type: Boolean, optional: true}, -}; +patch(many2ManyTagsField, { + m2m_options_props_create(props, attrs, options) { + const ir_options = session.web_m2x_options; + // Create option already available for m2m fields + if (!options.create) { + if ( + ir_options["web_m2x_options.create"] === "False" && + props.canQuickCreate + ) { + props.canQuickCreate = false; + } else if ( + ir_options["web_m2x_options.create"] === "True" && + !props.canQuickCreate + ) { + props.canQuickCreate = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } + } + return props; + }, -/** - * FormController - **/ -patch(FormController.prototype, "web_m2x_options.FormController", { + m2m_options_props_create_edit(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.create_edit === false) { + props.canCreateEdit = false; + } else if (options.create_edit) { + // Same condition set in web/views/fields/many2one/many2one_field + props.canCreateEdit = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } else if ( + ir_options["web_m2x_options.create_edit"] === "False" && + props.canCreateEdit + ) { + props.canCreateEdit = false; + } else if ( + ir_options["web_m2x_options.create_edit"] === "True" && + !props.canCreateEdit + ) { + // Same condition set in web/views/fields/many2one/many2one_field + props.canCreateEdit = attrs.can_create + ? evaluateBooleanExpr(attrs.can_create) + : true; + } + return props; + }, + + m2m_options_props_limit(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (Number(options.limit) && options.limit > 1) { + props.searchLimit = Number(options.limit) - 1; + } else if ( + Number(ir_options["web_m2x_options.limit"]) && + ir_options["web_m2x_options.limit"] > 1 + ) { + props.searchLimit = Number(ir_options["web_m2x_options.limit"]) - 1; + } + return props; + }, + + m2m_options_props_search_more(props, attrs, options) { + const ir_options = session.web_m2x_options; + if (options.search_more) { + props.noSearchMore = false; + } else if (options.search_more === false) { + props.noSearchMore = true; + } else if ( + ir_options["web_m2x_options.search_more"] === "True" && + props.noSearchMore + ) { + props.noSearchMore = false; + } else if (ir_options["web_m2x_options.search_more"] === "False") { + props.noSearchMore = true; + } + return props; + }, + + m2m_options_props(props, attrs, options) { + props = this.m2m_options_props_create(props, attrs, options); + props = this.m2m_options_props_create_edit(props, attrs, options); + props = this.m2m_options_props_limit(props, attrs, options); + props = this.m2m_options_props_search_more(props, attrs, options); + props.fieldColor = options.field_color; + props.fieldColorOptions = options.colors; + return props; + }, + extractProps({attrs, options, string}, dynamicInfo) { + const props = super.extractProps({attrs, options, string}, dynamicInfo); + const new_props = this.m2m_options_props(props, attrs, options); + return new_props; + }, +}); + +patch(Many2XAutocomplete.prototype, { + setup() { + super.setup(); + this.ir_options = session.web_m2x_options; + }, + async loadOptionsSource(request) { + var options = await super.loadOptionsSource(request); + this.field_color = this.props.fieldColor; + this.colors = this.props.fieldColorOptions; + if (this.colors && this.field_color) { + var value_ids = options.map((result) => result.value); + const objects = await this.orm.call( + this.props.resModel, + "search_read", + [], + { + domain: [["id", "in", value_ids]], + fields: [this.field_color], + } + ); + for (var index in objects) { + for (var index_value in options) { + if (options[index_value].value === objects[index].id) { + // Find value in values by comparing ids + var option = options[index_value]; + // Find color with field value as key + var color = + this.colors[objects[index][this.field_color]] || "black"; + option.style = "color:" + color; + break; + } + } + } + } + return options; + }, +}); + +patch(FormController.prototype, { /** * @override */ setup() { - var self = this; - this._super(...arguments); - - /** Due to problem of 2 onWillStart in native web core - * (see: https://github.com/odoo/odoo/blob/16.0/addons/web/static/src/views/model.js#L142) - * do the trick to override beforeLoadResolver here to customize viewLimit - */ - this.superBeforeLoadResolver = this.beforeLoadResolver; - this.beforeLoadResolver = async () => { - await self._setSubViewLimit(); - self.superBeforeLoadResolver(); - }; + super.setup(...arguments); + this._setSubViewLimit(); }, /** * @override * add more method to add subview limit on formview */ async _setSubViewLimit() { - const ir_options = Component.env.session.web_m2x_options; - - const activeFields = this.archInfo.activeFields, - fields = this.props.fields, + const ir_options = session.web_m2x_options; + const activeFields = this.archInfo.fieldNodes, isSmall = this.user; var limit = ir_options["web_m2x_options.field_limit_entries"]; - if (!_.isUndefined(limit)) { + if (!(typeof limit === "undefined")) { limit = parseInt(limit, 10); } - for (const fieldName in activeFields) { - const field = fields[fieldName]; + const field = activeFields[fieldName]; if (!isX2Many(field)) { // What follows only concerns x2many fields continue; } - const fieldInfo = activeFields[fieldName]; - if (fieldInfo.modifiers.invisible === true) { + // Const fieldInfo = activeFields[fieldName]; + if (field.invisible) { // No need to fetch the sub view if the field is always invisible continue; } - if (!fieldInfo.FieldComponent.useSubView) { + if (!field.field.useSubView) { // The FieldComponent used to render the field doesn't need a sub view continue; } - - let viewType = fieldInfo.viewMode || "list,kanban"; + let viewType = field.viewMode || "list,kanban"; viewType = viewType.replace("tree", "list"); if (viewType.includes(",")) { viewType = isSmall ? "kanban" : "list"; } - fieldInfo.viewMode = viewType; - if (fieldInfo.views[viewType] && limit) { - fieldInfo.views[viewType].limit = limit; + field.viewMode = viewType; + if (field.views[viewType] && limit) { + field.views[viewType].limit = limit; } } }, diff --git a/web_m2x_options/static/src/components/relational_utils.esm.js b/web_m2x_options/static/src/components/relational_utils.esm.js deleted file mode 100644 index 1fbe39eae..000000000 --- a/web_m2x_options/static/src/components/relational_utils.esm.js +++ /dev/null @@ -1,221 +0,0 @@ -/** @odoo-module **/ - -import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; -import {patch} from "@web/core/utils/patch"; -import {sprintf} from "@web/core/utils/strings"; -const {Component} = owl; - -export function is_option_set(option) { - if (_.isUndefined(option)) return false; - if (typeof option === "string") return option === "true" || option === "True"; - if (typeof option === "boolean") return option; - return false; -} - -patch(Many2XAutocomplete.prototype, "web_m2x_options.Many2XAutocomplete", { - setup() { - this._super(...arguments); - this.ir_options = Component.env.session.web_m2x_options; - }, - - async loadOptionsSource(request) { - if (this.lastProm) { - this.lastProm.abort(false); - } - // Add options limit used to change number of selections record - // returned. - if (!_.isUndefined(this.ir_options["web_m2x_options.limit"])) { - this.props.searchLimit = parseInt( - this.ir_options["web_m2x_options.limit"], - 10 - ); - this.limit = this.props.searchLimit; - } - - if (typeof this.props.nodeOptions.limit === "number") { - this.props.searchLimit = this.props.nodeOptions.limit; - this.limit = this.props.searchLimit; - } - - // Add options field_color and colors to color item(s) depending on field_color value - this.field_color = this.props.nodeOptions.field_color; - this.colors = this.props.nodeOptions.colors; - - this.lastProm = this.orm.call(this.props.resModel, "name_search", [], { - name: request, - operator: "ilike", - args: this.props.getDomain(), - limit: this.props.searchLimit + 1, - context: this.props.context, - }); - const records = await this.lastProm; - - var options = records.map((result) => ({ - value: result[0], - id: result[0], - label: result[1].split("\n")[0], - })); - - // Limit results if there is a custom limit options - if (this.limit) { - options = options.slice(0, this.props.searchLimit); - } - - // Search result value colors - if (this.colors && this.field_color) { - var value_ids = options.map((result) => result.value); - const objects = await this.orm.call( - this.props.resModel, - "search_read", - [], - { - domain: [["id", "in", value_ids]], - fields: [this.field_color], - } - ); - for (var index in objects) { - for (var index_value in options) { - if (options[index_value].id === objects[index].id) { - // Find value in values by comparing ids - var option = options[index_value]; - // Find color with field value as key - var color = - this.colors[objects[index][this.field_color]] || "black"; - option.style = "color:" + color; - break; - } - } - } - } - - // Quick create - // Note: Create should be before `search_more` (reserve native order) - // One more reason: when calling `onInputBlur`, native select the first option (activeSourceOption) - // which triggers m2o_dialog if m2o_dialog=true - var create_enabled = - this.props.quickCreate && !this.props.nodeOptions.no_create; - - var raw_result = _.map(records, function (x) { - return x[1]; - }); - var quick_create = is_option_set(this.props.nodeOptions.create), - quick_create_undef = _.isUndefined(this.props.nodeOptions.create), - m2x_create_undef = _.isUndefined(this.ir_options["web_m2x_options.create"]), - m2x_create = is_option_set(this.ir_options["web_m2x_options.create"]); - var show_create = - (!this.props.nodeOptions && (m2x_create_undef || m2x_create)) || - (this.props.nodeOptions && - (quick_create || - (quick_create_undef && (m2x_create_undef || m2x_create)))); - if ( - create_enabled && - !this.props.nodeOptions.no_quick_create && - request.length > 0 && - !_.contains(raw_result, request) && - show_create - ) { - options.push({ - label: sprintf(this.env._t(`Create "%s"`), request), - classList: "o_m2o_dropdown_option o_m2o_dropdown_option_create", - action: async (params) => { - try { - await this.props.quickCreate(request, params); - } catch { - const context = this.getCreationContext(request); - return this.openMany2X({context}); - } - }, - }); - } - - // Search more... - // Resolution order: - // 1- check if "search_more" is set locally in node's options - // 2- if set locally, apply its value - // 3- if not set locally, check if it's set globally via ir.config_parameter - // 4- if set globally, apply its value - // 5- if not set globally either, check if returned values are more than node's limit - var search_more = false; - if (!_.isUndefined(this.props.nodeOptions.search_more)) { - search_more = is_option_set(this.props.nodeOptions.search_more); - } else if (!_.isUndefined(this.ir_options["web_m2x_options.search_more"])) { - search_more = is_option_set(this.ir_options["web_m2x_options.search_more"]); - } else { - search_more = - !this.props.noSearchMore && this.props.searchLimit < records.length; - } - if (search_more) { - options.push({ - label: this.env._t("Search More..."), - action: this.onSearchMore.bind(this, request), - classList: "o_m2o_dropdown_option o_m2o_dropdown_option_search_more", - }); - } - - // Create and Edit - const canCreateEdit = - "createEdit" in this.activeActions - ? this.activeActions.createEdit - : this.activeActions.create; - if ( - !request.length && - !this.props.value && - (this.props.quickCreate || canCreateEdit) - ) { - options.push({ - label: this.env._t("Start typing..."), - classList: "o_m2o_start_typing", - unselectable: true, - }); - } - - // Create and edit ... - var create_edit = - is_option_set(this.props.nodeOptions.create) || - is_option_set(this.props.nodeOptions.create_edit), - create_edit_undef = - _.isUndefined(this.props.nodeOptions.create) && - _.isUndefined(this.props.nodeOptions.create_edit), - m2x_create_edit_undef = _.isUndefined( - this.ir_options["web_m2x_options.create_edit"] - ), - m2x_create_edit = is_option_set( - this.ir_options["web_m2x_options.create_edit"] - ); - var show_create_edit = - (!this.props.nodeOptions && (m2x_create_edit_undef || m2x_create_edit)) || - (this.props.nodeOptions && - (create_edit || - (create_edit_undef && (m2x_create_edit_undef || m2x_create_edit)))); - if ( - create_enabled && - !this.props.nodeOptions.no_create_edit && - show_create_edit && - request.length && - canCreateEdit - ) { - const context = this.getCreationContext(request); - options.push({ - label: this.env._t("Create and edit..."), - classList: "o_m2o_dropdown_option o_m2o_dropdown_option_create_edit", - action: () => this.openMany2X({context}), - }); - } - - // No records - if (!records.length && !this.activeActions.create) { - options.push({ - label: this.env._t("No records"), - classList: "o_m2o_no_result", - unselectable: true, - }); - } - - return options; - }, -}); - -Many2XAutocomplete.defaultProps = { - ...Many2XAutocomplete.defaultProps, - nodeOptions: {}, -}; diff --git a/web_m2x_options/tests/test_ir_config_parameter.py b/web_m2x_options/tests/test_ir_config_parameter.py index eae00c7a9..015228589 100644 --- a/web_m2x_options/tests/test_ir_config_parameter.py +++ b/web_m2x_options/tests/test_ir_config_parameter.py @@ -7,17 +7,16 @@ from odoo.tests import common class TestIrConfigParameter(common.TransactionCase): @classmethod def setUpClass(cls): - super(TestIrConfigParameter, cls).setUpClass() + super().setUpClass() cls.env["ir.config_parameter"].set_param("web_m2x_options.limit", 10) cls.env["ir.config_parameter"].set_param("web_m2x_options.create_edit", "True") cls.env["ir.config_parameter"].set_param("web_m2x_options.create", "True") cls.env["ir.config_parameter"].set_param("web_m2x_options.search_more", "False") - cls.env["ir.config_parameter"].set_param("web_m2x_options.m2o_dialog", "True") def test_web_m2x_options_key(self): web_m2x_options = self.env["ir.config_parameter"].get_web_m2x_options() self.assertIn("web_m2x_options.limit", web_m2x_options) - self.assertNotIn("web_m2x_options.m2o_dialog_test", web_m2x_options) + self.assertNotIn("web_m2x_options.search_more_test", web_m2x_options) def test_web_m2x_options_value(self): web_m2x_options = self.env["ir.config_parameter"].get_web_m2x_options() @@ -25,4 +24,3 @@ class TestIrConfigParameter(common.TransactionCase): self.assertTrue(bool(web_m2x_options["web_m2x_options.create_edit"])) self.assertTrue(bool(web_m2x_options["web_m2x_options.create"])) self.assertEqual(web_m2x_options["web_m2x_options.search_more"], "False") - self.assertTrue(bool(web_m2x_options["web_m2x_options.m2o_dialog"]))