From dc46ccbadca55bfe46892f718f3f61bcab7a67c3 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 10 Oct 2016 11:37:21 +0200 Subject: [PATCH] [WIP] copy module from V7 GRAP repository --- barcodes_generate/__init__.py | 2 + barcodes_generate/__openerp__.py | 69 +++++++++++ barcodes_generate/demo/res_users.xml | 13 +++ barcodes_generate/i18n/fr.po | 110 ++++++++++++++++++ barcodes_generate/models/__init__.py | 6 + .../models/barcode_generate_mixin.py | 56 +++++++++ barcodes_generate/models/barcode_rule.py | 27 +++++ barcodes_generate/models/product_product.py | 11 ++ barcodes_generate/models/res_partner.py | 11 ++ barcodes_generate/security/res_groups.xml | 20 ++++ .../static/description/barcode_rule.png | Bin 0 -> 9047 bytes barcodes_generate/static/description/icon.png | Bin 0 -> 16262 bytes barcodes_generate/views/view_barcode_rule.xml | 21 ++++ .../views/view_product_product.xml | 28 +++++ barcodes_generate/views/view_res_partner.xml | 28 +++++ 15 files changed, 402 insertions(+) create mode 100644 barcodes_generate/__init__.py create mode 100644 barcodes_generate/__openerp__.py create mode 100644 barcodes_generate/demo/res_users.xml create mode 100644 barcodes_generate/i18n/fr.po create mode 100644 barcodes_generate/models/__init__.py create mode 100644 barcodes_generate/models/barcode_generate_mixin.py create mode 100644 barcodes_generate/models/barcode_rule.py create mode 100644 barcodes_generate/models/product_product.py create mode 100644 barcodes_generate/models/res_partner.py create mode 100644 barcodes_generate/security/res_groups.xml create mode 100644 barcodes_generate/static/description/barcode_rule.png create mode 100644 barcodes_generate/static/description/icon.png create mode 100644 barcodes_generate/views/view_barcode_rule.xml create mode 100644 barcodes_generate/views/view_product_product.xml create mode 100644 barcodes_generate/views/view_res_partner.xml diff --git a/barcodes_generate/__init__.py b/barcodes_generate/__init__.py new file mode 100644 index 00000000..a0fdc10f --- /dev/null +++ b/barcodes_generate/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/barcodes_generate/__openerp__.py b/barcodes_generate/__openerp__.py new file mode 100644 index 00000000..f91c0d73 --- /dev/null +++ b/barcodes_generate/__openerp__.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-Today GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Barcodes - Generate', + 'summary': 'Generate Barcodes for Products and Customers', + 'version': '1.0', + 'category': 'Point Of Sale', + 'description': """ +============================================ +Generate Barcodes for Products and Customers +============================================ + +This module depends on a backport of the V9 modules of Odoo 'barcodes'. + +It expends Odoo functionnality, to allow user to generate barcode depending +on a given barcode rule. + +For exemple, a typical pattern for products is "23.....{NNNDD}" that means +that the EAN13 code will begin by '23', followed by 5 digits and after 5 others +digits to define the variable price. (EAN13 has a third char for control). + +With this module, it is possible to: +- Affect a pattern (barcode.rule) to a product.product or a res.partner +- To generate an EAN13 depending on the defined pattern and a custom ID + +Note +---- +Dependency to point_of_sale is required because ean13 field, defined in 'base' +module (in the res.partner model), is defined in a point_of_sale view. + +The same design error is present in odoo 9.0 with the renamed 'barcode' field. + +It's a relative problem, because product barcodes generation will occures +mostly in a Point of Sale context. + +You could comment 'point_of_sale' dependency if you use this module without +point of sale. + +Copyright Note +-------------- +Icon of the module is based on the Oxygen Team work and is under LGPL licence: + +http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org.html + + +""", + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'barcodes', + 'point_of_sale', + ], + 'data': [ + 'security/res_groups.xml', + 'views/view_res_partner.xml', + 'views/view_product_product.xml', + 'views/view_barcode_rule.xml', + ], + 'demo': [ + 'demo/res_users.xml', + ], + 'images': [ + 'static/description/barcode_rule.png' + ], +} diff --git a/barcodes_generate/demo/res_users.xml b/barcodes_generate/demo/res_users.xml new file mode 100644 index 00000000..bdf035f6 --- /dev/null +++ b/barcodes_generate/demo/res_users.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/barcodes_generate/i18n/fr.po b/barcodes_generate/i18n/fr.po new file mode 100644 index 00000000..fa7cdd25 --- /dev/null +++ b/barcodes_generate/i18n/fr.po @@ -0,0 +1,110 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * barcodes_generate +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-09-21 00:43+0000\n" +"PO-Revision-Date: 2016-09-21 00:43+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: barcodes_generate +#: field:barcode.rule,is_partner_available:0 +msgid "Available for Partners" +msgstr "Disponible pour les partenaires" + +#. module: barcodes_generate +#: field:barcode.rule,is_product_available:0 +msgid "Available for Products" +msgstr "Disponible pour les articles" + +#. module: barcodes_generate +#: field:barcode.generate.mixin,barcode_base:0 +#: field:product.product,barcode_base:0 +#: field:res.partner,barcode_base:0 +msgid "Barcode Base" +msgstr "Base du code Barre" + +#. module: barcodes_generate +#: field:barcode.generate.mixin,barcode_rule_id:0 +#: field:product.product,barcode_rule_id:0 +#: field:res.partner,barcode_rule_id:0 +msgid "Barcode Rule" +msgstr "Règle de code barre" + +#. module: barcodes_generate +#: constraint:res.partner:0 +msgid "Error: Invalid ean code" +msgstr "Erreur : code EAN incorrect" + +#. module: barcodes_generate +#: view:product.product:0 +#: view:res.partner:0 +msgid "Generate Barcode" +msgstr "Générer un code barre" + +#. module: barcodes_generate +#: model:res.groups,name:barcodes_generate.generate_partner_barcode +msgid "Generate Barcodes for Partners" +msgstr "Générer un code barre pour les partenaires" + +#. module: barcodes_generate +#: model:res.groups,name:barcodes_generate.generate_product_barcode +msgid "Generate Barcodes for Products" +msgstr "Générer un code barre pour les articles" + +#. module: barcodes_generate +#: help:barcode.rule,is_partner_available:0 +msgid "If checked, users with specific access right will have the possibility to generate barcodes with this pattern for the partners." +msgstr "Si cette case est cochée, les utilisateurs avec une autorisation adéquate auront la possibilité de générer des codes barres en suivant ce motif, pour les partenaires." + +#. module: barcodes_generate +#: help:barcode.rule,is_product_available:0 +msgid "If checked, users with specific access right will have the possibility to generate barcodes with this pattern for the products." +msgstr "Si cette case est cochée, les utilisateurs avec une autorisation adéquate auront la possibilité de générer des codes barres en suivant ce motif, pour les articles." + +#. module: barcodes_generate +#: code:_description:0 +#: model:ir.model,name:barcodes_generate.model_res_partner +#, python-format +msgid "Partner" +msgstr "Partenaire" + +#. module: barcodes_generate +#: code:_description:0 +#: model:ir.model,name:barcodes_generate.model_product_product +#, python-format +msgid "Product" +msgstr "Article" + +#. module: barcodes_generate +#: constraint:res.partner:0 +msgid "You cannot create recursive Partner hierarchies." +msgstr "Vous ne pouvez pas créer de hiérarchies de partenaires récursives." + +#. module: barcodes_generate +#: constraint:product.product:0 +msgid "You provided an invalid \"EAN13 Barcode\" reference. You may use the \"Internal Reference\" field instead." +msgstr "Vous avez indiqué un code barre EAN13 erroné. Vous pouvez utiliser le champ \"Référence interne\" à la place." + +#. module: barcodes_generate +#: code:_description:0 +#: model:ir.model,name:barcodes_generate.model_barcode_generate_mixin +#, python-format +msgid "barcode.generate.mixin" +msgstr "barcode.generate.mixin" + +#. module: barcodes_generate +#: code:_description:0 +#: model:ir.model,name:barcodes_generate.model_barcode_rule +#, python-format +msgid "barcode.rule" +msgstr "barcode.rule" + diff --git a/barcodes_generate/models/__init__.py b/barcodes_generate/models/__init__.py new file mode 100644 index 00000000..a76dbdcf --- /dev/null +++ b/barcodes_generate/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from . import barcode_generate_mixin + +from . import res_partner +from . import barcode_rule +from . import product_product diff --git a/barcodes_generate/models/barcode_generate_mixin.py b/barcodes_generate/models/barcode_generate_mixin.py new file mode 100644 index 00000000..10c544bf --- /dev/null +++ b/barcodes_generate/models/barcode_generate_mixin.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import barcode + +from openerp.osv import fields +from openerp.osv.orm import AbstractModel + + +class barcode_generate_mixin(AbstractModel): + _name = 'barcode.generate.mixin' + + _columns = { + 'barcode_rule_id': fields.many2one( + 'barcode.rule', 'Barcode Rule'), + 'barcode_base': fields.integer('Barcode Base'), + } + + def generate_barcode(self, cr, uid, ids, context=None): + vals = self._compute_custom_barcode(cr, uid, ids, context=context) + for id in vals.keys(): + self.write(cr, uid, id, {'ean13': vals[id]}, context=context) + return True + + def _compute_custom_barcode(self, cr, uid, ids, context=None): + res = {} + for item in self.browse(cr, uid, ids, context=context): + if item.barcode_rule_id and item.barcode_base: + pass + barcode_class = barcode.get_barcode_class( + item.barcode_rule_id.encoding) + padding = item.barcode_rule_id.pattern.count('.') + full_base = str(item.barcode_base).rjust(padding, '0') + + # Define barcode + custom_code = item.barcode_rule_id.pattern + custom_code = custom_code.replace('{', '').replace('}', '') + custom_code = custom_code.replace( + 'D', self._get_barcode_replacement_char( + cr, uid, 'D', context=context)) + custom_code = custom_code.replace( + 'N', self._get_barcode_replacement_char( + cr, uid, 'N', context=context)) + custom_code = custom_code.replace('.' * padding, full_base) + res[item.id] = barcode_class(custom_code) + return res + + def _get_barcode_replacement_char(self, cr, uid, char, context=None): + """ + Can be overload by inheritance + Define wich character will be used instead of the 'N' or the 'D' + char, present in the pattern of the barcode_rule_id + """ + return '0' diff --git a/barcodes_generate/models/barcode_rule.py b/barcodes_generate/models/barcode_rule.py new file mode 100644 index 00000000..3a4a63f7 --- /dev/null +++ b/barcodes_generate/models/barcode_rule.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.osv import fields +from openerp.osv.orm import Model + + +class barcode_rule(Model): + _inherit = 'barcode.rule' + + _columns = { + 'is_product_available': fields.boolean( + string='Available for Products', help="If checked, users with" + " specific access right will have the possibility to generate" + " barcodes with this pattern for the products."), + 'is_partner_available': fields.boolean( + string='Available for Partners', help="If checked, users with" + " specific access right will have the possibility to generate" + " barcodes with this pattern for the partners."), + } + + # TODO set constraint + # is_product_available and is_partner_available: + # - should be possible only for ean13 barcode rule + # - should be possible only if pattern contains at leas one '.' char diff --git a/barcodes_generate/models/product_product.py b/barcodes_generate/models/product_product.py new file mode 100644 index 00000000..c20f9475 --- /dev/null +++ b/barcodes_generate/models/product_product.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.osv.orm import Model + + +class product_product(Model): + _name = 'product.product' + _inherit = ['product.product', 'barcode.generate.mixin'] diff --git a/barcodes_generate/models/res_partner.py b/barcodes_generate/models/res_partner.py new file mode 100644 index 00000000..9ae48017 --- /dev/null +++ b/barcodes_generate/models/res_partner.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.osv.orm import Model + + +class res_partner(Model): + _name = 'res.partner' + _inherit = ['res.partner', 'barcode.generate.mixin'] diff --git a/barcodes_generate/security/res_groups.xml b/barcodes_generate/security/res_groups.xml new file mode 100644 index 00000000..0d81da22 --- /dev/null +++ b/barcodes_generate/security/res_groups.xml @@ -0,0 +1,20 @@ + + + + + + + Generate Barcodes for Products + + + + + Generate Barcodes for Partners + + + + diff --git a/barcodes_generate/static/description/barcode_rule.png b/barcodes_generate/static/description/barcode_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..82cad0a9379fc6cfa8984a7494eadd281de42810 GIT binary patch literal 9047 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 YSr2-{ceaF{r7?h<)F;Vu2}A$?19M)Y=Kufz literal 0 HcmV?d00001 diff --git a/barcodes_generate/static/description/icon.png b/barcodes_generate/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3533a281ec705b8a9d933f080145fb8ddda7df9 GIT binary patch literal 16262 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 lq3wau|BsKc#=o!c&=%5pKPbNs1wHdn;=(dQ + + + + + + barcode.rule + + + + + + + + + + diff --git a/barcodes_generate/views/view_product_product.xml b/barcodes_generate/views/view_product_product.xml new file mode 100644 index 00000000..77df09cf --- /dev/null +++ b/barcodes_generate/views/view_product_product.xml @@ -0,0 +1,28 @@ + + + + + + + product.product + + + + + +