From 2f4330bbb32ec294843158fb16f50ff08e55314c Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Thu, 14 Jul 2011 14:57:37 +0530 Subject: [PATCH 01/30] [ADD] Base: add res.currency.rate.type object and its m2o on res.currency.rate bzr revid: mra@mra-laptop-20110714092737-9jlk0xjc3hkb4rog --- openerp/addons/base/res/res_currency.py | 11 +++++++++++ openerp/addons/base/res/res_currency_view.xml | 1 + 2 files changed, 12 insertions(+) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index d81248a735d..fa718ddffbc 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -133,6 +133,15 @@ class res_currency(osv.osv): res_currency() +class res_currency_rate_type(osv.osv): + _name = "res.currency.rate.type" + _description = "Currency Rate Type" + _columns = { + 'name': fields.char('Name', size=32, required=True), + } + +res_currency_rate_type() + class res_currency_rate(osv.osv): _name = "res.currency.rate" _description = "Currency Rate" @@ -141,11 +150,13 @@ class res_currency_rate(osv.osv): 'rate': fields.float('Rate', digits=(12,6), required=True, help='The rate of the currency to the currency of rate 1'), 'currency_id': fields.many2one('res.currency', 'Currency', readonly=True), + 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type'), } _defaults = { 'name': lambda *a: time.strftime('%Y-%m-%d'), } _order = "name desc" + res_currency_rate() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml index 37a8693e5b3..346da2488c9 100644 --- a/openerp/addons/base/res/res_currency_view.xml +++ b/openerp/addons/base/res/res_currency_view.xml @@ -48,6 +48,7 @@
+ From 72db8f87cbacb53b7f098531aa0b9607516ed353 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Thu, 14 Jul 2011 16:15:17 +0530 Subject: [PATCH 02/30] [IMP] Base: add argument on compute method bzr revid: mra@mra-laptop-20110714104517-11w0ptxmob5s481n --- openerp/addons/base/res/res_currency.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index fa718ddffbc..957c0fb625f 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -43,6 +43,7 @@ class res_currency(osv.osv): res[id] = rate else: res[id] = 0 + return res _name = "res.currency" _description = "Currency" @@ -68,7 +69,7 @@ class res_currency(osv.osv): _order = "name" def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'): - res=super(osv.osv, self).read(cr, user, ids, fields, context, load) + res = super(osv.osv, self).read(cr, user, ids, fields, context, load) for r in res: if r.__contains__('rate_ids'): rates=r['rate_ids'] @@ -76,6 +77,7 @@ class res_currency(osv.osv): currency_rate_obj= self.pool.get('res.currency.rate') currency_date = currency_rate_obj.read(cr,user,rates[0],['name'])['name'] r['date'] = currency_date + return res def name_get(self, cr, uid, ids, context=None): @@ -109,13 +111,17 @@ class res_currency(osv.osv): raise osv.except_osv(_('Error'), _('No rate found \n' \ 'for the currency: %s \n' \ 'at the date: %s') % (currency_symbol, date)) + return to_currency.rate/from_currency.rate - def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, context=None): + def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, rate_type=False, context=None): if not from_currency_id: from_currency_id = to_currency_id if not to_currency_id: to_currency_id = from_currency_id + + if rate_type: + context.update({'currency_rate_type_id': rate_type}) xc = self.browse(cr, uid, [from_currency_id,to_currency_id], context=context) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] to_currency = (xc[0].id == to_currency_id and xc[0]) or xc[1] From 5c7075cac6ae44b6daf2bb55793f10aa855c0a44 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 12 Jul 2011 17:06:01 +0530 Subject: [PATCH 03/30] [IMP] base: Added a condition to check currency rate type. bzr revid: uco@tinyerp.com-20110712113601-slvo0c3590a7dkxf --- openerp/addons/base/res/res_currency.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 957c0fb625f..46b4dd45207 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -36,8 +36,12 @@ class res_currency(osv.osv): else: date = time.strftime('%Y-%m-%d') date = date or time.strftime('%Y-%m-%d') + currency_rate_type_id = context.get('currency_rate_type_id', 0) for id in ids: - cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s ORDER BY name desc LIMIT 1" ,(id, date)) + cr.execute("SELECT currency_id, rate FROM res_currency_rate "\ + "WHERE currency_id = %s AND name <= %s AND currency_rate_type_id = %s "\ + "ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type_id)) + if cr.rowcount: id, rate = cr.fetchall()[0] res[id] = rate From b9cc3d22b6c9cd4f79c05aa4a91c054494392467 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 12 Jul 2011 18:12:53 +0530 Subject: [PATCH 04/30] [IMP] base: Improved currency rate function to avoid sql query. bzr revid: uco@tinyerp.com-20110712124253-vy1g8lq40jsdmyi8 --- openerp/addons/base/res/res_currency.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 46b4dd45207..9d6b183bba8 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -28,6 +28,7 @@ from tools.translate import _ class res_currency(osv.osv): def _current_rate(self, cr, uid, ids, name, arg, context=None): + currency_rate_obj = self.pool.get('res.currency.rate') if context is None: context = {} res = {} @@ -36,15 +37,16 @@ class res_currency(osv.osv): else: date = time.strftime('%Y-%m-%d') date = date or time.strftime('%Y-%m-%d') - currency_rate_type_id = context.get('currency_rate_type_id', 0) + domain = [('currency_id','in',ids), ('name','<=',date)] + currency_rate_type_id = context.get('currency_rate_type_id', False) + if currency_rate_type_id: + domain.append(('currency_rate_type_id','=',currency_rate_type_id)) + curr_rate_ids = currency_rate_obj.search(cr, uid, domain, context=context) for id in ids: - cr.execute("SELECT currency_id, rate FROM res_currency_rate "\ - "WHERE currency_id = %s AND name <= %s AND currency_rate_type_id = %s "\ - "ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type_id)) - - if cr.rowcount: - id, rate = cr.fetchall()[0] - res[id] = rate + if curr_rate_ids: + for cur in currency_rate_obj.browse(cr, uid, curr_rate_ids, context=context): + if cur.currency_id.id == id: + res[id] = cur.rate else: res[id] = 0 From a6b7507ae5b4e4385ca2d34305be3293e29b1659 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Wed, 13 Jul 2011 11:05:03 +0530 Subject: [PATCH 05/30] [IMP] base: Improved _currency_rate function. bzr revid: uco@tinyerp.com-20110713053503-rejienqc30ocr78g --- openerp/addons/base/res/res_currency.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 9d6b183bba8..e4b5c73bd02 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -41,14 +41,14 @@ class res_currency(osv.osv): currency_rate_type_id = context.get('currency_rate_type_id', False) if currency_rate_type_id: domain.append(('currency_rate_type_id','=',currency_rate_type_id)) - curr_rate_ids = currency_rate_obj.search(cr, uid, domain, context=context) + curr_rate_ids = currency_rate_obj.search(cr, uid, domain, order='name desc', context=context) + curr_rates = currency_rate_obj.browse(cr, uid, curr_rate_ids, context=context) for id in ids: - if curr_rate_ids: - for cur in currency_rate_obj.browse(cr, uid, curr_rate_ids, context=context): - if cur.currency_id.id == id: - res[id] = cur.rate - else: - res[id] = 0 + res[id] = 0 + for cur in curr_rates: + if cur.currency_id.id == id: + res[id] = cur.rate + break return res _name = "res.currency" From 33947346e4393d7861c792e08452ec74e3da20e4 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Fri, 15 Jul 2011 11:25:41 +0530 Subject: [PATCH 06/30] [IMP] Base: Currency improve code bzr revid: mra@mra-laptop-20110715055541-il3hhp42b9jiojo4 --- openerp/addons/base/res/res_currency.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index e4b5c73bd02..30d93921bd3 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -29,18 +29,17 @@ from tools.translate import _ class res_currency(osv.osv): def _current_rate(self, cr, uid, ids, name, arg, context=None): currency_rate_obj = self.pool.get('res.currency.rate') + res = {} if context is None: context = {} - res = {} if 'date' in context: date = context['date'] else: date = time.strftime('%Y-%m-%d') - date = date or time.strftime('%Y-%m-%d') - domain = [('currency_id','in',ids), ('name','<=',date)] + domain = [('currency_id', 'in', ids), ('name', '<=', date)] currency_rate_type_id = context.get('currency_rate_type_id', False) if currency_rate_type_id: - domain.append(('currency_rate_type_id','=',currency_rate_type_id)) + domain.append(('currency_rate_type_id', '=', currency_rate_type_id)) curr_rate_ids = currency_rate_obj.search(cr, uid, domain, order='name desc', context=context) curr_rates = currency_rate_obj.browse(cr, uid, curr_rate_ids, context=context) for id in ids: @@ -49,8 +48,8 @@ class res_currency(osv.osv): if cur.currency_id.id == id: res[id] = cur.rate break - return res + _name = "res.currency" _description = "Currency" _columns = { @@ -75,15 +74,14 @@ class res_currency(osv.osv): _order = "name" def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'): + currency_rate_obj= self.pool.get('res.currency.rate') res = super(osv.osv, self).read(cr, user, ids, fields, context, load) for r in res: if r.__contains__('rate_ids'): rates=r['rate_ids'] if rates: - currency_rate_obj= self.pool.get('res.currency.rate') - currency_date = currency_rate_obj.read(cr,user,rates[0],['name'])['name'] + currency_date = currency_rate_obj.read(cr, user, rates[0], ['name'])['name'] r['date'] = currency_date - return res def name_get(self, cr, uid, ids, context=None): From efe44324d194c7e58b324ae8d9f18c533897d0bf Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Fri, 15 Jul 2011 11:58:37 +0530 Subject: [PATCH 07/30] [ADD] base: Added view and menu item for currency rate type object. bzr revid: uco@tinyerp.com-20110715062837-bw70on2op2b0pv1z --- openerp/addons/base/res/res_currency_view.xml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml index 346da2488c9..63a55c0fddf 100644 --- a/openerp/addons/base/res/res_currency_view.xml +++ b/openerp/addons/base/res/res_currency_view.xml @@ -67,5 +67,28 @@ + + + res.currency.rate.type.form + res.currency.rate.type + form + +
+ + +
+
+ + + Currency Rate Type + res.currency.rate.type + form + tree,form + + + + From 416b2693ac0185d0d706c805319a3a3bcc3104d3 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Fri, 19 Aug 2011 16:37:19 +0530 Subject: [PATCH 08/30] [IMP] base: Improved arguments in compute method to avoid error of No rate found. bzr revid: uco@tinyerp.com-20110819110719-r82nsaui8a2kk58i --- openerp/addons/base/res/res_currency.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 30d93921bd3..5e69daddb13 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -118,17 +118,17 @@ class res_currency(osv.osv): return to_currency.rate/from_currency.rate - def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, rate_type=False, context=None): + def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, + round=True, currency_rate_type_from=False, currency_rate_type_to=False, context=None): if not from_currency_id: from_currency_id = to_currency_id if not to_currency_id: to_currency_id = from_currency_id - if rate_type: - context.update({'currency_rate_type_id': rate_type}) - xc = self.browse(cr, uid, [from_currency_id,to_currency_id], context=context) + xc = self.browse(cr, uid, [from_currency_id], context={'currency_rate_type_id': currency_rate_type_from}) + xc1 = self.browse(cr, uid, [to_currency_id], context={'currency_rate_type_id': currency_rate_type_to}) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] - to_currency = (xc[0].id == to_currency_id and xc[0]) or xc[1] + to_currency = (xc1[0].id == to_currency_id and xc1[0]) or xc1[1] if to_currency_id == from_currency_id: if round: return self.round(cr, uid, to_currency, from_amount) From bd5cb5e54af9a311753037b96f032503a35e65bc Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 23 Aug 2011 17:31:16 +0530 Subject: [PATCH 09/30] [IMP] base: Improved code to update the context. bzr revid: uco@tinyerp.com-20110823120116-6mrgalyg77jthxnt --- openerp/addons/base/res/res_currency.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 5e69daddb13..8a8067c6ff4 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -125,8 +125,14 @@ class res_currency(osv.osv): if not to_currency_id: to_currency_id = from_currency_id - xc = self.browse(cr, uid, [from_currency_id], context={'currency_rate_type_id': currency_rate_type_from}) - xc1 = self.browse(cr, uid, [to_currency_id], context={'currency_rate_type_id': currency_rate_type_to}) + context.update({'currency_rate_type_id': False}) + if currency_rate_type_from: + context.update({'currency_rate_type_id': currency_rate_type_from}) + if currency_rate_type_to: + context.update({'currency_rate_type_id': currency_rate_type_to}) + + xc = self.browse(cr, uid, [from_currency_id], context=context) + xc1 = self.browse(cr, uid, [to_currency_id], context=context) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] to_currency = (xc1[0].id == to_currency_id and xc1[0]) or xc1[1] if to_currency_id == from_currency_id: From 108db379d07eef72ba427428c83c8b799c2cc458 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Wed, 24 Aug 2011 11:14:16 +0530 Subject: [PATCH 10/30] [REF] base: Changed code to avoid overriding of context values. bzr revid: uco@tinyerp.com-20110824054416-ngrtkk5oh1v9jgb3 --- openerp/addons/base/res/res_currency.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 8a8067c6ff4..13bb14d0578 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -125,13 +125,9 @@ class res_currency(osv.osv): if not to_currency_id: to_currency_id = from_currency_id - context.update({'currency_rate_type_id': False}) - if currency_rate_type_from: - context.update({'currency_rate_type_id': currency_rate_type_from}) - if currency_rate_type_to: - context.update({'currency_rate_type_id': currency_rate_type_to}) - + context.update({'currency_rate_type_id': currency_rate_type_from}) xc = self.browse(cr, uid, [from_currency_id], context=context) + context.update({'currency_rate_type_id': currency_rate_type_to}) xc1 = self.browse(cr, uid, [to_currency_id], context=context) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] to_currency = (xc1[0].id == to_currency_id and xc1[0]) or xc1[1] From 2ef83855446422320dea2bc3f9739647db523bfe Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Wed, 24 Aug 2011 14:40:22 +0530 Subject: [PATCH 11/30] [FIX] base: Fixed currency rate argument problem in context. bzr revid: uco@tinyerp.com-20110824091022-0n1iwkefv2h4nh74 --- openerp/addons/base/res/res_currency.py | 32 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 13bb14d0578..495a931f91d 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -103,41 +103,51 @@ class res_currency(osv.osv): def is_zero(self, cr, uid, currency, amount): return abs(self.round(cr, uid, currency, amount)) < currency.rounding - def _get_conversion_rate(self, cr, uid, from_currency, to_currency, context=None): + def _get_conversion_rate(self, cr, uid, from_currency_rate, to_currency_rate, context=None): if context is None: context = {} - if from_currency['rate'] == 0 or to_currency['rate'] == 0: + if from_currency_rate == 0 or to_currency_rate == 0: date = context.get('date', time.strftime('%Y-%m-%d')) - if from_currency['rate'] == 0: - currency_symbol = from_currency.symbol + if from_currency_rate == 0: + currency_symbol = context.get('from_curr_symbol') else: - currency_symbol = to_currency.symbol + currency_symbol = context.get('to_curr_symbol') raise osv.except_osv(_('Error'), _('No rate found \n' \ 'for the currency: %s \n' \ 'at the date: %s') % (currency_symbol, date)) - return to_currency.rate/from_currency.rate + return to_currency_rate/from_currency_rate def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, currency_rate_type_from=False, currency_rate_type_to=False, context=None): + if not context: + context = {} if not from_currency_id: from_currency_id = to_currency_id if not to_currency_id: to_currency_id = from_currency_id - context.update({'currency_rate_type_id': currency_rate_type_from}) - xc = self.browse(cr, uid, [from_currency_id], context=context) - context.update({'currency_rate_type_id': currency_rate_type_to}) - xc1 = self.browse(cr, uid, [to_currency_id], context=context) + ctx1 = context.copy() + ctx1.update({'currency_rate_type_id': currency_rate_type_from}) + xc = self.browse(cr, uid, [from_currency_id], context=ctx1) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] + from_currency_rate = from_currency['rate'] + context.update({'from_curr_symbol': from_currency.symbol}) + + ctx2 = context.copy() + ctx2.update({'currency_rate_type_id': currency_rate_type_to}) + xc1 = self.browse(cr, uid, [to_currency_id], context=ctx2) to_currency = (xc1[0].id == to_currency_id and xc1[0]) or xc1[1] + to_currency_rate = to_currency['rate'] + context.update({'to_curr_symbol': to_currency.symbol}) + if to_currency_id == from_currency_id: if round: return self.round(cr, uid, to_currency, from_amount) else: return from_amount else: - rate = self._get_conversion_rate(cr, uid, from_currency, to_currency, context=context) + rate = self._get_conversion_rate(cr, uid, from_currency_rate, to_currency_rate, context=context) if round: return self.round(cr, uid, to_currency, from_amount * rate) else: From 5b17d2ccb7638543f02ac4d018a984441c7f2ce2 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Thu, 25 Aug 2011 17:26:45 +0530 Subject: [PATCH 12/30] [FIX] base: Fixed problem of browse method in _get_conversion_rate method. bzr revid: uco@tinyerp.com-20110825115645-85ya32yjnpirbuga --- openerp/addons/base/res/res_currency.py | 34 ++++++++++++------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 495a931f91d..f8bd4f21893 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -103,15 +103,24 @@ class res_currency(osv.osv): def is_zero(self, cr, uid, currency, amount): return abs(self.round(cr, uid, currency, amount)) < currency.rounding - def _get_conversion_rate(self, cr, uid, from_currency_rate, to_currency_rate, context=None): + def _get_conversion_rate(self, cr, uid, from_currency, to_currency, context=None): if context is None: context = {} + ctx = context.copy() + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from')}) + from_currency = self.browse(cr, uid, [from_currency.id], context=ctx)[0] + from_currency_rate = from_currency['rate'] + + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to')}) + to_currency = self.browse(cr, uid, [to_currency.id], context=ctx)[0] + to_currency_rate = to_currency['rate'] + if from_currency_rate == 0 or to_currency_rate == 0: date = context.get('date', time.strftime('%Y-%m-%d')) if from_currency_rate == 0: - currency_symbol = context.get('from_curr_symbol') + currency_symbol = from_currency.symbol else: - currency_symbol = context.get('to_curr_symbol') + currency_symbol = to_currency.symbol raise osv.except_osv(_('Error'), _('No rate found \n' \ 'for the currency: %s \n' \ 'at the date: %s') % (currency_symbol, date)) @@ -126,28 +135,17 @@ class res_currency(osv.osv): from_currency_id = to_currency_id if not to_currency_id: to_currency_id = from_currency_id - - ctx1 = context.copy() - ctx1.update({'currency_rate_type_id': currency_rate_type_from}) - xc = self.browse(cr, uid, [from_currency_id], context=ctx1) + xc = self.browse(cr, uid, [from_currency_id,to_currency_id], context=context) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] - from_currency_rate = from_currency['rate'] - context.update({'from_curr_symbol': from_currency.symbol}) - - ctx2 = context.copy() - ctx2.update({'currency_rate_type_id': currency_rate_type_to}) - xc1 = self.browse(cr, uid, [to_currency_id], context=ctx2) - to_currency = (xc1[0].id == to_currency_id and xc1[0]) or xc1[1] - to_currency_rate = to_currency['rate'] - context.update({'to_curr_symbol': to_currency.symbol}) - + to_currency = (xc[0].id == to_currency_id and xc[0]) or xc[1] if to_currency_id == from_currency_id: if round: return self.round(cr, uid, to_currency, from_amount) else: return from_amount else: - rate = self._get_conversion_rate(cr, uid, from_currency_rate, to_currency_rate, context=context) + context.update({'currency_rate_type_from': currency_rate_type_from, 'currency_rate_type_to': currency_rate_type_to}) + rate = self._get_conversion_rate(cr, uid, from_currency, to_currency, context=context) if round: return self.round(cr, uid, to_currency, from_amount * rate) else: From e117018b7b0d7896ad886c871589a7defb45dec5 Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Thu, 25 Aug 2011 22:36:57 +0530 Subject: [PATCH 13/30] [REF] Base: small improvement bzr revid: mra@tinyerp.com-20110825170657-tgajqc4yknz9f83b --- openerp/addons/base/res/res_currency.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index f8bd4f21893..8182a207c5c 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -107,11 +107,11 @@ class res_currency(osv.osv): if context is None: context = {} ctx = context.copy() - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from')}) + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from', False)}) from_currency = self.browse(cr, uid, [from_currency.id], context=ctx)[0] from_currency_rate = from_currency['rate'] - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to')}) + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to', False)}) to_currency = self.browse(cr, uid, [to_currency.id], context=ctx)[0] to_currency_rate = to_currency['rate'] @@ -124,7 +124,6 @@ class res_currency(osv.osv): raise osv.except_osv(_('Error'), _('No rate found \n' \ 'for the currency: %s \n' \ 'at the date: %s') % (currency_symbol, date)) - return to_currency_rate/from_currency_rate def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, From 46f690d64c0200cf72e22e5ccaad489ed5f11c1d Mon Sep 17 00:00:00 2001 From: "Mustufa Rangwala (OpenERP)" Date: Thu, 25 Aug 2011 23:06:51 +0530 Subject: [PATCH 14/30] [IMP] Base: added currency rate type on tree view bzr revid: mra@tinyerp.com-20110825173651-5rn1vsukicpdo331 --- openerp/addons/base/res/res_currency_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml index 63a55c0fddf..ddfee8fa090 100644 --- a/openerp/addons/base/res/res_currency_view.xml +++ b/openerp/addons/base/res/res_currency_view.xml @@ -53,6 +53,7 @@ +
From 9421188847a74992ffab17eea99674ba2a49feb0 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Sun, 28 Aug 2011 00:53:30 +0200 Subject: [PATCH 15/30] [IMP] base/res_currency: improved res.currency.rate.type. Added search view and help tooltip. Made some code cleaning bzr revid: qdp-launchpad@openerp.com-20110827225330-3ng37d8yg31psgsd --- openerp/addons/base/res/res_currency.py | 45 +++++++++---------- openerp/addons/base/res/res_currency_view.xml | 12 ++++- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 8182a207c5c..5333a8eab20 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -28,28 +28,24 @@ from tools.translate import _ class res_currency(osv.osv): def _current_rate(self, cr, uid, ids, name, arg, context=None): - currency_rate_obj = self.pool.get('res.currency.rate') - res = {} if context is None: context = {} + res = {} if 'date' in context: date = context['date'] else: date = time.strftime('%Y-%m-%d') - domain = [('currency_id', 'in', ids), ('name', '<=', date)] - currency_rate_type_id = context.get('currency_rate_type_id', False) - if currency_rate_type_id: - domain.append(('currency_rate_type_id', '=', currency_rate_type_id)) - curr_rate_ids = currency_rate_obj.search(cr, uid, domain, order='name desc', context=context) - curr_rates = currency_rate_obj.browse(cr, uid, curr_rate_ids, context=context) + date = date or time.strftime('%Y-%m-%d') + currency_rate_type = context.get('currency_rate_type_id', None) + operator = currency_rate_type and '=' or 'is' for id in ids: - res[id] = 0 - for cur in curr_rates: - if cur.currency_id.id == id: - res[id] = cur.rate - break + cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s AND currency_rate_type_id " + operator +" %s ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type)) + if cr.rowcount: + id, rate = cr.fetchall()[0] + res[id] = rate + else: + res[id] = 0 return res - _name = "res.currency" _description = "Currency" _columns = { @@ -107,24 +103,22 @@ class res_currency(osv.osv): if context is None: context = {} ctx = context.copy() - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from', False)}) - from_currency = self.browse(cr, uid, [from_currency.id], context=ctx)[0] - from_currency_rate = from_currency['rate'] + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from', None)}) + from_currency = self.browse(cr, uid, from_currency.id, context=ctx) - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to', False)}) - to_currency = self.browse(cr, uid, [to_currency.id], context=ctx)[0] - to_currency_rate = to_currency['rate'] + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to', None)}) + to_currency = self.browse(cr, uid, to_currency.id, context=ctx) - if from_currency_rate == 0 or to_currency_rate == 0: + if from_currency.rate == 0 or to_currency.rate == 0: date = context.get('date', time.strftime('%Y-%m-%d')) - if from_currency_rate == 0: + if from_currency.rate == 0: currency_symbol = from_currency.symbol else: currency_symbol = to_currency.symbol raise osv.except_osv(_('Error'), _('No rate found \n' \ 'for the currency: %s \n' \ 'at the date: %s') % (currency_symbol, date)) - return to_currency_rate/from_currency_rate + return to_currency.rate/from_currency.rate def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, currency_rate_type_from=False, currency_rate_type_to=False, context=None): @@ -156,7 +150,7 @@ class res_currency_rate_type(osv.osv): _name = "res.currency.rate.type" _description = "Currency Rate Type" _columns = { - 'name': fields.char('Name', size=32, required=True), + 'name': fields.char('Name', size=64, required=True, translate=True), } res_currency_rate_type() @@ -164,12 +158,13 @@ res_currency_rate_type() class res_currency_rate(osv.osv): _name = "res.currency.rate" _description = "Currency Rate" + _columns = { 'name': fields.date('Date', required=True, select=True), 'rate': fields.float('Rate', digits=(12,6), required=True, help='The rate of the currency to the currency of rate 1'), 'currency_id': fields.many2one('res.currency', 'Currency', readonly=True), - 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type'), + 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type', help="Allow you to define your own currency rate types, like average or Day to Year. Leave empty if you simply want to use the normal 'spot' rate type"), } _defaults = { 'name': lambda *a: time.strftime('%Y-%m-%d'), diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml index ddfee8fa090..4220832606b 100644 --- a/openerp/addons/base/res/res_currency_view.xml +++ b/openerp/addons/base/res/res_currency_view.xml @@ -88,7 +88,17 @@ form tree,form - + + res.currency.rate.type.search + res.currency.rate.type + search + + + + + + + From b8b78c43ddd108bc6baff809c3e5589bd1056b24 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 30 Aug 2011 14:06:44 +0200 Subject: [PATCH 16/30] [IMP] base, res.currency: by default, don't show the currency_rate_type_id field, and don't display its menuitem. Both should be added by specific module using it bzr revid: qdp-launchpad@openerp.com-20110830120644-lwuv3h1vrqjhu32y --- openerp/addons/base/res/res_currency_view.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml index 4220832606b..24939bd8642 100644 --- a/openerp/addons/base/res/res_currency_view.xml +++ b/openerp/addons/base/res/res_currency_view.xml @@ -48,12 +48,10 @@
- - @@ -99,7 +97,6 @@ - From 17156bd16a2c10f6201ff01040fc8c27763fea6f Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 30 Aug 2011 14:07:27 +0200 Subject: [PATCH 17/30] [IMP] base, res.currency: fixes bzr revid: qdp-launchpad@openerp.com-20110830120727-82z1fn0msp7m5096 --- openerp/addons/base/res/res_currency.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 5333a8eab20..422d40db727 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -131,7 +131,7 @@ class res_currency(osv.osv): xc = self.browse(cr, uid, [from_currency_id,to_currency_id], context=context) from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1] to_currency = (xc[0].id == to_currency_id and xc[0]) or xc[1] - if to_currency_id == from_currency_id: + if (to_currency_id == from_currency_id) and (currency_rate_type_from == currency_rate_type_to): if round: return self.round(cr, uid, to_currency, from_amount) else: @@ -164,7 +164,7 @@ class res_currency_rate(osv.osv): 'rate': fields.float('Rate', digits=(12,6), required=True, help='The rate of the currency to the currency of rate 1'), 'currency_id': fields.many2one('res.currency', 'Currency', readonly=True), - 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type', help="Allow you to define your own currency rate types, like average or Day to Year. Leave empty if you simply want to use the normal 'spot' rate type"), + 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type', help="Allow you to define your own currency rate types, like 'Average' or 'Year to Date'. Leave empty if you simply want to use the normal 'spot' rate type"), } _defaults = { 'name': lambda *a: time.strftime('%Y-%m-%d'), From 13b2db36315bfb4407b9b53728cb648ae77a085a Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 30 Aug 2011 14:27:01 +0200 Subject: [PATCH 18/30] [FIX] base, res.currency: ProgrammingError. When giving a context value like {'currency_rate_type_id': False}, it crashed because the value False was kept instead of None. Thanks Guewen (c2c) for the clue. bzr revid: qdp-launchpad@openerp.com-20110830122701-yrcpo19lokkgrpcc --- openerp/addons/base/res/res_currency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 422d40db727..c9cd36276ba 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -36,7 +36,7 @@ class res_currency(osv.osv): else: date = time.strftime('%Y-%m-%d') date = date or time.strftime('%Y-%m-%d') - currency_rate_type = context.get('currency_rate_type_id', None) + currency_rate_type = context.get('currency_rate_type_id') or None operator = currency_rate_type and '=' or 'is' for id in ids: cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s AND currency_rate_type_id " + operator +" %s ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type)) From 9c6fcf06d2520c48d2382f5e5f80cbb8d44f38b8 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 30 Aug 2011 14:55:21 +0200 Subject: [PATCH 19/30] [IMP] base, res.currency: code cleaning bzr revid: qdp-launchpad@openerp.com-20110830125521-1kt54s56865388ch --- openerp/addons/base/res/res_currency.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index c9cd36276ba..88ee993a5fc 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -70,8 +70,8 @@ class res_currency(osv.osv): _order = "name" def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'): - currency_rate_obj= self.pool.get('res.currency.rate') res = super(osv.osv, self).read(cr, user, ids, fields, context, load) + currency_rate_obj = self.pool.get('res.currency.rate') for r in res: if r.__contains__('rate_ids'): rates=r['rate_ids'] @@ -148,7 +148,7 @@ res_currency() class res_currency_rate_type(osv.osv): _name = "res.currency.rate.type" - _description = "Currency Rate Type" + _description = "Used to define the type of Currency Rates" _columns = { 'name': fields.char('Name', size=64, required=True, translate=True), } From 399de9724c7da178eb8ff4638af469ed118dfa74 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 30 Aug 2011 15:20:35 +0200 Subject: [PATCH 20/30] [IMP] base, res.currency: code cleaning bzr revid: qdp-launchpad@openerp.com-20110830132035-x2gs62lft5o19u6i --- openerp/addons/base/res/res_currency.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py index 88ee993a5fc..ccac26eead9 100644 --- a/openerp/addons/base/res/res_currency.py +++ b/openerp/addons/base/res/res_currency.py @@ -36,8 +36,8 @@ class res_currency(osv.osv): else: date = time.strftime('%Y-%m-%d') date = date or time.strftime('%Y-%m-%d') - currency_rate_type = context.get('currency_rate_type_id') or None - operator = currency_rate_type and '=' or 'is' + currency_rate_type = context.get('currency_rate_type_id') or None #to deal with the case were context['currency_rate_type_id'] == False + operator = '=' if currency_rate_type else 'is' for id in ids: cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s AND currency_rate_type_id " + operator +" %s ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type)) if cr.rowcount: @@ -103,10 +103,10 @@ class res_currency(osv.osv): if context is None: context = {} ctx = context.copy() - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from', None)}) + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from')}) from_currency = self.browse(cr, uid, from_currency.id, context=ctx) - ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to', None)}) + ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to')}) to_currency = self.browse(cr, uid, to_currency.id, context=ctx) if from_currency.rate == 0 or to_currency.rate == 0: From 25eca5ffebae46ea75a5f8b0e72c962af7599891 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 30 Aug 2011 17:00:25 +0200 Subject: [PATCH 21/30] [FIX] don't display negative numbers for the decimal part of floats, having -3.-72 makes no sense bzr revid: xmo@openerp.com-20110830150025-biqwrkt69wjye7n2 --- addons/base/static/src/js/formats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/formats.js b/addons/base/static/src/js/formats.js index ed25b28c16d..5180e95fbe9 100644 --- a/addons/base/static/src/js/formats.js +++ b/addons/base/static/src/js/formats.js @@ -28,7 +28,7 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) { case 'float': var precision = descriptor.digits ? descriptor.digits[1] : 2; var int_part = Math.floor(value); - var dec_part = Math.floor((value % 1) * Math.pow(10, precision)); + var dec_part = Math.abs(Math.floor((value % 1) * Math.pow(10, precision))); return _.sprintf('%d' + openerp.base._t.database.parameters.decimal_point + '%d', int_part, dec_part); case 'float_time': return _.sprintf("%02d:%02d", From d47382ce7de35f59f9f2635cce6372aa52e54773 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 30 Aug 2011 17:01:51 +0200 Subject: [PATCH 22/30] [IMP] sprintf is awesome, so use sprintf correctly for patterning bzr revid: xmo@openerp.com-20110830150151-2ureqckjksnw8r1p --- addons/base/static/src/js/formats.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/formats.js b/addons/base/static/src/js/formats.js index 5180e95fbe9..8e2b2dd18cb 100644 --- a/addons/base/static/src/js/formats.js +++ b/addons/base/static/src/js/formats.js @@ -29,7 +29,9 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) { var precision = descriptor.digits ? descriptor.digits[1] : 2; var int_part = Math.floor(value); var dec_part = Math.abs(Math.floor((value % 1) * Math.pow(10, precision))); - return _.sprintf('%d' + openerp.base._t.database.parameters.decimal_point + '%d', int_part, dec_part); + return _.sprintf('%d%s%d', + int_part, dec_part, + openerp.base._t.database.parameters.decimal_point); case 'float_time': return _.sprintf("%02d:%02d", Math.floor(value), @@ -45,7 +47,7 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) { if (typeof(value) == "string") value = openerp.base.str_to_datetime(value); try { - return value.toString(_.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, + return value.toString(_.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, Date.CultureInfo.formatPatterns.longTime)); } catch (e) { return value.format("%m/%d/%Y %H:%M:%S"); @@ -108,7 +110,7 @@ openerp.base.parse_value = function (value, descriptor, value_if_empty) { case 'progressbar': return openerp.base.parse_value(value, {type: "float"}); case 'datetime': - var tmp = Date.parseExact(value, _.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, + var tmp = Date.parseExact(value, _.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, Date.CultureInfo.formatPatterns.longTime)); if (tmp !== null) return tmp; From 974305d697eddb291e729947b36665fb93c5f0b6 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 31 Aug 2011 01:23:00 +0200 Subject: [PATCH 23/30] [IMP] moved openerpweb into base.common to be renamed web.commom bzr revid: al@openerp.com-20110830232300-0f4hb3pk3jso0dii --- addons/base/__init__.py | 5 +++++ .../base/common}/__init__.py | 0 {openerpweb => addons/base/common}/ast.py | 0 {openerpweb => addons/base/common}/dates.py | 0 .../base/common}/nonliterals.py | 0 .../base/common}/openerpweb.py | 14 ++++++++---- .../base/common}/tests/__init__.py | 0 .../base/common}/tests/test_model.py | 0 .../base/common}/tests/test_nonliterals.py | 0 .../base/common}/tests/test_session.py | 0 addons/base/controllers/main.py | 8 ++++--- addons/base_calendar/controllers/main.py | 3 ++- addons/base_dashboard/controllers.py | 2 +- addons/base_diagram/controllers/main.py | 2 +- addons/base_gantt/controllers/main.py | 2 +- addons/base_graph/controllers/main.py | 4 ++-- addons/web_chat/controllers/main.py | 2 +- addons/web_mobile/controllers/main.py | 22 +++++++++---------- openerp-web.py | 11 +++++++--- 19 files changed, 47 insertions(+), 28 deletions(-) rename {openerpweb => addons/base/common}/__init__.py (100%) rename {openerpweb => addons/base/common}/ast.py (100%) rename {openerpweb => addons/base/common}/dates.py (100%) rename {openerpweb => addons/base/common}/nonliterals.py (100%) rename {openerpweb => addons/base/common}/openerpweb.py (98%) rename {openerpweb => addons/base/common}/tests/__init__.py (100%) rename {openerpweb => addons/base/common}/tests/test_model.py (100%) rename {openerpweb => addons/base/common}/tests/test_nonliterals.py (100%) rename {openerpweb => addons/base/common}/tests/test_session.py (100%) diff --git a/addons/base/__init__.py b/addons/base/__init__.py index ee5959455ad..343b53d050d 100644 --- a/addons/base/__init__.py +++ b/addons/base/__init__.py @@ -1 +1,6 @@ +import common import controllers + +# TODO +# if we detect that we are imported from the openerp server register common.Root() as a wsgi entry point + diff --git a/openerpweb/__init__.py b/addons/base/common/__init__.py similarity index 100% rename from openerpweb/__init__.py rename to addons/base/common/__init__.py diff --git a/openerpweb/ast.py b/addons/base/common/ast.py similarity index 100% rename from openerpweb/ast.py rename to addons/base/common/ast.py diff --git a/openerpweb/dates.py b/addons/base/common/dates.py similarity index 100% rename from openerpweb/dates.py rename to addons/base/common/dates.py diff --git a/openerpweb/nonliterals.py b/addons/base/common/nonliterals.py similarity index 100% rename from openerpweb/nonliterals.py rename to addons/base/common/nonliterals.py diff --git a/openerpweb/openerpweb.py b/addons/base/common/openerpweb.py similarity index 98% rename from openerpweb/openerpweb.py rename to addons/base/common/openerpweb.py index b2364692203..0e413c64e78 100644 --- a/openerpweb/openerpweb.py +++ b/addons/base/common/openerpweb.py @@ -23,8 +23,10 @@ import logging # Globals #----------------------------------------------------------- -path_root = os.path.dirname(os.path.dirname(os.path.normpath(__file__))) -path_addons = os.path.join(path_root, 'addons') +import __main__ + +path_root = __main__.path_root +path_addons = __main__.path_addons cherrypy_root = None #----------------------------------------------------------- @@ -425,12 +427,16 @@ class Root(object): controllers_path[o._cp_path] = o def default(self, *l, **kw): - #print "default",l,kw + print "default",l,kw # handle static files if len(l) > 2 and l[1] == 'static': # sanitize path p = os.path.normpath(os.path.join(*l)) - return cherrypy.lib.static.serve_file(os.path.join(path_addons, p)) + p2 = os.path.join(path_addons, p) + print "p",p + print "p2",p2 + + return cherrypy.lib.static.serve_file(p2) elif len(l) > 1: for i in range(len(l), 1, -1): ps = "/" + "/".join(l[0:i]) diff --git a/openerpweb/tests/__init__.py b/addons/base/common/tests/__init__.py similarity index 100% rename from openerpweb/tests/__init__.py rename to addons/base/common/tests/__init__.py diff --git a/openerpweb/tests/test_model.py b/addons/base/common/tests/test_model.py similarity index 100% rename from openerpweb/tests/test_model.py rename to addons/base/common/tests/test_model.py diff --git a/openerpweb/tests/test_nonliterals.py b/addons/base/common/tests/test_nonliterals.py similarity index 100% rename from openerpweb/tests/test_nonliterals.py rename to addons/base/common/tests/test_nonliterals.py diff --git a/openerpweb/tests/test_session.py b/addons/base/common/tests/test_session.py similarity index 100% rename from openerpweb/tests/test_session.py rename to addons/base/common/tests/test_session.py diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index c9bd7ddfeab..0d652500a35 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -15,9 +15,11 @@ from cStringIO import StringIO import cherrypy -import openerpweb -import openerpweb.ast -import openerpweb.nonliterals +import base.common as openerpweb +import base.common.ast +import base.common.nonliterals +openerpweb.ast = base.common.ast +openerpweb.nonliterals = base.common.nonliterals from babel.messages.pofile import read_po diff --git a/addons/base_calendar/controllers/main.py b/addons/base_calendar/controllers/main.py index 28c871bf2b4..0211b3e4632 100644 --- a/addons/base_calendar/controllers/main.py +++ b/addons/base_calendar/controllers/main.py @@ -1,5 +1,6 @@ +import base.common as openerpweb + from base.controllers.main import View -import openerpweb class CalendarView(View): _cp_path = "/base_calendar/calendarview" diff --git a/addons/base_dashboard/controllers.py b/addons/base_dashboard/controllers.py index b0f5fbf817e..0c5c0a26859 100644 --- a/addons/base_dashboard/controllers.py +++ b/addons/base_dashboard/controllers.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import openerpweb +import base.common as openerpweb WIDGET_CONTENT_PATTERN = """ diff --git a/addons/base_diagram/controllers/main.py b/addons/base_diagram/controllers/main.py index 2f76ead7117..8e258810eca 100644 --- a/addons/base_diagram/controllers/main.py +++ b/addons/base_diagram/controllers/main.py @@ -1,5 +1,5 @@ +import base.common as openerpweb from base.controllers.main import View -import openerpweb class DiagramView(View): _cp_path = "/base_diagram/diagram" diff --git a/addons/base_gantt/controllers/main.py b/addons/base_gantt/controllers/main.py index 0e6754ecb05..56fb2b7e79f 100644 --- a/addons/base_gantt/controllers/main.py +++ b/addons/base_gantt/controllers/main.py @@ -1,4 +1,4 @@ -import openerpweb +import base.common as openerpweb from base.controllers.main import View class GanttView(View): diff --git a/addons/base_graph/controllers/main.py b/addons/base_graph/controllers/main.py index 680b9e030c2..f326faf3854 100644 --- a/addons/base_graph/controllers/main.py +++ b/addons/base_graph/controllers/main.py @@ -1,5 +1,5 @@ from base.controllers.main import View -import openerpweb +import base.common as openerpweb class GraphView(View): _cp_path = "/base_graph/graphview" @@ -8,4 +8,4 @@ class GraphView(View): def load(self, req, model, view_id): fields_view = self.fields_view_get(req, model, view_id, 'graph') all_fields = req.session.model(model).fields_get() - return {'fields_view': fields_view, 'all_fields':all_fields} \ No newline at end of file + return {'fields_view': fields_view, 'all_fields':all_fields} diff --git a/addons/web_chat/controllers/main.py b/addons/web_chat/controllers/main.py index 5e8d48344f8..5c427812d47 100644 --- a/addons/web_chat/controllers/main.py +++ b/addons/web_chat/controllers/main.py @@ -4,7 +4,7 @@ import cherrypy import simplejson import random -import openerpweb +import base.common as openerpweb #---------------------------------------------------------- # OpenERP Web ajaxim Controllers diff --git a/addons/web_mobile/controllers/main.py b/addons/web_mobile/controllers/main.py index d2ba132d1c2..8fa3e32a775 100644 --- a/addons/web_mobile/controllers/main.py +++ b/addons/web_mobile/controllers/main.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- -import glob, os -import pprint - -import simplejson - -import openerpweb -import openerpweb.ast -import openerpweb.nonliterals - -import cherrypy - +#import glob, os +#import pprint +# +#import simplejson +# +#import openerpweb +#import openerpweb.ast +#import openerpweb.nonliterals +# +#import cherrypy +# diff --git a/openerp-web.py b/openerp-web.py index 99305b276a8..fe582575b98 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -1,7 +1,12 @@ #!/usr/bin/env python -import sys +import os,sys -import openerpweb +path_root = os.path.dirname(os.path.abspath(__file__)) +path_addons = os.path.join(path_root, 'addons') +if path_addons not in sys.path: + sys.path.insert(0, path_addons) + +import base if __name__ == "__main__": - openerpweb.main(sys.argv) + base.common.main(sys.argv) From 05c596fc3cbc9faaeb7bf0af0402ed5698890cba Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 31 Aug 2011 01:39:20 +0200 Subject: [PATCH 24/30] moved OpenERPSession into backend{rpc|local}.py bzr revid: al@openerp.com-20110830233920-cy8k1h55j976bnhr --- addons/base/common/__init__.py | 5 +- addons/base/common/backendlocal.py | 23 ++ addons/base/common/backendrpc.py | 212 ++++++++++++++++++ .../common/{openerpweb.py => dispatch.py} | 198 +--------------- addons/base_dashboard/controllers.py | 2 +- 5 files changed, 244 insertions(+), 196 deletions(-) create mode 100644 addons/base/common/backendlocal.py create mode 100644 addons/base/common/backendrpc.py rename addons/base/common/{openerpweb.py => dispatch.py} (62%) diff --git a/addons/base/common/__init__.py b/addons/base/common/__init__.py index b201d5a7953..60699c86f43 100644 --- a/addons/base/common/__init__.py +++ b/addons/base/common/__init__.py @@ -1,2 +1,5 @@ #!/usr/bin/python -from openerpweb import * +# TODO if from openerpserver use backendlocal +# from backendlocal import * +from backendrpc import * +from dispatch import * diff --git a/addons/base/common/backendlocal.py b/addons/base/common/backendlocal.py new file mode 100644 index 00000000000..dac33991c4d --- /dev/null +++ b/addons/base/common/backendlocal.py @@ -0,0 +1,23 @@ +#---------------------------------------------------------- +# OpenERPSession local openerp backend access +#---------------------------------------------------------- +class OpenERPUnboundException(Exception): + pass + +class OpenERPConnector(object): + pass + +class OpenERPAuth(object): + pass + +class OpenERPModel(object): + def __init__(self, session, model): + self._session = session + self._model = model + + def __getattr__(self, name): + return lambda *l:self._session.execute(self._model, name, *l) + +class OpenERPSession(object): + def __init__(self, model_factory=OpenERPModel): + pass diff --git a/addons/base/common/backendrpc.py b/addons/base/common/backendrpc.py new file mode 100644 index 00000000000..d2e2f6615e1 --- /dev/null +++ b/addons/base/common/backendrpc.py @@ -0,0 +1,212 @@ +#!/usr/bin/python +import datetime +import urllib +import dateutil.relativedelta +import functools +import logging +import optparse +import os +import sys +import tempfile +import time +import traceback +import uuid +import xmlrpclib + +import cherrypy +import cherrypy.lib.static +import simplejson + +import nonliterals +#---------------------------------------------------------- +# OpenERPSession RPC openerp backend access +#---------------------------------------------------------- +class OpenERPUnboundException(Exception): + pass + +class OpenERPConnector(object): + pass + +class OpenERPAuth(object): + pass + +class OpenERPModel(object): + def __init__(self, session, model): + self._session = session + self._model = model + + def __getattr__(self, name): + return lambda *l:self._session.execute(self._model, name, *l) + +class OpenERPSession(object): + """ + An OpenERP RPC session, a given user can own multiple such sessions + in a web session. + + .. attribute:: context + + The session context, a ``dict``. Can be reloaded by calling + :meth:`openerpweb.openerpweb.OpenERPSession.get_context` + + .. attribute:: domains_store + + A ``dict`` matching domain keys to evaluable (but non-literal) domains. + + Used to store references to non-literal domains which need to be + round-tripped to the client browser. + """ + def __init__(self, server='127.0.0.1', port=8069, model_factory=OpenERPModel): + self._server = server + self._port = port + self._db = False + self._uid = False + self._login = False + self._password = False + self.model_factory = model_factory + self._locale = 'en_US' + self.context = {} + self.contexts_store = {} + self.domains_store = {} + self._lang = {} + self.remote_timezone = 'utc' + self.client_timezone = False + + def proxy(self, service): + s = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service)) + return s + + def bind(self, db, uid, password): + self._db = db + self._uid = uid + self._password = password + + def login(self, db, login, password): + uid = self.proxy('common').login(db, login, password) + self.bind(db, uid, password) + self._login = login + + if uid: self.get_context() + return uid + + def assert_valid(self): + """ + Ensures this session is valid (logged into the openerp server) + """ + if not (self._db and self._uid and self._password): + raise OpenERPUnboundException() + + def execute(self, model, func, *l, **d): + self.assert_valid() + r = self.proxy('object').execute(self._db, self._uid, self._password, model, func, *l, **d) + return r + + def exec_workflow(self, model, id, signal): + self.assert_valid() + r = self.proxy('object').exec_workflow(self._db, self._uid, self._password, model, signal, id) + return r + + def model(self, model): + """ Get an RPC proxy for the object ``model``, bound to this session. + + :param model: an OpenERP model name + :type model: str + :rtype: :class:`openerpweb.openerpweb.OpenERPModel` + """ + return self.model_factory(self, model) + + def get_context(self): + """ Re-initializes the current user's session context (based on + his preferences) by calling res.users.get_context() with the old + context + + :returns: the new context + """ + assert self._uid, "The user needs to be logged-in to initialize his context" + self.context = self.model('res.users').context_get(self.context) + self.context = self.context or {} + + self.client_timezone = self.context.get("tz", False) + # invalid code, anyway we decided the server will be in UTC + #if self.client_timezone: + # self.remote_timezone = self.execute('common', 'timezone_get') + + self._locale = self.context.get('lang','en_US') + lang_ids = self.execute('res.lang','search', [('code', '=', self._locale)]) + if lang_ids: + self._lang = self.execute('res.lang', 'read',lang_ids[0], []) + return self.context + + @property + def base_eval_context(self): + """ Default evaluation context for the session. + + Used to evaluate contexts and domains. + """ + base = dict( + uid=self._uid, + current_date=datetime.date.today().strftime('%Y-%m-%d'), + time=time, + datetime=datetime, + relativedelta=dateutil.relativedelta.relativedelta + ) + base.update(self.context) + return base + + def evaluation_context(self, context=None): + """ Returns the session's evaluation context, augmented with the + provided context if any. + + :param dict context: to add merge in the session's base eval context + :returns: the augmented context + :rtype: dict + """ + d = dict(self.base_eval_context) + if context: + d.update(context) + d['context'] = d + return d + + def eval_context(self, context_to_eval, context=None): + """ Evaluates the provided context_to_eval in the context (haha) of + the context. Also merges the evaluated context with the session's context. + + :param context_to_eval: a context to evaluate. Must be a dict or a + non-literal context. If it's a dict, will be + returned as-is + :type context_to_eval: openerpweb.nonliterals.Context + :returns: the evaluated context + :rtype: dict + + :raises: ``TypeError`` if ``context_to_eval`` is neither a dict nor + a Context + """ + ctx = dict( + self.base_eval_context, + **(context or {})) + + # adding the context of the session to send to the openerp server + ccontext = nonliterals.CompoundContext(self.context, context_to_eval or {}) + ccontext.session = self + return ccontext.evaluate(ctx) + + def eval_domain(self, domain, context=None): + """ Evaluates the provided domain using the provided context + (merged with the session's evaluation context) + + :param domain: an OpenERP domain as a list or as a + :class:`openerpweb.nonliterals.Domain` instance + + In the second case, it will be evaluated and returned. + :type domain: openerpweb.nonliterals.Domain + :param dict context: the context to use in the evaluation, if any. + :returns: the evaluated domain + :rtype: list + + :raises: ``TypeError`` if ``domain`` is neither a list nor a Domain + """ + if isinstance(domain, list): + return domain + + cdomain = nonliterals.CompoundDomain(domain) + cdomain.session = self + return cdomain.evaluate(context or {}) diff --git a/addons/base/common/openerpweb.py b/addons/base/common/dispatch.py similarity index 62% rename from addons/base/common/openerpweb.py rename to addons/base/common/dispatch.py index 0e413c64e78..7d50785bf56 100644 --- a/addons/base/common/openerpweb.py +++ b/addons/base/common/dispatch.py @@ -3,6 +3,7 @@ import datetime import urllib import dateutil.relativedelta import functools +import logging import optparse import os import sys @@ -17,7 +18,9 @@ import cherrypy.lib.static import simplejson import nonliterals -import logging +# TODO if from openerpserver use backendlocal +# from backendlocal import * +from backendrpc import * #----------------------------------------------------------- # Globals @@ -40,199 +43,6 @@ controllers_class = {} controllers_object = {} controllers_path = {} -#---------------------------------------------------------- -# OpenERP Client Library -#---------------------------------------------------------- -class OpenERPUnboundException(Exception): - pass - -class OpenERPConnector(object): - pass - -class OpenERPAuth(object): - pass - -class OpenERPModel(object): - def __init__(self, session, model): - self._session = session - self._model = model - - def __getattr__(self, name): - return lambda *l:self._session.execute(self._model, name, *l) - -class OpenERPSession(object): - """ - An OpenERP RPC session, a given user can own multiple such sessions - in a web session. - - .. attribute:: context - - The session context, a ``dict``. Can be reloaded by calling - :meth:`openerpweb.openerpweb.OpenERPSession.get_context` - - .. attribute:: domains_store - - A ``dict`` matching domain keys to evaluable (but non-literal) domains. - - Used to store references to non-literal domains which need to be - round-tripped to the client browser. - """ - def __init__(self, server='127.0.0.1', port=8069, model_factory=OpenERPModel): - self._server = server - self._port = port - self._db = False - self._uid = False - self._login = False - self._password = False - self.model_factory = model_factory - self._locale = 'en_US' - self.context = {} - self.contexts_store = {} - self.domains_store = {} - self._lang = {} - self.remote_timezone = 'utc' - self.client_timezone = False - - def proxy(self, service): - s = xmlrpclib.ServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service)) - return s - - def bind(self, db, uid, password): - self._db = db - self._uid = uid - self._password = password - - def login(self, db, login, password): - uid = self.proxy('common').login(db, login, password) - self.bind(db, uid, password) - self._login = login - - if uid: self.get_context() - return uid - - def assert_valid(self): - """ - Ensures this session is valid (logged into the openerp server) - """ - if not (self._db and self._uid and self._password): - raise OpenERPUnboundException() - - def execute(self, model, func, *l, **d): - self.assert_valid() - r = self.proxy('object').execute(self._db, self._uid, self._password, model, func, *l, **d) - return r - - def exec_workflow(self, model, id, signal): - self.assert_valid() - r = self.proxy('object').exec_workflow(self._db, self._uid, self._password, model, signal, id) - return r - - def model(self, model): - """ Get an RPC proxy for the object ``model``, bound to this session. - - :param model: an OpenERP model name - :type model: str - :rtype: :class:`openerpweb.openerpweb.OpenERPModel` - """ - return self.model_factory(self, model) - - def get_context(self): - """ Re-initializes the current user's session context (based on - his preferences) by calling res.users.get_context() with the old - context - - :returns: the new context - """ - assert self._uid, "The user needs to be logged-in to initialize his context" - self.context = self.model('res.users').context_get(self.context) - self.context = self.context or {} - - self.client_timezone = self.context.get("tz", False) - # invalid code, anyway we decided the server will be in UTC - #if self.client_timezone: - # self.remote_timezone = self.execute('common', 'timezone_get') - - self._locale = self.context.get('lang','en_US') - lang_ids = self.execute('res.lang','search', [('code', '=', self._locale)]) - if lang_ids: - self._lang = self.execute('res.lang', 'read',lang_ids[0], []) - return self.context - - @property - def base_eval_context(self): - """ Default evaluation context for the session. - - Used to evaluate contexts and domains. - """ - base = dict( - uid=self._uid, - current_date=datetime.date.today().strftime('%Y-%m-%d'), - time=time, - datetime=datetime, - relativedelta=dateutil.relativedelta.relativedelta - ) - base.update(self.context) - return base - - def evaluation_context(self, context=None): - """ Returns the session's evaluation context, augmented with the - provided context if any. - - :param dict context: to add merge in the session's base eval context - :returns: the augmented context - :rtype: dict - """ - d = dict(self.base_eval_context) - if context: - d.update(context) - d['context'] = d - return d - - def eval_context(self, context_to_eval, context=None): - """ Evaluates the provided context_to_eval in the context (haha) of - the context. Also merges the evaluated context with the session's context. - - :param context_to_eval: a context to evaluate. Must be a dict or a - non-literal context. If it's a dict, will be - returned as-is - :type context_to_eval: openerpweb.nonliterals.Context - :returns: the evaluated context - :rtype: dict - - :raises: ``TypeError`` if ``context_to_eval`` is neither a dict nor - a Context - """ - ctx = dict( - self.base_eval_context, - **(context or {})) - - # adding the context of the session to send to the openerp server - ccontext = nonliterals.CompoundContext(self.context, context_to_eval or {}) - ccontext.session = self - return ccontext.evaluate(ctx) - - def eval_domain(self, domain, context=None): - """ Evaluates the provided domain using the provided context - (merged with the session's evaluation context) - - :param domain: an OpenERP domain as a list or as a - :class:`openerpweb.nonliterals.Domain` instance - - In the second case, it will be evaluated and returned. - :type domain: openerpweb.nonliterals.Domain - :param dict context: the context to use in the evaluation, if any. - :returns: the evaluated domain - :rtype: list - - :raises: ``TypeError`` if ``domain`` is neither a list nor a Domain - """ - if isinstance(domain, list): - return domain - - cdomain = nonliterals.CompoundDomain(domain) - cdomain.session = self - return cdomain.evaluate(context or {}) - #---------------------------------------------------------- # OpenERP Web RequestHandler #---------------------------------------------------------- diff --git a/addons/base_dashboard/controllers.py b/addons/base_dashboard/controllers.py index 0c5c0a26859..2ebfefab1e8 100644 --- a/addons/base_dashboard/controllers.py +++ b/addons/base_dashboard/controllers.py @@ -18,7 +18,7 @@ WIDGET_CONTENT_PATTERN = """ """ -class Widgets(openerpweb.openerpweb.Controller): +class Widgets(openerpweb.Controller): _cp_path = '/base_dashboard/widgets' @openerpweb.httprequest From 67f486f0be587afc3397d838f3ce75ab319e929b Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 31 Aug 2011 01:44:33 +0200 Subject: [PATCH 25/30] openerp-web ready to be a simple set of openerp-server addons, still need to rename base* into web* bzr revid: al@openerp.com-20110830234433-k9pg3m4cadqntgko --- openerp-web.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openerp-web.py b/openerp-web.py index fe582575b98..3363b4466a7 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -8,5 +8,13 @@ if path_addons not in sys.path: import base -if __name__ == "__main__": +def main(): + # TODO move the code of base.common.main here ! + # change the code to configure a simple werzug server -> base.common.Root() base.common.main(sys.argv) + +if __name__ == "__main__": + main() + + + From 2e7927331d642bad8d0bea02ed438e406df9f172 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Wed, 31 Aug 2011 09:56:39 +0200 Subject: [PATCH 26/30] [FIX] registry: forgot the self/cls args. bzr revid: vmt@openerp.com-20110831075639-0ywrg01e6zdff7l7 --- openerp/modules/registry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index 47f16119e86..072082db000 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -77,7 +77,7 @@ class Registry(object): return res - def clear_caches(): + def clear_caches(self): """ Clear the caches This clears the caches associated to methods decorated with @@ -160,7 +160,7 @@ class RegistryManager(object): @classmethod - def clear_caches(db_name): + def clear_caches(cls, db_name): """ Clear the caches This clears the caches associated to methods decorated with From f2d080780ca73a9f32586362c8d6c8ccd4aeaa07 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 31 Aug 2011 10:35:21 +0200 Subject: [PATCH 27/30] [fix] fixed relative paths in css bzr revid: nicolas.vanhoren@openerp.com-20110831083521-47rpomwr2787ounu --- addons/base/static/src/css/base.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index b0a7dd3c8c8..4133a9c8623 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -597,13 +597,13 @@ label.error { background-color: #ccc; } .openerp .searchview_group.folded .searchview_group_string { - background: url("../img/ui/group-folded.png") no-repeat scroll 0 50%; + background: url("/base/static/src/img/ui/group-folded.png") no-repeat scroll 0 50%; } .openerp .searchview_group.folded .searchview_group_content { display: none; } .openerp .searchview_group.expanded .searchview_group_string { - background: url("../img/ui/group-expanded.png") no-repeat scroll 0 50%; + background: url("/base/static/src/img/ui/group-expanded.png") no-repeat scroll 0 50%; } .openerp .searchview_group.expanded .searchview_group_content { display: block; @@ -635,13 +635,13 @@ label.error { } .openerp .oe_search-view-custom-filter-btn span { - background: url(../img/icons/gtk-add.png) repeat-y; + background: url(/base/static/src/img/icons/gtk-add.png) repeat-y; padding-left: 18px; } .openerp .searchview_extended_add_proposition span { font-size: 0.9em; - background: url(../img/icons/gtk-add.png) repeat-y; + background: url(/base/static/src/img/icons/gtk-add.png) repeat-y; padding-left: 18px; } @@ -657,7 +657,7 @@ label.error { .openerp .searchview_extended_delete_group span, .openerp .searchview_extended_delete_prop span { font-size: 0.9em; - background: url(../img/icons/gtk-close.png) repeat-y; + background: url(/base/static/src/img/icons/gtk-close.png) repeat-y; padding-left: 18px; } /* List */ @@ -1091,7 +1091,7 @@ label.error { cursor: pointer; border: 1px solid #D2CFCF; display: block; - background: url(../img/toggle-a-bg.png); + background: url(/base/static/src/img/toggle-a-bg.png); width: 21px; height: 21px; z-index: 10; @@ -1106,7 +1106,7 @@ label.error { } .openerp li.oe_sidebar_print { padding-left: 20px; - background: 1px 3px url(../img/icons/gtk-print.png) no-repeat; + background: 1px 3px url(/base/static/src/img/icons/gtk-print.png) no-repeat; } .openerp.kitten-mode-activated .main_table { From ddadb2ce75c50a41ecf717b929eda8714d5f9d9d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 31 Aug 2011 11:45:47 +0200 Subject: [PATCH 28/30] [FIX] issue in splitting field paths for export: would create empty path sections because too eager do replacement in two passes of re-base replacement: replace old-style 'field:id' and 'field.id' in resp. 'field/id' and 'field/.id', don't touch anything else (especially not 'field/.id') and leave them through instead. bzr revid: xmo@openerp.com-20110831094547-8evd7ecm5qojspnr --- openerp/osv/orm.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 4b0e99477d5..b87672c012d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -984,9 +984,10 @@ class orm_template(object): cols = self._columns.copy() for f in self._inherit_fields: cols.update({f: self._inherit_fields[f][2]}) - def fsplit(x): - if x=='.id': return [x] - return x.replace(':id','/id').replace('.id','/.id').split('/') + def fsplit(fieldname): + fixed_db_id = re.sub(r'([^/])\.id', r'\1/.id', fieldname) + fixed_external_id = re.sub(r'([^/]):id', r'\1/id', fixed_db_id) + return fixed_external_id.split('/') fields_to_export = map(fsplit, fields_to_export) datas = [] for row in self.browse(cr, uid, ids, context): From 5b8ad8068bac7f124071249899e91822f11f194f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 31 Aug 2011 12:21:11 +0200 Subject: [PATCH 29/30] [fix] some bugs with float & date parsing + corrected tests bzr revid: nicolas.vanhoren@openerp.com-20110831102111-ure7wc02nu33v4n2 --- addons/base/static/src/js/formats.js | 8 ++++---- addons/base/static/test/formats.js | 21 ++++++++++++--------- addons/base/static/test/test.html | 6 +++++- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/js/formats.js b/addons/base/static/src/js/formats.js index 8e2b2dd18cb..bf54290bf45 100644 --- a/addons/base/static/src/js/formats.js +++ b/addons/base/static/src/js/formats.js @@ -30,8 +30,8 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) { var int_part = Math.floor(value); var dec_part = Math.abs(Math.floor((value % 1) * Math.pow(10, precision))); return _.sprintf('%d%s%d', - int_part, dec_part, - openerp.base._t.database.parameters.decimal_point); + int_part, + openerp.base._t.database.parameters.decimal_point, dec_part); case 'float_time': return _.sprintf("%02d:%02d", Math.floor(value), @@ -119,7 +119,7 @@ openerp.base.parse_value = function (value, descriptor, value_if_empty) { return tmp; throw value + " is not a valid datetime"; case 'date': - var tmp = Date.parseExact(Date.CultureInfo.formatPatterns.shortDate); + var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.shortDate); if (tmp !== null) return tmp; tmp = Date.parse(value); @@ -127,7 +127,7 @@ openerp.base.parse_value = function (value, descriptor, value_if_empty) { return tmp; throw value + " is not a valid date"; case 'time': - var tmp = Date.parseExact(Date.CultureInfo.formatPatterns.longTime); + var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.longTime); if (tmp !== null) return tmp; tmp = Date.parse(value); diff --git a/addons/base/static/test/formats.js b/addons/base/static/test/formats.js index 4c46f050998..66ffd1b5c3c 100644 --- a/addons/base/static/test/formats.js +++ b/addons/base/static/test/formats.js @@ -11,17 +11,17 @@ $(document).ready(function () { test("format_datetime", function () { var date = openerp.base.str_to_datetime("2009-05-04 12:34:23"); var str = openerp.base.format_value(date, {type:"datetime"}); - equal(str, date.format("%m/%d/%Y %H:%M:%S")); + equal(str, date.toString("M/d/yyyy h:mm:ss tt")); }); test("format_date", function () { var date = openerp.base.str_to_datetime("2009-05-04 12:34:23"); var str = openerp.base.format_value(date, {type:"date"}); - equal(str, date.format("%m/%d/%Y")); + equal(str, date.toString("M/d/yyyy")); }); test("format_time", function () { var date = openerp.base.str_to_datetime("2009-05-04 12:34:23"); var str = openerp.base.format_value(date, {type:"time"}); - equal(str, date.format("%H:%M:%S")); + equal(str, date.toString("h:mm:ss tt")); }); test("format_float", function () { var fl = 12.1234; @@ -30,22 +30,25 @@ $(document).ready(function () { }); test("parse_datetime", function () { var val = openerp.base.str_to_datetime("2009-05-04 12:34:23"); - var res = openerp.base.parse_value(val.format("%m/%d/%Y %H:%M:%S"), {type:"datetime"}); - equal(val.format("%m/%d/%Y %H:%M:%S"), res.format("%m/%d/%Y %H:%M:%S")); + var res = openerp.base.parse_value(val.toString("M/d/yyyy h:mm:ss tt"), {type:"datetime"}); + equal(val.toString("M/d/yyyy h:mm:ss tt"), res.toString("M/d/yyyy h:mm:ss tt")); }); test("parse_date", function () { var val = openerp.base.str_to_date("2009-05-04"); - var res = openerp.base.parse_value(val.format("%m/%d/%Y"), {type:"date"}); - equal(val.format("%m/%d/%Y %H:%M:%S"), res.format("%m/%d/%Y %H:%M:%S")); + var res = openerp.base.parse_value(val.toString("M/d/yyyy"), {type:"date"}); + equal(val.toString("M/d/yyyy"), res.toString("M/d/yyyy")); }); test("parse_time", function () { var val = openerp.base.str_to_time("12:34:23"); - var res = openerp.base.parse_value(val.format("%H:%M:%S"), {type:"time"}); - equal(val.format("%m/%d/%Y %H:%M:%S"), res.format("%m/%d/%Y %H:%M:%S")); + var res = openerp.base.parse_value(val.toString("h:mm:ss tt"), {type:"time"}); + equal(val.toString("h:mm:ss tt"), res.toString("h:mm:ss tt")); }); test("parse_float", function () { var str = "134,112.1234"; var val = openerp.base.parse_value(str, {type:"float"}); equal(val, 134112.1234); + var str = "-134,112.1234"; + var val = openerp.base.parse_value(str, {type:"float"}); + equal(val, -134112.1234); }); }); \ No newline at end of file diff --git a/addons/base/static/test/test.html b/addons/base/static/test/test.html index 9c741eb5336..957456f4280 100644 --- a/addons/base/static/test/test.html +++ b/addons/base/static/test/test.html @@ -14,7 +14,11 @@ - + + + + + From b44295bba90d1e853d0a73df3a42a6b64ba718fc Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 31 Aug 2011 14:45:38 +0200 Subject: [PATCH 30/30] [IMP] Many improvements to form frame rendering (with computation algorithm) bzr revid: fme@openerp.com-20110831124538-xt3px1rv8ys181se --- addons/base/static/src/css/base.css | 3 ++ addons/base/static/src/js/form.js | 56 ++++++++++++++++++++--------- addons/base/static/src/xml/base.xml | 13 +++---- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 4133a9c8623..a33bdce973b 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -931,6 +931,9 @@ label.error { margin: 3px 4px 3px 1px; height: 15px; } +.openerp .oe_form_frame_cell.oe_form_separator_vertical { + border-left: 1px solid #666; +} .openerp td.required input, .openerp td.required select { background-color: #D2D2FF !important; } diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index e2a99e9b8c5..11ddc1a3850 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -83,9 +83,11 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormVi this.$form_header.find('button.oe_form_button_cancel').click(this.do_cancel); this.$form_header.find('button.oe_form_button_new').click(this.on_button_new); - this.$form_header.find('button.oe_get_xml_view').click(function() { - $('' + openerp.base.json_node_to_xml(self.fields_view.arch, true) + '').dialog({ width: '95%', height: 600}); - }); + if (this.session.debug) { + this.$form_header.find('button.oe_get_xml_view').click(function() { + $('' + openerp.base.json_node_to_xml(self.fields_view.arch, true) + '').dialog({ width: '95%', height: 600}); + }); + } if (this.options.sidebar && this.options.sidebar_id) { this.sidebar = new openerp.base.Sidebar(this, this.options.sidebar_id); @@ -577,17 +579,23 @@ openerp.base.form.Widget = openerp.base.Widget.extend({ this.view.widgets[this.element_id] = this; this.children = node.children; - this.colspan = parseInt(node.attrs.colspan || 1); + this.colspan = parseInt(node.attrs.colspan || 1, 10); + this.decrease_max_width = 0; this.string = this.string || node.attrs.string; this.help = this.help || node.attrs.help; this.invisible = this.modifiers['invisible'] === true; + this.classname = 'oe_form_' + this.type; + + this.width = this.node.attrs.width; }, start: function() { this.$element = $('#' + this.element_id); }, stop: function() { - this.$element.remove(); + if (this.$element) { + this.$element.remove(); + } }, process_modifiers: function() { var compute_domain = openerp.base.form.compute_domain; @@ -608,7 +616,7 @@ openerp.base.form.WidgetFrame = openerp.base.form.Widget.extend({ template: 'WidgetFrame', init: function(view, node) { this._super(view, node); - this.columns = node.attrs.col || 4; + this.columns = parseInt(node.attrs.col || 4, 10); this.x = 0; this.y = 0; this.table = []; @@ -634,15 +642,21 @@ openerp.base.form.WidgetFrame = openerp.base.form.Widget.extend({ return row; }, set_row_cells_with: function(row) { + var bypass = 0, + max_width = 100; + for (var i = 0; i < row.length; i++) { + bypass += row[i].width === undefined ? 0 : 1; + max_width -= row[i].decrease_max_width; + } + var size_unit = Math.round(max_width / (this.columns - bypass)), + colspan_sum = 0; for (var i = 0; i < row.length; i++) { var w = row[i]; - if (w.is_field_label) { - w.width = "1%"; - if (row[i + 1]) { - row[i + 1].width = Math.round((100 / this.columns) * (w.colspan + 1) - 1) + '%'; - } - } else if (w.width === undefined) { - w.width = Math.round((100 / this.columns) * w.colspan) + '%'; + colspan_sum += w.colspan; + if (w.width === undefined) { + var width = (i === row.length - 1 && colspan_sum === this.columns) ? max_width : Math.round(size_unit * w.colspan); + max_width -= width; + w.width = width + '%'; } } }, @@ -732,6 +746,11 @@ openerp.base.form.WidgetSeparator = openerp.base.form.Widget.extend({ init: function(view, node) { this._super(view, node); this.template = "WidgetSeparator"; + this.orientation = node.attrs.orientation || 'horizontal'; + if (this.orientation === 'vertical') { + this.width = '1'; + } + this.classname += '_' + this.orientation; } }); @@ -795,14 +814,15 @@ openerp.base.form.WidgetLabel = openerp.base.form.Widget.extend({ this._super(view, node); // TODO fme: support for attrs.align - if (this.node.tag == 'label' && this.node.attrs.colspan) { - this.is_field_label = false; + if (this.node.tag == 'label' && (this.node.attrs.colspan || (this.string && this.string.length > 32))) { this.template = "WidgetParagraph"; - this.colspan = this.node.attrs.colspan; + this.colspan = parseInt(this.node.attrs.colspan || 1, 10); } else { - this.is_field_label = true; this.template = "WidgetLabel"; this.colspan = 1; + this.width = '1%'; + this.decrease_max_width = 1; + this.nowrap = true; } }, render: function () { @@ -844,6 +864,8 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ this.required = this.modifiers['required'] === true; this.invalid = false; this.dirty = false; + + this.classname = 'oe_form_field_' + this.type; }, start: function() { this._super.apply(this, arguments); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index c6bd9a1ee19..b308d1c7856 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -622,7 +622,7 @@
-

+