From 72afd2823077fffc027ee6da692b8f8a89dfc794 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 11 Aug 2016 13:22:31 +0200 Subject: [PATCH] [FIX] remove or convert old-API calls --- addons/hr_timesheet/project_timesheet.py | 3 +- addons/web/controllers/main.py | 124 ++++++++---------- addons/web/models/ir_http.py | 2 +- addons/web_diagram/controllers/main.py | 25 ++-- addons/website_blog/controllers/main.py | 2 +- openerp/addons/base/tests/test_api.py | 58 +------- .../addons/base/tests/test_user_has_group.py | 11 +- openerp/addons/base/tests/test_views.py | 5 +- openerp/fields.py | 3 - openerp/http.py | 8 +- openerp/models.py | 26 +--- openerp/tests/common.py | 14 +- openerp/tools/convert.py | 5 +- openerp/tools/test_reports.py | 52 ++++---- openerp/tools/yaml_import.py | 5 +- openerp/workflow/workitem.py | 17 ++- 16 files changed, 132 insertions(+), 228 deletions(-) diff --git a/addons/hr_timesheet/project_timesheet.py b/addons/hr_timesheet/project_timesheet.py index 1e17eecc8e2..b3b50b32d51 100644 --- a/addons/hr_timesheet/project_timesheet.py +++ b/addons/hr_timesheet/project_timesheet.py @@ -2,7 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models, fields, api -from odoo.osv import osv class Project(models.Model): @@ -59,4 +58,4 @@ class Task(models.Model): subtask_project_id = fields.Many2one('project.project', related="project_id.subtask_project_id", string='Sub-task Project') subtask_count = fields.Integer(compute='_get_subtask_count', type='integer', string="Sub-task count") - _constraints = [(osv.osv._check_recursion, 'Circular references are not permitted between tasks and sub-tasks', ['parent_id'])] + _constraints = [(models.BaseModel._check_recursion, 'Circular references are not permitted between tasks and sub-tasks', ['parent_id'])] diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 3fcd074aeb0..5be3a1a3ef6 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -33,7 +33,8 @@ from odoo.tools import topological_sort from odoo.tools.translate import _ from odoo.tools.misc import str2bool, xlwt from odoo import http -from odoo.http import request, serialize_exception as _serialize_exception, content_disposition +from odoo.http import content_disposition, dispatch_rpc, request, \ + serialize_exception as _serialize_exception from odoo.exceptions import AccessError from odoo.models import check_method_name @@ -291,8 +292,7 @@ def set_cookie_and_redirect(redirect_url): return redirect def load_actions_from_ir_values(action_slot, model, res_id): - ir_values = request.session.model('ir.values') - actions = ir_values.get_actions(action_slot=action_slot, model=model, res_id=res_id, context=request.context) + actions = request.env['ir.values'].get_actions(action_slot, model, res_id) return [(id, name, clean_action(action)) for id, name, action in actions] def clean_action(action): @@ -632,7 +632,7 @@ class Database(http.Controller): try: # country code could be = "False" which is actually True in python country_code = post.get('country_code') or False - request.session.proxy("db").create_database(master_pwd, name, bool(post.get('demo')), lang, password, post.get('login'), country_code) + dispatch_rpc('db', 'create_database', [master_pwd, name, bool(post.get('demo')), lang, password, post.get('login'), country_code]) request.session.authenticate(name, 'admin', password) return http.local_redirect('/web/') except Exception, e: @@ -642,7 +642,7 @@ class Database(http.Controller): @http.route('/web/database/duplicate', type='http', auth="none", methods=['POST'], csrf=False) def duplicate(self, master_pwd, name, new_name): try: - request.session.proxy("db").duplicate_database(master_pwd, name, new_name) + dispatch_rpc('db', 'duplicate_database', [master_pwd, name, new_name]) return http.local_redirect('/web/database/manager') except Exception, e: error = "Database duplication error: %s" % e @@ -651,7 +651,7 @@ class Database(http.Controller): @http.route('/web/database/drop', type='http', auth="none", methods=['POST'], csrf=False) def drop(self, master_pwd, name): try: - request.session.proxy("db").drop(master_pwd, name) + dispatch_rpc('db','drop', [master_pwd, name]) return http.local_redirect('/web/database/manager') except Exception, e: error = "Database deletion error: %s" % e @@ -679,7 +679,7 @@ class Database(http.Controller): def restore(self, master_pwd, backup_file, name, copy=False): try: data = base64.b64encode(backup_file.read()) - request.session.proxy("db").restore(master_pwd, name, data, str2bool(copy)) + dispatch_rpc('db', 'restore', [master_pwd, name, data, str2bool(copy)]) return http.local_redirect('/web/database/manager') except Exception, e: error = "Database restore error: %s" % e @@ -688,7 +688,7 @@ class Database(http.Controller): @http.route('/web/database/change_password', type='http', auth="none", methods=['POST'], csrf=False) def change_password(self, master_pwd, master_pwd_new): try: - request.session.proxy("db").change_admin_password(master_pwd, master_pwd_new) + dispatch_rpc('db', 'change_admin_password', [master_pwd, master_pwd_new]) return http.local_redirect('/web/database/manager') except Exception, e: error = "Master password update error: %s" % e @@ -717,8 +717,7 @@ class Session(http.Controller): if new_password != confirm_password: return {'error': _('The new password and its confirmation must be identical.'),'title': _('Change Password')} try: - if request.session.model('res.users').change_password( - old_password, new_password): + if request.env['res.users'].change_password(old_password, new_password): return {'new_password':new_password} except Exception: return {'error': _('The old password you provided is incorrect, your password was not changed.'), 'title': _('Change Password')} @@ -727,7 +726,7 @@ class Session(http.Controller): @http.route('/web/session/get_lang_list', type='json', auth="none") def get_lang_list(self): try: - return request.session.proxy("db").list_lang() or [] + return dispatch_rpc('db', 'list_lang', []) or [] except Exception, e: return {"error": e, "title": _("Languages")} @@ -765,7 +764,7 @@ class Session(http.Controller): @http.route('/web/session/check', type='json', auth="user") def check(self): - request.session.assert_valid() + request.session.check_security() return None @http.route('/web/session/destroy', type='json', auth="user") @@ -786,13 +785,14 @@ class Menu(http.Controller): :return: needaction data :rtype: dict(menu_id: {'needaction_enabled': boolean, 'needaction_counter': int}) """ - return request.session.model('ir.ui.menu').get_needaction_data(menu_ids, request.context) + return request.env['ir.ui.menu'].browse(menu_ids).get_needaction_data() class DataSet(http.Controller): @http.route('/web/dataset/search_read', type='json', auth="user") def search_read(self, model, fields=False, offset=0, limit=False, domain=None, sort=None): return self.do_search_read(model, fields, offset, limit, domain, sort) + def do_search_read(self, model, fields=False, offset=0, limit=False, domain=None , sort=None): """ Performs a search() followed by a read() (if needed) using the @@ -810,17 +810,17 @@ class DataSet(http.Controller): matching fields selection set) :rtype: list """ - Model = request.session.model(model) + Model = request.env[model] - records = Model.search_read(domain, fields, offset or 0, limit or False, sort or False, - request.context) + records = Model.search_read(domain, fields, + offset=offset or 0, limit=limit or False, order=sort or False) if not records: return { 'length': 0, 'records': [] } if limit and len(records) == limit: - length = Model.search_count(domain, request.context) + length = Model.search_count(domain) else: length = len(records) + (offset or 0) return { @@ -830,9 +830,8 @@ class DataSet(http.Controller): @http.route('/web/dataset/load', type='json', auth="user") def load(self, model, id, fields): - m = request.session.model(model) value = {} - r = m.read([id], False, request.context) + r = request.env[model].browse([id]).read() if r: value = r[0] return {'value': value} @@ -861,7 +860,8 @@ class DataSet(http.Controller): @http.route('/web/dataset/exec_workflow', type='json', auth="user") def exec_workflow(self, model, id, signal): - return request.session.exec_workflow(model, id, signal) + request.session.check_security() + return request.env[model].browse(id).signal_workflow(signal)[id] @http.route('/web/dataset/resequence', type='json', auth="user") def resequence(self, model, ids, field='sequence', offset=0): @@ -878,24 +878,24 @@ class DataSet(http.Controller): starting the resequencing from an arbitrary number, defaults to ``0`` """ - m = request.session.model(model) + m = request.env[model] if not m.fields_get([field]): return False # python 2.6 has no start parameter - for i, id in enumerate(ids): - m.write(id, { field: i + offset }) + for i, record in enumerate(m.browse(ids)): + record.write({field: i + offset}) return True class View(http.Controller): @http.route('/web/view/add_custom', type='json', auth="user") def add_custom(self, view_id, arch): - CustomView = request.session.model('ir.ui.view.custom') + CustomView = request.env['ir.ui.view.custom'] CustomView.create({ 'user_id': request.session.uid, 'ref_id': view_id, 'arch': arch - }, request.context) + }) return {'result': True} class TreeView(View): @@ -1016,23 +1016,23 @@ class Binary(http.Controller): @http.route('/web/binary/upload_attachment', type='http', auth="user") @serialize_exception def upload_attachment(self, callback, model, id, ufile): - Model = request.session.model('ir.attachment') + Model = request.env['ir.attachment'] out = """""" try: - attachment_id = Model.create({ + attachment = Model.create({ 'name': ufile.filename, 'datas': base64.encodestring(ufile.read()), 'datas_fname': ufile.filename, 'res_model': model, 'res_id': int(id) - }, request.context) + }) args = { 'filename': ufile.filename, 'mimetype': ufile.content_type, - 'id': attachment_id + 'id': attachment.id } except Exception: args = {'error': _("Something horrible happened")} @@ -1088,19 +1088,19 @@ class Action(http.Controller): @http.route('/web/action/load', type='json', auth="user") def load(self, action_id, additional_context=None): - Actions = request.session.model('ir.actions.actions') + Actions = request.env['ir.actions.actions'] value = False try: action_id = int(action_id) except ValueError: try: - module, xmlid = action_id.split('.', 1) - model, action_id = request.session.model('ir.model.data').get_object_reference(module, xmlid) - assert model.startswith('ir.actions.') + action = request.env.ref(action_id) + assert action._name.startswith('ir.actions.') + action_id = action.id except Exception: action_id = 0 # force failed read - base_action = Actions.read([action_id], ['type'], context=request.context) + base_action = Actions.browse([action_id]).read(['type']) if base_action: ctx = request.context action_type = base_action[0]['type'] @@ -1108,19 +1108,16 @@ class Action(http.Controller): ctx.update({'bin_size': True}) if additional_context: ctx.update(additional_context) - action = request.session.model(action_type).read([action_id], False, context=ctx) + env = request.env(context=ctx) + action = env[action_type].browse([action_id]).read() if action: value = clean_action(action[0]) return value @http.route('/web/action/run', type='json', auth="user") def run(self, action_id): - return_action = request.session.model('ir.actions.server').run( - [action_id], request.context) - if return_action: - return clean_action(return_action) - else: - return False + result = request.env['ir.actions.server'].browse([action_id]).run() + return clean_action(result) if result else False class Export(http.Controller): @@ -1195,9 +1192,8 @@ class Export(http.Controller): @http.route('/web/export/namelist', type='json', auth="user") def namelist(self, model, export_id): # TODO: namelist really has no reason to be in Python (although itertools.groupby helps) - export = request.session.model("ir.exports").read([export_id])[0] - export_fields_list = request.session.model("ir.exports.line").read( - export['export_fields']) + export = request.env['ir.exports'].browse([export_id]).read()[0] + export_fields_list = request.env['ir.exports.line'].browse(export['export_fields']).read() fields_data = self.fields_info( model, map(operator.itemgetter('name'), export_fields_list)) @@ -1290,19 +1286,16 @@ class ExportFormat(object): def base(self, data, token): params = json.loads(data) model, fields, ids, domain, import_compat = \ - operator.itemgetter('model', 'fields', 'ids', 'domain', - 'import_compat')( - params) + operator.itemgetter('model', 'fields', 'ids', 'domain', 'import_compat')(params) - Model = request.session.model(model) - context = dict(request.context or {}, **params.get('context', {})) - ids = ids or Model.search(domain, offset=0, limit=False, order=False, context=context) + Model = request.env[model].with_context(**params.get('context', {})) + records = Model.browse(ids) or Model.search(domain, offset=0, limit=False, order=False) - if not request.env[model]._is_an_ordinary_table(): + if not Model._is_an_ordinary_table(): fields = [field for field in fields if field['name'] != 'id'] field_names = map(operator.itemgetter('name'), fields) - import_data = Model.export_data(ids, field_names, self.raw_data, context=context).get('datas',[]) + import_data = records.export_data(field_names, self.raw_data).get('datas',[]) if import_compat: columns_headers = field_names @@ -1420,7 +1413,6 @@ class Reports(http.Controller): def index(self, action, token): action = json.loads(action) - report_srv = request.session.proxy("report") context = dict(request.context) context.update(action["context"]) @@ -1433,15 +1425,14 @@ class Reports(http.Controller): report_ids = action['datas'].pop('ids') report_data.update(action['datas']) - report_id = report_srv.report( + report_id = dispatch_rpc('report', 'report', [ request.session.db, request.session.uid, request.session.password, - action["report_name"], report_ids, - report_data, context) + action["report_name"], report_ids, report_data, context]) report_struct = None while True: - report_struct = report_srv.report_get( - request.session.db, request.session.uid, request.session.password, report_id) + report_struct = dispatch_rpc('report', 'report_get', [ + request.session.db, request.session.uid, request.session.password, report_id]) if report_struct["state"]: break @@ -1454,11 +1445,10 @@ class Reports(http.Controller): report_struct['format'], 'octet-stream') file_name = action.get('name', 'report') if 'name' not in action: - reports = request.session.model('ir.actions.report.xml') - res_id = reports.search([('report_name', '=', action['report_name']),], - context=context) - if len(res_id) > 0: - file_name = reports.read(res_id[0], ['name'], context)['name'] + reports = request.env['ir.actions.report.xml'] + reports = reports.search([('report_name', '=', action['report_name'])]) + if reports: + file_name = reports[0].name else: file_name = action['report_name'] file_name = '%s.%s' % (file_name, report_struct['format']) @@ -1473,16 +1463,14 @@ class Reports(http.Controller): class Apps(http.Controller): @http.route('/apps/', auth='user') def get_app_url(self, req, app): - act_window_obj = request.session.model('ir.actions.act_window') - ir_model_data = request.session.model('ir.model.data') try: - action_id = ir_model_data.get_object_reference('base', 'open_module_tree')[1] - action = act_window_obj.read(action_id, ['name', 'type', 'res_model', 'view_mode', 'view_type', 'context', 'views', 'domain']) + record = request.env.ref('base.open_module_tree') + action = record.read(['name', 'type', 'res_model', 'view_mode', 'view_type', 'context', 'views', 'domain'])[0] action['target'] = 'current' except ValueError: action = False try: - app_id = ir_model_data.get_object_reference('base', 'module_%s' % app)[1] + app_id = request.env.ref('base.module_%s' % app).id except ValueError: app_id = False diff --git a/addons/web/models/ir_http.py b/addons/web/models/ir_http.py index aea99b06111..f11798cf123 100644 --- a/addons/web/models/ir_http.py +++ b/addons/web/models/ir_http.py @@ -14,7 +14,7 @@ class Http(models.AbstractModel): def webclient_rendering_context(self): return { - 'menu_data': request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, request.debug, context=request.context), + 'menu_data': request.env['ir.ui.menu'].load_menus(request.debug), 'session_info': json.dumps(self.session_info()), } diff --git a/addons/web_diagram/controllers/main.py b/addons/web_diagram/controllers/main.py index ebc3f4402e5..22761f6cd22 100644 --- a/addons/web_diagram/controllers/main.py +++ b/addons/web_diagram/controllers/main.py @@ -36,10 +36,9 @@ class DiagramView(http.Controller): shape_colour, shape_color_state = shape_spec.split(':') shapes[shape_colour] = shape_color_state - ir_view = req.session.model('ir.ui.view') - graphs = ir_view.graph_get( - int(id), model, node, connector, src_node, des_node, label, - (140, 180), req.session.context) + ir_view = http.request.env['ir.ui.view'] + graphs = ir_view.graph_get(int(id), model, node, connector, src_node, + des_node, label, (140, 180)) nodes = graphs['nodes'] transitions = graphs['transitions'] isolate_nodes = {} @@ -59,10 +58,9 @@ class DiagramView(http.Controller): 's_id': transitions[tr][0], 'd_id': transitions[tr][1] }) - connector_tr = req.session.model(connector) - connector_ids = connector_tr.search([('id', 'in', list_tr)], context=req.session.context) - data_connectors =connector_tr.read(connector_ids, connector_fields, req.session.context) + connector_model = http.request.env[connector] + data_connectors = connector_model.search([('id', 'in', list_tr)]).read(connector_fields) for tr in data_connectors: transition_id = str(tr['id']) @@ -78,12 +76,11 @@ class DiagramView(http.Controller): for i, fld in enumerate(connector_fields): t['options'][connector_fields_string[i]] = tr[fld] - fields = req.session.model('ir.model.fields') - field_ids = fields.search([('model', '=', model), ('relation', '=', node)], context=req.session.context) - field_data = fields.read(field_ids, ['relation_field'], req.session.context) - node_act = req.session.model(node) - search_acts = node_act.search([(field_data[0]['relation_field'], '=', id)], context=req.session.context) - data_acts = node_act.read(search_acts, invisible_node_fields + visible_node_fields, req.session.context) + fields = http.request.env['ir.model.fields'] + field = fields.search([('model', '=', model), ('relation', '=', node)]) + node_act = http.request.env[node] + search_acts = node_act.search([(field.relation_field, '=', id)]) + data_acts = search_acts.read(invisible_node_fields + visible_node_fields) for act in data_acts: n = nodes.get(str(act['id'])) @@ -109,7 +106,7 @@ class DiagramView(http.Controller): for i, fld in enumerate(visible_node_fields): n['options'][node_fields_string[i]] = act[fld] - _id, name = req.session.model(model).name_get([id], req.session.context)[0] + _id, name = http.request.env[model].browse([id]).name_get()[0] return dict(nodes=nodes, conn=connectors, name=name, diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py index ea3a3922ca8..417f74da2c4 100644 --- a/addons/website_blog/controllers/main.py +++ b/addons/website_blog/controllers/main.py @@ -206,7 +206,7 @@ class WebsiteBlog(http.Controller): tag = None if tag_id: - tag = request.registry['blog.tag'].browse(request.cr, request.uid, int(tag_id), context=request.context) + tag = request.env['blog.tag'].browse(int(tag_id)) blog_url = QueryURL('', ['blog', 'tag'], blog=blog_post.blog_id, tag=tag, date_begin=date_begin, date_end=date_end) if not blog_post.blog_id.id == blog.id: diff --git a/openerp/addons/base/tests/test_api.py b/openerp/addons/base/tests/test_api.py index 22a42cac389..99014af8ba6 100644 --- a/openerp/addons/base/tests/test_api.py +++ b/openerp/addons/base/tests/test_api.py @@ -26,11 +26,9 @@ class TestAPI(common.TransactionCase): def test_00_query(self): """ Build a recordset, and check its contents. """ domain = [('name', 'ilike', 'j')] - ids = self.registry('res.partner').search(self.cr, self.uid, domain) partners = self.env['res.partner'].search(domain) - # partners is a collection of browse records corresponding to ids - self.assertTrue(ids) + # partners is a collection of browse records self.assertTrue(partners) # partners and its contents are instance of the model @@ -38,9 +36,6 @@ class TestAPI(common.TransactionCase): for p in partners: self.assertIsRecord(p, 'res.partner') - self.assertEqual([p.id for p in partners], ids) - self.assertEqual(self.env['res.partner'].browse(ids), partners) - @mute_logger('openerp.models') def test_01_query_offset(self): """ Build a recordset with offset, and check equivalence. """ @@ -71,7 +66,8 @@ class TestAPI(common.TransactionCase): @mute_logger('openerp.models') def test_04_query_count(self): """ Test the search method with count=True. """ - count1 = self.registry('res.partner').search(self.cr, self.uid, [], count=True) + self.cr.execute("SELECT COUNT(*) FROM res_partner WHERE active") + count1 = self.cr.fetchone()[0] count2 = self.env['res.partner'].search([], count=True) self.assertIsInstance(count1, (int, long)) self.assertIsInstance(count2, (int, long)) @@ -137,54 +133,6 @@ class TestAPI(common.TransactionCase): self.assertFalse(partner.parent_id.user_id.groups_id) self.assertIsRecordset(partner.parent_id.user_id.groups_id, 'res.groups') - @mute_logger('openerp.models') - def test_10_old_old(self): - """ Call old-style methods in the old-fashioned way. """ - partners = self.env['res.partner'].search([('name', 'ilike', 'j')]) - self.assertTrue(partners) - ids = map(int, partners) - - # call method name_get on partners' model, and check its effect - res = partners._model.name_get(self.cr, self.uid, ids) - self.assertEqual(len(res), len(ids)) - self.assertEqual(set(val[0] for val in res), set(ids)) - - @mute_logger('openerp.models') - def test_20_old_new(self): - """ Call old-style methods in the new API style. """ - partners = self.env['res.partner'].search([('name', 'ilike', 'j')]) - self.assertTrue(partners) - - # call method name_get on partners itself, and check its effect - res = partners.name_get() - self.assertEqual(len(res), len(partners)) - self.assertEqual(set(val[0] for val in res), set(map(int, partners))) - - @mute_logger('openerp.models') - def test_25_old_new(self): - """ Call old-style methods on records (new API style). """ - partners = self.env['res.partner'].search([('name', 'ilike', 'j')]) - self.assertTrue(partners) - - # call method name_get on partner records, and check its effect - for p in partners: - res = p.name_get() - self.assertTrue(isinstance(res, list) and len(res) == 1) - self.assertTrue(isinstance(res[0], tuple) and len(res[0]) == 2) - self.assertEqual(res[0][0], p.id) - - @mute_logger('openerp.models') - def test_30_new_old(self): - """ Call new-style methods in the old-fashioned way. """ - partners = self.env['res.partner'].search([('name', 'ilike', 'j')]) - self.assertTrue(partners) - ids = map(int, partners) - - # call method write on partners' model, and check its effect - partners._model.write(self.cr, self.uid, ids, {'active': False}) - for p in partners: - self.assertFalse(p.active) - @mute_logger('openerp.models') def test_40_new_new(self): """ Call new-style methods in the new API style. """ diff --git a/openerp/addons/base/tests/test_user_has_group.py b/openerp/addons/base/tests/test_user_has_group.py index be326976d8d..9b8911d5348 100644 --- a/openerp/addons/base/tests/test_user_has_group.py +++ b/openerp/addons/base/tests/test_user_has_group.py @@ -29,19 +29,18 @@ class TestHasGroup(TransactionCase): 'groups_id': [(4, group0, 0)] }) - def test_old_api(self): - Users = self.registry['res.users'] - + def test_env_uid(self): + Users = self.env['res.users'].sudo(self.test_user) self.assertTrue( - Users.has_group(self.cr, self.test_user.id, self.group0), + Users.has_group(self.group0), "the test user should belong to group0" ) self.assertFalse( - Users.has_group(self.cr, self.test_user.id, self.group1), + Users.has_group(self.group1), "the test user should *not* belong to group1" ) - def test_new_api(self): + def test_record(self): self.assertTrue( self.test_user.has_group(self.group0), "the test user should belong to group0", diff --git a/openerp/addons/base/tests/test_views.py b/openerp/addons/base/tests/test_views.py index 1a3488d96c9..1ece193f26a 100644 --- a/openerp/addons/base/tests/test_views.py +++ b/openerp/addons/base/tests/test_views.py @@ -354,13 +354,10 @@ class TestApplyInheritanceSpecs(ViewCase): class TestApplyInheritanceWrapSpecs(ViewCase): def setUp(self): super(TestApplyInheritanceWrapSpecs, self).setUp() - self.View = self.registry('ir.ui.view') self.base_arch = E.template(E.div(E.p("Content"))) def apply_spec(self, spec): - self.View.apply_inheritance_specs(self.cr, self.uid, - self.base_arch, - spec, None) + self.View.apply_inheritance_specs(self.base_arch, spec, None) def test_replace(self): spec = E.xpath( diff --git a/openerp/fields.py b/openerp/fields.py index e14384bef12..0b9a481320e 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -1639,9 +1639,6 @@ class Selection(Field): } def __init__(self, selection=Default, string=Default, **kwargs): - if callable(selection): - from openerp import api - selection = api.expected(api.model, selection) super(Selection, self).__init__(selection=selection, string=string, **kwargs) @property diff --git a/openerp/http.py b/openerp/http.py index 45db589aa28..033e3469065 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -1161,7 +1161,7 @@ class OpenERPSession(werkzeug.contrib.sessions.Session): :returns: the new context """ assert self.uid, "The user needs to be logged-in to initialize his context" - self.context = request.registry.get('res.users').context_get(request.cr, request.uid) or {} + self.context = request.env['res.users'].context_get() or {} self.context['uid'] = self.uid self._fix_lang(self.context) return self.context @@ -1433,11 +1433,9 @@ class Response(werkzeug.wrappers.Response): def render(self): """ Renders the Response's template, returns the result """ - view_obj = request.registry["ir.ui.view"] - uid = self.uid or request.uid or openerp.SUPERUSER_ID + env = request.env(user=self.uid or request.uid or openerp.SUPERUSER_ID) self.qcontext['request'] = request - return view_obj.render_template(request.cr, uid, self.template, - self.qcontext, context=request.context) + return env["ir.ui.view"].render_template(self.template, self.qcontext) def flatten(self): """ Forces the rendering of the response's template, sets the result diff --git a/openerp/models.py b/openerp/models.py index 21258d77a98..ce2d7cdb1ab 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -44,7 +44,6 @@ import openerp from . import SUPERUSER_ID from . import api from . import tools -from .api import Environment from .exceptions import AccessError, MissingError, ValidationError, UserError from .osv.query import Query from .tools import frozendict, lazy_property, ormcache, Collector, LastOrderedSet, OrderedSet @@ -1086,14 +1085,12 @@ class BaseModel(object): # old-style constraint methods trans = self.env['ir.translation'] - cr, uid, context = self.env.args - ids = self.ids errors = [] - for fun, msg, names in self._constraints: + for func, msg, names in self._constraints: try: - # validation must be context-independent; call ``fun`` without context + # validation must be context-independent; call ``func`` without context valid = names and not (set(names) & field_names) - valid = valid or fun(self._model, cr, uid, ids) + valid = valid or func(self) extra_error = None except Exception, e: _logger.debug('Exception while validating constraint', exc_info=True) @@ -1101,7 +1098,7 @@ class BaseModel(object): extra_error = tools.ustr(e) if not valid: if callable(msg): - res_msg = msg(self._model, cr, uid, ids, context=context) + res_msg = msg(self) if isinstance(res_msg, tuple): template, params = res_msg res_msg = template % params @@ -4789,13 +4786,6 @@ class BaseModel(object): prefetch[cls._name].update(ids) return records - @api.v7 - def browse(self, cr, uid, arg=None, context=None): - ids = _normalize_ids(arg) - #assert all(isinstance(id, IdType) for id in ids), "Browsing invalid ids: %s" % ids - return self._browse(ids, Environment(cr, uid, context or {})) - - @api.v8 def browse(self, arg=None, prefetch=None): """ browse([ids]) -> records @@ -5411,12 +5401,8 @@ class BaseModel(object): field_vars = RawRecord(self) params = safe_eval("[%s]" % params, global_vars, field_vars, nocopy=True) - # call onchange method with context when possible - args = (self._cr, self._uid, self._origin.ids) + tuple(params) - try: - method_res = getattr(self._model, method)(*args, context=self._context) - except TypeError: - method_res = getattr(self._model, method)(*args) + # invoke onchange method + method_res = getattr(self._origin, method)(*params) process(method_res) @api.multi diff --git a/openerp/tests/common.py b/openerp/tests/common.py index 9be7ee3bcdd..54dddcff829 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -99,10 +99,7 @@ class BaseCase(unittest.TestCase): :raise: ValueError if not found :returns: registered id """ - assert "." in xid, "this method requires a fully qualified parameter, in the following form: 'module.identifier'" - module, xid = xid.split('.') - _, id = self.registry('ir.model.data').get_object_reference(self.cr, self.uid, module, xid) - return id + return self.browse_ref(xid).id def browse_ref(self, xid): """ Returns a record object for the provided @@ -114,8 +111,7 @@ class BaseCase(unittest.TestCase): :returns: :class:`~openerp.models.BaseModel` """ assert "." in xid, "this method requires a fully qualified parameter, in the following form: 'module.identifier'" - module, xid = xid.split('.') - return self.registry('ir.model.data').get_object(self.cr, self.uid, module, xid) + return self.env.ref(xid) @contextmanager def _assertRaises(self, exception): @@ -276,8 +272,8 @@ class HttpCase(TransactionCase): return db = get_db_name() - Users = self.registry['res.users'] - uid = Users.authenticate(db, user, password, None) + uid = self.registry['res.users'].authenticate(db, user, password, None) + env = api.Environment(self.cr, uid, {}) # self.session.authenticate(db, user, password, uid=uid) # OpenERPSession.authenticate accesses the current request, which we @@ -288,7 +284,7 @@ class HttpCase(TransactionCase): session.uid = uid session.login = user session.password = password - session.context = Users.context_get(self.cr, uid) or {} + session.context = env['res.users'].context_get() or {} session.context['uid'] = uid session._fix_lang(session.context) diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 0c2101fd191..6827ad68fcf 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -188,11 +188,10 @@ def _eval_xml(self, node, env): return_val = _eval_xml(self, n, env) if return_val is not None: args.append(return_val) - model = env[node.get('model', '')]._model + model = env[node.get('model', '')] method = node.get('name') # this one still depends on the old API - res = getattr(model, method)(env.cr, env.uid, *args) - return res + return openerp.api.call_kw(model, method, args, {}) elif node.tag == "test": return node.text diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index be864f1d27e..ab924b5b4d1 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -100,13 +100,10 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, if '.' in action_id: our_module = action_id.split('.', 1)[0] - if context is None: - context = {} - else: - context = context.copy() # keep it local + context = dict(context or {}) # TODO context fill-up - registry = openerp.registry(cr.dbname) + env = openerp.api.Environment(cr, uid, context) def log_test(msg, *args): _test_logger.info(" - " + msg, *args) @@ -122,30 +119,33 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, if isinstance(action_id, basestring): if '.' in action_id: - act_module, act_xmlid = action_id.split('.', 1) + _, act_xmlid = action_id.split('.', 1) else: if not our_module: raise ValueError('You cannot only specify action_id "%s" without a module name' % action_id) - act_module = our_module act_xmlid = action_id - act_model, act_id = registry['ir.model.data'].get_object_reference(cr, uid, act_module, act_xmlid) + action_id = '%s.%s' % (our_module, action_id) + action = env.ref(action_id) + act_model, act_id = action._name, action.id else: assert isinstance(action_id, (long, int)) act_model = 'ir.action.act_window' # assume that act_id = action_id act_xmlid = '<%s>' % act_id - def _exec_action(action, datas, context): + def _exec_action(action, datas, env): # taken from client/modules/action/main.py:84 _exec_action() if isinstance(action, bool) or 'type' not in action: return # Updating the context : Adding the context of action in order to use it on Views called from buttons + context = dict(env.context) if datas.get('id',False): context.update( {'active_id': datas.get('id',False), 'active_ids': datas.get('ids',[]), 'active_model': datas.get('model',False)}) context1 = action.get('context', {}) if isinstance(context1, basestring): - context1 = safe_eval(context1, context.copy()) + context1 = safe_eval(context1, dict(context)) context.update(context1) + env = env(context=context) if action['type'] in ['ir.actions.act_window', 'ir.actions.submenu']: for key in ('res_id', 'res_model', 'view_type', 'view_mode', 'limit', 'search_view', 'auto_search', 'search_view_id'): @@ -167,11 +167,11 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, log_test("will emulate a %s view: %s#%s", action['view_type'], datas['res_model'], view_id or '?') - view_res = registry[datas['res_model']].fields_view_get(cr, uid, view_id, action['view_type'], context) + view_res = env[datas['res_model']].fields_view_get(view_id, action['view_type']) assert view_res and view_res.get('arch'), "Did not return any arch for the view" view_data = {} - if view_res.get('fields',{}).keys(): - view_data = registry[datas['res_model']].default_get(cr, uid, view_res['fields'].keys(), context) + if view_res.get('fields'): + view_data = env[datas['res_model']].default_get(list(view_res['fields'])) if datas.get('form'): view_data.update(datas.get('form')) if wiz_data: @@ -212,11 +212,12 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, button_weight += 10 string = button.getAttribute('string') or '?%s' % len(buttons) - buttons.append( { 'name': button.getAttribute('name'), - 'string': string, - 'type': button.getAttribute('type'), - 'weight': button_weight, - }) + buttons.append({ + 'name': button.getAttribute('name'), + 'string': string, + 'type': button.getAttribute('type'), + 'weight': button_weight, + }) except Exception, e: _logger.warning("Cannot resolve the view arch and locate the buttons!", exc_info=True) raise AssertionError(e.args[0]) @@ -224,7 +225,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, if not datas['res_id']: # it is probably an orm_memory object, we need to create # an instance - datas['res_id'] = registry[datas['res_model']].create(cr, uid, view_data, context) + datas['res_id'] = env[datas['res_model']].create(view_data).id if not buttons: raise AssertionError("view form doesn't have any buttons to press!") @@ -241,11 +242,12 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, continue if b['type'] == 'object': #there we are! press the button! - fn = getattr(registry[datas['res_model']], b['name']) - if not fn: + rec = env[datas['res_model']].browse(datas['res_id']) + func = getattr(rec, b['name'], None) + if not func: _logger.error("The %s model doesn't have a %s attribute!", datas['res_model'], b['name']) continue - res = fn(cr, uid, [datas['res_id'],], context) + res = func() break else: _logger.warning("in the \"%s\" form, the \"%s\" button has unknown type %s", @@ -269,8 +271,8 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, raise Exception("Cannot handle action of type %s" % act_model) log_test("will be using %s action %s #%d", act_model, act_xmlid, act_id) - action = registry[act_model].read(cr, uid, [act_id], context=context)[0] - assert action, "Could not read action %s[%s]" %(act_model, act_id) + action = env[act_model].browse(act_id).read()[0] + assert action, "Could not read action %s[%s]" % (act_model, act_id) loop = 0 while action: loop += 1 @@ -279,7 +281,7 @@ def try_report_action(cr, uid, action_id, active_model=None, active_ids=None, _logger.info("Passed %d loops, giving up", loop) raise Exception("Too many loops at action") log_test("it is an %s action at loop #%d", action.get('type', 'unknown'), loop) - result = _exec_action(action, datas, context) + result = _exec_action(action, datas, env) if not isinstance(result, dict): break datas = result.get('datas', {}) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 8f96c881934..3c6480e400c 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -678,14 +678,13 @@ class YamlInterpreter(object): function, params = node.items()[0] if self.isnoupdate(function) and self.mode != 'init': return - model = self.env[function.model]._model + model = self.env[function.model] if function.eval: args = self.process_eval(function.eval) else: args = self._eval_params(function.model, params) - method = function.name # this one still depends on the old API - getattr(model, method)(self.cr, self.uid, *args) + return openerp.api.call_kw(model, function.name, args, {}) def _set_group_values(self, node, values): if node.groups: diff --git a/openerp/workflow/workitem.py b/openerp/workflow/workitem.py index a2f20195f9b..8affdd7a8a1 100644 --- a/openerp/workflow/workitem.py +++ b/openerp/workflow/workitem.py @@ -32,10 +32,10 @@ class Environment(dict): self.model = record.model self.id = record.id self.ids = [record.id] - self.obj = openerp.registry(self.cr.dbname)[self.model] def __getitem__(self, key): - records = self.obj.browse(self.cr, self.uid, self.ids) + env = openerp.api.Environment(self.cr, self.uid, {}) + records = env[self.model].browse(self.ids) if hasattr(records, key): return getattr(records, key) else: @@ -282,10 +282,9 @@ class WorkflowItem(object): 'active_id': self.record.id, 'active_ids': [self.record.id] } - - ir_actions_server = openerp.registry(self.session.cr.dbname)['ir.actions.server'] - result = ir_actions_server.run(self.session.cr, self.session.uid, [activity['action_id']], context) - + env = openerp.api.Environment(self.session.cr, self.session.uid, context) + action = env['ir.actions.server'].browse(activity['action_id']) + result = action.run() return result def wkf_expr_execute(self, activity): @@ -307,9 +306,9 @@ class WorkflowItem(object): return False if self.session.uid != openerp.SUPERUSER_ID and transition['group_id']: - registry = openerp.registry(self.session.cr.dbname) - user_groups = registry['res.users'].read(self.session.cr, self.session.uid, [self.session.uid], ['groups_id'])[0]['groups_id'] - if transition['group_id'] not in user_groups: + env = openerp.api.Environment(self.session.cr, self.session.uid, {}) + user_groups = env.user.groups_id + if transition['group_id'] not in user_groups.ids: return False return self.wkf_expr_eval_expr(transition['condition'])