From 231ef10f9735249c2812f8a7aceec8a6ccd04624 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 3 Aug 2016 13:00:30 +0200 Subject: [PATCH 1/6] [CHG] base_custom_info: Relicense to LGPL with all authors' consent --- base_custom_info/README.rst | 6 +++--- base_custom_info/__init__.py | 2 +- base_custom_info/__openerp__.py | 4 ++-- base_custom_info/models/__init__.py | 2 +- base_custom_info/models/custom_info.py | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/base_custom_info/README.rst b/base_custom_info/README.rst index 005080fa4..60eecd504 100644 --- a/base_custom_info/README.rst +++ b/base_custom_info/README.rst @@ -1,6 +1,6 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 +.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 ================ Base Custom Info diff --git a/base_custom_info/__init__.py b/base_custom_info/__init__.py index 5faa0139b..cc6e9affa 100644 --- a/base_custom_info/__init__.py +++ b/base_custom_info/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html from . import models diff --git a/base_custom_info/__openerp__.py b/base_custom_info/__openerp__.py index 603362e2f..f1daa9ea1 100644 --- a/base_custom_info/__openerp__.py +++ b/base_custom_info/__openerp__.py @@ -2,7 +2,7 @@ # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden # © 2015-2016 Jairo Llopis -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html { 'name': "Base Custom Info", @@ -30,6 +30,6 @@ 'Tecnativa, ' 'Odoo Community Association (OCA)', 'website': 'http://www.antiun.com', - 'license': 'AGPL-3', + 'license': 'LGPL-3', 'installable': True, } diff --git a/base_custom_info/models/__init__.py b/base_custom_info/models/__init__.py index 278faf2ff..4ce49af98 100644 --- a/base_custom_info/models/__init__.py +++ b/base_custom_info/models/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html from . import custom_info diff --git a/base_custom_info/models/custom_info.py b/base_custom_info/models/custom_info.py index ed353cce2..297a25ade 100644 --- a/base_custom_info/models/custom_info.py +++ b/base_custom_info/models/custom_info.py @@ -2,7 +2,7 @@ # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden # © 2015 Antiun Ingeniería S.L. - Jairo Llopis -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html from openerp import api, fields, models From 6e0e3c22ffbe73d367ad195afc9211a386d907ee Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 3 Aug 2016 17:18:46 +0200 Subject: [PATCH 2/6] [IMP]base_custom_info: New types and access rules system. * Now you can define properties types, and access rules are inherited from the model/record linked to the custom info record. * Simplified version of computed value. * Implement for res.partner. * Add tests and fix bugs discovered in the meantime. * Allow to disable partner custom info tab, and custom info menu. * All of it can be set within general settings. * Now, by default, this module does not display custom info for partners unless in demo mode. Better fit for a base module. * You can disable the top menu entry too if it disturbs you, or enable it for everybody. * Give a special form when editing in partner custom info tab. * Sortable properties. * Sort values at onchange time. * Improve performance in onchange. * Split in several model files. --- base_custom_info/README.rst | 158 +++++- base_custom_info/__init__.py | 2 +- base_custom_info/__openerp__.py | 19 +- base_custom_info/demo/custom.info.option.csv | 4 + .../demo/custom.info.property.csv | 6 + .../demo/custom.info.template.csv | 2 + base_custom_info/demo/res_groups.xml | 12 + base_custom_info/i18n/es.po | 527 ++++++++++++++++-- .../migrations/9.0.2.0.0/pre-migrate.py | 10 + base_custom_info/models/__init__.py | 11 +- base_custom_info/models/custom_info.py | 134 ++--- .../models/custom_info_category.py | 34 ++ base_custom_info/models/custom_info_option.py | 38 ++ .../models/custom_info_property.py | 113 ++++ .../models/custom_info_template.py | 69 +++ base_custom_info/models/custom_info_value.py | 283 ++++++++++ base_custom_info/models/res_partner.py | 22 + base_custom_info/security/ir.model.access.csv | 13 +- base_custom_info/security/res_groups.xml | 31 ++ base_custom_info/tests/__init__.py | 5 + base_custom_info/tests/test_partner.py | 119 ++++ .../tests/test_value_conversion.py | 131 +++++ .../views/custom_info_category_view.xml | 53 ++ .../views/custom_info_option_view.xml | 52 ++ .../views/custom_info_property_view.xml | 63 ++- .../views/custom_info_template_view.xml | 38 +- .../views/custom_info_value_view.xml | 80 ++- base_custom_info/views/menu.xml | 44 +- base_custom_info/views/res_partner_view.xml | 28 + base_custom_info/wizard/__init__.py | 6 + .../wizard/base_config_settings.py | 20 + .../wizard/base_config_settings_view.xml | 33 ++ 32 files changed, 1968 insertions(+), 192 deletions(-) create mode 100644 base_custom_info/demo/custom.info.option.csv create mode 100644 base_custom_info/demo/custom.info.property.csv create mode 100644 base_custom_info/demo/custom.info.template.csv create mode 100644 base_custom_info/demo/res_groups.xml create mode 100644 base_custom_info/migrations/9.0.2.0.0/pre-migrate.py create mode 100644 base_custom_info/models/custom_info_category.py create mode 100644 base_custom_info/models/custom_info_option.py create mode 100644 base_custom_info/models/custom_info_property.py create mode 100644 base_custom_info/models/custom_info_template.py create mode 100644 base_custom_info/models/custom_info_value.py create mode 100644 base_custom_info/models/res_partner.py create mode 100644 base_custom_info/security/res_groups.xml create mode 100644 base_custom_info/tests/__init__.py create mode 100644 base_custom_info/tests/test_partner.py create mode 100644 base_custom_info/tests/test_value_conversion.py create mode 100644 base_custom_info/views/custom_info_category_view.xml create mode 100644 base_custom_info/views/custom_info_option_view.xml create mode 100644 base_custom_info/views/res_partner_view.xml create mode 100644 base_custom_info/wizard/__init__.py create mode 100644 base_custom_info/wizard/base_config_settings.py create mode 100644 base_custom_info/wizard/base_config_settings_view.xml diff --git a/base_custom_info/README.rst b/base_custom_info/README.rst index 60eecd504..6d6c57177 100644 --- a/base_custom_info/README.rst +++ b/base_custom_info/README.rst @@ -6,8 +6,126 @@ Base Custom Info ================ -This module allows to create custom fields in models without altering model's -structure. +This module allows you to attach custom information to records without the need +to alter the database structure too much. + +Definitions +=========== + +This module defines several concepts that you have to understand. + +Templates +--------- + +A *template* is a collection of *properties* that a record should have. +*Templates* always apply to a given model, and then you can choose among the +current templates for the model you are using when you edit a record of that +model. + +I.e., This addon includes a demo template called "Smart partners", that applies +to the model ``res.partner``, so if you edit any partner, you can choose that +template and get its properties autofilled. + +Properties +---------- + +A *property* is the "name" of the field. *Templates* can have any amount of +*properties*, and when you apply a *template* to a record, it automatically +gets all of its *properties* filled, empty (unless they have a *Default +value*), ready to assign *values*. + +You can set a property to as *required* to force it have a value, although you +should keep in mind that for yes/no properties, this would mean that only *yes* +can be selected, and for numeric properties, zero would be forbidden. + +Also you can set *Minimum* and *Maximum* limits for every *property*, but those +limits are only used when the data type is text (to constrain its length) or +number. To skip this constraint, just set a maximum smaller than the minimum. + +*Properties* always belong to a template, and as such, to a model. + +*Properties* define the data type (text, number, yes/no...), and when the type +is "Selection", then you can define what *options* are available. + +I.e., the "Smart partners" *template* has the following *properties*: + +- Name of his/her teacher +- Amount of people that hates him/her for being so smart +- Average note on all subjects +- Does he/she believe he/she is the smartest person on earth? +- What weaknesses does he/she have? + +When you set that template to any partner, you will then be able to fill these +*properties* with *values*. + +Categories +---------- + +*Properties* can also belong to a *category*, which allows you to sort them in +a logical way, and makes further development easier. + +For example, the ``website_sale_custom_info`` addon uses these to display a +technical datasheet per product in your online shop, sorted and separated by +category. + +You are not required to give a *category* to every *property*. + +Options +------- + +When a *property*'s type is "Selection", then you define the *options* +available, so the *value* must be one of these *options*. + +I.e., the "What weaknesses does he/she have?" *property* has some options: + +- Loves junk food +- Needs videogames +- Huge glasses + +The *value* will always be one of these. + +Value +----- + +When you assign a *template* to a partner, and then you get the *properties* it +should have, you still have to set a *value* for each property. + +*Values* can be of different types (whole numbers, constrained selection, +booleans...), depending on how the *property* was defined. However, there is +always the ``value`` field, that is a text string, and converts automatically +to/from the correct type. + +Why would I need this? +~~~~~~~~~~~~~~~~~~~~~~ + +Imagine you have some partners that are foreign, and that for those partners +you need some extra information that is not needed for others, and you do not +want to fill the partners model with a lot of fields that will be empty most of +the time. + +In this case, you could define a *template* called "Foreign partners", which +will be applied to ``res.partner`` objects, and defines some *properties* that +these are expected to have. + +Then you could assign that *template* to a partner, and automatically you will +get a subtable of all the properties it should have, with tools to fill their +*values* correctly. + +Does this work with any model? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Yes and no. + +Yes, because this is a base module that provides the tools to make this work +with any model. + +No, because, although the tools are provided, they are only applied to the +``res.partner`` model. This is by design, because different models can have +different needs, and we don't want to depend on every possible model. + +So, if you want to apply this to other models, you will have to develop a +little additional addon that depends on this one. If you are a developer, refer +to the *Development* section below. Installation ============ @@ -18,6 +136,17 @@ concrete models. This module is a technical dependency and is to be installed in parallel to other modules. +Configuration +============= + +To enable the main *Custom Info* menu: + +#. Enable *Settings > General Settings > Manage custom information*. + +To enable partner's custom info tab: + +#. Enable *Settings > General Settings > Edit custom information in partners*. + Usage ===== @@ -26,7 +155,7 @@ expected for a given record. To define a template, you need to: -* Go to *Settings > Custom Info > Templates*. +* Go to *Custom Info > Templates*. * Create one. * Add some *Properties* to it. @@ -35,11 +164,19 @@ properties. To manage the properties, you need to: -* Go to *Settings > Custom Info > Properties*. +* Go to *Custom Info > Properties*. + +To manage the property categories, you need to: + +* Go to *Custom Info > Categories*. + +Some properties can have a number of options to choose, to manage them: + +* Go to *Custom Info > Options*. To manage their values, you need to: -* Go to *Settings > Custom Info > Values*. +* Go to *Custom Info > Values*. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -51,10 +188,19 @@ Development To create a module that supports custom information, just depend on this module and inherit from the ``custom.info`` model. +See an example in the ``product_custom_info`` addon. + Known issues / Roadmap ====================== -* All data types of custom information values are text strings. +* Custom properties cannot be shared among templates. +* You get an error if you press *Save & New* when setting property values in + partner form. +* `There seems to be a bug in the web client that makes subviews appear empty + after an onchange + `_. + This module includes a workaround for that, but the bug should be fixed and + the workaround removed. Bug Tracker =========== diff --git a/base_custom_info/__init__.py b/base_custom_info/__init__.py index cc6e9affa..a518dce55 100644 --- a/base_custom_info/__init__.py +++ b/base_custom_info/__init__.py @@ -3,4 +3,4 @@ # © 2015 Antiun Ingeniería S.L. - Carlos Dauden # License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html -from . import models +from . import models, wizard diff --git a/base_custom_info/__openerp__.py b/base_custom_info/__openerp__.py index f1daa9ea1..81bcec5f1 100644 --- a/base_custom_info/__openerp__.py +++ b/base_custom_info/__openerp__.py @@ -8,16 +8,27 @@ 'name': "Base Custom Info", 'summary': "Add custom field in models", 'category': 'Tools', - 'version': '9.0.1.0.0', + 'version': '9.0.2.0.0', 'depends': [ - 'base', + 'base_setup', ], 'data': [ + 'security/ir.model.access.csv', + 'security/res_groups.xml', + 'views/custom_info_category_view.xml', + 'views/custom_info_option_view.xml', 'views/custom_info_template_view.xml', 'views/custom_info_property_view.xml', 'views/custom_info_value_view.xml', 'views/menu.xml', - 'security/ir.model.access.csv', + 'views/res_partner_view.xml', + 'wizard/base_config_settings_view.xml', + ], + 'demo': [ + 'demo/custom.info.template.csv', + 'demo/custom.info.property.csv', + 'demo/custom.info.option.csv', + 'demo/res_groups.xml', ], "images": [ "images/menu.png", @@ -29,7 +40,7 @@ 'Incaser Informatica S.L., ' 'Tecnativa, ' 'Odoo Community Association (OCA)', - 'website': 'http://www.antiun.com', + 'website': 'https://www.tecnativa.com', 'license': 'LGPL-3', 'installable': True, } diff --git a/base_custom_info/demo/custom.info.option.csv b/base_custom_info/demo/custom.info.option.csv new file mode 100644 index 000000000..aa072dc80 --- /dev/null +++ b/base_custom_info/demo/custom.info.option.csv @@ -0,0 +1,4 @@ +id,name,property_ids:id +opt_food,Loves junk food,prop_weaknesses +opt_videogames,Needs videogames,prop_weaknesses +opt_glasses,Huge glasses,prop_weaknesses diff --git a/base_custom_info/demo/custom.info.property.csv b/base_custom_info/demo/custom.info.property.csv new file mode 100644 index 000000000..64c3a3066 --- /dev/null +++ b/base_custom_info/demo/custom.info.property.csv @@ -0,0 +1,6 @@ +id,name,template_id:id,field_type,default_value,required +prop_teacher,Name of his/her teacher,tpl_smart,str,, +prop_haters,Amount of people that hates him/her for being so smart,tpl_smart,int,, +prop_avg_note,Average note on all subjects,tpl_smart,float,,True +prop_smartypants,Does he/she believe he/she is the smartest person on earth?,tpl_smart,bool,, +prop_weaknesses,What weaknesses does he/she have?,tpl_smart,id,Huge glasses, diff --git a/base_custom_info/demo/custom.info.template.csv b/base_custom_info/demo/custom.info.template.csv new file mode 100644 index 000000000..1ec9e2bfd --- /dev/null +++ b/base_custom_info/demo/custom.info.template.csv @@ -0,0 +1,2 @@ +id,name,model +tpl_smart,Smart partners,res.partner diff --git a/base_custom_info/demo/res_groups.xml b/base_custom_info/demo/res_groups.xml new file mode 100644 index 000000000..be6dcbc2f --- /dev/null +++ b/base_custom_info/demo/res_groups.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/base_custom_info/i18n/es.po b/base_custom_info/i18n/es.po index 9632caf95..b5eb90896 100644 --- a/base_custom_info/i18n/es.po +++ b/base_custom_info/i18n/es.po @@ -1,7 +1,7 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: # * base_custom_info -# +# # Translators: # OCA Transbot , 2016 # Pedro M. Baeza , 2016 @@ -9,20 +9,53 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-12-17 02:07+0000\n" -"PO-Revision-Date: 2016-12-17 02:07+0000\n" -"Last-Translator: Pedro M. Baeza , 2016\n" +"POT-Creation-Date: 2016-09-09 11:16+0200\n" +"PO-Revision-Date: 2016-09-09 11:17+0200\n" +"Last-Translator: Jairo Llopis \n" "Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es\n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.8.8\n" + +#. module: base_custom_info +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_value_inner_form +msgid "" +"Warning!\n" +" You might see no changes in parent form until you save it." +msgstr "" +"¡Atención!\n" +" Puede que no vea los cambios en el formulario principal " +"hasta que lo guarde." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_base_config_settings_group_custom_info_partner +msgid "Add a tab in the partners form to edit custom information" +msgstr "" +"Añadir una pestaña en el formulario de empresas para editar su inf. " +"personalizada." + +#. module: base_custom_info +#: model:ir.ui.menu,name:base_custom_info.menu_advanced +msgid "Advanced" +msgstr "Avanzado" #. module: base_custom_info -#: model:ir.model,name:base_custom_info.model_custom_info_model_link -msgid "A model that gets its ``ir.model`` computed" -msgstr "Un modelo que obtiene su \"ir.model\" calculado" +#: model:res.groups,name:base_custom_info.group_advanced +msgid "Advanced management" +msgstr "Gestión avanzada" + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_base_config_settings_group_custom_info_manager +msgid "Allow all employees to manage custom information" +msgstr "Permitir a todos los empleados gestionar inf. personalizada." + +#. module: base_custom_info +#: model:custom.info.property,name:base_custom_info.prop_haters +msgid "Amount of people that hates him/her for being so smart" +msgstr "Cantidad de gente que lo odia por ser tan listo" #. module: base_custom_info #: sql_constraint:custom.info.value:0 @@ -39,12 +72,53 @@ msgstr "Ya existe otra propiedad con ese nombre en esa plantilla." msgid "Another template with that name exists for that model." msgstr "Ya existe otra plantilla con ese nombre para ese modelo." +#. module: base_custom_info +#: model:ir.model,name:base_custom_info.model_custom_info_option +msgid "Available options for a custom property" +msgstr "Opciones disponibles para una propiedad personalizada" + +#. module: base_custom_info +#: model:custom.info.property,name:base_custom_info.prop_avg_note +msgid "Average note on all subjects" +msgstr "Nota media en todas las materias" + +#. module: base_custom_info +#: model:ir.ui.menu,name:base_custom_info.menu_basic +msgid "Basic" +msgstr "Básico" + +#. module: base_custom_info +#: model:res.groups,name:base_custom_info.group_basic +msgid "Basic management" +msgstr "Gestión básica" + +#. module: base_custom_info +#: model:ir.actions.act_window,name:base_custom_info.custom_info_category_action +#: model:ir.ui.menu,name:base_custom_info.menu_category +msgid "Categories" +msgstr "Categorías" + +#. module: base_custom_info +#: model:ir.model,name:base_custom_info.model_custom_info_category +msgid "Categorize custom info properties" +msgstr "Categorizar las propiedades de inf. personalizada" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_category_id +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_category_id +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_value_search +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_property_search +msgid "Category" +msgstr "Categoría" + #. module: base_custom_info #: model:ir.actions.act_window,help:base_custom_info.custom_info_template_action msgid "Click to define a new custom info template." -msgstr "Pulse para definir una nueva plantilla de información personalizada." +msgstr "Pulse para definir una nueva plantilla de inf. personalizada." #. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_create_uid +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_create_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_create_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_create_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_create_uid @@ -52,6 +126,8 @@ msgid "Created by" msgstr "Creado por" #. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_create_date +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_create_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_create_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_create_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_create_date @@ -61,31 +137,56 @@ msgstr "Creado el" #. module: base_custom_info #: model:ir.ui.menu,name:base_custom_info.menu_base_custom_info msgid "Custom Info" -msgstr "Información personalizada" +msgstr "Inf. personalizada" + +#. module: base_custom_info +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_category_tree +msgid "Custom Info Categories" +msgstr "Categorías de inf. personalizada" + +#. module: base_custom_info +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_option_tree +msgid "Custom Info Options" +msgstr "Opciones de inf. personalizada" + +#. module: base_custom_info +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_property_tree +msgid "Custom Info Properties" +msgstr "Propiedades de inf. personalizada" #. module: base_custom_info #: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_form msgid "Custom Info Template" -msgstr "Plantilla de información personalizada" +msgstr "Plantilla de inf. personalizada" #. module: base_custom_info -#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_line_form +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_category_form +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_option_form +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_property_form msgid "Custom Info Template Properties" -msgstr "Propiedades de la plantilla de información personalizada" +msgstr "Propiedades de la plantilla de inf. personalizada" #. module: base_custom_info -#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_line_tree #: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_tree msgid "Custom Info Templates" -msgstr "Plantillas de información personalizada" +msgstr "Plantillas de inf. personalizada" + +#. module: base_custom_info +#: model:ir.module.category,name:base_custom_info.category +#: model:ir.ui.view,arch_db:base_custom_info.view_general_configuration +#: model:ir.ui.view,arch_db:base_custom_info.view_partner_form +msgid "Custom Information" +msgstr "Inf. personalizada" #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_custom_info_template_id +#: model:ir.model.fields,field_description:base_custom_info.field_res_partner_custom_info_template_id msgid "Custom Information Template" -msgstr "Plantilla de información personalizada" +msgstr "Plantilla de inf. personalizada" #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_custom_info_ids +#: model:ir.model.fields,field_description:base_custom_info.field_res_partner_custom_info_ids msgid "Custom Properties" msgstr "Propiedades personalizadas" @@ -97,21 +198,43 @@ msgstr "Valores de las propiedades personalizadas" #. module: base_custom_info #: model:ir.model,name:base_custom_info.model_custom_info_property msgid "Custom information property" -msgstr "Propiedad de información personalizada" +msgstr "Propiedad de inf. personalizada" #. module: base_custom_info #: model:ir.model,name:base_custom_info.model_custom_info_template msgid "Custom information template" -msgstr "Plantilla de información personalizada" +msgstr "Plantilla de inf. personalizada" #. module: base_custom_info #: model:ir.model,name:base_custom_info.model_custom_info_value msgid "Custom information value" -msgstr "Valor de información personalizada" +msgstr "Valor de inf. personalizada" + +#. module: base_custom_info +#: selection:custom.info.property,field_type:0 +msgid "Decimal number" +msgstr "Número decimal" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value_float +msgid "Decimal number value" +msgstr "Valor del número decimal" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_default_value +msgid "Default value" +msgstr "Valor por defecto" + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_property.py:99 +#, python-format +msgid "Default value %s cannot be converted to type %s." +msgstr "El valor por defecto %s no se puede convertir al tipo %s." #. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_display_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_display_name -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_model_link_display_name +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_display_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_display_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_display_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_display_name @@ -119,8 +242,74 @@ msgid "Display Name" msgstr "Nombre mostrado" #. module: base_custom_info +#: model:res.groups,name:base_custom_info.group_partner +msgid "Display in partner form" +msgstr "Mostrar en el formulario de empresas" + +#. module: base_custom_info +#: model:custom.info.property,name:base_custom_info.prop_smartypants +msgid "Does he/she believe he/she is the smartest person on earth?" +msgstr "¿Se cree la persona más lista de la tierra?" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_base_config_settings_group_custom_info_partner +msgid "Edit custom information in partners" +msgstr "Editar inf. personalizada en empresas" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_field_name +msgid "Field name" +msgstr "Nombre del campo" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_field_type +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_field_type +msgid "Field type" +msgstr "Tipo del campo" + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_property_maximum +msgid "" +"For numeric fields, it means the maximum possible value; for text fields, it " +"means the maximum possible length. If it is smaller than the minimum, then " +"this check is skipped" +msgstr "" +"Para campos numéricos, significa el valor máximo permitido; para campos de " +"texto, significa la longitud máxima permitida. Si es menor que el mínimo, " +"entonces esta comprobación se omite." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_property_minimum +msgid "" +"For numeric fields, it means the minimum possible value; for text fields, it " +"means the minimum possible length. If it is bigger than the maximum, then " +"this check is skipped" +msgstr "" +"Para campos numéricos, significa el valor mínimo permitido; para campos de " +"texto, significa la longitud mínima permitida. Si es mayor que el máximo, " +"entonces esta comprobación se omite." + +#. module: base_custom_info +#: model:custom.info.property,default_value:base_custom_info.prop_weaknesses +msgid "Gafas gigantes" +msgstr "Gafas gigantes" + +#. module: base_custom_info +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_search +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_value_search +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_property_search +msgid "Group By" +msgstr "Agrupar por..." + +#. module: base_custom_info +#: model:custom.info.option,name:base_custom_info.opt_glasses +msgid "Huge glasses" +msgstr "Gafas gigantes" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_id #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_id -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_model_link_id +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_id #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_id #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_id #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_id @@ -128,27 +317,37 @@ msgid "ID" msgstr "ID" #. module: base_custom_info -#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_form -msgid "Info Lines" -msgstr "Líneas de información" +#: code:addons/base_custom_info/models/custom_info_property.py:109 +#, python-format +msgid "If you require a Yes/No field, you can only set Yes." +msgstr "Si requiere un campo Sí/No, sólo podrá escoger Sí." + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_property.py:112 +#, python-format +msgid "If you require a numeric field, you cannot set it to zero." +msgstr "Si requiere un campo numérico, no podrá ponerlo a cero." #. module: base_custom_info #: model:ir.model,name:base_custom_info.model_custom_info msgid "Inheritable abstract model to add custom info in any model" msgstr "" -"Modelo abstracto que se puede heredar para añadir información personalizada " -"a cualquier modelo" +"Modelo abstracto que se puede heredar para añadir inf. personalizada a " +"cualquier modelo" #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info___last_update -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_model_link___last_update +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category___last_update +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option___last_update #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property___last_update #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template___last_update #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value___last_update msgid "Last Modified on" -msgstr "Última modificación en" +msgstr "Última modificación el" #. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_write_uid +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_write_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_write_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_write_uid #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_write_uid @@ -156,6 +355,8 @@ msgid "Last Updated by" msgstr "Última actualización por" #. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_write_date +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_write_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_write_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_write_date #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_write_date @@ -163,16 +364,52 @@ msgid "Last Updated on" msgstr "Última actualización el" #. module: base_custom_info -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_model_link_model -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_model_link_model_id +#: code:addons/base_custom_info/models/custom_info_value.py:199 +#, python-format +msgid "" +"Length for %(prop)s is %(val)s, but it should be between %(min)d and %(max)d." +msgstr "" +"La longitud de %(prop)s es %(val)s, pero debería estar entre %(min)d y " +"%(max)d." + +#. module: base_custom_info +#: model:custom.info.option,name:base_custom_info.opt_food +msgid "Loves junk food" +msgstr "Le encanta la comida basura" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_base_config_settings_group_custom_info_manager +msgid "Manage custom information" +msgstr "Gestionar inf. personalizada" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_maximum +msgid "Maximum" +msgstr "Máximo" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_minimum +msgid "Minimum" +msgstr "Mínimo" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_model #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_model #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_model_id #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_model -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_model_id +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_template_search msgid "Model" msgstr "Modelo" #. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_template.py:52 +#, python-format +msgid "Model does not exist." +msgstr "El modelo no existe." + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_name +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_name #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_name @@ -180,29 +417,124 @@ msgid "Name" msgstr "Nombre" #. module: base_custom_info -#: model:ir.actions.act_window,name:base_custom_info.custom_info_template_line_action -#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_info_ids -#: model:ir.ui.menu,name:base_custom_info.menu_base_custom_info_template_line +#: model:custom.info.property,name:base_custom_info.prop_teacher +msgid "Name of his/her teacher" +msgstr "Nombre de su profesor" + +#. module: base_custom_info +#: model:custom.info.option,name:base_custom_info.opt_videogames +msgid "Needs videogames" +msgstr "Necesita videojuegos" + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_value.py:161 +#: code:addons/base_custom_info/models/custom_info_value.py:256 +#, python-format +msgid "No" +msgstr "No" + +#. module: base_custom_info +#: model:ir.actions.act_window,name:base_custom_info.custom_info_option_action +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_option_ids +#: model:ir.ui.menu,name:base_custom_info.menu_option +msgid "Options" +msgstr "Opciones" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_owner_id +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_value_search +msgid "Owner" +msgstr "Dueño" + +#. module: base_custom_info +#: model:ir.model,name:base_custom_info.model_res_partner +msgid "Partner" +msgstr "Empresa" + +#. module: base_custom_info +#: model:ir.actions.act_window,name:base_custom_info.custom_info_property_action +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_property_ids +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_property_ids +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_template_property_ids +#: model:ir.ui.menu,name:base_custom_info.menu_property msgid "Properties" msgstr "Propiedades" +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_category_property_ids +msgid "Properties in this category." +msgstr "Propiedades en esta categoría." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_option_property_ids +msgid "Properties where this option is enabled." +msgstr "Propiedades en las que esta opción está disponible." + #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_property_id +#: model:ir.ui.view,arch_db:base_custom_info.base_custom_info_value_search msgid "Property" msgstr "Propiedad" +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_value.py:183 +#, python-format +msgid "Property %s is required." +msgstr "La propiedad %s es obligatoria" + #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_info_value_ids msgid "Property Values" msgstr "Valor de la propiedad" +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_value_owner_id +msgid "Record that owns this custom value." +msgstr "Registro que posee este valor personalizado." + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_required +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_required +msgid "Required" +msgstr "Requerido" + #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_res_id msgid "Resource ID" msgstr "ID del recurso" +#. module: base_custom_info +#: selection:custom.info.property,field_type:0 +msgid "Selection" +msgstr "Selección" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value_id +msgid "Selection value" +msgstr "Valor de selección" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_category_sequence +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_category_sequence +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_sequence +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_category_sequence +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_property_sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_custom_info +#: model:custom.info.template,name:base_custom_info.tpl_smart +msgid "Smart partners" +msgstr "Gente lista" + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_value_field_name +msgid "Technical name of the field where the value is stored." +msgstr "Nombre técnico del campo donde se guarda este valor" + #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_property_template_id +#: model:ir.ui.view,arch_db:base_custom_info.custom_info_property_search msgid "Template" msgstr "Plantilla" @@ -212,22 +544,139 @@ msgstr "Plantilla" msgid "Templates" msgstr "Plantillas" +#. module: base_custom_info +#: selection:custom.info.property,field_type:0 +msgid "Text" +msgstr "Texto" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value_str +msgid "Text value" +msgstr "Valor de texto" + +#. module: base_custom_info +#: model:res.groups,comment:base_custom_info.group_advanced +msgid "The user will be able to manage advanced custom information." +msgstr "" +"El usuario tendrá acceso a una gestión avanzada de la inf. personalizada." + +#. module: base_custom_info +#: model:res.groups,comment:base_custom_info.group_basic +msgid "The user will be able to manage basic custom information." +msgstr "" +"El usuario tendrá acceso a una gestión básica de la inf. personalizada." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_property_field_type +#: model:ir.model.fields,help:base_custom_info.field_custom_info_value_field_type +msgid "Type of information that can be stored in the property." +msgstr "Tipo de información que se puede almacenar en esta propiedad." + #. module: base_custom_info #: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value msgid "Value" msgstr "Valor" +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_value.py:205 +#, python-format +msgid "" +"Value for %(prop)s is %(val)s, but it should be between %(min)d and %(max)d." +msgstr "" +"El valor de %(prop)s es %(val)s, pero debería estar entre %(min)d y %(max)d." + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_value.py:209 +#, python-format +msgid "" +"Value for %(prop)s is %(val)s, but it should be between %(min)f and %(max)f." +msgstr "" +"El valor de %(prop)s es %(val)s, pero debería estar entre %(min)f y %(max)f." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_value_value +msgid "Value, always converted to/from the typed field." +msgstr "Valor, siempre convertido del/al campo tipado." + #. module: base_custom_info #: model:ir.actions.act_window,name:base_custom_info.custom_info_value_action +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_option_value_ids #: model:ir.ui.menu,name:base_custom_info.menu_base_custom_info_value msgid "Values" msgstr "Valores" #. module: base_custom_info -#: model:ir.actions.act_window,help:base_custom_info.custom_info_template_action +#: model:ir.model.fields,help:base_custom_info.field_custom_info_option_value_ids +msgid "Values that have set this option." +msgstr "Valores que han escogido esta opción." + +#. module: base_custom_info +#: model:custom.info.property,name:base_custom_info.prop_weaknesses +msgid "What weaknesses does he/she have?" +msgstr "¿Qué debilidades tiene?" + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_property_option_ids +msgid "When the field type is 'selection', choose the available options here." +msgstr "" +"Cuando el tipo de campo es 'selección', escoja las opciones disponibles aquí." + +#. module: base_custom_info +#: selection:custom.info.property,field_type:0 +msgid "Whole number" +msgstr "Número entero" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value_int +msgid "Whole number value" +msgstr "Valor del número entero" + +#. module: base_custom_info +#: model:res.groups,comment:base_custom_info.group_partner +msgid "Will be able to edit custom information from partner's form." +msgstr "Podrá editar inf. personalizada en el formulario de empresa." + +#. module: base_custom_info +#: model:ir.model.fields,help:base_custom_info.field_custom_info_property_default_value msgid "" -"You must define a custom info template for each\n" -" product properties group." +"Will be applied by default to all custom values of this property. This is a " +"char field, so you have to enter some value that can be converted to the " +"field type you choose." msgstr "" -"Debe definir una plantilla de información personalizada para cada grupo de " +"Se aplicará por defecto a todos los valores personalizados de esta " +"propiedad. Este campo es de texto, así que tiene que introducir un valor que " +"se pueda convertir al tipo de campo que ha escogido." + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_value.py:161 +#, python-format +msgid "Yes" +msgstr "Sí" + +#. module: base_custom_info +#: selection:custom.info.property,field_type:0 +msgid "Yes/No" +msgstr "Sí/No" + +#. module: base_custom_info +#: model:ir.model.fields,field_description:base_custom_info.field_custom_info_value_value_bool +msgid "Yes/No value" +msgstr "Valor sí/no" + +#. module: base_custom_info +#: code:addons/base_custom_info/models/custom_info_template.py:59 +#, python-format +msgid "You cannot change the model because it is in use." +msgstr "No puede cambiar el modelo porque ya se está usando." + +#. module: base_custom_info +#: model:ir.actions.act_window,help:base_custom_info.custom_info_template_action +msgid "You must define a custom info template for each properties group." +msgstr "" +"Debe definir una plantilla de inf. personalizada por cada grupo de " "propiedades." + +#. module: base_custom_info +#: model:ir.model,name:base_custom_info.model_base_config_settings +msgid "base.config.settings" +msgstr "base.config.settings" diff --git a/base_custom_info/migrations/9.0.2.0.0/pre-migrate.py b/base_custom_info/migrations/9.0.2.0.0/pre-migrate.py new file mode 100644 index 000000000..574e261dd --- /dev/null +++ b/base_custom_info/migrations/9.0.2.0.0/pre-migrate.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +# pragma: no-cover + + +def migrate(cr, version): + """Update database from previous versions, before updating module.""" + cr.execute( + "ALTER TABLE custom_info_value RENAME COLUMN value TO value_str") diff --git a/base_custom_info/models/__init__.py b/base_custom_info/models/__init__.py index 4ce49af98..e0593f285 100644 --- a/base_custom_info/models/__init__.py +++ b/base_custom_info/models/__init__.py @@ -1,6 +1,15 @@ # -*- coding: utf-8 -*- # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden +# © 2016 Jairo Llopis # License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html -from . import custom_info +from . import ( + custom_info_template, + custom_info_property, + custom_info_category, + custom_info_option, + custom_info_value, + custom_info, + res_partner, +) diff --git a/base_custom_info/models/custom_info.py b/base_custom_info/models/custom_info.py index 297a25ade..7ef469e3a 100644 --- a/base_custom_info/models/custom_info.py +++ b/base_custom_info/models/custom_info.py @@ -1,121 +1,61 @@ # -*- coding: utf-8 -*- # © 2015 Antiun Ingeniería S.L. - Sergio Teruel # © 2015 Antiun Ingeniería S.L. - Carlos Dauden -# © 2015 Antiun Ingeniería S.L. - Jairo Llopis +# © 2016 Jairo Llopis # License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html from openerp import api, fields, models -class CustomInfoModelLink(models.AbstractModel): - _description = "A model that gets its ``ir.model`` computed" - _name = "custom.info.model_link" - - model = fields.Char( - index=True, - readonly=True, - required=True) - model_id = fields.Many2one( - 'ir.model', - 'Model', - compute="_compute_model_id", - store=True) - - @api.multi - @api.depends("model") - def _compute_model_id(self): - """Get a related model from its name, for better UI.""" - for s in self: - s.model_id = self.env["ir.model"].search([("model", "=", s.model)]) - - -class CustomInfoTemplate(models.Model): - """Defines custom properties expected for a given database object.""" - _description = "Custom information template" - _name = "custom.info.template" - _inherit = "custom.info.model_link" - _sql_constraints = [ - ("name_model", - "UNIQUE (name, model)", - "Another template with that name exists for that model."), - ] - - name = fields.Char(required=True, translate=True) - info_ids = fields.One2many( - 'custom.info.property', - 'template_id', - 'Properties') - - -class CustomInfoProperty(models.Model): - """Name of the custom information property.""" - _description = "Custom information property" - _name = "custom.info.property" - _sql_constraints = [ - ("name_template", - "UNIQUE (name, template_id)", - "Another property with that name exists for that template."), - ] - - name = fields.Char(required=True, translate=True) - template_id = fields.Many2one( - comodel_name='custom.info.template', - string='Template', - required=True) - info_value_ids = fields.One2many( - comodel_name="custom.info.value", - inverse_name="property_id", - string="Property Values") - - -class CustomInfoValue(models.Model): - _description = "Custom information value" - _name = "custom.info.value" - _inherit = "custom.info.model_link" - _rec_name = 'value' - _sql_constraints = [ - ("property_model_res", - "UNIQUE (property_id, model, res_id)", - "Another property with that name exists for that resource."), - ] - - res_id = fields.Integer("Resource ID", index=True, required=True) - property_id = fields.Many2one( - comodel_name='custom.info.property', - required=True, - string='Property') - name = fields.Char(related='property_id.name', readonly=True) - value = fields.Char(translate=True, index=True) +class CustomInfo(models.AbstractModel): + """Models that inherit this one will get custom information for free! + They will probably want to declare a default model in the context of the + :attr:`custom_info_template_id` field. -class CustomInfo(models.AbstractModel): + See example in :mod:`res_partner`. + """ _description = "Inheritable abstract model to add custom info in any model" _name = "custom.info" custom_info_template_id = fields.Many2one( comodel_name='custom.info.template', + domain=lambda self: [("model", "=", self._name)], string='Custom Information Template') custom_info_ids = fields.One2many( comodel_name='custom.info.value', inverse_name='res_id', domain=lambda self: [("model", "=", self._name)], + context={"embed": True}, auto_join=True, string='Custom Properties') @api.multi @api.onchange('custom_info_template_id') def _onchange_custom_info_template_id(self): - if not self.custom_info_template_id: - self.custom_info_ids = False - else: - info_list = self.custom_info_ids.mapped('property_id') - for info_name in self.custom_info_template_id.info_ids: - if info_name not in info_list: - self.custom_info_ids |= self.custom_info_ids.new({ - 'model': self._name, - 'property_id': info_name.id, - "res_id": self.id, - }) + new = [(5, False, False)] + for prop in self.custom_info_template_id.property_ids: + new += [(0, False, { + "property_id": prop.id, + "res_id": self.id, + "model": self._name, + })] + self.custom_info_ids = new + self.custom_info_ids._onchange_property_set_default_value() + self.custom_info_ids._inverse_value() + self.custom_info_ids._compute_value() + + # HACK https://github.com/OCA/server-tools/pull/492#issuecomment-237594285 + @api.multi + def onchange(self, values, field_name, field_onchange): + """Add custom info children values that will be probably changed.""" + subfields = ("category_id", "field_type", "required", "property_id", + "res_id", "model", "value", "value_str", "value_int", + "value_float", "value_bool", "value_id") + for subfield in subfields: + field_onchange.setdefault("custom_info_ids." + subfield, "") + return super(CustomInfo, self).onchange( + values, field_name, field_onchange) @api.multi def unlink(self): @@ -124,3 +64,13 @@ class CustomInfo(models.AbstractModel): if res: info_values.unlink() return res + + @api.multi + @api.returns("custom.info.value") + def get_custom_info_value(self, properties): + """Get ``custom.info.value`` records for the given property.""" + return self.env["custom.info.value"].search([ + ("model", "=", self._name), + ("res_id", "in", self.ids), + ("property_id", "in", properties.ids), + ]) diff --git a/base_custom_info/models/custom_info_category.py b/base_custom_info/models/custom_info_category.py new file mode 100644 index 000000000..f48551471 --- /dev/null +++ b/base_custom_info/models/custom_info_category.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from openerp import api, fields, models + + +class CustomInfoCategory(models.Model): + _description = "Categorize custom info properties" + _name = "custom.info.category" + _order = "sequence, name" + + name = fields.Char(index=True, translate=True, required=True) + sequence = fields.Integer(index=True) + property_ids = fields.One2many( + comodel_name="custom.info.property", + inverse_name="category_id", + string="Properties", + help="Properties in this category.", + ) + + @api.multi + def check_access_rule(self, operation): + """You access a category if you access at least one property.""" + last = None + for prop in self.mapped("property_ids"): + try: + prop.check_access_rule(operation) + return + except Exception as last: + pass + if last: + raise last + return super(CustomInfoCategory, self).check_access_rule(operation) diff --git a/base_custom_info/models/custom_info_option.py b/base_custom_info/models/custom_info_option.py new file mode 100644 index 000000000..08d812c41 --- /dev/null +++ b/base_custom_info/models/custom_info_option.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from openerp import api, fields, models + + +class CustomInfoOption(models.Model): + _description = "Available options for a custom property" + _name = "custom.info.option" + _order = "name" + + name = fields.Char(index=True, translate=True, required=True) + property_ids = fields.Many2many( + comodel_name="custom.info.property", + string="Properties", + help="Properties where this option is enabled.", + ) + value_ids = fields.One2many( + comodel_name="custom.info.value", + inverse_name="value_id", + string="Values", + help="Values that have set this option.", + ) + + @api.multi + def check_access_rule(self, operation): + """You access an option if you access at least one property.""" + last = None + for prop in self.mapped("property_ids"): + try: + prop.check_access_rule(operation) + return + except Exception as last: + pass + if last: + raise last + return super(CustomInfoOption, self).check_access_rule(operation) diff --git a/base_custom_info/models/custom_info_property.py b/base_custom_info/models/custom_info_property.py new file mode 100644 index 000000000..67917cff3 --- /dev/null +++ b/base_custom_info/models/custom_info_property.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html +from openerp import _, api, fields, models +from openerp.exceptions import UserError, ValidationError + + +class CustomInfoProperty(models.Model): + """Name of the custom information property.""" + _description = "Custom information property" + _name = "custom.info.property" + _order = "template_id, category_sequence, category_id, sequence, id" + _sql_constraints = [ + ("name_template", + "UNIQUE (name, template_id)", + "Another property with that name exists for that template."), + ] + + name = fields.Char(required=True, translate=True) + sequence = fields.Integer(index=True) + category_id = fields.Many2one( + comodel_name="custom.info.category", + string="Category", + ) + category_sequence = fields.Integer( + related="category_id.sequence", + store=True, + readonly=True, + ) + template_id = fields.Many2one( + comodel_name='custom.info.template', + string='Template', + required=True) + model = fields.Char( + related="template_id.model", + readonly=True, + auto_join=True, + ) + info_value_ids = fields.One2many( + comodel_name="custom.info.value", + inverse_name="property_id", + string="Property Values") + default_value = fields.Char( + translate=True, + help="Will be applied by default to all custom values of this " + "property. This is a char field, so you have to enter some value " + "that can be converted to the field type you choose.", + ) + required = fields.Boolean() + minimum = fields.Float( + help="For numeric fields, it means the minimum possible value; " + "for text fields, it means the minimum possible length. " + "If it is bigger than the maximum, then this check is skipped", + ) + maximum = fields.Float( + default=-1, + help="For numeric fields, it means the maximum possible value; " + "for text fields, it means the maximum possible length. " + "If it is smaller than the minimum, then this check is skipped", + ) + field_type = fields.Selection( + selection=[ + ("str", "Text"), + ("int", "Whole number"), + ("float", "Decimal number"), + ("bool", "Yes/No"), + ("id", "Selection"), + ], + default="str", + required=True, + help="Type of information that can be stored in the property.", + ) + option_ids = fields.Many2many( + comodel_name="custom.info.option", + string="Options", + help="When the field type is 'selection', choose the available " + "options here.", + ) + + @api.multi + def check_access_rule(self, operation): + """You access a property if you access its template.""" + self.mapped("template_id").check_access_rule(operation) + return super(CustomInfoProperty, self).check_access_rule(operation) + + @api.one + @api.constrains("default_value", "field_type") + def _check_default_value(self): + """Ensure the default value is valid.""" + if self.default_value: + try: + self.env["custom.info.value"]._transform_value( + self.default_value, self.field_type, self) + except ValueError: + selection = dict( + self._fields["field_type"].get_description(self.env) + ["selection"]) + raise ValidationError( + _("Default value %s cannot be converted to type %s.") % + (self.default_value, selection[self.field_type])) + + @api.multi + @api.onchange("required", "field_type") + def _onchange_required_warn(self): + """Warn if the required flag implies a possible weird behavior.""" + if self.required: + if self.field_type == "bool": + raise UserError( + _("If you require a Yes/No field, you can only set Yes.")) + if self.field_type in {"int", "float"}: + raise UserError( + _("If you require a numeric field, you cannot set it to " + "zero.")) diff --git a/base_custom_info/models/custom_info_template.py b/base_custom_info/models/custom_info_template.py new file mode 100644 index 000000000..16e814e0e --- /dev/null +++ b/base_custom_info/models/custom_info_template.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from openerp import _, api, fields, models +from openerp.exceptions import ValidationError + + +class CustomInfoTemplate(models.Model): + """Defines custom properties expected for a given database object.""" + _description = "Custom information template" + _name = "custom.info.template" + _order = "model_id, name" + _sql_constraints = [ + ("name_model", + "UNIQUE (name, model)", + "Another template with that name exists for that model."), + ] + + name = fields.Char(required=True, translate=True) + model = fields.Char( + index=True, + readonly=True, + required=True) + model_id = fields.Many2one( + 'ir.model', + 'Model', + compute="_compute_model_id", + store=True, + ondelete="cascade", + ) + property_ids = fields.One2many( + 'custom.info.property', + 'template_id', + 'Properties', + oldname="info_ids", + context={"embed": True}, + ) + + @api.multi + @api.depends("model") + def _compute_model_id(self): + """Get a related model from its name, for better UI.""" + for s in self: + s.model_id = self.env["ir.model"].search([("model", "=", s.model)]) + + @api.multi + @api.constrains("model") + def _check_model(self): + """Ensure model exists.""" + for s in self: + if s.model not in self.env: + raise ValidationError(_("Model does not exist.")) + # Avoid error when updating base module and a submodule extends a + # model that falls out of this one's dependency graph + with self.env.norecompute(): + oldmodels = set(s.mapped("property_ids.info_value_ids.model")) + if oldmodels and {s.model} != oldmodels: + raise ValidationError( + _("You cannot change the model because it is in use.")) + + @api.multi + def check_access_rule(self, operation): + """You access a template if you access its model.""" + for s in self: + model = self.env[s.model] + model.check_access_rights(operation) + model.check_access_rule(operation) + return super(CustomInfoTemplate, self).check_access_rule(operation) diff --git a/base_custom_info/models/custom_info_value.py b/base_custom_info/models/custom_info_value.py new file mode 100644 index 000000000..321b25f22 --- /dev/null +++ b/base_custom_info/models/custom_info_value.py @@ -0,0 +1,283 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html +from openerp import _, api, fields, models, SUPERUSER_ID +from openerp.exceptions import ValidationError +from openerp.tools.safe_eval import safe_eval + + +class CustomInfoValue(models.Model): + _description = "Custom information value" + _name = "custom.info.value" + _rec_name = 'value' + _order = ("model, res_id, category_sequence, category_id, " + "property_sequence, property_id") + _sql_constraints = [ + ("property_owner", + "UNIQUE (property_id, model, res_id)", + "Another property with that name exists for that resource."), + ] + + model = fields.Char( + related="property_id.model", + index=True, + readonly=True, + auto_join=True, + store=True, + ) + owner_id = fields.Reference( + selection="_selection_owner_id", + string="Owner", + compute="_compute_owner_id", + inverse="_inverse_owner_id", + help="Record that owns this custom value.", + ) + res_id = fields.Integer( + "Resource ID", + required=True, + index=True, + store=True, + ondelete="cascade", + ) + property_id = fields.Many2one( + comodel_name='custom.info.property', + required=True, + string='Property') + property_sequence = fields.Integer( + related="property_id.sequence", + store=True, + index=True, + readonly=True, + ) + category_sequence = fields.Integer( + related="property_id.category_id.sequence", + store=True, + readonly=True, + ) + category_id = fields.Many2one( + related="property_id.category_id", + store=True, + readonly=True, + ) + name = fields.Char(related='property_id.name', readonly=True) + field_type = fields.Selection(related="property_id.field_type") + field_name = fields.Char( + compute="_compute_field_name", + help="Technical name of the field where the value is stored.", + ) + required = fields.Boolean(related="property_id.required") + value = fields.Char( + compute="_compute_value", + inverse="_inverse_value", + search="_search_value", + help="Value, always converted to/from the typed field.", + ) + value_str = fields.Char( + string="Text value", + translate=True, + index=True, + ) + value_int = fields.Integer( + string="Whole number value", + index=True, + ) + value_float = fields.Float( + string="Decimal number value", + index=True, + ) + value_bool = fields.Boolean( + string="Yes/No value", + index=True, + ) + value_id = fields.Many2one( + comodel_name="custom.info.option", + string="Selection value", + ondelete="cascade", + domain="[('property_ids', 'in', [property_id])]", + ) + + @api.multi + def check_access_rule(self, operation): + """You access a value if you access its property and owner record.""" + if self.env.uid == SUPERUSER_ID: + return + for s in self: + s.property_id.check_access_rule(operation) + s.owner_id.check_access_rights(operation) + s.owner_id.check_access_rule(operation) + return super(CustomInfoValue, self).check_access_rule(operation) + + @api.model + def create(self, vals): + """Skip constrains in 1st lap.""" + # HACK https://github.com/odoo/odoo/pull/13439 + if "value" in vals: + self.env.context.skip_required = True + return super(CustomInfoValue, self).create(vals) + + @api.model + def _selection_owner_id(self): + """You can choose among models linked to a template.""" + models = self.env["ir.model.fields"].search([ + ("ttype", "=", "many2one"), + ("relation", "=", "custom.info.template"), + ("model_id.transient", "=", False), + "!", ("model", "=like", "custom.info.%"), + ]).mapped("model_id") + models = models.search([("id", "in", models.ids)], order="name") + return [(m.model, m.name) for m in models + if m.model in self.env and self.env[m.model]._auto] + + @api.multi + @api.depends("property_id.field_type") + def _compute_field_name(self): + """Get the technical name where the real typed value is stored.""" + for s in self: + s.field_name = "value_{!s}".format(s.property_id.field_type) + + @api.multi + @api.depends("res_id", "model") + def _compute_owner_id(self): + """Get the id from the linked record.""" + for s in self: + s.owner_id = "{},{}".format(s.model, s.res_id) + + @api.multi + def _inverse_owner_id(self): + """Store the owner according to the model and ID.""" + for s in self: + s.model = s.owner_id._name + s.res_id = s.owner_id.id + + @api.multi + @api.depends("property_id.field_type", "field_name", "value_str", + "value_int", "value_float", "value_bool", "value_id") + def _compute_value(self): + """Get the value as a string, from the original field.""" + for s in self: + if s.field_type == "id": + s.value = ", ".join(s.value_id.mapped("display_name")) + elif s.field_type == "bool": + s.value = _("Yes") if s.value_bool else _("No") + else: + s.value = getattr(s, s.field_name, False) + + @api.multi + def _inverse_value(self): + """Write the value correctly converted in the typed field.""" + for s in self: + s[s.field_name] = self._transform_value( + s.value, s.field_type, s.property_id) + + @api.one + @api.constrains("required", "field_name", "value_str", "value_int", + "value_float", "value_bool", "value_id") + def _check_required(self): + """Ensure required fields are filled""" + # HACK https://github.com/odoo/odoo/pull/13439 + try: + del self.env.context.skip_required + except AttributeError: + if self.required and not self[self.field_name]: + raise ValidationError( + _("Property %s is required.") % + self.property_id.display_name) + + @api.one + @api.constrains("property_id", "field_type", "field_name", + "value_str", "value_int", "value_float") + def _check_min_max_limits(self): + """Ensure value falls inside the property's stablished limits.""" + minimum, maximum = self.property_id.minimum, self.property_id.maximum + if minimum <= maximum: + value = self[self.field_name] + if not value: + # This is a job for :meth:`.~_check_required` + return + if self.field_type == "str": + number = len(self.value_str) + message = _( + "Length for %(prop)s is %(val)s, but it should be " + "between %(min)d and %(max)d.") + elif self.field_type in {"int", "float"}: + number = value + if self.field_type == "int": + message = _( + "Value for %(prop)s is %(val)s, but it should be " + "between %(min)d and %(max)d.") + else: + message = _( + "Value for %(prop)s is %(val)s, but it should be " + "between %(min)f and %(max)f.") + else: + return + if not minimum <= number <= maximum: + raise ValidationError(message % { + "prop": self.property_id.display_name, + "val": number, + "min": minimum, + "max": maximum, + }) + + @api.multi + @api.onchange("property_id") + def _onchange_property_set_default_value(self): + """Load default value for this property.""" + for record in self: + if not record.value and record.property_id.default_value: + record.value = record.property_id.default_value + + @api.model + def _transform_value(self, value, format_, properties=None): + """Transforms a text value to the expected format. + + :param str/bool value: + Custom value in raw string. + + :param str format_: + Target conversion format for the value. Must be available among + ``custom.info.property`` options. + + :param recordset properties: + Useful when :param:`format_` is ``id``, as it helps to ensure the + option is available in these properties. If :param:`format_` is + ``id`` and :param:`properties` is ``None``, no transformation will + be made for :param:`value`. + """ + if not value: + value = False + elif format_ == "id" and properties: + value = self.env["custom.info.option"].search( + [("property_ids", "in", properties.ids), + ("name", "=ilike", value)]) + value.ensure_one() + elif format_ == "bool": + value = value.strip().lower() not in { + "0", "false", "", "no", "off", _("No").lower()} + elif format_ not in {"str", "id"}: + value = safe_eval("{!s}({!r})".format(format_, value)) + return value + + @api.model + def _search_value(self, operator, value): + """Search from the stored field directly.""" + options = ( + o[0] for o in + self.property_id._fields["field_type"] + .get_description(self.env)["selection"]) + domain = [] + for fmt in options: + try: + _value = (self._transform_value(value, fmt) + if not isinstance(value, list) else + [self._transform_value(v, fmt) for v in value]) + except ValueError: + # If you are searching something that cannot be casted, then + # your property is probably from another type + continue + domain += [ + "&", + ("field_type", "=", fmt), + ("value_" + fmt, operator, _value), + ] + return ["|"] * (len(domain) / 3 - 1) + domain diff --git a/base_custom_info/models/res_partner.py b/base_custom_info/models/res_partner.py new file mode 100644 index 000000000..cc431bfbf --- /dev/null +++ b/base_custom_info/models/res_partner.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from openerp import fields, models + + +class ResPartner(models.Model): + """Implement custom information for partners. + + Besides adding some visible feature to the module, this is useful for + testing and example purposes. + """ + _name = "res.partner" + _inherit = [_name, "custom.info"] + + custom_info_template_id = fields.Many2one( + context={"default_model": _name}, + ) + custom_info_ids = fields.One2many( + context={"default_model": _name}, + ) diff --git a/base_custom_info/security/ir.model.access.csv b/base_custom_info/security/ir.model.access.csv index d285e7021..ee65f8e15 100644 --- a/base_custom_info/security/ir.model.access.csv +++ b/base_custom_info/security/ir.model.access.csv @@ -1,7 +1,6 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_custom_info_template_user","custom.info.template.user","model_custom_info_template","base.group_user",1,0,0,0 -"access_custom_info_property_user","custom.info.template.line.user","model_custom_info_property","base.group_user",1,0,0,0 -"access_custom_info_value_user","custom.info.value.user","model_custom_info_value","base.group_user",1,0,0,0 -"access_custom_info_template_sale_manager","custom.info.template.salemanager","model_custom_info_template","base.group_system",1,1,1,1 -"access_custom_info_property_sale_manager","custom.info.template.line.salemanager","model_custom_info_property","base.group_system",1,1,1,1 -"access_custom_info_value_sale_manager","custom.info.value.salemanager","model_custom_info_value","base.group_system",1,1,1,1 +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_template,Access custom info templates,model_custom_info_template,,1,1,1,1 +access_property,Access custom info properties,model_custom_info_property,,1,1,1,1 +access_value,Access custom info values,model_custom_info_value,,1,1,1,1 +access_option,Access custom info options,model_custom_info_option,,1,1,1,1 +access_category,Access custom info categories,model_custom_info_category,,1,1,1,1 diff --git a/base_custom_info/security/res_groups.xml b/base_custom_info/security/res_groups.xml new file mode 100644 index 000000000..684c141c8 --- /dev/null +++ b/base_custom_info/security/res_groups.xml @@ -0,0 +1,31 @@ + + + + + + + Custom Information + + + + Display in partner form + + Will be able to edit custom information from partner's form. + + + + Basic management + + The user will be able to manage basic custom information. + + + + Advanced management + + The user will be able to manage advanced custom information. + + + + + diff --git a/base_custom_info/tests/__init__.py b/base_custom_info/tests/__init__.py new file mode 100644 index 000000000..18f016dd7 --- /dev/null +++ b/base_custom_info/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from . import test_partner, test_value_conversion diff --git a/base_custom_info/tests/test_partner.py b/base_custom_info/tests/test_partner.py new file mode 100644 index 000000000..ee39778ce --- /dev/null +++ b/base_custom_info/tests/test_partner.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from openerp.exceptions import AccessError, ValidationError +from openerp.tests.common import TransactionCase + + +class PartnerCase(TransactionCase): + def setUp(self, *args, **kwargs): + super(PartnerCase, self).setUp(*args, **kwargs) + self.agrolait = self.env.ref("base.res_partner_2") + self.tpl = self.env.ref("base_custom_info.tpl_smart") + self.demouser = self.env.ref("base.user_demo") + + def set_custom_info_for_agrolait(self): + """Used when you need to use some created custom info.""" + self.agrolait.custom_info_template_id = self.tpl + self.env["custom.info.value"].create({ + "res_id": self.agrolait.id, + "property_id": self.env.ref("base_custom_info.prop_haters").id, + "value_int": 5, + }) + + def test_access_granted(self): + """Access to the model implies access to custom info.""" + # Demo user has contact creation permissions by default + agrolait = self.agrolait.sudo(self.demouser) + agrolait.custom_info_template_id = self.tpl + agrolait.env["custom.info.value"].create({ + "res_id": agrolait.id, + "property_id": + agrolait.env.ref("base_custom_info.prop_weaknesses").id, + "value_id": agrolait.env.ref("base_custom_info.opt_food").id, + }) + agrolait.custom_info_template_id.property_ids[0].name = "Changed!" + agrolait.env.ref("base_custom_info.opt_food").name = "Changed!" + + def test_access_denied(self): + """Forbidden access to the model forbids it to custom info.""" + # Remove permissions to demo user + self.demouser.groups_id = self.env.ref("base.group_portal") + + agrolait = self.agrolait.sudo(self.demouser) + with self.assertRaises(AccessError): + agrolait.custom_info_template_id = self.tpl + + with self.assertRaises(AccessError): + agrolait.env["custom.info.value"].create({ + "res_id": agrolait.id, + "property_id": + agrolait.env.ref("base_custom_info.prop_weaknesses").id, + "value_id": agrolait.env.ref("base_custom_info.opt_food").id, + }) + + with self.assertRaises(AccessError): + agrolait.custom_info_template_id.property_ids[0].name = "Changed!" + + with self.assertRaises(AccessError): + agrolait.env.ref("base_custom_info.opt_food").name = "Changed!" + + def test_apply_unapply_template(self): + """(Un)apply a template to a owner and it gets filled.""" + # Applying a template autofills the values + self.agrolait.custom_info_template_id = self.tpl + with self.env.do_in_onchange(): + self.agrolait._onchange_custom_info_template_id() + self.assertEqual( + len(self.agrolait.custom_info_ids), + len(self.tpl.property_ids)) + self.assertEqual( + self.agrolait.custom_info_ids.mapped("property_id"), + self.tpl.property_ids) + + # Unapplying a template empties the values + self.agrolait.custom_info_template_id = False + self.agrolait._onchange_custom_info_template_id() + self.assertFalse(self.agrolait.custom_info_template_id) + + def test_template_model_and_model_id_match(self): + """Template's model and model_id fields match.""" + self.assertEqual(self.tpl.model, self.tpl.model_id.model) + self.tpl.model = "res.users" + self.assertEqual(self.tpl.model, self.tpl.model_id.model) + + def test_template_model_must_exist(self): + """Cannot create templates for unexisting models.""" + with self.assertRaises(ValidationError): + self.tpl.model = "yabadabaduu" + + def test_change_used_model_fails(self): + """If a template's model is already used, you cannot change it.""" + self.set_custom_info_for_agrolait() + with self.assertRaises(ValidationError): + self.tpl.model = "res.users" + + def test_owners_selection(self): + """Owners selection includes only the required matches.""" + choices = dict(self.env["custom.info.value"]._selection_owner_id()) + self.assertIn("res.partner", choices) + self.assertNotIn("ir.model", choices) + self.assertNotIn("custom.info.property", choices) + self.assertNotIn("custom.info", choices) + + def test_owner_id(self): + """Check the computed owner id for a value.""" + self.set_custom_info_for_agrolait() + self.assertEqual(self.agrolait.custom_info_ids.owner_id, self.agrolait) + + def test_get_custom_info_value(self): + """Check the custom info getter helper works fine.""" + self.set_custom_info_for_agrolait() + result = self.agrolait.get_custom_info_value( + self.env.ref("base_custom_info.prop_haters")) + self.assertEqual(result.field_type, "int") + self.assertEqual(result.field_name, "value_int") + self.assertEqual(result[result.field_name], 5) + self.assertEqual(result.value_int, 5) + self.assertEqual(result.value, "5") diff --git a/base_custom_info/tests/test_value_conversion.py b/base_custom_info/tests/test_value_conversion.py new file mode 100644 index 000000000..1f18c2dcf --- /dev/null +++ b/base_custom_info/tests/test_value_conversion.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import logging + +from openerp.tests.common import TransactionCase + +_logger = logging.getLogger(__name__) + + +class ValueConversionCase(TransactionCase): + def setUp(self): + super(ValueConversionCase, self).setUp() + self.agrolait = self.env.ref("base.res_partner_2") + self.tpl = self.env.ref("base_custom_info.tpl_smart") + self.prop_str = self.env.ref("base_custom_info.prop_teacher") + self.prop_int = self.env.ref("base_custom_info.prop_haters") + self.prop_float = self.env.ref("base_custom_info.prop_avg_note") + self.prop_bool = self.env.ref("base_custom_info.prop_smartypants") + self.prop_id = self.env.ref("base_custom_info.prop_weaknesses") + + def create_value(self, prop, value, field="value"): + """Create a custom info value.""" + _logger.info( + "Creating. prop: %s; value: %s; field: %s", prop, value, field) + self.agrolait.custom_info_template_id = self.tpl + if field == "value": + value = str(value) + self.value = self.env["custom.info.value"].create({ + "res_id": self.agrolait.id, + "property_id": prop.id, + field: value, + }) + + def creation_found(self, value): + """Ensure you can search what you just created.""" + prop = self.value.property_id + _logger.info( + "Searching. prop: %s; value: %s", prop, value) + self.assertEqual( + self.value.search([ + ("property_id", "=", prop.id), + ("value", "=", value)]), + self.value) + self.assertEqual( + self.value.search([ + ("property_id", "=", prop.id), + ("value", "in", [value])]), + self.value) + self.assertIs( + self.value.search([ + ("property_id", "=", prop.id), + ("value", "not in", [value])]).id, + False) + + def test_to_str(self): + """Conversion to text.""" + self.create_value(self.prop_str, "Mr. Einstein") + self.creation_found("Mr. Einstein") + self.assertEqual(self.value.value, self.value.value_str) + + def test_from_str(self): + """Conversion from text.""" + self.create_value(self.prop_str, "Mr. Einstein", "value_str") + self.creation_found("Mr. Einstein") + self.assertEqual(self.value.value, self.value.value_str) + + def test_to_int(self): + """Conversion to whole number.""" + self.create_value(self.prop_int, 5) + self.creation_found("5") + self.assertEqual(int(self.value.value), self.value.value_int) + + def test_from_int(self): + """Conversion from whole number.""" + self.create_value(self.prop_int, 5, "value_int") + self.creation_found("5") + self.assertEqual(int(self.value.value), self.value.value_int) + + def test_to_float(self): + """Conversion to decimal number.""" + self.create_value(self.prop_float, 10.5) + self.creation_found("10.5") + self.assertEqual(float(self.value.value), self.value.value_float) + + def test_from_float(self): + """Conversion from decimal number.""" + self.create_value(self.prop_float, 10.5, "value_float") + self.creation_found("10.5") + self.assertEqual(float(self.value.value), self.value.value_float) + + def test_to_bool_true(self): + """Conversion to yes.""" + self.create_value(self.prop_bool, "True") + self.creation_found("True") + self.assertEqual(self.value.with_context(lang="en_US").value, "Yes") + self.assertIs(self.value.value_bool, True) + + def test_from_bool_true(self): + """Conversion from yes.""" + self.create_value(self.prop_bool, "True", "value_bool") + self.creation_found("True") + self.assertEqual(self.value.with_context(lang="en_US").value, "Yes") + self.assertIs(self.value.value_bool, True) + + def test_to_bool_false(self): + """Conversion to no.""" + self.create_value(self.prop_bool, "False") + self.assertEqual(self.value.with_context(lang="en_US").value, "No") + self.assertIs(self.value.value_bool, False) + + def test_from_bool_false(self): + """Conversion from no.""" + self.create_value(self.prop_bool, False, "value_bool") + self.assertEqual(self.value.with_context(lang="en_US").value, "No") + self.assertIs(self.value.value_bool, False) + + def test_to_id(self): + """Conversion to selection.""" + self.create_value(self.prop_id, "Needs videogames") + self.creation_found("Needs videogames") + self.assertEqual(self.value.value, self.value.value_id.name) + + def test_from_id(self): + """Conversion from selection.""" + self.create_value( + self.prop_id, + self.env.ref("base_custom_info.opt_videogames").id, + "value_id") + self.creation_found("Needs videogames") + self.assertEqual(self.value.value, self.value.value_id.name) diff --git a/base_custom_info/views/custom_info_category_view.xml b/base_custom_info/views/custom_info_category_view.xml new file mode 100644 index 000000000..d9b5a7355 --- /dev/null +++ b/base_custom_info/views/custom_info_category_view.xml @@ -0,0 +1,53 @@ + + + + + + Custom Info Category Tree + custom.info.category + + + + + + + + + + + Custom Info Category Form + custom.info.category + +
+ + + + + + + +
+
+
+ + + Custom Info Category Search + custom.info.category + + + + + + + + + + Categories + ir.actions.act_window + custom.info.category + tree,form + form + + +
diff --git a/base_custom_info/views/custom_info_option_view.xml b/base_custom_info/views/custom_info_option_view.xml new file mode 100644 index 000000000..dfad88e3e --- /dev/null +++ b/base_custom_info/views/custom_info_option_view.xml @@ -0,0 +1,52 @@ + + + + + + Custom Info Option Tree + custom.info.option + + + + + + + + + + Custom Info Option Form + custom.info.option + +
+ + + + + + + +
+
+
+ + + Custom Info Option Search + custom.info.option + + + + + + + + + + Options + ir.actions.act_window + custom.info.option + tree,form + form + + +
diff --git a/base_custom_info/views/custom_info_property_view.xml b/base_custom_info/views/custom_info_property_view.xml index 72bda5437..21d447ec6 100644 --- a/base_custom_info/views/custom_info_property_view.xml +++ b/base_custom_info/views/custom_info_property_view.xml @@ -1,36 +1,77 @@ - + + - - base.custom.info.property.tree + + Custom Info Property Tree custom.info.property - + + - + + + + + - - base.custom.info.property.form + + Custom Info Property Form custom.info.property
- + + + + + + + - + +
- + + Custom Info Property Search + custom.info.property + + + + + + + + + + + + + + + + + Properties ir.actions.act_window custom.info.property @@ -38,4 +79,4 @@ form -
+ diff --git a/base_custom_info/views/custom_info_template_view.xml b/base_custom_info/views/custom_info_template_view.xml index 3e9ff7cbd..d8500fe96 100644 --- a/base_custom_info/views/custom_info_template_view.xml +++ b/base_custom_info/views/custom_info_template_view.xml @@ -1,21 +1,23 @@ - + + - base.custom.info.template.tree + Custom Info Template Tree custom.info.template - + - base.custom.info.template.form + Custom Info Template Form custom.info.template
@@ -26,17 +28,30 @@ - - - - - +
+ + Custom Info Template Search + custom.info.template + + + + + + + + + + + + Templates ir.actions.act_window @@ -49,10 +64,9 @@

Click to define a new custom info template.

- You must define a custom info template for each - product properties group. + You must define a custom info template for each properties group.

-
+ diff --git a/base_custom_info/views/custom_info_value_view.xml b/base_custom_info/views/custom_info_value_view.xml index 53ed922dd..519721095 100644 --- a/base_custom_info/views/custom_info_value_view.xml +++ b/base_custom_info/views/custom_info_value_view.xml @@ -1,19 +1,87 @@ - + + - base.custom.info.value.tree + Custom Info Value Tree custom.info.value - + + + - - + + Custom Info Value Form + custom.info.value + +
+ + + + + + + + + + + + + + + +
+ Warning! + You might see no changes in parent form until you save it. +
+
+
+
+
+ + + Custom Info Value Search + custom.info.value + + + + + + + + + + + + + + + + Values ir.actions.act_window @@ -22,4 +90,4 @@ form -
+ diff --git a/base_custom_info/views/menu.xml b/base_custom_info/views/menu.xml index 8f4b2220c..f69e82584 100644 --- a/base_custom_info/views/menu.xml +++ b/base_custom_info/views/menu.xml @@ -1,23 +1,41 @@ - + + - + + groups="base_custom_info.group_basic"/> + + + + - - - - + parent="menu_basic" sequence="10"/> - + parent="menu_basic" sequence="20"/> + + + + + + - + diff --git a/base_custom_info/views/res_partner_view.xml b/base_custom_info/views/res_partner_view.xml new file mode 100644 index 000000000..5f64e41f0 --- /dev/null +++ b/base_custom_info/views/res_partner_view.xml @@ -0,0 +1,28 @@ + + + + + + Custom info in partners form + res.partner + + + + + + + + + + + + + + diff --git a/base_custom_info/wizard/__init__.py b/base_custom_info/wizard/__init__.py new file mode 100644 index 000000000..d3a343ecb --- /dev/null +++ b/base_custom_info/wizard/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# © 2015 Antiun Ingeniería S.L. - Sergio Teruel +# © 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from . import base_config_settings diff --git a/base_custom_info/wizard/base_config_settings.py b/base_custom_info/wizard/base_config_settings.py new file mode 100644 index 000000000..6d78f1209 --- /dev/null +++ b/base_custom_info/wizard/base_config_settings.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Jairo Llopis +# License LGPL-3 - See http://www.gnu.org/licenses/lgpl-3.0.html + +from openerp import fields, models + + +class BaseConfigSettings(models.TransientModel): + _inherit = "base.config.settings" + + group_custom_info_manager = fields.Boolean( + string="Manage custom information", + implied_group="base_custom_info.group_basic", + help="Allow all employees to manage custom information", + ) + group_custom_info_partner = fields.Boolean( + string="Edit custom information in partners", + implied_group="base_custom_info.group_partner", + help="Add a tab in the partners form to edit custom information", + ) diff --git a/base_custom_info/wizard/base_config_settings_view.xml b/base_custom_info/wizard/base_config_settings_view.xml new file mode 100644 index 000000000..095b60943 --- /dev/null +++ b/base_custom_info/wizard/base_config_settings_view.xml @@ -0,0 +1,33 @@ + + + + + + Allow to enable partners custom info + base.config.settings + + + + + + + + + + + + From d0dfdc76c25e3f69bdab2f04e9c3e60749f28e93 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Thu, 15 Sep 2016 13:17:51 +0200 Subject: [PATCH 3/6] [IMP] base_custom_info: Recursive templates. - Select an option with an additional template and get it filled on the owner. - Drop support for onchange, too many bugs to workaround. - Improve demo data. - Improve tests. - Almost cool material icon, this is an app now! - Fun pics. --- base_custom_info/README.rst | 39 ++++++- base_custom_info/__openerp__.py | 3 + .../demo/custom.info.category.csv | 3 + base_custom_info/demo/custom.info.option.csv | 14 ++- .../demo/custom.info.property.csv | 14 ++- .../demo/custom.info.template.csv | 1 + .../demo/custom_info_property_defaults.yml | 6 + base_custom_info/models/custom_info.py | 93 ++++++++++++---- base_custom_info/models/custom_info_option.py | 6 + base_custom_info/models/custom_info_value.py | 25 ++++- .../description/customizations-everywhere.jpg | Bin 0 -> 122500 bytes base_custom_info/static/description/icon.png | Bin 0 -> 5289 bytes base_custom_info/static/description/icon.svg | 68 ++++++++++++ .../static/description/templateception.jpg | Bin 0 -> 57934 bytes base_custom_info/tests/test_partner.py | 104 +++++++++++++++--- .../tests/test_value_conversion.py | 37 +++---- .../views/custom_info_option_view.xml | 2 + .../views/custom_info_property_view.xml | 6 +- base_custom_info/views/res_partner_view.xml | 22 +++- 19 files changed, 356 insertions(+), 87 deletions(-) create mode 100644 base_custom_info/demo/custom.info.category.csv create mode 100644 base_custom_info/demo/custom_info_property_defaults.yml create mode 100644 base_custom_info/static/description/customizations-everywhere.jpg create mode 100644 base_custom_info/static/description/icon.png create mode 100644 base_custom_info/static/description/icon.svg create mode 100644 base_custom_info/static/description/templateception.jpg diff --git a/base_custom_info/README.rst b/base_custom_info/README.rst index 6d6c57177..8271d9f6e 100644 --- a/base_custom_info/README.rst +++ b/base_custom_info/README.rst @@ -84,6 +84,29 @@ I.e., the "What weaknesses does he/she have?" *property* has some options: The *value* will always be one of these. +Recursive templates using options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Oh dear customization lovers! Options can be used to customize the custom +information template! + +.. figure:: /base_custom_info/static/description/customizations-everywhere.jpg + :alt: Customizations Everywhere + +If you assign an *additional template* to an option, and while using the owner +form you choose that option, you can then press *reload custom information +templates* to make the owner update itself to include all the properties in all +the involved templates. If you do not press the button, anyway the reloading +will be performed when saving the owner record. + +.. figure:: /base_custom_info/static/description/templateception.jpg + :alt: Templateception + +I.e., if you select the option "Needs videogames" for the property "What +weaknesses does he/she have?" of a smart partner and press *reload custom +information templates*, you will get 2 new properties to fill: "Favourite +videogames genre" and "Favourite videogame". + Value ----- @@ -196,11 +219,17 @@ Known issues / Roadmap * Custom properties cannot be shared among templates. * You get an error if you press *Save & New* when setting property values in partner form. -* `There seems to be a bug in the web client that makes subviews appear empty - after an onchange - `_. - This module includes a workaround for that, but the bug should be fixed and - the workaround removed. +* You have to press *reload custom information templates*, when the optimal + thing would be the reloading taking place whenever needed: when you change + the template, or when you choose an option that has an additional template. + However, `currently it is impossible for a x2many field to update itself + `_, and it is + needed to skip some checks when you are saving a record after filling the + templates, which has to be done by `changing the context, something also not + possible currently at onchange time + `_. So there are some technical + limitations that do not let us reach the ideal UX for this addon. So, in + short, press the button when you see it and be happy. Bug Tracker =========== diff --git a/base_custom_info/__openerp__.py b/base_custom_info/__openerp__.py index 81bcec5f1..261fb15a6 100644 --- a/base_custom_info/__openerp__.py +++ b/base_custom_info/__openerp__.py @@ -25,9 +25,11 @@ 'wizard/base_config_settings_view.xml', ], 'demo': [ + 'demo/custom.info.category.csv', 'demo/custom.info.template.csv', 'demo/custom.info.property.csv', 'demo/custom.info.option.csv', + 'demo/custom_info_property_defaults.yml', 'demo/res_groups.xml', ], "images": [ @@ -42,5 +44,6 @@ 'Odoo Community Association (OCA)', 'website': 'https://www.tecnativa.com', 'license': 'LGPL-3', + 'application': True, 'installable': True, } diff --git a/base_custom_info/demo/custom.info.category.csv b/base_custom_info/demo/custom.info.category.csv new file mode 100644 index 000000000..35104e4ef --- /dev/null +++ b/base_custom_info/demo/custom.info.category.csv @@ -0,0 +1,3 @@ +id,name,sequence +cat_statics,Statics,50 +cat_gaming,Gaming,100 diff --git a/base_custom_info/demo/custom.info.option.csv b/base_custom_info/demo/custom.info.option.csv index aa072dc80..46f2c65bb 100644 --- a/base_custom_info/demo/custom.info.option.csv +++ b/base_custom_info/demo/custom.info.option.csv @@ -1,4 +1,10 @@ -id,name,property_ids:id -opt_food,Loves junk food,prop_weaknesses -opt_videogames,Needs videogames,prop_weaknesses -opt_glasses,Huge glasses,prop_weaknesses +id,name,property_ids:id,template_id:id +opt_food,Loves junk food,prop_weaknesses, +opt_videogames,Needs videogames,prop_weaknesses,tpl_gamer +opt_glasses,Huge glasses,prop_weaknesses, +opt_shooter,Shooter,prop_fav_genre, +opt_platforms,Platforms,prop_fav_genre, +opt_cars,Cars,prop_fav_genre, +opt_rpg,RPG,prop_fav_genre, +opt_strategy,Strategy,prop_fav_genre, +opt_graphical_adventure,Graphical adventure,prop_fav_genre, diff --git a/base_custom_info/demo/custom.info.property.csv b/base_custom_info/demo/custom.info.property.csv index 64c3a3066..724562f7a 100644 --- a/base_custom_info/demo/custom.info.property.csv +++ b/base_custom_info/demo/custom.info.property.csv @@ -1,6 +1,8 @@ -id,name,template_id:id,field_type,default_value,required -prop_teacher,Name of his/her teacher,tpl_smart,str,, -prop_haters,Amount of people that hates him/her for being so smart,tpl_smart,int,, -prop_avg_note,Average note on all subjects,tpl_smart,float,,True -prop_smartypants,Does he/she believe he/she is the smartest person on earth?,tpl_smart,bool,, -prop_weaknesses,What weaknesses does he/she have?,tpl_smart,id,Huge glasses, +id,name,template_id:id,field_type,required,minimum,maximum,category_id:id,sequence +prop_teacher,Name of his/her teacher,tpl_smart,str,,1,30,,100 +prop_haters,Amount of people that hates him/her for being so smart,tpl_smart,int,,0,99999,cat_statics,200 +prop_avg_note,Average note on all subjects,tpl_smart,float,True,0,10,cat_statics,300 +prop_smartypants,Does he/she believe he/she is the smartest person on earth?,tpl_smart,bool,,0,-1,,400 +prop_weaknesses,What weaknesses does he/she have?,tpl_smart,id,,0,-1,,500 +prop_fav_genre,Favourite videogames genre,tpl_gamer,id,,0,-1,cat_gaming,600 +prop_fav_game,Favourite videogame,tpl_gamer,str,,0,-1,cat_gaming,700 diff --git a/base_custom_info/demo/custom.info.template.csv b/base_custom_info/demo/custom.info.template.csv index 1ec9e2bfd..d6d96e0cc 100644 --- a/base_custom_info/demo/custom.info.template.csv +++ b/base_custom_info/demo/custom.info.template.csv @@ -1,2 +1,3 @@ id,name,model tpl_smart,Smart partners,res.partner +tpl_gamer,Gamers,res.partner diff --git a/base_custom_info/demo/custom_info_property_defaults.yml b/base_custom_info/demo/custom_info_property_defaults.yml new file mode 100644 index 000000000..592efa6dd --- /dev/null +++ b/base_custom_info/demo/custom_info_property_defaults.yml @@ -0,0 +1,6 @@ +# Copyright 2016 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +- Setting default values after loading custom.info.option.csv + +- !record {model: custom.info.property, id: prop_weaknesses}: + default_value: Huge glasses diff --git a/base_custom_info/models/custom_info.py b/base_custom_info/models/custom_info.py index 7ef469e3a..45c70e963 100644 --- a/base_custom_info/models/custom_info.py +++ b/base_custom_info/models/custom_info.py @@ -29,33 +29,27 @@ class CustomInfo(models.AbstractModel): context={"embed": True}, auto_join=True, string='Custom Properties') + dirty_templates = fields.Boolean( + compute="_compute_dirty_templates", + ) - @api.multi - @api.onchange('custom_info_template_id') - def _onchange_custom_info_template_id(self): - new = [(5, False, False)] - for prop in self.custom_info_template_id.property_ids: - new += [(0, False, { - "property_id": prop.id, - "res_id": self.id, - "model": self._name, - })] - self.custom_info_ids = new - self.custom_info_ids._onchange_property_set_default_value() - self.custom_info_ids._inverse_value() - self.custom_info_ids._compute_value() + # HACK https://github.com/odoo/odoo/pull/11042 + @api.model + def create(self, vals): + res = super(CustomInfo, self).create(vals) + if not self.env.context.get("filling_templates"): + res.filtered( + "dirty_templates").action_custom_info_templates_fill() + return res - # HACK https://github.com/OCA/server-tools/pull/492#issuecomment-237594285 + # HACK https://github.com/odoo/odoo/pull/11042 @api.multi - def onchange(self, values, field_name, field_onchange): - """Add custom info children values that will be probably changed.""" - subfields = ("category_id", "field_type", "required", "property_id", - "res_id", "model", "value", "value_str", "value_int", - "value_float", "value_bool", "value_id") - for subfield in subfields: - field_onchange.setdefault("custom_info_ids." + subfield, "") - return super(CustomInfo, self).onchange( - values, field_name, field_onchange) + def write(self, vals): + res = super(CustomInfo, self).write(vals) + if not self.env.context.get("filling_templates"): + self.filtered( + "dirty_templates").action_custom_info_templates_fill() + return res @api.multi def unlink(self): @@ -65,6 +59,16 @@ class CustomInfo(models.AbstractModel): info_values.unlink() return res + @api.one + @api.depends("custom_info_template_id", + "custom_info_ids.value_id.template_id") + def _compute_dirty_templates(self): + """Know if you need to reload the templates.""" + expected_properties = self.all_custom_info_templates().mapped( + "property_ids") + actual_properties = self.mapped("custom_info_ids.property_id") + self.dirty_templates = expected_properties != actual_properties + @api.multi @api.returns("custom.info.value") def get_custom_info_value(self, properties): @@ -74,3 +78,44 @@ class CustomInfo(models.AbstractModel): ("res_id", "in", self.ids), ("property_id", "in", properties.ids), ]) + + @api.multi + def all_custom_info_templates(self): + """Get all custom info templates involved in these owners.""" + return (self.mapped("custom_info_template_id") | + self.mapped("custom_info_ids.value_id.template_id")) + + @api.multi + def action_custom_info_templates_fill(self): + """Fill values with enabled custom info templates.""" + recursive_owners = self + for owner in self.with_context(filling_templates=True): + values = owner.custom_info_ids + tpls = owner.all_custom_info_templates() + props_good = tpls.mapped("property_ids") + props_enabled = owner.mapped("custom_info_ids.property_id") + to_add = props_good - props_enabled + to_rm = props_enabled - props_good + # Remove remaining properties + # HACK https://github.com/odoo/odoo/pull/13480 + values.filtered(lambda r: r.property_id in to_rm).unlink() + values = values.exists() + # Add new properties + for prop in to_add: + newvalue = values.new({ + "property_id": prop.id, + "res_id": owner.id, + }) + newvalue._onchange_property_set_default_value() + # HACK https://github.com/odoo/odoo/issues/13076 + newvalue._inverse_value() + newvalue._compute_value() + values |= newvalue + owner.custom_info_ids = values + # Default values implied new templates? Then this is recursive + if owner.all_custom_info_templates() == tpls: + recursive_owners -= owner + # Changes happened under a different environment; update own + self.invalidate_cache() + if recursive_owners: + return recursive_owners.action_custom_info_templates_fill() diff --git a/base_custom_info/models/custom_info_option.py b/base_custom_info/models/custom_info_option.py index 08d812c41..6e20d94bd 100644 --- a/base_custom_info/models/custom_info_option.py +++ b/base_custom_info/models/custom_info_option.py @@ -22,6 +22,12 @@ class CustomInfoOption(models.Model): string="Values", help="Values that have set this option.", ) + template_id = fields.Many2one( + comodel_name="custom.info.template", + string="Additional template", + help="Additional template to be applied to the owner if this option " + "is chosen.", + ) @api.multi def check_access_rule(self, operation): diff --git a/base_custom_info/models/custom_info_value.py b/base_custom_info/models/custom_info_value.py index 321b25f22..a7cd143a8 100644 --- a/base_custom_info/models/custom_info_value.py +++ b/base_custom_info/models/custom_info_value.py @@ -109,11 +109,26 @@ class CustomInfoValue(models.Model): @api.model def create(self, vals): - """Skip constrains in 1st lap.""" + """Skip constrains in 1st lap. Update owner templates.""" # HACK https://github.com/odoo/odoo/pull/13439 if "value" in vals: self.env.context.skip_required = True - return super(CustomInfoValue, self).create(vals) + result = super(CustomInfoValue, self).create(vals) + # HACK https://github.com/odoo/odoo/pull/11042 + if not self.env.context.get("filling_templates"): + result.owner_id.exists().filtered("dirty_templates") \ + .action_custom_info_templates_fill() + return result + + # HACK https://github.com/odoo/odoo/pull/11042 + @api.multi + def write(self, vals): + """Update owner templates.""" + result = super(CustomInfoValue, self).write(vals) + if not self.env.context.get("filling_templates"): + self.mapped("owner_id").exists().filtered("dirty_templates") \ + .action_custom_info_templates_fill() + return result @api.model def _selection_owner_id(self): @@ -178,7 +193,8 @@ class CustomInfoValue(models.Model): try: del self.env.context.skip_required except AttributeError: - if self.required and not self[self.field_name]: + if (not self.env.context.get("filling_templates") and + self.required and not self[self.field_name]): raise ValidationError( _("Property %s is required.") % self.property_id.display_name) @@ -188,6 +204,9 @@ class CustomInfoValue(models.Model): "value_str", "value_int", "value_float") def _check_min_max_limits(self): """Ensure value falls inside the property's stablished limits.""" + # Skip constraint while filling the partner template + if self.env.context.get("filling_templates"): + return minimum, maximum = self.property_id.minimum, self.property_id.maximum if minimum <= maximum: value = self[self.field_name] diff --git a/base_custom_info/static/description/customizations-everywhere.jpg b/base_custom_info/static/description/customizations-everywhere.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12dc888504479e23d649187789aa044ea501c666 GIT binary patch literal 122500 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۳W1AzYH!zF(-z41@ik}W9fxTK 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

cBsweQ5Afy$mLvb54Q z$*;UYV`qNz=z8|0t29!@D z3w1w)UMu*yqFs30_+L|>!M_u)J{)+b$NCR}{vv9yOW^dpi&pUsjhryvq?)#?ZK~h> zzD+{o;)e;Gd1=S7^y}BJr=>=WrGWCI8RLN8{8f8X<6KWHVH^z@xZ<&Rm`XKTar)$O zN$c#nm0EJf&BnA`d7`;x2YE_fBs?<1I*xM8>ra~pm*FZ#bexpFqbv)(y|RO)S~v=E zmL74MjHKrpp6nwJ(r*)f)Sea9{xbYwi^V^*Hl?ZjF7TK96AMN7b8n(*-x9n>dEjY2 zH~7E78mzu7k6Y2MHEDEz6MRX#?bh4;LpPU019}o;h)8u z--uJ(HoGm}rQvO3Shu~@G}yHp*yqx%f3iO+n5f`JpL-n+d-u=z`c#pX!5a{P)9-id z{9Wn8j&Zno!ldx9todgP&a|a8r$+%F-OhC9$@|XZ|yN_MA)jA_bL>t+-E>?ziz?QcUKs73QaRQ|6{QEHr>1^SurGRMVQufk9GC6|fy zAC6xWehz7W4*X57_%`F=e}}Z+iW*V)`|(T09~HC#r|O;`xA6QnS}(*;_>@hp_)o<5 zKNPO5{3+mQHJ=u0J}4G8aOafFit6Ii1 z-_NZRt7*On@e~#?#E?hlg7$) zXv(}Gs7{=tJXJ|WNh)<0#J;Zhk^5LbjQ$3G)3?44_?@MEKi9u#U)xLJUB-u|{2JGO zC3rsj#GefOKj5{C;vT2r4O_*!H-Y{pMd7a(_}|0V`u4G^{{Us^65Z*3DxXb^ojUSC zH`Tg#?N#s`{?UK5hMjxy3&VPipTrN@3-)sGAN(hJkB$B!Xr3Rp@&1nvw>QKu3HaOM zPs14`_>1Aoje6P*5E=CQgs~~RdBGx#+2tM+Eb$XRbQY7_Q~+g zzs1jwe-Jbui602`dk=+wum{ASg`NfR*TXLxd~ETDhxIRs_Oa_a*TcOhM)-^Ir^7xR z*8E@M>s!rM-py}xTi+3Hne?kE^`miMwzixf?Azl10D)f&z8Uxn;>W~)+EZ20zA9OK zZ_+$t@jp-a&G9$(v+-V~;++pk@UMZi4Hs7MCxiYId`0laqw!PXcC%^WeJjIo+xX+e z+Mk59Z5vCswblGN7l!Qa?e&k2g2o2X5@Y@ZG5Ihbomxw1WX@17++$&7>({yT#VGOZ zYM7dJ-U`t6)$6)3#5gI+tqd&+Zf>1AaFpnK3&wJ%B{96tmJ)bXn727$ zaClXSmJ$_Z2vNjhaTTLYR;yBQr;7U5Ea}3u9XV2j;XYKUudn=B@mJxOjeZON0KrLo z38{Y4Ixm8>pBsMG8jr+32+J>vJZBbz?D@mq7SSq(`WHKk*isu6ViZd`WZT+wCT8GSg6&Egt?$O&3R>TaWVH ztl&|Q8-ACeNe-FGxZ61Z{hGPI);iA> zOBm?MR>R>Vgu^IeCkj}2{Ys_|q^VQnY7TC2uDM!poi!e5Md|BO;MxDryxl&z(t5ooPzZlzs2i?IZTA_!}4PFXLNHL*ho6 zs>kA=_$FWM>+qjg@x|ASJbP_rrF>{_7JOIM{AuBzh@TOB2Xg-a5xh64>-ufKg%`#i zGt+e&oqI>Nx6&_f9&{07&b$fxSNIQ9{jq!pEPob06?k*uufyNj$H(6Z^W3kr1-w~;m)6~d`9@S;e8KO@ig8I)~}}2mg7j&{7+${KCPh}&0kNONrD|a z^VUe?Dn`IMbSw{F_o}~>AEEyMzMua9imyxkcE$TXPpVPoSd1njGxm+QEHc8ms*S8v#@YNhPu zPNh1Y#xqf+%;LCD59s?|E(Oa)ADOfj-WX%T{HLe)-_-vAwMBf6BM|H2E7$j< z?W)wPY0uitdr7%kRUBgKNncsGrzfjdXWiiNal+wnxNqIh>hvhl=7m3F341zp;msN` Rl$9vECZMGy6{2p)|Jjn(X$k-U literal 0 HcmV?d00001 diff --git a/base_custom_info/static/description/icon.png b/base_custom_info/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..896696e43b57a353305958c411a62b42430697d3 GIT binary patch literal 5289 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 r>88k + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/base_custom_info/static/description/templateception.jpg b/base_custom_info/static/description/templateception.jpg new file mode 100644 index 0000000000000000000000000000000000000000..268c29da001d1b0673b4be6d01acd53e4f9f67fe GIT binary patch literal 57934 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 + @@ -22,6 +23,7 @@ + diff --git a/base_custom_info/views/custom_info_property_view.xml b/base_custom_info/views/custom_info_property_view.xml index 21d447ec6..71a14f6a4 100644 --- a/base_custom_info/views/custom_info_property_view.xml +++ b/base_custom_info/views/custom_info_property_view.xml @@ -33,8 +33,10 @@ - - + + - - + + + + + +