Sébastien BEAU
9 years ago
committed by
Simone Orsi
10 changed files with 337 additions and 0 deletions
-
93base_jsonify/README.rst
-
7base_jsonify/__init__.py
-
29base_jsonify/__openerp__.py
-
11base_jsonify/demo/export_demo.xml
-
16base_jsonify/demo/ir.exports.line.csv
-
8base_jsonify/models/__init__.py
-
40base_jsonify/models/ir_export.py
-
49base_jsonify/models/models.py
-
6base_jsonify/tests/__init__.py
-
78base_jsonify/tests/test_get_parser.py
@ -0,0 +1,93 @@ |
|||||
|
.. 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 |
||||
|
|
||||
|
============== |
||||
|
Base Jsonify |
||||
|
============== |
||||
|
|
||||
|
This module add the jsonify method to the ORM. This method take as argument |
||||
|
the browse record and the "parser" that specify the field to extract. |
||||
|
|
||||
|
Example of parser: |
||||
|
|
||||
|
|
||||
|
.. code-block:: python |
||||
|
|
||||
|
parser = [ |
||||
|
'name', |
||||
|
'number', |
||||
|
'create_date', |
||||
|
('partner_id', ['id', 'display_name', 'ref']) |
||||
|
('line_id', ['id', ('product_id', ['name']), 'price_unit']) |
||||
|
] |
||||
|
|
||||
|
In order to be consitent with the odoo api the jsonify method always |
||||
|
return a list of object even if there is only one element in input |
||||
|
|
||||
|
Also the module provide a method "get_json_parser" on the ir.exports object |
||||
|
that generate a parser from an ir.exports configuration |
||||
|
|
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
|
||||
|
To install this module, you need to install it |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
|
||||
|
No configuration required |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
This is a technical module not function feature is added |
||||
|
|
||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
||||
|
:alt: Try me on Runbot |
||||
|
:target: https://runbot.odoo-community.org/runbot/{repo_id}/{branch} |
||||
|
|
||||
|
.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt |
||||
|
.. branch is "8.0" for example |
||||
|
|
||||
|
Known issues / Roadmap |
||||
|
====================== |
||||
|
|
||||
|
Nothing yet |
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
|
||||
|
Bugs are tracked on `GitHub Issues |
||||
|
<https://github.com/OCA/{project_repo}/issues>`_. In case of trouble, please |
||||
|
check there if your issue has already been reported. If you spotted it first, |
||||
|
help us smashing it by providing a detailed and welcomed feedback. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Images |
||||
|
------ |
||||
|
|
||||
|
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* BEAU Sébastien <sebastien.beau@akretion.com> |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: https://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
OCA, or the Odoo Community Association, is a nonprofit organization whose |
||||
|
mission is to support the collaborative development of Odoo features and |
||||
|
promote its widespread use. |
||||
|
|
||||
|
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,7 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
|
||||
|
from . import models |
@ -0,0 +1,29 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
{ |
||||
|
"name": "Base Jsonify", |
||||
|
"summary": "Base module that provide the jsonify method on all object", |
||||
|
"version": "8.0.1.0.0", |
||||
|
"category": "Uncategorized", |
||||
|
"website": "https://odoo-community.org/", |
||||
|
"author": "Akretion, Odoo Community Association (OCA)", |
||||
|
"license": "AGPL-3", |
||||
|
"application": False, |
||||
|
"installable": True, |
||||
|
"external_dependencies": { |
||||
|
"python": [], |
||||
|
"bin": [], |
||||
|
}, |
||||
|
"depends": [ |
||||
|
"base", |
||||
|
], |
||||
|
"data": [ |
||||
|
], |
||||
|
"demo": [ |
||||
|
'demo/export_demo.xml', |
||||
|
'demo/ir.exports.line.csv', |
||||
|
], |
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
|
||||
|
<record id="ir_exp_partner" model="ir.exports"> |
||||
|
<field name="name">Partner Export</field> |
||||
|
<field name="resource">res.partner</field> |
||||
|
</record> |
||||
|
|
||||
|
</data> |
||||
|
</openerp> |
@ -0,0 +1,16 @@ |
|||||
|
id,export_id/id,name |
||||
|
name,ir_exp_partner,name |
||||
|
active,ir_exp_partner,active |
||||
|
credit_limit,ir_exp_partner,credit_limit |
||||
|
color,ir_exp_partner,color |
||||
|
category_id_name,ir_exp_partner,category_id/name |
||||
|
country_id_name,ir_exp_partner,country_id/name |
||||
|
country_id_code,ir_exp_partner,country_id/code |
||||
|
child_ids_name,ir_exp_partner,child_ids/name |
||||
|
child_ids_id,ir_exp_partner,child_ids/id |
||||
|
child_ids_email,ir_exp_partner,child_ids/email |
||||
|
child_ids_country_id_name,ir_exp_partner,child_ids/country_id/name |
||||
|
child_ids_country_id_code,ir_exp_partner,child_ids/country_id/code |
||||
|
child_ids_child_ids_name,ir_exp_partner,child_ids/child_ids/name |
||||
|
lang,ir_exp_partner,lang |
||||
|
comment,ir_exp_partner,comment |
@ -0,0 +1,8 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
|
||||
|
from . import models |
||||
|
from . import ir_export |
@ -0,0 +1,40 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
from openerp import api, models |
||||
|
|
||||
|
|
||||
|
def update_dict(data, fields): |
||||
|
field = fields[0] |
||||
|
if len(fields) == 1: |
||||
|
if field == '.id': |
||||
|
field = 'id' |
||||
|
data[field] = True |
||||
|
else: |
||||
|
if field not in data: |
||||
|
data[field] = {} |
||||
|
update_dict(data[field], fields[1:]) |
||||
|
|
||||
|
|
||||
|
def convert_dict(dict_parser): |
||||
|
parser = [] |
||||
|
for field, value in dict_parser.iteritems(): |
||||
|
if value is True: |
||||
|
parser.append(field) |
||||
|
else: |
||||
|
parser.append((field, convert_dict(value))) |
||||
|
return parser |
||||
|
|
||||
|
|
||||
|
class IrExport(models.Model): |
||||
|
_inherit = 'ir.exports' |
||||
|
|
||||
|
@api.multi |
||||
|
def get_json_parser(self): |
||||
|
self.ensure_one() |
||||
|
dict_parser = {} |
||||
|
for line in self.export_fields: |
||||
|
update_dict(dict_parser, line.name.split('/')) |
||||
|
return convert_dict(dict_parser) |
@ -0,0 +1,49 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
from openerp import api, models |
||||
|
from openerp.exceptions import Warning as UserError |
||||
|
from openerp.tools.translate import _ |
||||
|
|
||||
|
|
||||
|
@api.multi |
||||
|
def jsonify(self, parser): |
||||
|
""" Convert the record according to the parser given |
||||
|
Example of parser: |
||||
|
parser = [ |
||||
|
'name', |
||||
|
'number', |
||||
|
'create_date', |
||||
|
('partner_id', ['id', 'display_name', 'ref']) |
||||
|
('line_id', ['id', ('product_id', ['name']), 'price_unit']) |
||||
|
] |
||||
|
|
||||
|
In order to be consitent with the odoo api the jsonify method always |
||||
|
return a list of object even if there is only one element in input |
||||
|
""" |
||||
|
result = [] |
||||
|
for rec in self: |
||||
|
res = {} |
||||
|
for field in parser: |
||||
|
if isinstance(field, tuple): |
||||
|
field_name, subparser = field |
||||
|
field_type = rec._fields[field_name].type |
||||
|
if field_type in ('one2many', 'many2many'): |
||||
|
res[field_name] = rec[field_name].jsonify(subparser) |
||||
|
elif field_type == 'many2one': |
||||
|
data = rec[field_name].jsonify(subparser) |
||||
|
if data: |
||||
|
res[field_name] = data[0] |
||||
|
else: |
||||
|
res[field_name] = None |
||||
|
else: |
||||
|
raise UserError(_('Wrong parser configuration')) |
||||
|
else: |
||||
|
res[field] = rec[field] |
||||
|
result.append(res) |
||||
|
return result |
||||
|
|
||||
|
|
||||
|
models.Model.jsonify = jsonify |
@ -0,0 +1,6 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Akretion (http://www.akretion.com) |
||||
|
# Sébastien BEAU <sebastien.beau@akretion.com> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
from . import test_get_parser |
@ -0,0 +1,78 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © <YEAR(S)> <AUTHOR(S)> |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from openerp.tests.common import TransactionCase |
||||
|
|
||||
|
|
||||
|
class TestParser(TransactionCase): |
||||
|
|
||||
|
def setUp(self): |
||||
|
super(TestParser, self).setUp() |
||||
|
self.expected_parser = [ |
||||
|
u'lang', |
||||
|
u'comment', |
||||
|
u'credit_limit', |
||||
|
u'name', |
||||
|
u'color', |
||||
|
(u'child_ids', [ |
||||
|
(u'child_ids', [u'name']), |
||||
|
u'email', |
||||
|
(u'country_id', [u'code', u'name']), |
||||
|
u'name', |
||||
|
u'id', |
||||
|
]), |
||||
|
(u'country_id', [u'code', u'name']), |
||||
|
u'active', |
||||
|
(u'category_id', [u'name']) |
||||
|
] |
||||
|
|
||||
|
# TODO adapt data for 8.0 |
||||
|
def fixme_test_getting_parser(self): |
||||
|
exporter = self.env.ref('base_jsonify.ir_exp_partner') |
||||
|
parser = exporter.get_json_parser() |
||||
|
self.assertEqual(parser, self.expected_parser) |
||||
|
|
||||
|
def fixme_test_json_export(self): |
||||
|
expected_json = [{ |
||||
|
u'lang': False, |
||||
|
u'comment': False, |
||||
|
u'credit_limit': 0.0, |
||||
|
u'name': u'Camptocamp', |
||||
|
u'color': 0, |
||||
|
u'country_id': {u'code': u'FR', u'name': u'France'}, |
||||
|
u'child_ids': [{ |
||||
|
u'id': 29, |
||||
|
u'country_id': { |
||||
|
u'code': u'FR', |
||||
|
u'name': u'France' |
||||
|
}, |
||||
|
u'child_ids': [], |
||||
|
u'email': u'ayaan.agarwal@bestdesigners.example.com', |
||||
|
u'name': u'Ayaan Agarwal' |
||||
|
}, { |
||||
|
u'id': 35, |
||||
|
u'country_id': { |
||||
|
u'code': u'FR', |
||||
|
u'name': u'France'}, |
||||
|
u'child_ids': [], |
||||
|
u'email': u'benjamin.flores@nebula.example.com', |
||||
|
u'name': u'Benjamin Flores' |
||||
|
}, { |
||||
|
u'id': 28, |
||||
|
u'country_id': { |
||||
|
u'code': u'FR', |
||||
|
u'name': u'France'}, |
||||
|
u'child_ids': [], |
||||
|
u'email': u'phillipp.miller@mediapole.example.com', |
||||
|
u'name': u'Phillipp Miller' |
||||
|
}], |
||||
|
u'active': True, |
||||
|
u'category_id': [ |
||||
|
{u'name': u'Gold'}, |
||||
|
{u'name': u'Services'} |
||||
|
] |
||||
|
}] |
||||
|
partner = self.env.ref('base.res_partner_12') |
||||
|
json_partner = partner.jsonify(self.expected_parser) |
||||
|
self.assertEqual(json_partner, expected_json) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue