From b5228c7752b8942210164a5be16f7f48cd7a8b12 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Sun, 16 Apr 2017 22:52:10 +0200 Subject: [PATCH] [ADD] explicit tests for UnquoteRecordset --- website_mail_qweb/controllers/main.py | 55 ++++++++++--------- .../tests/test_website_mail_qweb.py | 16 ++++++ 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/website_mail_qweb/controllers/main.py b/website_mail_qweb/controllers/main.py index b35562de..425f9d25 100644 --- a/website_mail_qweb/controllers/main.py +++ b/website_mail_qweb/controllers/main.py @@ -4,34 +4,35 @@ from openerp.addons.website_mail.controllers.email_designer import\ WebsiteEmailDesigner from openerp import http +from openerp.http import request -class UnquoteObject(str): - def __getattr__(self, name): - return UnquoteObject('%s.%s' % (self, name)) +class UnquoteRecordset(object): + def __init__(self, recordset, name): + self.__recordset = recordset + self.__name = name - def __repr__(self): - return self + def __getitem__(self, key): + if isinstance(key, basestring) and key in self.__recordset._fields: + return self.__recordset[key] + return UnquoteRecordset( + self.__recordset[key], '%s[%s]' % (self.__name, key) + ) - def __call__(self, *args, **kwargs): - return UnquoteObject( - '%s(%s)' % ( - self, - ','.join( - [ - UnquoteObject( - a if not isinstance(a, basestring) - else "'%s'" % a - ) - for a in args - ] + - [ - '%s=%s' % (UnquoteObject(k), v) - for (k, v) in kwargs.iteritems() - ] + def __getattr__(self, name): + recordset = self.__recordset + if name in recordset._fields: + if recordset._fields[name].relational: + return UnquoteRecordset( + recordset[name], '%s.%s' % (self.__name, name) ) - ) - ) + elif recordset._fields[name].type in ('char', 'text'): + return '%s.%s' % (self.__name, name) + elif recordset._fields[name].type in ('integer', 'float'): + return 42 + else: + return recordset[name] + return getattr(recordset, name) class Main(WebsiteEmailDesigner): @@ -40,11 +41,15 @@ class Main(WebsiteEmailDesigner): result = super(Main, self).index( model, res_id, template_model=template_model, **kw ) + env = request.env qcontext = result.qcontext - record = qcontext['record'] + record = qcontext.get('record', env['email.template'].new()) if record.body_type == 'qweb': qcontext['body_field'] = 'body_view_id' qcontext['mode'] = 'email_designer' - qcontext['object'] = UnquoteObject('object') + qcontext['object'] = UnquoteRecordset( + env[record.model_id.model].new(), + 'object', + ) qcontext['email_template'] = record return result diff --git a/website_mail_qweb/tests/test_website_mail_qweb.py b/website_mail_qweb/tests/test_website_mail_qweb.py index aa9d7f5d..bdb55f5e 100644 --- a/website_mail_qweb/tests/test_website_mail_qweb.py +++ b/website_mail_qweb/tests/test_website_mail_qweb.py @@ -2,6 +2,7 @@ # © 2017 Therp BV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp.tests.common import HttpCase +from ..controllers.main import UnquoteRecordset class TestWebsiteMailQweb(HttpCase): @@ -12,3 +13,18 @@ class TestWebsiteMailQweb(HttpCase): self.env.ref('email_template_qweb.email_template_demo1').id ) self.assertIn('Dear object.name,', result.read()) + + def test_unquote_recordset(self): + record = UnquoteRecordset(self.env['res.partner'].new(), 'object') + self.assertEqual(record.name, 'object.name') + self.assertEqual(record.parent_id.name, 'object.parent_id.name') + self.assertEqual(record.id, 42) + self.assertEqual( + record.create_date, + self.env['res.partner']._fields['create_date'].null(self.env) + ) + self.assertEqual( + record[:1]['create_date'], + self.env['res.partner']._fields['create_date'].null(self.env) + ) + self.assertEqual(record._fields, self.env['res.partner']._fields)