[MERGE]merged with latest
bzr revid: vba@tinyerp.com-20120823110601-zit332ukypcbvv16
This commit is contained in:
+1
-1
@@ -105,7 +105,7 @@ def run_test_file(dbname, test_file):
|
||||
db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False)
|
||||
cr = db.cursor()
|
||||
_logger.info('loading test file %s', test_file)
|
||||
openerp.tools.convert_yaml_import(cr, 'base', file(test_file), {}, 'test', True)
|
||||
openerp.tools.convert_yaml_import(cr, 'base', file(test_file), 'test', {}, 'test', True)
|
||||
cr.rollback()
|
||||
cr.close()
|
||||
except Exception:
|
||||
|
||||
@@ -25,20 +25,21 @@
|
||||
'name': 'Base',
|
||||
'version': '1.3',
|
||||
'category': 'Hidden',
|
||||
'description': """The kernel of OpenERP, needed for all installation.""",
|
||||
'description': """
|
||||
The kernel of OpenERP, needed for all installation.
|
||||
===================================================
|
||||
""",
|
||||
'author': 'OpenERP SA',
|
||||
'maintainer': 'OpenERP SA',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': [],
|
||||
'init_xml': [
|
||||
'data': [
|
||||
'base_data.xml',
|
||||
'security/base_security.xml',
|
||||
'base_menu.xml',
|
||||
'res/res_security.xml',
|
||||
'res/res_config.xml',
|
||||
'data/res.country.state.csv'
|
||||
],
|
||||
'update_xml': [
|
||||
'data/res.country.state.csv',
|
||||
'ir/wizard/wizard_menu_view.xml',
|
||||
'ir/ir.xml',
|
||||
'ir/ir_filters.xml',
|
||||
@@ -75,7 +76,7 @@
|
||||
'res/res_widget_view.xml',
|
||||
'res/res_widget_data.xml',
|
||||
],
|
||||
'demo_xml': [
|
||||
'demo': [
|
||||
'base_demo.xml',
|
||||
'res/res_partner_demo.xml',
|
||||
'res/res_partner_demo.yml',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Top menu item -->
|
||||
<menuitem name="Reporting"
|
||||
|
||||
@@ -560,7 +560,6 @@
|
||||
<record model="ir.ui.view" id="view_ir_needaction_users_rel_tree">
|
||||
<field name="name">ir.needaction_users_rel.tree</field>
|
||||
<field name="model">ir.needaction_users_rel</field>
|
||||
<field name="sequence">10</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Subscription">
|
||||
<field name="user_id"/>
|
||||
|
||||
@@ -18,12 +18,14 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import base64
|
||||
from docutils.core import publish_string
|
||||
import imp
|
||||
import logging
|
||||
import re
|
||||
import urllib
|
||||
import zipimport
|
||||
import base64
|
||||
|
||||
from openerp import modules, pooler, release, tools, addons
|
||||
from openerp.tools.parse_version import parse_version
|
||||
@@ -94,6 +96,15 @@ class module(osv.osv):
|
||||
'module %s', name, exc_info=True)
|
||||
return info
|
||||
|
||||
def _get_desc(self, cr, uid, ids, field_name=None, arg=None, context=None):
|
||||
res = dict.fromkeys(ids, '')
|
||||
for module in self.browse(cr, uid, ids, context=context):
|
||||
desc = self.get_module_info(module.name).get('description', '')
|
||||
overrides = dict(embed_stylesheet=False, doctitle_xform=False, output_encoding='unicode')
|
||||
output = publish_string(source=desc, writer_name='html', settings_overrides=overrides)
|
||||
res[module.id] = output
|
||||
return res
|
||||
|
||||
def _get_latest_version(self, cr, uid, ids, field_name=None, arg=None, context=None):
|
||||
res = dict.fromkeys(ids, '')
|
||||
for m in self.browse(cr, uid, ids):
|
||||
@@ -182,7 +193,7 @@ class module(osv.osv):
|
||||
'category_id': fields.many2one('ir.module.category', 'Category', readonly=True, select=True),
|
||||
'shortdesc': fields.char('Module Name', size=64, readonly=True, translate=True),
|
||||
'summary': fields.char('Summary', size=64, readonly=True, translate=True),
|
||||
'description': fields.text("Description", readonly=True, translate=True),
|
||||
'description': fields.function(_get_desc, string='Description', type='html', method=True, readonly=True, store=True),
|
||||
'author': fields.char("Author", size=128, readonly=True),
|
||||
'maintainer': fields.char('Maintainer', size=128, readonly=True),
|
||||
'contributors': fields.text('Contributors', readonly=True),
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
<field name="model">ir.module.module</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search modules">
|
||||
<field name="name" filter_domain="['|', '|', '|', ('description', 'ilike', self), ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('name',
|
||||
<field name="name" filter_domain="['|', '|', ('summary', 'ilike', self), ('shortdesc', 'ilike', self), ('name',
|
||||
'ilike', self)]"/>
|
||||
<filter name="app" icon="terp-check" string="Apps" domain="[('application', '=', 1)]"/>
|
||||
<filter name="extra" icon="terp-check" string="Extra" domain="[('application', '=', 0)]"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<data noupdate="1">
|
||||
<record id="res_config_view_base" model="ir.ui.view">
|
||||
<field name="name">res.config.view.base</field>
|
||||
<field name="model">res.config</field>
|
||||
|
||||
@@ -204,7 +204,7 @@
|
||||
</templates>
|
||||
</kanban>
|
||||
<form string="Contact" version="7.0">
|
||||
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"'/>
|
||||
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
|
||||
<div class="oe_title">
|
||||
<group>
|
||||
<field name="name"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<data noupdate="1">
|
||||
|
||||
<record model="res.groups" id="group_partner_manager">
|
||||
<field name="name">Partner Manager</field>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<data noupdate="1">
|
||||
|
||||
<!--
|
||||
Users Groups
|
||||
|
||||
@@ -42,15 +42,13 @@
|
||||
-
|
||||
!python {model: ir.model}: |
|
||||
from tools.safe_eval import safe_eval
|
||||
from tools.misc import mute_logger
|
||||
try:
|
||||
safe_eval('open("/etc/passwd","r")')
|
||||
assert False, "safe_eval should not allow calling open() builtin"
|
||||
with mute_logger('openerp.tools.safe_eval'):
|
||||
safe_eval('open("/etc/passwd","r")')
|
||||
assert False, "safe_eval should not allow calling open() builtin"
|
||||
except NameError:
|
||||
pass
|
||||
except:
|
||||
# NameError should be raised because open() builtin is not found,
|
||||
# but other exceptions probably indicate that open() was executed!
|
||||
assert False, "safe_eval should not allow calling open() builtin"
|
||||
pass
|
||||
|
||||
-
|
||||
"ORM test: verify that parent_store computation are going right"
|
||||
|
||||
@@ -185,7 +185,6 @@
|
||||
<rng:optional> <rng:attribute name="string"/> </rng:optional>
|
||||
<rng:optional> <rng:attribute name="sequence"/> </rng:optional>
|
||||
<rng:optional> <rng:attribute name="groups"/> </rng:optional>
|
||||
<rng:optional> <rng:attribute name="type"/> </rng:optional>
|
||||
<rng:optional> <rng:attribute name="menu"/> </rng:optional>
|
||||
<rng:empty />
|
||||
</rng:element>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
|
||||
# Copyright (C) 2010-2012 OpenERP s.a. (<http://openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
@@ -84,7 +84,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
||||
_load_data(cr, module_name, idref, mode, 'test')
|
||||
return True
|
||||
except Exception:
|
||||
_logger.error(
|
||||
_logger.exception(
|
||||
'module %s: an exception occurred in a test', module_name)
|
||||
return False
|
||||
finally:
|
||||
@@ -119,7 +119,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
||||
elif ext == '.sql':
|
||||
process_sql_file(cr, fp)
|
||||
elif ext == '.yml':
|
||||
tools.convert_yaml_import(cr, module_name, fp, idref, mode, noupdate, report)
|
||||
tools.convert_yaml_import(cr, module_name, fp, kind, idref, mode, noupdate, report)
|
||||
else:
|
||||
tools.convert_xml_import(cr, module_name, fp, idref, mode, noupdate, report)
|
||||
finally:
|
||||
|
||||
+3
-3
@@ -3,7 +3,7 @@
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2011 OpenERP SA (<http://www.openerp.com>)
|
||||
# Copyright (C) 2004-2012 OpenERP SA (<http://www.openerp.com>)
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
@@ -376,11 +376,11 @@ def dispatch_rpc(service_name, method, params):
|
||||
except openerp.exceptions.Warning:
|
||||
raise
|
||||
except openerp.exceptions.DeferredException, e:
|
||||
_logger.error(tools.exception_to_unicode(e))
|
||||
_logger.exception(tools.exception_to_unicode(e))
|
||||
post_mortem(e.traceback)
|
||||
raise
|
||||
except Exception, e:
|
||||
_logger.error(tools.exception_to_unicode(e))
|
||||
_logger.exception(tools.exception_to_unicode(e))
|
||||
post_mortem(sys.exc_info())
|
||||
raise
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import openerp.modules.registry
|
||||
import openerp
|
||||
|
||||
from openerp.tests import common
|
||||
from openerp.tools.misc import mute_logger
|
||||
|
||||
def ok(n):
|
||||
""" Successful import of ``n`` records
|
||||
@@ -221,6 +222,7 @@ class test_integer_field(ImporterCase):
|
||||
-1, -42, -(2**31 - 1), -(2**31), -12345678
|
||||
], values(self.read()))
|
||||
|
||||
@mute_logger('openerp.sql_db')
|
||||
def test_out_of_range(self):
|
||||
self.assertEqual(
|
||||
self.import_(['value'], [[str(2**31)]]),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import threading
|
||||
import time
|
||||
import unittest2
|
||||
import xmlrpclib
|
||||
@@ -11,6 +12,13 @@ ADDONS_PATH = openerp.tools.config['addons_path']
|
||||
PORT = openerp.tools.config['xmlrpc_port']
|
||||
DB = openerp.tools.config['db_name']
|
||||
|
||||
# If the database name is not provided on the command-line,
|
||||
# use the one on the thread (which means if it is provided on
|
||||
# the command-line, this will break when installing another
|
||||
# database from XML-RPC).
|
||||
if not DB and hasattr(threading.current_thread(), 'dbname'):
|
||||
DB = threading.current_thread().dbname
|
||||
|
||||
HOST = '127.0.0.1'
|
||||
|
||||
ADMIN_USER = 'admin'
|
||||
|
||||
@@ -22,6 +22,16 @@ def registry(model):
|
||||
def cursor():
|
||||
return openerp.modules.registry.RegistryManager.get(DB).db.cursor()
|
||||
|
||||
|
||||
def drop_sequence(code):
|
||||
cr = cursor()
|
||||
for model in ['ir.sequence', 'ir.sequence.type']:
|
||||
s = registry(model)
|
||||
ids = s.search(cr, ADMIN_USER_ID, [('code', '=', code)])
|
||||
s.unlink(cr, ADMIN_USER_ID, ids)
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
class test_ir_sequence_standard(unittest2.TestCase):
|
||||
""" A few tests for a 'Standard' (i.e. PostgreSQL) sequence. """
|
||||
|
||||
@@ -48,7 +58,7 @@ class test_ir_sequence_standard(unittest2.TestCase):
|
||||
def test_ir_sequence_draw(self):
|
||||
""" Try to draw a number. """
|
||||
cr = cursor()
|
||||
n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
n = registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
assert n
|
||||
cr.commit()
|
||||
cr.close()
|
||||
@@ -57,15 +67,19 @@ class test_ir_sequence_standard(unittest2.TestCase):
|
||||
""" Try to draw a number from two transactions. """
|
||||
cr0 = cursor()
|
||||
cr1 = cursor()
|
||||
n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
n0 = registry('ir.sequence').next_by_code(cr0, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
assert n0
|
||||
n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
n1 = registry('ir.sequence').next_by_code(cr1, ADMIN_USER_ID, 'test_sequence_type', {})
|
||||
assert n1
|
||||
cr0.commit()
|
||||
cr1.commit()
|
||||
cr0.close()
|
||||
cr1.close()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
drop_sequence('test_sequence_type')
|
||||
|
||||
class test_ir_sequence_no_gap(unittest2.TestCase):
|
||||
""" Copy of the previous tests for a 'No gap' sequence. """
|
||||
|
||||
@@ -85,7 +99,7 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
|
||||
def test_ir_sequence_draw_no_gap(self):
|
||||
""" Try to draw a number. """
|
||||
cr = cursor()
|
||||
n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
n = registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
assert n
|
||||
cr.commit()
|
||||
cr.close()
|
||||
@@ -99,12 +113,16 @@ class test_ir_sequence_no_gap(unittest2.TestCase):
|
||||
cr1._default_log_exceptions = False # Prevent logging a traceback
|
||||
msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
|
||||
with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
|
||||
n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
n0 = registry('ir.sequence').next_by_code(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
assert n0
|
||||
n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
n1 = registry('ir.sequence').next_by_code(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
|
||||
cr0.close()
|
||||
cr1.close()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
drop_sequence('test_sequence_type_2')
|
||||
|
||||
class test_ir_sequence_change_implementation(unittest2.TestCase):
|
||||
""" Create sequence objects and change their ``implementation`` field. """
|
||||
|
||||
@@ -146,6 +164,11 @@ class test_ir_sequence_change_implementation(unittest2.TestCase):
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
drop_sequence('test_sequence_type_3')
|
||||
drop_sequence('test_sequence_type_4')
|
||||
|
||||
class test_ir_sequence_generate(unittest2.TestCase):
|
||||
""" Create sequence objects and generate some values. """
|
||||
|
||||
@@ -162,7 +185,7 @@ class test_ir_sequence_generate(unittest2.TestCase):
|
||||
cr.close()
|
||||
|
||||
cr = cursor()
|
||||
f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_5', {})
|
||||
f = lambda *a: registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type_5', {})
|
||||
assert all(str(x) == f() for x in xrange(1,1000))
|
||||
cr.commit()
|
||||
cr.close()
|
||||
@@ -180,11 +203,15 @@ class test_ir_sequence_generate(unittest2.TestCase):
|
||||
cr.close()
|
||||
|
||||
cr = cursor()
|
||||
f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_6', {})
|
||||
f = lambda *a: registry('ir.sequence').next_by_code(cr, ADMIN_USER_ID, 'test_sequence_type_6', {})
|
||||
assert all(str(x) == f() for x in xrange(1,1000))
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
drop_sequence('test_sequence_type_5')
|
||||
drop_sequence('test_sequence_type_6')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -591,7 +591,11 @@ form: module.record_id""" % (xml_id,)
|
||||
|
||||
if rec.get('action'):
|
||||
a_action = rec.get('action','').encode('utf8')
|
||||
a_type = rec.get('type','').encode('utf8') or 'act_window'
|
||||
|
||||
# determine the type of action
|
||||
a_type, a_id = self.model_id_get(cr, a_action)
|
||||
a_type = a_type.split('.')[-1] # keep only type part
|
||||
|
||||
icons = {
|
||||
"act_window": 'STOCK_NEW',
|
||||
"report.xml": 'STOCK_PASTE',
|
||||
@@ -601,8 +605,8 @@ form: module.record_id""" % (xml_id,)
|
||||
"server": 'STOCK_EXECUTE',
|
||||
}
|
||||
values['icon'] = icons.get(a_type,'STOCK_NEW')
|
||||
|
||||
if a_type=='act_window':
|
||||
a_id = self.id_get(cr, a_action)
|
||||
cr.execute('select view_type,view_mode,name,view_id,target from ir_act_window where id=%s', (int(a_id),))
|
||||
rrres = cr.fetchone()
|
||||
assert rrres, "No window action defined for this id %s !\n" \
|
||||
@@ -627,9 +631,8 @@ form: module.record_id""" % (xml_id,)
|
||||
values['icon'] = 'STOCK_EXECUTE'
|
||||
if not values.get('name', False):
|
||||
values['name'] = action_name
|
||||
|
||||
|
||||
elif a_type in ['wizard', 'url', 'client', 'server'] and not values.get('name'):
|
||||
a_id = self.id_get(cr, a_action)
|
||||
a_table = 'ir_act_%s' % a_type
|
||||
cr.execute('select name from %s where id=%%s' % a_table, (int(a_id),))
|
||||
resw = cr.fetchone()
|
||||
@@ -667,9 +670,6 @@ form: module.record_id""" % (xml_id,)
|
||||
self.idref[rec_id] = int(pid)
|
||||
|
||||
if rec.get('action') and pid:
|
||||
a_action = rec.get('action').encode('utf8')
|
||||
a_type = rec.get('type','').encode('utf8') or 'act_window'
|
||||
a_id = self.id_get(cr, a_action)
|
||||
action = "ir.actions.%s,%d" % (a_type, a_id)
|
||||
self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(pid))], action, True, True, xml_id=rec_id)
|
||||
return ('ir.ui.menu', pid)
|
||||
|
||||
@@ -1140,4 +1140,37 @@ class UnquoteEvalContext(defaultdict):
|
||||
def __missing__(self, key):
|
||||
return unquote(key)
|
||||
|
||||
|
||||
class mute_logger(object):
|
||||
"""Temporary suppress the logging.
|
||||
Can be used as context manager or decorator.
|
||||
|
||||
@mute_logger('openerp.plic.ploc')
|
||||
def do_stuff():
|
||||
blahblah()
|
||||
|
||||
with mute_logger('openerp.foo.bar'):
|
||||
do_suff()
|
||||
|
||||
"""
|
||||
def __init__(self, *loggers):
|
||||
self.loggers = loggers
|
||||
|
||||
def filter(self, record):
|
||||
return 0
|
||||
|
||||
def __enter__(self):
|
||||
for logger in self.loggers:
|
||||
logging.getLogger(logger).addFilter(self)
|
||||
|
||||
def __exit__(self, exc_type=None, exc_val=None, exc_tb=None):
|
||||
for logger in self.loggers:
|
||||
logging.getLogger(logger).removeFilter(self)
|
||||
|
||||
def __call__(self, func):
|
||||
@wraps(func)
|
||||
def deco(*args, **kwargs):
|
||||
with self:
|
||||
return func(*args, **kwargs)
|
||||
return deco
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -100,7 +100,7 @@ class RecordDictWrapper(dict):
|
||||
return dict.__getitem__(self, key)
|
||||
|
||||
class YamlInterpreter(object):
|
||||
def __init__(self, cr, module, id_map, mode, filename, report=None, noupdate=False):
|
||||
def __init__(self, cr, module, id_map, mode, filename, report=None, noupdate=False, loglevel=logging.DEBUG):
|
||||
self.cr = cr
|
||||
self.module = module
|
||||
self.id_map = id_map
|
||||
@@ -110,6 +110,7 @@ class YamlInterpreter(object):
|
||||
report = assertion_report.assertion_report()
|
||||
self.assertion_report = report
|
||||
self.noupdate = noupdate
|
||||
self.loglevel = loglevel
|
||||
self.pool = pooler.get_pool(cr.dbname)
|
||||
self.uid = 1
|
||||
self.context = {} # opererp context
|
||||
@@ -119,6 +120,9 @@ class YamlInterpreter(object):
|
||||
'datetime': datetime,
|
||||
'timedelta': timedelta}
|
||||
|
||||
def _log(self, *args, **kwargs):
|
||||
_logger.log(self.loglevel, *args, **kwargs)
|
||||
|
||||
def _ref(self):
|
||||
return lambda xml_id: self.get_id(xml_id)
|
||||
|
||||
@@ -484,12 +488,10 @@ class YamlInterpreter(object):
|
||||
self.noupdate = node.noupdate
|
||||
|
||||
def process_python(self, node):
|
||||
def log(msg, *args):
|
||||
_logger.log(logging.TEST, msg, *args)
|
||||
python, statements = node.items()[0]
|
||||
model = self.get_model(python.model)
|
||||
statements = statements.replace("\r\n", "\n")
|
||||
code_context = {'model': model, 'cr': self.cr, 'uid': self.uid, 'log': log, 'context': self.context}
|
||||
code_context = {'model': model, 'cr': self.cr, 'uid': self.uid, 'log': self._log, 'context': self.context}
|
||||
code_context.update({'self': model}) # remove me when no !python block test uses 'self' anymore
|
||||
try:
|
||||
code_obj = compile(statements, self.filename, 'exec')
|
||||
@@ -720,7 +722,7 @@ class YamlInterpreter(object):
|
||||
if len(ids):
|
||||
self.pool.get(node.model).unlink(self.cr, self.uid, ids)
|
||||
else:
|
||||
_logger.log(logging.TEST, "Record not deleted.")
|
||||
self._log("Record not deleted.")
|
||||
|
||||
def process_url(self, node):
|
||||
self.validate_xml_id(node.id)
|
||||
@@ -805,7 +807,7 @@ class YamlInterpreter(object):
|
||||
|
||||
is_preceded_by_comment = False
|
||||
for node in yaml.load(yaml_string):
|
||||
is_preceded_by_comment = self._log(node, is_preceded_by_comment)
|
||||
is_preceded_by_comment = self._log_node(node, is_preceded_by_comment)
|
||||
try:
|
||||
self._process_node(node)
|
||||
except YamlImportException, e:
|
||||
@@ -852,26 +854,27 @@ class YamlInterpreter(object):
|
||||
else:
|
||||
raise YamlImportException("Can not process YAML block: %s" % node)
|
||||
|
||||
def _log(self, node, is_preceded_by_comment):
|
||||
def _log_node(self, node, is_preceded_by_comment):
|
||||
if is_comment(node):
|
||||
is_preceded_by_comment = True
|
||||
_logger.log(logging.TEST, node)
|
||||
self._log(node)
|
||||
elif not is_preceded_by_comment:
|
||||
if isinstance(node, types.DictionaryType):
|
||||
msg = "Creating %s\n with %s"
|
||||
args = node.items()[0]
|
||||
_logger.log(logging.TEST, msg, *args)
|
||||
self._log(msg, *args)
|
||||
else:
|
||||
_logger.log(logging.TEST, node)
|
||||
self._log(node)
|
||||
else:
|
||||
is_preceded_by_comment = False
|
||||
return is_preceded_by_comment
|
||||
|
||||
def yaml_import(cr, module, yamlfile, idref=None, mode='init', noupdate=False, report=None):
|
||||
def yaml_import(cr, module, yamlfile, kind, idref=None, mode='init', noupdate=False, report=None):
|
||||
if idref is None:
|
||||
idref = {}
|
||||
loglevel = logging.TEST if kind == 'test' else logging.DEBUG
|
||||
yaml_string = yamlfile.read()
|
||||
yaml_interpreter = YamlInterpreter(cr, module, idref, mode, filename=yamlfile.name, report=report, noupdate=noupdate)
|
||||
yaml_interpreter = YamlInterpreter(cr, module, idref, mode, filename=yamlfile.name, report=report, noupdate=noupdate, loglevel=loglevel)
|
||||
yaml_interpreter.process(yaml_string)
|
||||
|
||||
# keeps convention of convert.py
|
||||
|
||||
Reference in New Issue
Block a user