From bd1f7547e5dbd029d8c6aea825243b40eaaa183d Mon Sep 17 00:00:00 2001 From: Matteo Bilotta Date: Fri, 21 Jun 2019 15:15:20 +0200 Subject: [PATCH] [MIG] Migrate 'product_tags' from 10.0 to 12.0. --- product_tags/__init__.py | 3 +- product_tags/__manifest__.py | 15 +- product_tags/doc/changelog.rst | 8 + product_tags/i18n/it.po | 147 +++++++++++++++++++ product_tags/models/__init__.py | 22 +++ product_tags/{ => models}/product.py | 71 +++++---- product_tags/product_view.xml | 106 ------------- product_tags/security/ir.model.access.csv | 7 +- product_tags/static/src/img/icon.png | Bin 11930 -> 0 bytes product_tags/views/product_tag_view.xml | 78 ++++++++++ product_tags/views/product_template_view.xml | 46 ++++++ 11 files changed, 358 insertions(+), 145 deletions(-) create mode 100644 product_tags/i18n/it.po create mode 100644 product_tags/models/__init__.py rename product_tags/{ => models}/product.py (53%) delete mode 100644 product_tags/product_view.xml delete mode 100644 product_tags/static/src/img/icon.png create mode 100644 product_tags/views/product_tag_view.xml create mode 100644 product_tags/views/product_template_view.xml diff --git a/product_tags/__init__.py b/product_tags/__init__.py index 9e90ae0380..c73ce3ddcd 100644 --- a/product_tags/__init__.py +++ b/product_tags/__init__.py @@ -2,6 +2,7 @@ # # OpenERP, Open Source Management Solution # Copyright (C) 2013 Julius Network Solutions SARL +# Copyright (c) 2019 Matteo Bilotta # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,4 +19,4 @@ # # -from . import product +from . import models diff --git a/product_tags/__manifest__.py b/product_tags/__manifest__.py index 522c699dff..0fc00590e9 100644 --- a/product_tags/__manifest__.py +++ b/product_tags/__manifest__.py @@ -3,6 +3,7 @@ # OpenERP, Open Source Management Solution # Copyright (C) 2013 Julius Network Solutions SARL # Copyright (C) 2015 credativ ltd. +# Copyright (c) 2019 Matteo Bilotta # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -21,19 +22,19 @@ { "name": "Product Tags", - "version": "10.0.1.0.1", + "version": "12.0.1.1.0", "author": "Julius Network Solutions", "website": "http://julius.fr", - "category": "Sales Management", + "category": "Sales", "depends": [ 'product', - 'sale', + 'sale' ], 'license': 'AGPL-3', - "demo": [], "data": [ 'security/ir.model.access.csv', - 'product_view.xml', - ], - 'installable': False, + + 'views/product_tag_view.xml', + 'views/product_template_view.xml' + ] } diff --git a/product_tags/doc/changelog.rst b/product_tags/doc/changelog.rst index 3a61d0fca9..df242417fb 100644 --- a/product_tags/doc/changelog.rst +++ b/product_tags/doc/changelog.rst @@ -1,4 +1,12 @@ +`1.1.0` +------- + +- **Successful migration to Odoo 12.** +- Improved tag searching algorithm. +- Enhanced tag views for a better UX. + `1.0.1` +------- - **Fix:** issue with search for non-existent tags diff --git a/product_tags/i18n/it.po b/product_tags/i18n/it.po new file mode 100644 index 0000000000..0f51f6e8f7 --- /dev/null +++ b/product_tags/i18n/it.po @@ -0,0 +1,147 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_tags +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0+e-20190417\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-06-21 13:41+0000\n" +"PO-Revision-Date: 2019-06-21 15:42+0200\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"Language: it\n" +"X-Generator: Poedit 2.2.3\n" + +#. module: product_tags +#: model_terms:ir.ui.view,arch_db:product_tags.product_tag_form_view +msgid "Accessories & Supplies" +msgstr "Accessori & Forniture" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__active +msgid "Active" +msgstr "Attivo" + +#. module: product_tags +#: model_terms:ir.ui.view,arch_db:product_tags.product_tag_search_view +msgid "Archived" +msgstr "Archiviati" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__child_ids +msgid "Child tags" +msgstr "Tag figli" + +#. module: product_tags +#: model_terms:ir.actions.act_window,help:product_tags.product_tag_action +msgid "Click to create a new product tag." +msgstr "Clicca per creare un nuovo tag di prodotto." + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__color +msgid "Color index" +msgstr "Indice colore" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: product_tags +#: model_terms:ir.ui.view,arch_db:product_tags.product_tag_form_view +msgid "Electronics" +msgstr "Elettronica" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__id +msgid "ID" +msgstr "ID" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__image +msgid "Image" +msgstr "Immagine" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__parent_id +msgid "Parent tag" +msgstr "Tag superiore" + +#. module: product_tags +#: model:ir.model,name:product_tags.model_product_template +msgid "Product Template" +msgstr "Modello prodotto" + +#. module: product_tags +#: model:ir.model,name:product_tags.model_product_tag +msgid "Product tags" +msgstr "Tag prodotti" + +#. module: product_tags +#: model:ir.model.fields,field_description:product_tags.field_product_tag__name +msgid "Tag Name" +msgstr "Nome tag" + +#. module: product_tags +#: model:ir.actions.act_window,name:product_tags.product_tag_action +#: model:ir.model.fields,field_description:product_tags.field_product_product__tag_ids +#: model:ir.model.fields,field_description:product_tags.field_product_template__tag_ids +#: model:ir.ui.menu,name:product_tags.product_tag_menu_sale +#: model_terms:ir.ui.view,arch_db:product_tags.product_template_search_view +msgid "Tags" +msgstr "Tag" + +#. module: product_tags +#: model_terms:ir.ui.view,arch_db:product_tags.product_template_form_view +msgid "Tags..." +msgstr "Tags..." + +#. module: product_tags +#: model:ir.model.fields,help:product_tags.field_product_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "Il campo \"Attivo\" ti consente di nascondere il tag prodotto senza rimuoverlo fisicamente." + +#. module: product_tags +#: model_terms:ir.actions.act_window,help:product_tags.product_tag_action +msgid "" +"With product tags you can categorize your products\n" +" regardless of the category they belong to." +msgstr "" +"Con i tag prodotti puoi categorizzare i tuoi prodotti\n" +" indipendentemente dalla categoria a cui appartengono." + +#. module: product_tags +#: code:addons/product_tags/models/product.py:45 +#, python-format +msgid "You cannot create recursive product tags." +msgstr "Non puoi creare tag prodotti ricorsivi." diff --git a/product_tags/models/__init__.py b/product_tags/models/__init__.py new file mode 100644 index 0000000000..241c24657c --- /dev/null +++ b/product_tags/models/__init__.py @@ -0,0 +1,22 @@ +# +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2013 Julius Network Solutions SARL +# Copyright (c) 2019 Matteo Bilotta +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# + +from . import product diff --git a/product_tags/product.py b/product_tags/models/product.py similarity index 53% rename from product_tags/product.py rename to product_tags/models/product.py index 82187d07be..5644b5c176 100644 --- a/product_tags/product.py +++ b/product_tags/models/product.py @@ -3,6 +3,7 @@ # OpenERP, Open Source Management Solution # Copyright (C) 2013 Julius Network Solutions SARL # Copyright (C) 2015 credativ ltd. +# Copyright (c) 2019 Matteo Bilotta # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -18,51 +19,67 @@ # along with this program. If not, see . # # -from openerp import api -from openerp import fields -from openerp import models +from odoo import _, api, fields, models +from odoo.osv import expression +from odoo.exceptions import ValidationError class ProductTag(models.Model): - _description = 'Product Tags' - _name = "product.tag" + _name = 'product.tag' + _description = "Product tags" + _order = 'name' + _parent_order = 'name' + _parent_store = True name = fields.Char('Tag Name', required=True, translate=True) active = fields.Boolean(help='The active field allows you to hide the tag without removing it.', default=True) + color = fields.Integer(string="Color index", default=0) + image = fields.Binary(sintrg="Image") + parent_id = fields.Many2one(string='Parent Tag', comodel_name='product.tag', index=True, ondelete='cascade') child_ids = fields.One2many(string='Child Tags', comodel_name='product.tag', inverse_name='parent_id') - parent_left = fields.Integer('Left Parent', index=True) - parent_right = fields.Integer('Right Parent', index=True) + parent_path = fields.Char(index=True) - image = fields.Binary('Image') - - _parent_store = True - _parent_order = 'name' - _order = 'parent_left' + @api.constrains('parent_id') + def _check_parent_id(self): + if not self._check_recursion(): + raise ValidationError(_("You cannot create recursive product tags.")) @api.multi def name_get(self): - """ Return the tags' display name, including their direct parent. """ - res = {} - for record in self: - current = record - name = current.name - while current.parent_id: - name = '%s / %s' % (current.parent_id.name, name) + res = [] + + for category in self: + names = [] + current = category + + while current: + names.append(current.name) current = current.parent_id - res[record.id] = name - return list(res.items()) + res.append((category.id, ' / '.join(reversed(names)))) + + return res @api.model - def name_search(self, name, args=None, operator='ilike', limit=100): + def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None): args = args or [] + if name: - # Be sure name_search is symetric to name_get - name = name.split(' / ')[-1] - args = [('name', operator, name)] + args - tags = self.search(args, limit=limit) - return tags.name_get() + parent_ids = [] + parent_domain = [] + + for tag in map(lambda t: t.strip(), name.split('/')): + name_domain = expression.AND([[('name', operator, tag)], parent_domain]) + parent_ids = self._search(name_domain, limit=limit, access_rights_uid=name_get_uid) + parent_domain = [('parent_id', 'in', parent_ids)] + + browse_domain = expression.OR([[('id', 'in', parent_ids)], parent_domain]) + args = expression.AND([browse_domain, args]) + + tag_ids = self._search(args, limit=limit, access_rights_uid=name_get_uid) + + return self.browse(tag_ids).name_get() class ProductTemplate(models.Model): diff --git a/product_tags/product_view.xml b/product_tags/product_view.xml deleted file mode 100644 index 7e601902f5..0000000000 --- a/product_tags/product_view.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - product.tag.view.form - product.tag - -
- - - - - - - - -
-
-
- - - product.tag.view.tree - product.tag - child_ids - - - - - - - - - Product Tags - product.tag - - - - - - - - - - product.tag.view.search - product.tag - - - - - - - - Product Tags - ir.actions.act_window - product.tag - form - tree,form - - - - - - - product.template.tag.view.search - product.template - - - - - - - - - - product.template.view.form - product.template - - - - - - - - - - - - Product Template Tag Kanban - product.template - - -
-
    -
  • -
-
-
-
- - -
-
diff --git a/product_tags/security/ir.model.access.csv b/product_tags/security/ir.model.access.csv index b3f1fc3cc9..cf961d9322 100644 --- a/product_tags/security/ir.model.access.csv +++ b/product_tags/security/ir.model.access.csv @@ -1,4 +1,3 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_product_tag_all","product_tag_all","model_product_tag",,1,0,0,0 -"access_product_tag_user","product_tag_user","model_product_tag","base.group_user",1,1,1,0 -"access_product_tag_product_manager","product_tag_product_manager","model_product_tag","product.group_mrp_properties",1,1,1,1 +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_product_tag_user,product.tag.user,model_product_tag,base.group_user,1,0,0,0 +access_product_tag_manager,product.tag.manager,model_product_tag,base.group_system,1,1,1,1 diff --git a/product_tags/static/src/img/icon.png b/product_tags/static/src/img/icon.png deleted file mode 100644 index e07cdd3f72bfe46a4c038900eb7ef8d927a01ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11930 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 diff --git a/product_tags/views/product_tag_view.xml b/product_tags/views/product_tag_view.xml new file mode 100644 index 0000000000..536382d5e5 --- /dev/null +++ b/product_tags/views/product_tag_view.xml @@ -0,0 +1,78 @@ + + + + + + product.tag.form + product.tag + +
+ +
+ +
+ +
+
+ +
+
+
+
+ + + product.tag.tree + product.tag + + + + + + + + + product.tag.search + product.tag + + + + + + + + + + + + Tags + product.tag + form + tree,form + + +

+ Click to create a new product tag. +

+

+ With product tags you can categorize your products + regardless of the category they belong to. +

+
+
+ + + +
diff --git a/product_tags/views/product_template_view.xml b/product_tags/views/product_template_view.xml new file mode 100644 index 0000000000..a75ac55133 --- /dev/null +++ b/product_tags/views/product_template_view.xml @@ -0,0 +1,46 @@ + + + + + + product.template.form + product.template + + + +
+ +
+
+
+
+ + + product.template.kanban + product.template + + + + + + + + + + + + product.template.search + product.template + + + + + + + + + +