[MIG][WIP]Yaltik DSL : Odoo DSL on pure Python

This commit is contained in:
Fabien BOURGEOIS 2020-05-07 10:17:03 +02:00
parent 9fa300f77e
commit 5c4c0fe6e3
2 changed files with 238 additions and 228 deletions

View File

@ -17,111 +17,109 @@
""" Odoo XML DSL """ """ Odoo XML DSL """
from typing import Text, Dict from xml_base import xmlroot, xmln
from xml_base import XMLAttrs, XMLDictElement, xmlroot, xmln
# XML helpers functions and macros # XML helpers functions and macros
# Odoo root XML Node # Odoo root XML Node
def odoo(children: Dict) -> ET.Element = {'tag': 'odoo', 'attrs': {}, 'children': children} |> xmlroot odoo = lambda children: xmlroot({'tag': 'odoo', 'attrs': {}, 'children': children})
# Special data Node # Special data Node
def data(*args): def data(*args):
""" Allow optional args on data tag """ """ Allow optional args on data tag """
if args |> len == 1: if len(args) == 1:
{} |> args.insert$(0) where: args = args |> list args = list(args)
args.insert(0, {})
return xmln('data', *args) return xmln('data', *args)
# Aliases # Aliases
def function(*args) -> XMLDictElement = xmln('function', *args) function = lambda *args: xmln('function', *args)
def record(*args) -> XMLDictElement = xmln('record', *args) record = lambda *args: xmln('record', *args)
def form(*args) -> XMLDictElement = xmln('form', *args) form = lambda *args: xmln('form', *args)
def tree(*args) -> XMLDictElement = xmln('tree', *args) tree = lambda *args: xmln('tree', *args)
def search(*args) -> XMLDictElement = xmln('search', *args) search = lambda *args: xmln('search', *args)
# Actions # Actions
def act_window(*args) -> XMLDictElement = xmln('act_window', *args) act_window = lambda *args: xmln('act_window', *args)
def act_window_model(model: Text, attrs: XMLAttrs) -> XMLDictElement: def act_window_model(model, attrs):
""" Build new act_window from model and args """ """ Build new act_window from model and args """
xmlid = '%s_view_action' % (('.', '_') |*> model.replace) xmlid = '%s_view_action' % (model.replace('.', '_'))
name = '%s Action' % ('.' |> model.split |> map$(-> _.capitalize()) |> list |> ' '.join) name = '%s Action' % ' '.join(map(lambda w: w.capitalize(), model.split('.')))
attrs_clone = attrs.copy() # Avoid side-effect attrs_clone = attrs.copy() # Avoid side-effect
{'id': xmlid, 'name': name, 'res_model': model} |> attrs_clone.update attrs_clone.update({'id': xmlid, 'name': name, 'res_model': model})
return act_window(attrs_clone) return act_window(attrs_clone)
def action_server_code(xmlid: Text, name: Text, modelref: Text, code: Text) -> XMLDictElement: def action_server_code(xmlid, name, modelref, code):
""" Server actions of type code """ """ Server actions of type code """
children = [name |> field_name, children = [field_name(name),
({'name': 'model_id', 'ref': modelref}, []) |*> field, field({'name': 'model_id', 'ref': modelref}, []),
({'name': 'state'}, ['code']) |*> field, field({'name': 'state'}, ['code']),
({'name': 'code'}, [code]) |*> field] field({'name': 'code'}, [code])]
return ({'id': xmlid, 'model': 'ir.actions.server'}, children) |*> record return record({'id': xmlid, 'model': 'ir.actions.server'}, children)
def client_action_multi(xmlid: Text, name: Text, model: Text, action: Text) -> XMLDictElement: def client_action_multi(xmlid, name, model, action):
""" Client action multi (ir.values), with own xmlid, name, targeted model """ Client action multi (ir.values), with own xmlid, name, targeted model
and action """ and action """
action = action |> "'ir.actions.server,%d'%{}".format action = "'ir.actions.server,%d'%{}".format(action)
children = [name |> field_name, children = [field_name(name),
{'name': 'key2', 'eval': "'client_action_multi'"} |> field, field({'name': 'key2', 'eval': "'client_action_multi'"}),
{'name': 'model', 'eval': "'%s'" % model} |> field, field({'name': 'model', 'eval': "'%s'" % model}),
{'name': 'value', 'eval': action} |> field] field({'name': 'value', 'eval': action})]
return ({'id': xmlid, 'model': 'ir.values'}, children) |*> record return record({'id': xmlid, 'model': 'ir.values'}, children)
# Menus # Menus
def menuitem(*args) -> XMLDictElement = xmln('menuitem', *args) menuitem = lambda *args: xmln('menuitem', *args)
def menuitem_model(model: Text, attrs: XMLAttrs) -> XMLDictElement: def menuitem_model(model, attrs):
""" Build new menuitem from model and attrs """ """ Build new menuitem from model and attrs """
model_und = ('.', '_') |*> model.replace model_und = model.replace('.', '_')
xmlid = '%s_menu' % model_und xmlid = '%s_menu' % model_und
actionid = '%s_view_action' % model_und actionid = '%s_view_action' % model_und
attrs_clone = attrs.copy() # Avoid side-effect attrs_clone = attrs.copy() # Avoid side-effect
{'id': xmlid, 'action': actionid} |> attrs_clone.update attrs_clone.update({'id': xmlid, 'action': actionid})
return menuitem(attrs_clone) return menuitem(attrs_clone)
# Form aliases # Form aliases
def group(*args) -> XMLDictElement = xmln('group', *args) group = lambda *args: xmln('group', *args)
def header(*args) -> XMLDictElement = xmln('header', *args) header = lambda *args: xmln('header', *args)
def footer(*args) -> XMLDictElement = xmln('footer', *args) footer = lambda *args: xmln('footer', *args)
def sheet(*args) -> XMLDictElement = xmln('sheet', *args) sheet = lambda *args: xmln('sheet', *args)
def button(*args) -> XMLDictElement = xmln('button', *args) button = lambda *args: xmln('button', *args)
def p(*args) -> XMLDictElement = xmln('p', *args) p = lambda *args: xmln('p', *args)
def xpath(*args) -> XMLDictElement = xmln('xpath', *args) xpath = lambda *args: xmln('xpath', *args)
def attribute(name: Text, value: Text) -> XMLDictElement: attribute = lambda name, value: xmln('attribute', {'name': name}, [value])
return ('attribute', {'name': name}, [value]) |*> xmln
# Fields # Fields
def field(*args) -> XMLDictElement = xmln('field', *args) field = lambda *args: xmln('field', *args)
def field_name(name: Text) -> XMLDictElement = ({'name': 'name'}, [name]) |*> field field_name = lambda name: field({'name': 'name'}, [name])
def field_model(model: Text) -> XMLDictElement = ({'name': 'model'}, [model]) |*> field field_model = lambda model: field({'name': 'model'}, [model])
def field_inherit(xmlid: Text) -> XMLDictElement: field_inherit = lambda xmlid: field({'name': 'inherit_id', 'ref': xmlid}, [])
return ({'name': 'inherit_id', 'ref': xmlid}, []) |*> field field_arch = lambda *args: field({'name': 'arch', 'type': 'xml'}, *args)
def field_arch(*args) -> XMLDictElement = {'name': 'arch', 'type': 'xml'} |> field$ <*| args
# Search # Search
def filter(*args) -> XMLDictElement = xmln('filter', *args) filter = lambda *args: xmln('filter', *args)
# Views # Views
def view(xmlid: Text, children: List) -> XMLDictElement: view = lambda xmlid, children: record({'id': xmlid, 'model': 'ir.ui.view'}, children)
return ({'id': xmlid, 'model': 'ir.ui.view'}, children) |*> record
def view_def(xmlid: Text, name: Text, model: Text, arch: List) -> XMLDictElement: def view_def(xmlid, name, model, arch):
return (xmlid, [field_name(name), field_model(model), field_arch(arch)]) |*> view """ Shortcut for new view """
return view(xmlid, [field_name(name), field_model(model), field_arch(arch)])
def view_new(view_type: Text, model: Text, arch: List) -> XMLDictElement: def view_new(view_type, model, arch):
""" View : new view definition, based on type (form, tree, ...) and model ID """ """ View : new view definition, based on type (form, tree, ...) and model ID """
model_und = ('.', '_') |*> model.replace model_und = model.replace('.', '_')
model_cap = ('.' |> model.split |> map$(-> _.capitalize()) |> list |> ' '.join) model_cap = ' '.join(map(lambda w: w.capitalize(), model.split('.')))
xmlid = "%s_view_%s" % (model_und, view_type) xmlid = "%s_view_%s" % (model_und, view_type)
name = (model_cap, view_type.capitalize()) |> ' '.join name = ' '.join([model_cap, view_type.capitalize()])
return (xmlid, name, model, arch) |*> view_def return view_def(xmlid, name, model, arch)
def view_inherit(filename: Text, model: Text, inherit: Text, arch: List) -> XMLDictElement: def view_inherit(filename, model, inherit, arch):
""" Inherited View simplification with name of the record, xmlid for model """ Inherited View simplification with name of the record, xmlid for model
and inherited view """ and inherited view """
module = '.' |> filename.split |> .[2] module = filename.split('.')[2]
inherited = '.' |> inherit.split |> .[1] inherited = inherit.split('.')[1]
xmlid = '%s_inherit_%s' % (inherited, module) xmlid = '%s_inherit_%s' % (inherited, module)
model_cap = ('.' |> model.split |> map$(-> _.capitalize()) |> list |> ' '.join) model_cap = ' '.join(map(lambda w: w.capitalize(), model.split('.')))
name = '%s Adaptations' % model_cap name = '%s Adaptations' % model_cap
return view(xmlid, [name |> field_name, model |> field_model, return view(xmlid, [field_name(name), field_model(model),
inherit |> field_inherit, arch |> field_arch]) field_inherit(inherit), field_arch(arch)])

View File

@ -26,209 +26,221 @@ class TestOdooBase(unittest.TestCase):
""" Odoo Helpers tests """ """ Odoo Helpers tests """
def test_odoo(self): def test_odoo(self):
""" Test odoo function """
element = od.odoo([]) element = od.odoo([])
element `self.assertIsInstance` ET.Element self.assertIsInstance(element, ET.Element)
element.tag `self.assertEquals` 'odoo' self.assertEqual(element.tag, 'odoo')
def test_data(self): def test_data(self):
""" Test data function """
element = od.data([]) element = od.data([])
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'data' self.assertEqual(element.tag, 'data')
element.attrs `self.assertEquals` {} self.assertEqual(element.attrs, {})
element = od.data({"one": "attribute"}, []) element = od.data({"one": "attribute"}, [])
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'data' self.assertEqual(element.tag, 'data')
element.attrs `self.assertEquals` {"one": "attribute"} self.assertEqual(element.attrs, {"one": "attribute"})
def test_aliases(self): def test_aliases(self):
""" Test simple aliases to xmln """ """ Test simple aliases to xmln """
element = od.record({"one": "attribute"}, 'A child') element = od.record({"one": "attribute"}, 'A child')
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'record' self.assertEqual(element.tag, 'record')
element.attrs `self.assertEquals` {"one": "attribute"} self.assertEqual(element.attrs, {"one": "attribute"})
element.children `self.assertEquals` ['A child'] self.assertEqual(element.children, ['A child'])
element = od.tree() element = od.tree()
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'tree' self.assertEqual(element.tag, 'tree')
def test_act_window_model(self): def test_act_window_model(self):
element = ('sample.model', {'view_type': 'form'}) |*> od.act_window_model """ Test act_window function """
element `self.assertIsInstance` XMLDictElement element = od.act_window_model('sample.model', {'view_type': 'form'})
element.tag `self.assertEquals` 'act_window' self.assertIsInstance(element, XMLDictElement)
element.attrs['view_type'] `self.assertEquals` 'form' self.assertEqual(element.tag, 'act_window')
element.attrs['id'] `self.assertEquals` 'sample_model_view_action' self.assertEqual(element.attrs['view_type'], 'form')
element.attrs['res_model'] `self.assertEquals` 'sample.model' self.assertEqual(element.attrs['id'], 'sample_model_view_action')
element.attrs['name'] `self.assertEquals` 'Sample Model Action' self.assertEqual(element.attrs['res_model'], 'sample.model')
self.assertEqual(element.attrs['name'], 'Sample Model Action')
def test_menunitem_model(self): def test_menunitem_model(self):
element = ('sample.model', {'groups': 'base.user_employee'}) |*> od.menuitem_model """ Test menuitem function """
element `self.assertIsInstance` XMLDictElement element = od.menuitem_model('sample.model', {'groups': 'base.user_employee'})
element.tag `self.assertEquals` 'menuitem' self.assertIsInstance(element, XMLDictElement)
element.attrs['groups'] `self.assertEquals` 'base.user_employee' self.assertEqual(element.tag, 'menuitem')
element.attrs['id'] `self.assertEquals` 'sample_model_menu' self.assertEqual(element.attrs['groups'], 'base.user_employee')
element.attrs['action'] `self.assertEquals` 'sample_model_view_action' self.assertEqual(element.attrs['id'], 'sample_model_menu')
self.assertEqual(element.attrs['action'], 'sample_model_view_action')
def test_attribute(self): def test_attribute(self):
""" Test attribute function """
element = od.attribute('invisible', "1") element = od.attribute('invisible', "1")
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'attribute' self.assertEqual(element.tag, 'attribute')
element.attrs['name'] `self.assertEquals` 'invisible' self.assertEqual(element.attrs['name'], 'invisible')
element.children `self.assertEquals` ["1"] self.assertEqual(element.children, ["1"])
def test_fields(self): def test_fields(self):
""" Test fields function """
element = od.field({"one": "attribute"}, 'A child') element = od.field({"one": "attribute"}, 'A child')
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'field' self.assertEqual(element.tag, 'field')
element = 'A name' |> od.field_name element = od.field_name('A name')
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'field' self.assertEqual(element.tag, 'field')
element.attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.attrs['name'], 'name')
element.children `self.assertEquals` ['A name'] self.assertEqual(element.children, ['A name'])
element = 'sample.model' |> od.field_model element = od.field_model('sample.model')
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'field' self.assertEqual(element.tag, 'field')
element.attrs['name'] `self.assertEquals` 'model' self.assertEqual(element.attrs['name'], 'model')
element.children `self.assertEquals` ['sample.model'] self.assertEqual(element.children, ['sample.model'])
element = 'module.xml_view' |> od.field_inherit element = od.field_inherit('module.xml_view')
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'field' self.assertEqual(element.tag, 'field')
element.attrs['name'] `self.assertEquals` 'inherit_id' self.assertEqual(element.attrs['name'], 'inherit_id')
element.attrs['ref'] `self.assertEquals` 'module.xml_view' self.assertEqual(element.attrs['ref'], 'module.xml_view')
element.children |> self.assertFalse self.assertFalse(element.children)
element = od.field_arch() element = od.field_arch()
element `self.assertIsInstance` XMLDictElement self.assertIsInstance(element, XMLDictElement)
element.tag `self.assertEquals` 'field' self.assertEqual(element.tag, 'field')
element.attrs['name'] `self.assertEquals` 'arch' self.assertEqual(element.attrs['name'], 'arch')
element.attrs['type'] `self.assertEquals` 'xml' self.assertEqual(element.attrs['type'], 'xml')
element.children |> self.assertFalse self.assertFalse(element.children)
def test_view(self): def test_view(self):
element = od.view('view_xmlid', []) """ Test view function """
element `self.assertIsInstance` XMLDictElement element = od.view('view_xmlid', [])
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'view_xmlid' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.ui.view' self.assertEqual(element.attrs['id'], 'view_xmlid')
element.children |> self.assertFalse self.assertEqual(element.attrs['model'], 'ir.ui.view')
self.assertFalse(element.children)
def test_view_def(self): def test_view_def(self):
element = od.view_def('view_xmlid', 'View', 'sample.model', []) """ Test view_def function """
element `self.assertIsInstance` XMLDictElement element = od.view_def('view_xmlid', 'View', 'sample.model', [])
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'view_xmlid' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.ui.view' self.assertEqual(element.attrs['id'], 'view_xmlid')
(element.children |> len) `self.assertEquals` 3 self.assertEqual(element.attrs['model'], 'ir.ui.view')
element.children[0] `self.assertIsInstance` XMLDictElement self.assertEqual((len(element.children)), 3)
element.children[0].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[0], XMLDictElement)
element.children[0].attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.children[0].tag, 'field')
element.children[0].children `self.assertEquals` ['View'] self.assertEqual(element.children[0].attrs['name'], 'name')
element.children[1] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[0].children, ['View'])
element.children[1].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[1], XMLDictElement)
element.children[1].attrs['name'] `self.assertEquals` 'model' self.assertEqual(element.children[1].tag, 'field')
element.children[1].children `self.assertEquals` ['sample.model'] self.assertEqual(element.children[1].attrs['name'], 'model')
element.children[2] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[1].children, ['sample.model'])
element.children[2].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[2], XMLDictElement)
element.children[2].attrs['name'] `self.assertEquals` 'arch' self.assertEqual(element.children[2].tag, 'field')
element.children[2].attrs['type'] `self.assertEquals` 'xml' self.assertEqual(element.children[2].attrs['name'], 'arch')
element.children[2].children |> self.assertFalse self.assertEqual(element.children[2].attrs['type'], 'xml')
self.assertFalse(element.children[2].children)
def test_view_new(self): def test_view_new(self):
element = od.view_new('tree', 'sample.model', []) """ Test view_new function """
element `self.assertIsInstance` XMLDictElement element = od.view_new('tree', 'sample.model', [])
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'sample_model_view_tree' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.ui.view' self.assertEqual(element.attrs['id'], 'sample_model_view_tree')
(element.children |> len) `self.assertEquals` 3 self.assertEqual(element.attrs['model'], 'ir.ui.view')
element.children[0] `self.assertIsInstance` XMLDictElement self.assertEqual((len(element.children)), 3)
element.children[0].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[0], XMLDictElement)
element.children[0].attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.children[0].tag, 'field')
element.children[0].children `self.assertEquals` ['Sample Model Tree'] self.assertEqual(element.children[0].attrs['name'], 'name')
element.children[1] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[0].children, ['Sample Model Tree'])
element.children[1].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[1], XMLDictElement)
element.children[1].attrs['name'] `self.assertEquals` 'model' self.assertEqual(element.children[1].tag, 'field')
element.children[1].children `self.assertEquals` ['sample.model'] self.assertEqual(element.children[1].attrs['name'], 'model')
element.children[2] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[1].children, ['sample.model'])
element.children[2].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[2], XMLDictElement)
element.children[2].attrs['name'] `self.assertEquals` 'arch' self.assertEqual(element.children[2].tag, 'field')
element.children[2].attrs['type'] `self.assertEquals` 'xml' self.assertEqual(element.children[2].attrs['name'], 'arch')
element.children[2].children |> self.assertFalse self.assertEqual(element.children[2].attrs['type'], 'xml')
self.assertFalse(element.children[2].children)
def test_view_inherit(self): def test_view_inherit(self):
element = od.view_inherit('odoo.addons.module', 'sample.model', 'parent.view', []) """ Test view_inherit function """
element `self.assertIsInstance` XMLDictElement element = od.view_inherit('odoo.addons.module', 'sample.model', 'parent.view', [])
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'view_inherit_module' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.ui.view' self.assertEqual(element.attrs['id'], 'view_inherit_module')
(element.children |> len) `self.assertEquals` 4 self.assertEqual(element.attrs['model'], 'ir.ui.view')
element.children[0] `self.assertIsInstance` XMLDictElement self.assertEqual((len(element.children)), 4)
element.children[0].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[0], XMLDictElement)
element.children[0].attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.children[0].tag, 'field')
element.children[0].children `self.assertEquals` ['Sample Model Adaptations'] self.assertEqual(element.children[0].attrs['name'], 'name')
element.children[1] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[0].children, ['Sample Model Adaptations'])
element.children[1].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[1], XMLDictElement)
element.children[1].attrs['name'] `self.assertEquals` 'model' self.assertEqual(element.children[1].tag, 'field')
element.children[1].children `self.assertEquals` ['sample.model'] self.assertEqual(element.children[1].attrs['name'], 'model')
element.children[2] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[1].children, ['sample.model'])
element.children[2].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[2], XMLDictElement)
element.children[2].attrs['name'] `self.assertEquals` 'inherit_id' self.assertEqual(element.children[2].tag, 'field')
element.children[2].children |> self.assertFalse self.assertEqual(element.children[2].attrs['name'], 'inherit_id')
element.children[3] `self.assertIsInstance` XMLDictElement self.assertFalse(element.children[2].children)
element.children[3].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[3], XMLDictElement)
element.children[3].attrs['name'] `self.assertEquals` 'arch' self.assertEqual(element.children[3].tag, 'field')
element.children[3].attrs['type'] `self.assertEquals` 'xml' self.assertEqual(element.children[3].attrs['name'], 'arch')
element.children[3].children |> self.assertFalse self.assertEqual(element.children[3].attrs['type'], 'xml')
self.assertFalse(element.children[3].children)
def test_action_server_code(self): def test_action_server_code(self):
element = od.action_server_code('sample.xmlid', 'Code', 'sample.model', """ Test action_server_code function """
'''record.do_something()''') element = od.action_server_code('sample.xmlid', 'Code', 'sample.model',
element `self.assertIsInstance` XMLDictElement '''record.do_something()''')
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'sample.xmlid' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.actions.server' self.assertEqual(element.attrs['id'], 'sample.xmlid')
(element.children |> len) `self.assertEquals` 4 self.assertEqual(element.attrs['model'], 'ir.actions.server')
element.children[0] `self.assertIsInstance` XMLDictElement self.assertEqual((len(element.children)), 4)
element.children[0].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[0], XMLDictElement)
element.children[0].attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.children[0].tag, 'field')
element.children[0].children `self.assertEquals` ['Code'] self.assertEqual(element.children[0].attrs['name'], 'name')
element.children[1] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[0].children, ['Code'])
element.children[1].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[1], XMLDictElement)
element.children[1].attrs['name'] `self.assertEquals` 'model_id' self.assertEqual(element.children[1].tag, 'field')
element.children[1].attrs['ref'] `self.assertEquals` 'sample.model' self.assertEqual(element.children[1].attrs['name'], 'model_id')
element.children[1].children |> self.assertFalse self.assertEqual(element.children[1].attrs['ref'], 'sample.model')
element.children[2].tag `self.assertEquals` 'field' self.assertFalse(element.children[1].children)
element.children[2].attrs['name'] `self.assertEquals` 'state' self.assertEqual(element.children[2].tag, 'field')
element.children[2].children `self.assertEquals` ['code'] self.assertEqual(element.children[2].attrs['name'], 'state')
element.children[3].tag `self.assertEquals` 'field' self.assertEqual(element.children[2].children, ['code'])
element.children[3].attrs['name'] `self.assertEquals` 'code' self.assertEqual(element.children[3].tag, 'field')
element.children[3].children `self.assertEquals` ['record.do_something()'] self.assertEqual(element.children[3].attrs['name'], 'code')
self.assertEqual(element.children[3].children, ['record.do_something()'])
def test_client_action_multi(self): def test_client_action_multi(self):
element = od.client_action_multi('sample.xmlid', 'Multi', 'sample.model', 'sample.action') """ Test client_action_multi function """
element `self.assertIsInstance` XMLDictElement element = od.client_action_multi('sample.xmlid', 'Multi', 'sample.model', 'sample.action')
element.tag `self.assertEquals` 'record' self.assertIsInstance(element, XMLDictElement)
element.attrs['id'] `self.assertEquals` 'sample.xmlid' self.assertEqual(element.tag, 'record')
element.attrs['model'] `self.assertEquals` 'ir.values' self.assertEqual(element.attrs['id'], 'sample.xmlid')
(element.children |> len) `self.assertEquals` 4 self.assertEqual(element.attrs['model'], 'ir.values')
element.children[0] `self.assertIsInstance` XMLDictElement self.assertEqual((len(element.children)), 4)
element.children[0].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[0], XMLDictElement)
element.children[0].attrs['name'] `self.assertEquals` 'name' self.assertEqual(element.children[0].tag, 'field')
element.children[0].children `self.assertEquals` ['Multi'] self.assertEqual(element.children[0].attrs['name'], 'name')
element.children[1] `self.assertIsInstance` XMLDictElement self.assertEqual(element.children[0].children, ['Multi'])
element.children[1].tag `self.assertEquals` 'field' self.assertIsInstance(element.children[1], XMLDictElement)
element.children[1].attrs['name'] `self.assertEquals` 'key2' self.assertEqual(element.children[1].tag, 'field')
element.children[1].attrs['eval'] `self.assertEquals` "'client_action_multi'" self.assertEqual(element.children[1].attrs['name'], 'key2')
element.children[1].children |> self.assertFalse self.assertEqual(element.children[1].attrs['eval'], "'client_action_multi'")
element.children[2].tag `self.assertEquals` 'field' self.assertFalse(element.children[1].children)
element.children[2].attrs['name'] `self.assertEquals` 'model' self.assertEqual(element.children[2].tag, 'field')
element.children[2].attrs['eval'] `self.assertEquals` "'sample.model'" self.assertEqual(element.children[2].attrs['name'], 'model')
element.children[3].tag `self.assertEquals` 'field' self.assertEqual(element.children[2].attrs['eval'], "'sample.model'")
element.children[3].attrs['name'] `self.assertEquals` 'value' self.assertEqual(element.children[3].tag, 'field')
element.children[3].attrs['eval'] `self.assertEquals` "'ir.actions.server,%d'%sample.action" self.assertEqual(element.children[3].attrs['name'], 'value')
self.assertEqual(element.children[3].attrs['eval'], "'ir.actions.server,%d'%sample.action")
if __name__ == '__main__': if __name__ == '__main__':