From 9762c519edb89367a26cc8d696566813cd3fa731 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 09:06:40 +0100 Subject: [PATCH 01/86] Fixed two "Invalid function definition" (mst use store={object:(fnct, fields, priority)} bzr revid: olt@tinyerp.com-20081215080640-d0dabqxwojx2kgx4 --- addons/membership/membership.py | 2 +- addons/mrp_operations/mrp_operations.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/membership/membership.py b/addons/membership/membership.py index 9752fcd7737..a1480201dc8 100644 --- a/addons/membership/membership.py +++ b/addons/membership/membership.py @@ -437,7 +437,7 @@ class Partner(osv.osv): # 'membership_state': fields.function(_membership_state, method=True, string='Current membership state', # type='selection', selection=STATE, fnct_search=_membership_state_search), 'membership_state': fields.function(_membership_state, method=True, string='Current membership state', - type='selection',selection=STATE,store={'account.invoice':(_membership_state_search_inv,['state'])}), + type='selection',selection=STATE,store={'account.invoice':(_membership_state_search_inv,['state'], 10)}), # 'associate_member': fields.many2one('res.partner', 'Associate member'), 'free_member': fields.boolean('Free member'), 'membership_start': fields.function(_membership_start, method=True, diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py index 923a5a5d600..72316aca8bd 100755 --- a/addons/mrp_operations/mrp_operations.py +++ b/addons/mrp_operations/mrp_operations.py @@ -294,7 +294,7 @@ class mrp_operations_operation(osv.osv): 'code_id':fields.many2one('mrp_operations.operation.code','Code',required=True), 'date_start': fields.datetime('Start Date'), 'date_finished': fields.datetime('End Date'), - 'order_date': fields.function(_get_order_date,method=True,string='Order Date',type='date',store={'mrp.production':(_order_date_search_production,['date_planned'])}), + 'order_date': fields.function(_get_order_date,method=True,string='Order Date',type='date',store={'mrp.production':(_order_date_search_production,['date_planned'], 10)}), } _defaults={ 'date_start': lambda *a:DateTime.now().strftime('%Y-%m-%d %H:%M:%S') From 367a131bed07bf368d7e7d8bec1c243aa70f1022 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 10:16:30 +0100 Subject: [PATCH 02/86] Fixed a bad identifier: 'inv' -> 'invoice' bzr revid: olt@tinyerp.com-20081215091630-ztcb3wxnpg9zz1xe --- addons/account/invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 7307a2fbd3b..b995014bd23 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -836,7 +836,7 @@ class account_invoice(osv.osv): } lines = [(0, 0, l1), (0, 0, l2)] - move = {'ref': inv.number, 'line_id': lines, 'journal_id': pay_journal_id, 'period_id': period_id, 'date': date} + move = {'ref': invoice.number, 'line_id': lines, 'journal_id': pay_journal_id, 'period_id': period_id, 'date': date} move_id = self.pool.get('account.move').create(cr, uid, move) line_ids = [] From cbce9e585d095bbd786d1937846c2ab01e134a76 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 11:41:24 +0100 Subject: [PATCH 03/86] bugfixes: * 'account.move': trying to create one without 'name' * 'account.move.line': trying to create one without 'currency_id' bzr revid: olt@tinyerp.com-20081215104124-ah9j16sqrvozi7cc --- addons/account/account_move_line.py | 5 +++++ addons/account/invoice.py | 4 ++++ addons/account/wizard/wizard_pay_invoice.py | 1 - 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index ffef364ae37..18c9930b244 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -850,6 +850,7 @@ class account_move_line(osv.osv): if journal.analytic_journal_id: vals['analytic_lines'] = [(0,0, { 'name': vals['name'], + 'currency_id': account.company_id.currency_id.id, 'date': vals.get('date', time.strftime('%Y-%m-%d')), 'account_id': vals['analytic_account_id'], 'unit_amount':'quantity' in vals and vals['quantity'] or 1.0, @@ -860,6 +861,10 @@ class account_move_line(osv.osv): })] else: raise osv.except_osv(_('No analytic journal !'), _('Please set an analytic journal on this financial journal !')) + + #if not 'currency_id' in vals: + # vals['currency_id'] = account.company_id.currency_id.id + result = super(osv.osv, self).create(cr, uid, vals, context) # CREATE Taxes if 'account_tax_id' in vals and vals['account_tax_id']: diff --git a/addons/account/invoice.py b/addons/account/invoice.py index b995014bd23..8f33c013bd0 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -616,6 +616,10 @@ class account_invoice(osv.osv): move['period_id'] = period_id for i in line: i[2]['period_id'] = period_id + + if not 'name' in move: + move['name'] = inv.name + move_id = self.pool.get('account.move').create(cr, uid, move) new_move_name = self.pool.get('account.move').browse(cr, uid, move_id).name # make the invoice point to that move diff --git a/addons/account/wizard/wizard_pay_invoice.py b/addons/account/wizard/wizard_pay_invoice.py index bec4a3c164f..417de8e5212 100644 --- a/addons/account/wizard/wizard_pay_invoice.py +++ b/addons/account/wizard/wizard_pay_invoice.py @@ -60,7 +60,6 @@ def _pay_and_reconcile(self, cr, uid, data, context): ctx = {'date':data['form']['date']} amount = cur_obj.compute(cr, uid, journal.currency.id, invoice.company_id.currency_id.id, amount, context=ctx) - # Take the choosen date if form.has_key('comment'): context={'date_p':form['date'],'comment':form['comment']} From 5ef9a695262841f04002c0f8d8de0710d1ff61b5 Mon Sep 17 00:00:00 2001 From: apa-tiny Date: Mon, 15 Dec 2008 16:17:29 +0530 Subject: [PATCH 04/86] modify hr_expense report-vir bzr revid: patelamit2003@gmail.com-20081215104729-r3ssnb7yvp8zrmsv --- addons/hr_expense/report/expense.rml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/addons/hr_expense/report/expense.rml b/addons/hr_expense/report/expense.rml index 7c1ecd03635..fe6714ab8cb 100644 --- a/addons/hr_expense/report/expense.rml +++ b/addons/hr_expense/report/expense.rml @@ -213,40 +213,33 @@ - - [[ format(line.analytic_account and line.analytic_account.complete_name or removeParentNode('tr')) ]] + [[ line.analytic_account and line.analytic_account.complete_name or removeParentNode('tr') ]] - - - - - - @@ -297,4 +290,4 @@ This document must be dated and signed for reimbursment - + \ No newline at end of file From f0f0b55df3f3e9a7acb8fa5727a5c5e0bc3afefc Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 11:56:18 +0100 Subject: [PATCH 05/86] [FIX] unicode problems lp bug: https://launchpad.net/bugs/307908 fixed bzr revid: christophe@cobalt-20081215105618-c9ifz3x4pepvwkeb --- addons/crm_profiling/crm_profiling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/crm_profiling/crm_profiling.py b/addons/crm_profiling/crm_profiling.py index c5a8b118b0f..708294490f5 100644 --- a/addons/crm_profiling/crm_profiling.py +++ b/addons/crm_profiling/crm_profiling.py @@ -137,11 +137,11 @@ class questionnaire(osv.osv): quest_fields={} quest_form='''
''' % _('Questionnaire') - for x in result: - quest_form = quest_form + '''''' - quest_fields['quest_form'+str(x[1])] = {'string': str(x[0]), 'type': 'many2one', 'relation': 'crm_profiling.answer', 'domain': [('question_id','=',x[1])] } + for name, oid in result: + quest_form = quest_form + '' % (oid,) + quest_fields['quest_form%d' % (oid,)] = {'string': name, 'type': 'many2one', 'relation': 'crm_profiling.answer', 'domain': [('question_id','=',oid)] } quest_form = quest_form + '''''' - return quest_form,quest_fields + return quest_form, quest_fields _columns = { 'name': fields.char("Questionnaire",size=128, required=True), From 077e97c5d8b621183b0f15b76fab48fcf4f717ea Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 12:41:34 +0100 Subject: [PATCH 06/86] Bugfix: 'account.move.line': trying to create one without 'name' bzr revid: olt@tinyerp.com-20081215114134-anj9f1yu70n8yg2i --- addons/account/invoice.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 8f33c013bd0..b1694169646 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -839,6 +839,10 @@ class account_invoice(osv.osv): 'ref':invoice.number, } + name = invoice.invoice_line[0].name + l1['name'] = name + l2['name'] = name + lines = [(0, 0, l1), (0, 0, l2)] move = {'ref': invoice.number, 'line_id': lines, 'journal_id': pay_journal_id, 'period_id': period_id, 'date': date} move_id = self.pool.get('account.move').create(cr, uid, move) From 4297d5a743766328d9de02df8a6b20c6508bf7f7 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 12:46:57 +0100 Subject: [PATCH 07/86] wrong identifier: frags -> fargs bzr revid: olt@tinyerp.com-20081215114657-7do9gloamn3esv9y --- addons/account/account_move_line.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 18c9930b244..ef63c5e6890 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -273,7 +273,7 @@ class account_move_line(osv.osv): while i < len(args): fargs = args[i][0].split('.', 1) if len(fargs) > 1: - args[i] = (frags[0], 'in', invoice_obj.search(cursor, user, + args[i] = (fargs[0], 'in', invoice_obj.search(cursor, user, [(fargs[1], args[i][1], args[i][2])])) i += 1 continue From 05c0ca772168dfc9ba33273dc00cc34a540dd21f Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Mon, 15 Dec 2008 17:18:52 +0530 Subject: [PATCH 08/86] fix the problem of analytic account with the voucher entry improve the voucher entry system lp bug: https://launchpad.net/bugs/296760 fixed bzr revid: mga@tinyerp.com-20081215114852-j5gij01eby4p0gqg --- .../account_voucher_sequence.xml | 56 ++---- addons/account_voucher/voucher.py | 176 ++++++++++++------ addons/account_voucher/voucher_view.xml | 2 +- 3 files changed, 135 insertions(+), 99 deletions(-) diff --git a/addons/account_voucher/account_voucher_sequence.xml b/addons/account_voucher/account_voucher_sequence.xml index 70e804de8c6..b8935e76182 100644 --- a/addons/account_voucher/account_voucher_sequence.xml +++ b/addons/account_voucher/account_voucher_sequence.xml @@ -1,7 +1,7 @@ - + Voucher account.voucher @@ -12,32 +12,32 @@ --> Account Cash Received Voucher - account.voucher.rec_voucher + rec_voucher Account Cash Payble Voucher - account.voucher.pay_voucher + pay_voucher Account Bank Received Voucher - account.voucher.bank_rec_voucher + bank_rec_voucher Account Bank Payble Voucher - account.voucher.bank_pay_voucher + bank_pay_voucher Account Contra Voucher - account.voucher.cont_voucher + cont_voucher - Account Journal Voucher - account.voucher.journal_sale_vou + Sales Journal Voucher + journal_sale_voucher - Account Journal Voucher - account.voucher.journal_pur_vou + Purchase Journal Voucher + journal_pur_voucher Account Cash Received Voucher - account.voucher.rec_voucher + rec_voucher %(year)s/ Account Cash Payble Voucher - account.voucher.pay_voucher + pay_voucher %(year)s/ Account Bank Received Voucher - account.voucher.bank_rec_voucher + bank_rec_voucher %(year)s/ Account Bank Payble Voucher - account.voucher.bank_pay_voucher + bank_pay_voucher %(year)s/ Account Contra Voucher - account.voucher.cont_voucher + cont_voucher %(year)s/ - Account Journal Voucher - account.voucher.journal_sale_vou + Sales Journal Voucher + journal_sale_voucher %(year)s/ - Account Journal Voucher - account.voucher.journal_pur_vou + Purchase Journal Voucher + journal_pur_voucher %(year)s/ - diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py index c8f3660cd7e..611edebfc92 100755 --- a/addons/account_voucher/voucher.py +++ b/addons/account_voucher/voucher.py @@ -82,7 +82,7 @@ class account_voucher(osv.osv): ('rec_voucher','Cash Receipt Voucher'), ('bank_rec_voucher','Bank Receipt Voucher'), ('cont_voucher','Contra Voucher'), - ('journal_sale_vou','Journal Sale Voucher'), + ('journal_sale_voucher','Journal Sale Voucher'), ('journal_pur_voucher','Journal Purchase Voucher'), ],'Type', readonly=True, select=True), 'date':fields.date('Date', readonly=True, states={'draft':[('readonly',False)]}), @@ -99,7 +99,7 @@ class account_voucher(osv.osv): ('posted','Posted'), ('cancel','Cancel') ], 'State', - readonly=True), + readonly=True, size=32), 'amount':fields.float('Amount'), 'number':fields.char('Number', size=32, readonly=True), 'reference': fields.char('Voucher Reference', size=64), @@ -110,7 +110,6 @@ class account_voucher(osv.osv): } _defaults = { - #'journal_id':get_bank, 'state': lambda *a: 'draft', 'date' : lambda *a: time.strftime('%Y-%m-%d'), 'period_id': _get_period, @@ -142,16 +141,13 @@ class account_voucher(osv.osv): if journal_id and (type in ('rec_voucher','bank_rec_voucher','journal_pur_voucher')): account_id = journal.browse(cr, uid, journal_id).default_debit_account_id return {'value':{'account_id':account_id.id}} - elif journal_id and (type in ('pay_voucher','bank_pay_voucher','journal_sale_vou')) : + elif journal_id and (type in ('pay_voucher','bank_pay_voucher','journal_sale_voucher')) : account_id = journal.browse(cr, uid, journal_id).default_credit_account_id return {'value':{'account_id':account_id.id}} else: account_id = journal.browse(cr, uid, journal_id).default_credit_account_id return {'value':{'account_id':account_id.id}} - - - - + def open_voucher(self, cr, uid, ids, context={}): obj=self.pool.get('account.voucher').browse(cr,uid,ids) total=0 @@ -203,16 +199,16 @@ class account_voucher(osv.osv): for il in iml: if il['account_analytic_id']: - if inv.type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_vou','journal_pur_voucher'): + if inv.type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_voucher','journal_pur_voucher'): ref = inv.reference else: ref = self._convert_ref(cr, uid, inv.number) - il['analytic_lines'] = [(0,0, { + + il['analytic_lines'] = [(0, 0, { 'name': il['name'], 'date': inv['date'], 'account_id': il['account_analytic_id'], 'amount': inv['amount'] * sign, - #'partner_id': il['partner_id'] or False, 'general_account_id': il['account_id'] or False, 'journal_id': self.pool.get('account.voucher').browse(cr, uid, id).journal_id.analytic_journal_id.id or False, 'ref': ref, @@ -222,43 +218,41 @@ class account_voucher(osv.osv): def action_move_line_create(self, cr, uid, ids, *args): for inv in self.browse(cr, uid, ids): - if inv.move_id: continue - company_currency = inv.company_id.currency_id.id - - # create the analytical lines + line_ids = self.read(cr, uid, [inv.id], ['payment_ids'])[0]['payment_ids'] ils = self.pool.get('account.voucher.line').read(cr, uid, line_ids) - # one move line per invoice line + iml = self._get_analytic_lines(cr, uid, inv.id) - # check if taxes are all computed + diff_currency_p = inv.currency_id.id <> company_currency - # create one move line for the total and possibly adjust the other lines amount + total = 0 - if inv.type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_vou','journal_pur_voucher'): + if inv.type in ('pay_voucher', 'journal_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_voucher','journal_pur_voucher'): ref = inv.reference else: ref = self._convert_ref(cr, uid, inv.number) + date = inv.date total_currency = 0 for i in iml: + partner_id=i['partner_id'] + acc_id = i['account_id'] if inv.currency_id.id != company_currency: i['currency_id'] = inv.currency_id.id i['amount_currency'] = i['amount'] else: i['amount_currency'] = False i['currency_id'] = False - i['ref'] = ref - if inv.type in ('rec_voucher','bank_rec_voucher','journal_pur_voucher'): + if inv.type in ('rec_voucher','bank_rec_voucher','journal_pur_voucher','journal_voucher'): total += i['amount'] total_currency += i['amount_currency'] or i['amount'] i['amount'] = - i['amount'] else: total -= i['amount'] total_currency -= i['amount_currency'] or i['amount'] - acc_id = inv.account_id.id name = inv['name'] or '/' totlines = False @@ -266,39 +260,104 @@ class account_voucher(osv.osv): iml.append({ 'type': 'dest', 'name': name, - 'amount': total, + 'amount': total or False, 'account_id': acc_id, 'amount_currency': diff_currency_p \ and total_currency or False, 'currency_id': diff_currency_p \ and inv.currency_id.id or False, - 'ref': ref + 'ref': ref, + 'partner_id':partner_id or False, }) date = inv.date inv.amount=total - line = map(lambda x:(0, 0, self.line_get_convert(cr, uid, x,date, context={})), iml) - - journal_id = inv.journal_id.id #self._get_journal(cr, uid, {'type': inv['type']}) + line = map(lambda x:(0,0,self.line_get_convert(cr, uid, x,date, context={})) ,iml) + an_journal_id=inv.journal_id.analytic_journal_id.id + journal_id = inv.journal_id.id + journal = self.pool.get('account.journal').browse(cr, uid, journal_id) if journal.sequence_id: name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) - move = {'name': name, 'line_id': line, 'journal_id': journal_id} + move = {'name': name, 'journal_id': journal_id} if inv.period_id: move['period_id'] = inv.period_id.id for i in line: i[2]['period_id'] = inv.period_id.id move_id = self.pool.get('account.move').create(cr, uid, move) + ref=move['name'] + amount=0.0 + + #create the first line our self + move_line = { + 'name': inv.name, + 'debit': False, + 'credit':False, + 'account_id': inv.account_id.id or False, + 'move_id':move_id , + 'journal_id':journal_id , + 'period_id':inv.period_id.id, + 'partner_id': False, + 'ref': ref, + 'date': inv.date + } + if inv.type in ('rec_voucher', 'bank_rec_voucher', 'journal_pur_voucher', 'journal_voucher'): + move_line['debit'] = inv.amount + else: + move_line['credit'] = inv.amount * (-1) + self.pool.get('account.move.line').create(cr, uid, move_line) + + for line in inv.payment_ids: + + move_line = { + 'name':line.name, + 'debit':False, + 'credit':False, + 'account_id':line.account_id.id or False, + 'move_id':move_id , + 'journal_id':journal_id , + 'period_id':inv.period_id.id, + 'partner_id':line.partner_id.id or False, + 'ref':ref, + 'date':inv.date + } + + if line.type == 'dr': + move_line['debit'] = line.amount or False + amount=line.amount + elif line.type == 'cr': + move_line['credit'] = line.amount or False + amount=line.amount * (-1) + ml_id=self.pool.get('account.move.line').create(cr, uid, move_line) + + if inv.narration: + line.name=inv.narration + else: + line.name=line.name + + an_line = { + 'name':line.name, + 'date':inv.date, + 'amount':amount, + 'account_id':line.account_analytic_id.id or False, + 'move_id':ml_id, + 'journal_id':an_journal_id , + 'general_account_id':line.account_id.id, + 'ref':ref + } + self.pool.get('account.analytic.line').create(cr,uid,an_line) + self.write(cr, uid, [inv.id], {'move_id': move_id}) - obj=self.pool.get('account.move').browse(cr,uid,move_id) + obj=self.pool.get('account.move').browse(cr, uid, move_id) + for line in obj.line_id : - cr.execute('insert into voucher_id (account_id,rel_account_move) values (%s, %s)',(int(ids[0]),int(line.id))) - + cr.execute('insert into voucher_id (account_id,rel_account_move) values (%d, %d)',(int(ids[0]),int(line.id))) + return True - + def line_get_convert(self, cr, uid, x, date, context={}): return { 'date':date, @@ -326,9 +385,9 @@ class account_voucher(osv.osv): for (id, invtype, number, move_id, reference) in cr.fetchall(): if not number: number = self.pool.get('ir.sequence').get(cr, uid, - 'account.voucher.' + invtype) + invtype) - if type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_vou','journal_pur_voucher'): + if type in ('pay_voucher', 'rec_voucher','cont_voucher','bank_pay_voucher','bank_rec_voucher','journal_sale_voucher','journal_pur_voucher'): ref = reference else: ref = self._convert_ref(cr, uid, number) @@ -344,21 +403,18 @@ class account_voucher(osv.osv): (ref, move_id)) return True - - def name_get(self, cr, uid, ids, context={}): if not len(ids): return [] types = { - 'pay_voucher': 'CPV: ', - 'rec_voucher': 'CRV: ', - 'cont_voucher': 'CV: ', - 'bank_pay_voucher': 'BPV: ', - 'bank_rec_voucher': 'BRV: ', - 'journal_sale_vou': 'JSV: ', - 'journal_pur_voucher': 'JPV: ', - - } + 'pay_voucher': 'CPV: ', + 'rec_voucher': 'CRV: ', + 'cont_voucher': 'CV: ', + 'bank_pay_voucher': 'BPV: ', + 'bank_rec_voucher': 'BRV: ', + 'journal_sale_voucher': 'JSV: ', + 'journal_pur_voucher': 'JPV: ', + } return [(r['id'], types[r['type']]+(r['number'] or '')+' '+(r['name'] or '')) for r in self.read(cr, uid, ids, ['type', 'number', 'name'], context, load='_classic_write')] def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): @@ -426,12 +482,11 @@ class VoucherLine(osv.osv): res.append(self.move_line_get_item(cr, uid, line, context)) return res - def onchange_partner(self, cr, uid, ids, partner_id, type,type1): + def onchange_partner(self, cr, uid, ids, partner_id, type, type1): if not partner_id: return {'value' : {'account_id' : False, 'type' : False ,'amount':False}} obj = self.pool.get('res.partner') account_id = False - if type1 in ('rec_voucher','bank_rec_voucher'): account_id = obj.browse(cr, uid, partner_id).property_account_receivable balance=obj.browse(cr,uid,partner_id).credit @@ -440,12 +495,11 @@ class VoucherLine(osv.osv): account_id = obj.browse(cr, uid, partner_id).property_account_payable balance=obj.browse(cr,uid,partner_id).debit type = 'dr' - elif type1 in ('journal_sale_vou') : + elif type1 in ('journal_sale_voucher') : account_id = obj.browse(cr, uid, partner_id).property_account_receivable balance=obj.browse(cr,uid,partner_id).credit type = 'dr' - - elif type1 in ('journal_pur_vou') : + elif type1 in ('journal_pur_voucher') : account_id = obj.browse(cr, uid, partner_id).property_account_payable balance=obj.browse(cr,uid,partner_id).debit type = 'cr' @@ -474,7 +528,7 @@ class VoucherLine(osv.osv): account_id = obj.browse(cr, uid, partner_id).property_account_payable type = 'dr' - elif type1 in ('journal_sale_vou') : + elif type1 in ('journal_sale_voucher') : if amount < 0 : account_id = obj.browse(cr, uid, partner_id).property_account_payable type = 'cr' @@ -482,7 +536,7 @@ class VoucherLine(osv.osv): account_id = obj.browse(cr, uid, partner_id).property_account_receivable type = 'dr' - elif type1 in ('journal_pur_vou') : + elif type1 in ('journal_pur_voucher') : if amount< 0 : account_id = obj.browse(cr, uid, partner_id).property_account_receivable type = 'dr' @@ -516,7 +570,7 @@ class VoucherLine(osv.osv): account_id = obj.browse(cr, uid, partner_id).property_account_payable amount*=1 - elif type1 in ('journal_sale_vou') : + elif type1 in ('journal_sale_voucher') : if type == 'cr' : account_id = obj.browse(cr, uid, partner_id).property_account_payable amount*=-1 @@ -524,7 +578,7 @@ class VoucherLine(osv.osv): account_id = obj.browse(cr, uid, partner_id).property_account_receivable amount*=1 - elif type1 in ('journal_pur_vou') : + elif type1 in ('journal_pur_voucher') : if type == 'dr' : account_id = obj.browse(cr, uid, partner_id).property_account_receivable amount*=-1 @@ -539,12 +593,12 @@ class VoucherLine(osv.osv): def move_line_get_item(self, cr, uid, line, context={}): return { - 'type':'src', - 'name': line.name[:64], - 'amount':line.amount, - 'account_id':line.account_id.id, - 'partner_id':line.partner_id.id or False , - 'account_analytic_id':line.account_analytic_id.id or False, - } + 'type':'src', + 'name': line.name[:64], + 'amount':line.amount, + 'account_id':line.account_id.id, + 'partner_id':line.partner_id.id or False , + 'account_analytic_id':line.account_analytic_id.id or False, + } VoucherLine() diff --git a/addons/account_voucher/voucher_view.xml b/addons/account_voucher/voucher_view.xml index 872d831fa79..7f5cf40cd32 100755 --- a/addons/account_voucher/voucher_view.xml +++ b/addons/account_voucher/voucher_view.xml @@ -35,7 +35,7 @@ - + From 86ece830538feff751d60ee477e20e26ac09b6b0 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 12:57:55 +0100 Subject: [PATCH 09/86] Bugfix: account.move without 'name' bzr revid: olt@tinyerp.com-20081215115755-v8qvzenx5sbml988 --- addons/account/invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index b1694169646..3987d190f16 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -618,7 +618,7 @@ class account_invoice(osv.osv): i[2]['period_id'] = period_id if not 'name' in move: - move['name'] = inv.name + move['name'] = inv.name or '/' move_id = self.pool.get('account.move').create(cr, uid, move) new_move_name = self.pool.get('account.move').browse(cr, uid, move_id).name From aca4388202310eefda0deb386d4b4a840371a56c Mon Sep 17 00:00:00 2001 From: Jay Vora Date: Mon, 15 Dec 2008 17:34:01 +0530 Subject: [PATCH 10/86] Misc. changes bzr revid: jvo@tinyerp.com-20081215120401-g8x1llt6dtlfqnfj --- addons/account/account.py | 1 - addons/account/account_move_line.py | 1 - 2 files changed, 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index d80c77df52c..997fe2b3c59 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -832,7 +832,6 @@ class account_move(osv.osv): if 'line_id' in vals: c = context.copy() c['novalidate'] = True - print 'XXXXXXXXXXXXXXXXXXX : ',vals result = super(account_move, self).create(cr, uid, vals, c) self.validate(cr, uid, [result], context) else: diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index ef63c5e6890..be15a444ad7 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -728,7 +728,6 @@ class account_move_line(osv.osv): if vals.get('date', False): todo_date = vals['date'] del vals['date'] - print 'Writing', vals, 'to move_line', ids result = super(account_move_line, self).write(cr, uid, ids, vals, context) if check: From 55251a498e5f25f2a2fd00323993837d48a0fee2 Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 15 Dec 2008 17:37:28 +0530 Subject: [PATCH 11/86] Tax array added while amount is zero [done by vir] bzr revid: sahibsofia@gmail.com-20081215120728-sbbwcclm6eyrx3tj --- addons/account/report/invoice.rml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/account/report/invoice.rml b/addons/account/report/invoice.rml index 6247ca00818..e1a65319898 100644 --- a/addons/account/report/invoice.rml +++ b/addons/account/report/invoice.rml @@ -327,7 +327,7 @@ [[ l.name ]] - [[ ', '.join([lt.name for lt in l.invoice_line_tax_id]) or '0.00' ]] + [[ ', '.join([lt.name for lt in l.invoice_line_tax_id]) or '' ]] [[ formatLang(l.quantity) or '0.00' ]] @@ -463,7 +463,7 @@ - [[ format(o.amount_tax or removeParentNode('blockTable')) ]] + @@ -491,10 +491,10 @@ [[ t.name ]] - [[ formatLang(t.base) ]] + [[ formatLang(t.base) or '0.00' ]] - [[ formatLang(t.amount) or 0.00 ]] + [[ formatLang(t.amount) or '0.00' ]] @@ -559,4 +559,4 @@ - + \ No newline at end of file From 90f334cfcf60d62d5192488cfa6d98aeabaada28 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Mon, 15 Dec 2008 17:39:18 +0530 Subject: [PATCH 12/86] fixing for the analytic account in voucher entry bzr revid: mga@tinyerp.com-20081215120918-737pk2agyia6534o --- addons/account_voucher/voucher.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py index 611edebfc92..287bb2c8353 100755 --- a/addons/account_voucher/voucher.py +++ b/addons/account_voucher/voucher.py @@ -331,6 +331,7 @@ class account_voucher(osv.osv): elif line.type == 'cr': move_line['credit'] = line.amount or False amount=line.amount * (-1) + ml_id=self.pool.get('account.move.line').create(cr, uid, move_line) if inv.narration: @@ -338,17 +339,18 @@ class account_voucher(osv.osv): else: line.name=line.name - an_line = { - 'name':line.name, - 'date':inv.date, - 'amount':amount, - 'account_id':line.account_analytic_id.id or False, - 'move_id':ml_id, - 'journal_id':an_journal_id , - 'general_account_id':line.account_id.id, - 'ref':ref - } - self.pool.get('account.analytic.line').create(cr,uid,an_line) + if line.account_analytic_id: + an_line = { + 'name':line.name, + 'date':inv.date, + 'amount':amount, + 'account_id':line.account_analytic_id.id or False, + 'move_id':ml_id, + 'journal_id':an_journal_id , + 'general_account_id':line.account_id.id, + 'ref':ref + } + self.pool.get('account.analytic.line').create(cr,uid,an_line) self.write(cr, uid, [inv.id], {'move_id': move_id}) obj=self.pool.get('account.move').browse(cr, uid, move_id) From 8f688adaa99e7f71c7eb1ad318d8d80399e52cbe Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 13:15:02 +0100 Subject: [PATCH 13/86] .has_key() is deprecated, use 'in' bzr revid: olt@tinyerp.com-20081215121502-f1e6onelzbtwjzo6 --- addons/account/invoice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 3987d190f16..fb25b7b8f02 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -497,7 +497,7 @@ class account_invoice(osv.osv): total_currency = 0 key_line=[] for i in iml: - if i.has_key('account_id') and i.has_key('taxes'): + if 'account_id' in i and 'taxes' in i: if not (i['account_id'],i['taxes']) in key_line: key_line.append((i['account_id'],i['taxes'])) if inv.currency_id.id != company_currency: @@ -528,7 +528,7 @@ class account_invoice(osv.osv): if acc_obj.browse(cr,uid,item[0]).merge_invoice: repeat=False for move_line in iml: - if (move_line.has_key('account_id') and move_line['account_id']==item[0]) and (move_line.has_key('taxes') and move_line['taxes']==item[1]): + if (move_line.has_key('account_id') and move_line['account_id']==item[0]) and ('taxes' in move_line and move_line['taxes']==item[1]): move_list.append(move_line) if repeat: for key in move_line: @@ -820,7 +820,7 @@ class account_invoice(osv.osv): types = {'out_invoice': -1, 'in_invoice': 1, 'out_refund': 1, 'in_refund': -1} direction = types[invoice.type] #take the choosen date - if context.has_key('date_p') and context['date_p']: + if 'date_p' in context and context['date_p']: date=context['date_p'] else: date=time.strftime('%Y-%m-%d') From 2162b414fdd1cabc6e1f14f546cbd272cc2ea564 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Mon, 15 Dec 2008 17:47:02 +0530 Subject: [PATCH 14/86] audittrail bug fix bzr revid: mra@tinyerp.com-20081215121702-4lsck9r8yrtsetzz --- addons/audittrail/audittrail_view.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/audittrail/audittrail_view.xml b/addons/audittrail/audittrail_view.xml index ed7ff7294b2..654d060966b 100644 --- a/addons/audittrail/audittrail_view.xml +++ b/addons/audittrail/audittrail_view.xml @@ -76,14 +76,14 @@ - - + + - - + + From a9ddac89a6b4c71bd23c7a285e127de59272d27b Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 13:41:13 +0100 Subject: [PATCH 15/86] Fixed: bad sql query if no inventory location was chosen when trying to set stock to 0. Now a warning dialog appear asking to choose at least one inventory location bzr revid: olt@tinyerp.com-20081215124113-v4omh9enhed60ek4 --- addons/stock/wizard/inventory_merge_zero.py | 32 ++++++++++++--------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/addons/stock/wizard/inventory_merge_zero.py b/addons/stock/wizard/inventory_merge_zero.py index f0ce60b4c22..19648d25dde 100644 --- a/addons/stock/wizard/inventory_merge_zero.py +++ b/addons/stock/wizard/inventory_merge_zero.py @@ -40,7 +40,7 @@ def do_merge(self, cr, uid, data, context): if len(data['ids']) <> 1: raise wizard.except_wizard("Warning", - "Please select one and only one inventory!") + "Please select one and only one inventory !") cr.execute('select distinct location_id from stock_inventory_line where inventory_id=%s', (data['ids'][0],)) loc_ids = map(lambda x: x[0], cr.fetchall()) @@ -49,19 +49,23 @@ def do_merge(self, cr, uid, data, context): cr.execute('select distinct location_id,product_id from stock_inventory_line where inventory_id=%s', (data['ids'][0],)) inv = cr.fetchall() - cr.execute('select distinct product_id from stock_move where (location_dest_id in ('+locs+')) or (location_id in ('+locs+'))') - stock = cr.fetchall() - for s in stock: - for loc in loc_ids: - if (loc,s[0]) not in inv: - p = prod_obj.browse(cr, uid, s[0]) - invent_line_obj.create(cr, uid, { - 'inventory_id': data['ids'][0], - 'location_id': loc, - 'product_id': s[0], - 'product_uom': p.uom_id.id, - 'product_qty': 0.0, - }) + if not inv: + raise wizard.except_wizard("Warning", + "Please select at least one inventory location !") + else: + cr.execute('select distinct product_id from stock_move where (location_dest_id in ('+locs+')) or (location_id in ('+locs+'))') + stock = cr.fetchall() + for s in stock: + for loc in loc_ids: + if (loc,s[0]) not in inv: + p = prod_obj.browse(cr, uid, s[0]) + invent_line_obj.create(cr, uid, { + 'inventory_id': data['ids'][0], + 'location_id': loc, + 'product_id': s[0], + 'product_uom': p.uom_id.id, + 'product_qty': 0.0, + }) return {} From 6af4fbbbed7122479be3045eb3d28d580277818d Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 14:34:16 +0100 Subject: [PATCH 16/86] [FIX] close the db cursor bzr revid: christophe@cobalt-20081215133416-2biod95w2y4qs1hl --- addons/document/ftpserver/abstracted_fs.py | 26 +++++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/addons/document/ftpserver/abstracted_fs.py b/addons/document/ftpserver/abstracted_fs.py index c0f0bdf3407..c83fbb61d05 100644 --- a/addons/document/ftpserver/abstracted_fs.py +++ b/addons/document/ftpserver/abstracted_fs.py @@ -26,14 +26,16 @@ class file_wrapper(StringIO.StringIO): def close(self, *args, **kwargs): db,pool = pooler.get_db_and_pool(self.dbname) cr = db.cursor() - uid =self.uid - val = self.getvalue() - val2 = { - 'datas': base64.encodestring(val), - 'file_size': len(val), - } - pool.get('ir.attachment').write(cr, uid, [self.ressource_id], val2) - cr.commit() + try: + val = self.getvalue() + val2 = { + 'datas': base64.encodestring(val), + 'file_size': len(val), + } + pool.get('ir.attachment').write(cr, self.uid, [self.ressource_id], val2) + finally: + cr.commit() + cr.close() StringIO.StringIO.close(self, *args, **kwargs) class content_wrapper(StringIO.StringIO): @@ -47,10 +49,12 @@ class content_wrapper(StringIO.StringIO): def close(self, *args, **kwargs): db,pool = pooler.get_db_and_pool(self.dbname) cr = db.cursor() - getattr(self.pool.get('document.directory.content'), 'process_write_'+self.node.content.extension[1:])(cr, self.uid, self.node, self.getvalue()) + try: + getattr(self.pool.get('document.directory.content'), 'process_write_'+self.node.content.extension[1:])(cr, self.uid, self.node, self.getvalue()) + finally: + cr.commit() + cr.close() StringIO.StringIO.close(self, *args, **kwargs) - cr.commit() - cr.close() class abstracted_fs: From 929e87aaef0e9005fa336830d6f7ff41aef25487 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 15 Dec 2008 14:36:27 +0100 Subject: [PATCH 17/86] [FIX] base_module_publish: convert module name to string [IMP] base_module_publish: password is hidden bzr revid: christophe@cobalt-20081215133627-1sj43xbav1ehv47b --- .../wizard/base_module_publish.py | 14 +++++++------- addons/base_module_publish/wizard/module_zip.py | 13 +++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/addons/base_module_publish/wizard/base_module_publish.py b/addons/base_module_publish/wizard/base_module_publish.py index 74addefd82c..bfbba7676ad 100644 --- a/addons/base_module_publish/wizard/base_module_publish.py +++ b/addons/base_module_publish/wizard/base_module_publish.py @@ -129,7 +129,7 @@ upload_info_form = ''' align="0.0" colspan="4"/> - + ''' @@ -227,18 +227,18 @@ def _upload(self, cr, uid, datas, context): download = 'http://www.openerp.com/download/modules/'+res['module_filename'] result = post_multipart('www.openerp.com', '/mtree_upload.php', [ - ('login',datas['form']['login']), - ('password',datas['form']['password']), - ('module_name',mod.name) + ('login', datas['form']['login']), + ('password', datas['form']['password']), + ('module_name', str(mod.name)) ], [ ('module', res['module_filename'], res['module_file']) ]) - if result[0] == "1": + if result and result[0] == "1": raise wizard.except_wizard(_('Error'), _('Login failed!')) - elif result[0] == "2": + elif result and result[0] == "2": raise wizard.except_wizard(_('Error'), _('This version of the module is already exist on the server')) - elif result[0] != "0": + elif result and result[0] != "0": raise wizard.except_wizard(_('Error'), _('Failed to upload the file')) updata = { diff --git a/addons/base_module_publish/wizard/module_zip.py b/addons/base_module_publish/wizard/module_zip.py index 4014927bf99..c582358df0a 100644 --- a/addons/base_module_publish/wizard/module_zip.py +++ b/addons/base_module_publish/wizard/module_zip.py @@ -56,21 +56,22 @@ def createzip(cr, uid, moduleid, context, b64enc=True, src=True): _('Can not export module that is not installed!')) ad = tools.config['addons_path'] - if os.path.isdir(os.path.join(ad, module.name)): + name = str(module.name) + if os.path.isdir(os.path.join(ad, name)): archname = StringIO.StringIO('wb') archive = PyZipFile(archname, "w", ZIP_DEFLATED) - archive.writepy(os.path.join(ad, module.name)) - _zippy(archive, ad, module.name, src=src) + archive.writepy(os.path.join(ad, name)) + _zippy(archive, ad, name, src=src) archive.close() val =archname.getvalue() archname.close() - elif os.path.isfile(os.path.join(ad, module.name + '.zip')): - val = file(os.path.join(ad, module.name + '.zip'), 'rb').read() + elif os.path.isfile(os.path.join(ad, name + '.zip')): + val = file(os.path.join(ad, name + '.zip'), 'rb').read() else: raise wizard.except_wizard(_('Error'), _('Could not find the module to export!')) if b64enc: val =base64.encodestring(val) - return {'module_file':val, 'module_filename': module.name + '-' + \ + return {'module_file':val, 'module_filename': name + '-' + \ (module.installed_version or '0') + '.zip'} From ad5c7e4c65b19a2930582dd84c9575338d386e7a Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 15:14:29 +0100 Subject: [PATCH 18/86] tab2space bzr revid: olt@tinyerp.com-20081215141429-tlqzrd0m35uq9vyd --- addons/account/report/account_balance.py | 6 +- addons/account/report/rml_parse.py | 283 +++++++++++------------ 2 files changed, 144 insertions(+), 145 deletions(-) mode change 100755 => 100644 addons/account/report/rml_parse.py diff --git a/addons/account/report/account_balance.py b/addons/account/report/account_balance.py index 85596741a3c..fc178ea3ea4 100755 --- a/addons/account/report/account_balance.py +++ b/addons/account/report/account_balance.py @@ -28,7 +28,6 @@ import datetime from report import report_sxw class account_balance(report_sxw.rml_parse): - _name = 'report.account.account.balance' def __init__(self, cr, uid, name, context): super(account_balance, self).__init__(cr, uid, name, context) @@ -181,11 +180,12 @@ class account_balance(report_sxw.rml_parse): lst_string = '' lst_string = '\'' + '\',\''.join(map(str,acc_id)) + '\'' self.cr.execute("select code,id from account_account where id IN (%s)"%(lst_string)) - a_id = self.cr.fetchall() + a_id = self.cr.fetchall() a_id.sort() ids2 = [x[1] for x in a_id] - + result_acc += self.lines(form, ids2, done, level+1) + return result_acc def date_range(self,start,end): diff --git a/addons/account/report/rml_parse.py b/addons/account/report/rml_parse.py old mode 100755 new mode 100644 index cfb5646e555..7f442485314 --- a/addons/account/report/rml_parse.py +++ b/addons/account/report/rml_parse.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -31,148 +31,147 @@ import sys class rml_parse(report_sxw.rml_parse): - - def __init__(self, cr, uid, name, context): - super(rml_parse, self).__init__(cr, uid, name, context=None) - self.localcontext.update({ - 'comma_me': self.comma_me, - 'format_date': self._get_and_change_date_format_for_swiss, - 'strip_name' : self._strip_name, - 'explode_name' : self._explode_name, - }) + def __init__(self, cr, uid, name, context): + super(rml_parse, self).__init__(cr, uid, name, context=None) + self.localcontext.update({ + 'comma_me': self.comma_me, + 'format_date': self._get_and_change_date_format_for_swiss, + 'strip_name' : self._strip_name, + 'explode_name' : self._explode_name, + }) - def comma_me(self,amount): - #print "#" + str(amount) + "#" - if not amount: - amount = 0.0 - if type(amount) is float : - amount = str('%.2f'%amount) - else : - amount = str(amount) - if (amount == '0'): - return ' ' - orig = amount - new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount) - if orig == new: - return new - else: - return self.comma_me(new) - def _ellipsis(self, string, maxlen=100, ellipsis = '...'): - ellipsis = ellipsis or '' - try: - return string[:maxlen - len(ellipsis) ] + (ellipsis, '')[len(string) < maxlen] - except Exception, e: - return False - def _strip_name(self, name, maxlen=50): - return self._ellipsis(name, maxlen, '...') - - def _get_and_change_date_format_for_swiss (self,date_to_format): - date_formatted='' - if date_to_format: - date_formatted = strptime (date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y') - return date_formatted - - def _explode_name(self,chaine,length): - # We will test if the size is less then account - full_string = '' - if (len(str(chaine)) <= length): - return chaine - # - else: - chaine = unicode(chaine,'utf8').encode('iso-8859-1') - rup = 0 - for carac in chaine: - rup = rup + 1 - if rup == length: - full_string = full_string + '\n' - full_string = full_string + carac - rup = 0 - else: - full_string = full_string + carac - - return full_string - - def makeAscii(self,str): - try: - Stringer = str.encode("utf-8") - except UnicodeDecodeError: - try: - Stringer = str.encode("utf-16") - except UnicodeDecodeError: - print "UTF_16 Error" - Stringer = str - else: - return Stringer - else: - return Stringer - return Stringer - def explode_this(self,chaine,length): - #chaine = self.repair_string(chaine) - chaine = rstrip(chaine) - ast = list(chaine) - i = length - while i <= len(ast): - ast.insert(i,'\n') - i = i + length - chaine = str("".join(ast)) - return chaine - def repair_string(self,chaine): - ast = list(chaine) - UnicodeAst = [] - _previouslyfound = False - i = 0 - #print str(ast) - while i < len(ast): - elem = ast[i] - try: - Stringer = elem.encode("utf-8") - except UnicodeDecodeError: - to_reencode = elem + ast[i+1] - print str(to_reencode) - Good_char = to_reencode.decode('utf-8') - UnicodeAst.append(Good_char) - i += i +2 - else: - UnicodeAst.append(elem) - i += i + 1 - - - return "".join(UnicodeAst) - - def ReencodeAscii(self,str): - print sys.stdin.encoding - try: - Stringer = str.decode("ascii") - except UnicodeEncodeError: - print "REENCODING ERROR" - return str.encode("ascii") - except UnicodeDecodeError: - print "DECODING ERROR" - return str.encode("ascii") - - else: - print Stringer - return Stringer + def comma_me(self,amount): + #print "#" + str(amount) + "#" + if not amount: + amount = 0.0 + if type(amount) is float : + amount = str('%.2f'%amount) + else : + amount = str(amount) + if (amount == '0'): + return ' ' + orig = amount + new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount) + if orig == new: + return new + else: + return self.comma_me(new) + def _ellipsis(self, string, maxlen=100, ellipsis = '...'): + ellipsis = ellipsis or '' + try: + return string[:maxlen - len(ellipsis) ] + (ellipsis, '')[len(string) < maxlen] + except Exception, e: + return False + def _strip_name(self, name, maxlen=50): + return self._ellipsis(name, maxlen, '...') + + def _get_and_change_date_format_for_swiss (self,date_to_format): + date_formatted='' + if date_to_format: + date_formatted = strptime (date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y') + return date_formatted + + def _explode_name(self,chaine,length): + # We will test if the size is less then account + full_string = '' + if (len(str(chaine)) <= length): + return chaine + # + else: + chaine = unicode(chaine,'utf8').encode('iso-8859-1') + rup = 0 + for carac in chaine: + rup = rup + 1 + if rup == length: + full_string = full_string + '\n' + full_string = full_string + carac + rup = 0 + else: + full_string = full_string + carac + + return full_string + + def makeAscii(self,str): + try: + Stringer = str.encode("utf-8") + except UnicodeDecodeError: + try: + Stringer = str.encode("utf-16") + except UnicodeDecodeError: + print "UTF_16 Error" + Stringer = str + else: + return Stringer + else: + return Stringer + return Stringer + def explode_this(self,chaine,length): + #chaine = self.repair_string(chaine) + chaine = rstrip(chaine) + ast = list(chaine) + i = length + while i <= len(ast): + ast.insert(i,'\n') + i = i + length + chaine = str("".join(ast)) + return chaine + def repair_string(self,chaine): + ast = list(chaine) + UnicodeAst = [] + _previouslyfound = False + i = 0 + #print str(ast) + while i < len(ast): + elem = ast[i] + try: + Stringer = elem.encode("utf-8") + except UnicodeDecodeError: + to_reencode = elem + ast[i+1] + print str(to_reencode) + Good_char = to_reencode.decode('utf-8') + UnicodeAst.append(Good_char) + i += i +2 + else: + UnicodeAst.append(elem) + i += i + 1 + + + return "".join(UnicodeAst) + + def ReencodeAscii(self,str): + print sys.stdin.encoding + try: + Stringer = str.decode("ascii") + except UnicodeEncodeError: + print "REENCODING ERROR" + return str.encode("ascii") + except UnicodeDecodeError: + print "DECODING ERROR" + return str.encode("ascii") + + else: + print Stringer + return Stringer + + + # def _add_header(self, node): + # rml_head = tools.file_open('specific_param/report/header/corporate_rml_header_ch.rml').read() + # head_dom = xml.dom.minidom.parseString(rml_head) + # #for frame in head_dom.getElementsByTagName('frame'): + # # frame.parentNode.removeChild(frame) + # node2 = head_dom.documentElement + # for tag in node2.childNodes: + # if tag.nodeType==tag.ELEMENT_NODE: + # found = self._find_node(node, tag.localName) + # # rml_frames = found.getElementsByTagName('frame') + # if found: + # if tag.hasAttribute('position') and (tag.getAttribute('position')=='inside'): + # found.appendChild(tag) + # else: + # found.parentNode.replaceChild(tag, found) + # # for frame in rml_frames: + # # tag.appendChild(frame) + # return True - - # def _add_header(self, node): - # rml_head = tools.file_open('specific_param/report/header/corporate_rml_header_ch.rml').read() - # head_dom = xml.dom.minidom.parseString(rml_head) - # #for frame in head_dom.getElementsByTagName('frame'): - # # frame.parentNode.removeChild(frame) - # node2 = head_dom.documentElement - # for tag in node2.childNodes: - # if tag.nodeType==tag.ELEMENT_NODE: - # found = self._find_node(node, tag.localName) - # # rml_frames = found.getElementsByTagName('frame') - # if found: - # if tag.hasAttribute('position') and (tag.getAttribute('position')=='inside'): - # found.appendChild(tag) - # else: - # found.parentNode.replaceChild(tag, found) - # # for frame in rml_frames: - # # tag.appendChild(frame) - # return True - From f9156c66f7cca9a71ace212076f45b618eb599ea Mon Sep 17 00:00:00 2001 From: Najlaa Date: Mon, 15 Dec 2008 15:44:03 +0100 Subject: [PATCH 19/86] [FIX] Avoid crash when no ir_values bzr revid: nel@silver-20081215144403-3jtzlwxmaakramuk --- bin/addons/base/ir/ir_values.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index bd9a5ba2c69..9bffc4f0719 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -206,7 +206,8 @@ class ir_values(osv.osv): del fields[pos] else: pos+=1 - datas = self.pool.get(model).read(cr, uid, [id], fields, context)[0] + datas = self.pool.get(model).read(cr, uid, [id], fields, context) + datas= datas and datas[0] or None if not datas: #ir_del(cr, uid, x[0]) return False From 857315978abe63d87766c867d60eca8355141176 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 16:40:41 +0100 Subject: [PATCH 20/86] Fixed: 'intersect' method was not imported bzr revid: olt@tinyerp.com-20081215154041-09dnh954v64i6l9w --- addons/account_analytic_analysis/account_analytic_analysis.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 9b18c2d3061..d08aba68947 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -21,6 +21,7 @@ ############################################################################## import operator from osv import osv, fields +from osv.orm import intersect from tools.translate import _ From 1106d052b6cfc6e49a9c0f12c3975be687d09111 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 16:51:27 +0100 Subject: [PATCH 21/86] Bugfix: 'obj_line' was not defined bzr revid: olt@tinyerp.com-20081215155127-bmygwbngxm2tmazf --- addons/account_analytic_plans/account_analytic_plans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index dc63e082a19..2bbfb9e82f0 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -286,7 +286,7 @@ class account_move_line(osv.osv): if line.analytics_id: toremove = self.pool.get('account.analytic.line').search(cr, uid, [('move_id','=',line.id)], context=context) if toremove: - obj_line.unlink(cr, uid, toremove, context=context) + line.unlink(cr, uid, toremove, context=context) for line2 in line.analytics_id.account_ids: val = (line.credit or 0.0) - (line.debit or 0.0) amt=val * (line2.rate/100) From 2311698c51b4ce3fbc91d1885125b22da02b01f9 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Mon, 15 Dec 2008 17:22:33 +0100 Subject: [PATCH 22/86] "Bugfix: 'properties' was not defined" bzr revid: olt@tinyerp.com-20081215162233-v9m4ceexzgr9eieg --- addons/mrp/mrp.py | 2 +- addons/mrp/wizard/wizard_change_production_qty.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 331af2aeb99..901f38beab4 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -235,7 +235,7 @@ class mrp_bom(osv.osv): return {'value': v} return {} - def _bom_find(self, cr, uid, product_id, product_uom, properties = []): + def _bom_find(self, cr, uid, product_id, product_uom, properties=[]): bom_result = False # Why searching on BoM without parent ? cr.execute('select id from mrp_bom where product_id=%s and bom_id is null order by sequence', (product_id,)) diff --git a/addons/mrp/wizard/wizard_change_production_qty.py b/addons/mrp/wizard/wizard_change_production_qty.py index 3a031d8f5ce..6fca02332d5 100644 --- a/addons/mrp/wizard/wizard_change_production_qty.py +++ b/addons/mrp/wizard/wizard_change_production_qty.py @@ -67,7 +67,7 @@ def _change_prod_qty(self, cr, uid, data, context): bom_point = prod.bom_id bom_id = prod.bom_id.id if not bom_point: - bom_id = pool.get('mrp.bom')._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id, properties) + bom_id = pool.get('mrp.bom')._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id) if not bom_id: raise osv.except_osv('Error', "Couldn't find bill of material for product") self.write(cr, uid, [prod.id], {'bom_id': bom_id}) From adc8e511ba7492a8013c8c99dbc957eb14be5844 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 15 Dec 2008 21:22:41 +0100 Subject: [PATCH 23/86] [REF] Rewrite the domain field bzr revid: stephane@tinyerp.com-20081215202241-xvhn363iuzj1022c --- bin/addons/base/base_data.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/addons/base/base_data.xml b/bin/addons/base/base_data.xml index e41fccfe682..4777b7ea4f0 100644 --- a/bin/addons/base/base_data.xml +++ b/bin/addons/base/base_data.xml @@ -19,7 +19,7 @@ ir.ui.menu tree - + [('parent_id', '=', False)] From 2cc3ac1ef7968a471a72c0d1f79cecd3c03d60be Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Mon, 15 Dec 2008 22:06:59 +0100 Subject: [PATCH 24/86] improved_view bzr revid: fp@tinyerp.com-20081215210659-qm7pll67ylf9rv36 --- bin/addons/base/ir/ir.xml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index c649b12cf99..53c9fb7e580 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -324,12 +324,25 @@ - + + ir.actions.wizard.tree + ir.actions.wizard + tree + + + + + + + + + + ir.actions.wizard ir.actions.wizard form -
+ @@ -340,7 +353,7 @@ - Wizard + Wizards ir.actions.act_window ir.actions.wizard form From d24eb97eb459b52da05c70395511015a0a3e1656 Mon Sep 17 00:00:00 2001 From: Sofia Date: Tue, 16 Dec 2008 12:37:46 +0530 Subject: [PATCH 25/86] * In reports, graphs on opportunities shows estimated revenues instead of number of cases bzr revid: sahibsofia@gmail.com-20081216070746-aduwdhfkkgfunp7p --- addons/crm_configuration/crm_report_view.xml | 9 ++++++--- addons/crm_configuration/report/crm_report.py | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/addons/crm_configuration/crm_report_view.xml b/addons/crm_configuration/crm_report_view.xml index fc4a95e1610..567bfcbfd4d 100644 --- a/addons/crm_configuration/crm_report_view.xml +++ b/addons/crm_configuration/crm_report_view.xml @@ -16,10 +16,10 @@ + - @@ -34,6 +34,7 @@ + @@ -47,7 +48,7 @@ - + @@ -82,6 +83,7 @@ + @@ -98,6 +100,7 @@ + @@ -111,7 +114,7 @@ - + diff --git a/addons/crm_configuration/report/crm_report.py b/addons/crm_configuration/report/crm_report.py index 7cd7f19b18d..775eb7ec5cc 100644 --- a/addons/crm_configuration/report/crm_report.py +++ b/addons/crm_configuration/report/crm_report.py @@ -38,6 +38,7 @@ class report_crm_case_section_categ2(osv.osv): 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), 'category2_id':fields.many2one('crm.case.category2', 'Type', readonly=True), 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), + 'amount_revenue': fields.float('Est.Revenue', readonly=True), 'nbr': fields.integer('# of Cases', readonly=True), 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), 'delay_close': fields.char('Delay Close', size=20, readonly=True), @@ -56,6 +57,7 @@ class report_crm_case_section_categ2(osv.osv): c.stage_id, c.section_id, count(*) as nbr, + sum(planned_revenue) as amount_revenue, to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close from crm_case c @@ -74,6 +76,7 @@ class report_crm_case_section_stage(osv.osv): 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), 'categ_id':fields.many2one('crm.case.categ', 'Category', readonly=True), 'stage_id':fields.many2one('crm.case.stage', 'Stage', readonly=True), + 'amount_revenue': fields.float('Est.Revenue', readonly=True), 'nbr': fields.integer('# of Cases', readonly=True), 'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True), 'delay_close': fields.char('Delay Close', size=20, readonly=True), @@ -91,6 +94,7 @@ class report_crm_case_section_stage(osv.osv): c.stage_id, c.section_id, count(*) as nbr, + sum(planned_revenue) as amount_revenue, to_char(avg(date_closed-c.create_date), 'DD"d" HH24:MI:SS') as delay_close from crm_case c From ce70e60592b621c0b10ea531b1435b968beb04ac Mon Sep 17 00:00:00 2001 From: Husen Daudi Date: Tue, 16 Dec 2008 14:25:33 +0530 Subject: [PATCH 26/86] Fixed bug on function field if type is binary (ref:hmo) bzr revid: hda@tinyerp.com-20081216085533-4jjo15livmuh9mbp --- bin/osv/fields.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 544bd9b3fee..e0da8d38945 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -602,6 +602,9 @@ class function(_column): if store: self._classic_read = True self._classic_write = True + if type=='binary': + self._symbol_get=lambda x:x and str(x) + if type == 'float': self._symbol_c = float._symbol_c self._symbol_f = float._symbol_f From 9dec41a7b15e841c7332edae17d34cd3dfea5bb8 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 10:45:49 +0100 Subject: [PATCH 27/86] [FIX] Add the dot in the object name lp bug: https://launchpad.net/bugs/300646 fixed bzr revid: stephane@tinyerp.com-20081216094549-e5493sdtjwm4k99y --- bin/addons/base/ir/ir_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 40ce882e280..66cbd98e52d 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -55,7 +55,7 @@ class ir_model(osv.osv): if model.state=='manual': if not model.model.startswith('x_'): return False - if not re.match('^[a-z_A-Z0-9]+$',model.model): + if not re.match('^[a-z_A-Z0-9.]+$',model.model): return False return True From ffc916aaa39d8cca186c10c5d506fc5a472f0e62 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 11:14:22 +0100 Subject: [PATCH 28/86] wrong identifier: uid -> user bzr revid: olt@tinyerp.com-20081216101422-bk80ena85vj4y4kw --- bin/addons/base/ir/ir_model.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 40ce882e280..4d0cc16f21e 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -233,7 +233,7 @@ class ir_model_fields(osv.osv): # MAY BE ADD A ALTER TABLE DROP ? # return super(ir_model_fields, self).unlink(cr, user, ids, context) - + def write(self, cr, uid, ids, vals, context=None): res = False if 'relation_id' in vals: @@ -242,29 +242,29 @@ class ir_model_fields(osv.osv): if 'relation_field_id' in vals: field_data = self.pool.get('ir.model.fields').browse(cr, uid, vals['relation_field_id']) vals['relation'] = field_data.name - + res = super(ir_model_fields, self).write(cr, uid, ids, vals, context) return res - + def create(self, cr, user, vals, context=None): if 'relation_id' in vals: - model_data = self.pool.get('ir.model').browse(cr,user,vals['relation_id']) + model_data = self.pool.get('ir.model').browse(cr, user, vals['relation_id']) vals['relation']=model_data.model if 'relation_field_id' in vals: - field_data = self.pool.get('ir.model.fields').browse(cr, uid, vals['relation_field_id']) + field_data = self.pool.get('ir.model.fields').browse(cr, user, vals['relation_field_id']) vals['relation_field'] = field_data.name if 'model_id' in vals: - model_data=self.pool.get('ir.model').browse(cr,user,vals['model_id']) - vals['model']=model_data.model + model_data = self.pool.get('ir.model').browse(cr, user, vals['model_id']) + vals['model'] = model_data.model if context and context.get('manual',False): - vals['state']='manual' + vals['state'] = 'manual' res = super(ir_model_fields,self).create(cr, user, vals, context) - if vals.get('state','base')=='manual': + if vals.get('state','base') == 'manual': if not vals['name'].startswith('x_'): raise except_orm(_('Error'), _("Custom fields must have a name that starts with 'x_' !")) if self.pool.get(vals['model']): self.pool.get(vals['model']).__init__(self.pool, cr) - self.pool.get(vals['model'])._auto_init(cr,{}) + self.pool.get(vals['model'])._auto_init(cr, {}) return res ir_model_fields() @@ -298,7 +298,7 @@ class ir_model_access(osv.osv): model_name = model.name else: model_name = model - + if isinstance(group_ids, (int, long)): group_ids = [group_ids] for group_id in group_ids: @@ -324,7 +324,7 @@ class ir_model_access(osv.osv): def check(self, cr, uid, model, mode='read', raise_exception=True): if uid==1: - # User root have all accesses + # User root have all accesses # TODO: exclude xml-rpc requests return True @@ -335,7 +335,7 @@ class ir_model_access(osv.osv): model_name = model.name else: model_name = model - + # We check if a specific rule exists cr.execute('SELECT MAX(CASE WHEN perm_' + mode + ' THEN 1 ELSE 0 END) ' ' FROM ir_model_access a ' @@ -394,7 +394,7 @@ class ir_model_access(osv.osv): res = super(ir_model_access, self).write(cr, uid, *args, **argv) self.check() # clear the cache of check function return res - + def create(self, cr, uid, *args, **argv): res = super(ir_model_access, self).create(cr, uid, *args, **argv) self.check() From d8e954618d08c55edcd297b02dbbcede305b4739 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Tue, 16 Dec 2008 15:48:09 +0530 Subject: [PATCH 29/86] activate the python code in the server action bzr revid: mga@tinyerp.com-20081216101809-ki2d8z3869qsm3dx --- bin/addons/base/ir/ir.xml | 6 ++++++ bin/addons/base/ir/ir_actions.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index c649b12cf99..736f13b3507 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -1142,6 +1142,12 @@ + + + + + + diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index c270557f6c5..3aa83ffbe26 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -390,6 +390,7 @@ class actions_server(osv.osv): 'state': fields.selection([ ('client_action','Client Action'), ('dummy','Dummy'), + ('code','Python Code'), ('trigger','Trigger'), ('email','Email'), ('sms','SMS'), @@ -397,6 +398,7 @@ class actions_server(osv.osv): ('object_write','Write Object'), ('other','Multi Actions'), ], 'Action State', required=True, size=32), + 'code':fields.text('Python Code'), 'sequence': fields.integer('Sequence'), 'model_id': fields.many2one('ir.model', 'Object', required=True), 'action_id': fields.many2one('ir.actions.actions', 'Client Action'), @@ -418,6 +420,15 @@ class actions_server(osv.osv): 'state': lambda *a: 'dummy', 'type': lambda *a: 'ir.actions.server', 'sequence': lambda *a: 5, + 'code': lambda *a: """# You can use the following variables +# - object +# - object2 +# - time +# - cr +# - uid +# - ids +# If you plan to return an action, assign: action = {...} +""", } From 2b5169c00af8b7c2aa14218a4836722a4e2d4ab1 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 11:18:25 +0100 Subject: [PATCH 30/86] 'e' is not an exception class bzr revid: olt@tinyerp.com-20081216101825-xxu1fg5jba7nrk30 --- bin/addons/base/res/partner/partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/addons/base/res/partner/partner.py b/bin/addons/base/res/partner/partner.py index d17c696677f..56c01015287 100644 --- a/bin/addons/base/res/partner/partner.py +++ b/bin/addons/base/res/partner/partner.py @@ -255,7 +255,7 @@ class res_partner(osv.osv): ref = res and res[0]['ref'] or '0' try: nextref = int(ref)+1 - except e: + except: raise osv.except_osv(_('Warning'), _("Couldn't generate the next id because some partners have an alphabetic id !")) # update the current partner From 0c3a25a431295a324a454cc0fb33f22cc841b6ca Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 11:23:23 +0100 Subject: [PATCH 31/86] [IMP] Log the error if it can load a module bzr revid: stephane@tinyerp.com-20081216102323-acn5tmtfpopwc5ch --- bin/addons/__init__.py | 172 ++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 81 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index e18213d466f..eec3f6b2370 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -24,6 +24,7 @@ import os, sys, imp from os.path import join as opj import itertools from sets import Set +import zipimport import osv import tools @@ -268,25 +269,32 @@ def init_module_objects(cr, module_name, obj_list): t[1](cr, *t[2]) cr.commit() -# -# Register module named m, if not already registered -# def register_class(m): + """ + Register module named m, if not already registered + """ global loaded if m in loaded: return logger.notifyChannel('init', netsvc.LOG_INFO, 'module %s: registering objects' % m) loaded.append(m) mod_path = get_module_path(m) - if not os.path.isfile(mod_path+'.zip'): - imp.load_module(m, *imp.find_module(m, [ad, _ad])) - else: - import zipimport - try: - zimp = zipimport.zipimporter(mod_path+'.zip') + try: + zip_mod_path = mod_path + '.zip' + if not os.path.isfile(zip_mod_path): + imp.load_module(m, *imp.find_module(m, [ad, _ad])) + else: + zimp = zipimport.zipimporter(zip_mod_path) zimp.load_module(m) - except zipimport.ZipImportError: - logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m) + except zipimport.ZipImportError: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find zip module %s' % m) + raise + except ImportError: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find module %s' % m) + raise + except Exception: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find module %s' % (m)) + raise class MigrationManager(object): @@ -535,84 +543,86 @@ def load_module_graph(cr, graph, status=None, check_access_rules=True, **kwargs) def load_modules(db, force_demo=False, status=None, update_module=False): if not status: status={} + cr = db.cursor() - force = [] - if force_demo: - force.append('demo') - pool = pooler.get_pool(cr.dbname) - report = tools.assertion_report() - if update_module: - basegraph = create_graph(['base'], force) - load_module_graph(cr, basegraph, status, check_access_rules=False, report=report) + try: + force = [] + if force_demo: + force.append('demo') + pool = pooler.get_pool(cr.dbname) + report = tools.assertion_report() + if update_module: + basegraph = create_graph(['base'], force) + load_module_graph(cr, basegraph, status, check_access_rules=False, report=report) - modobj = pool.get('ir.module.module') - logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') - modobj.update_list(cr, 1) + modobj = pool.get('ir.module.module') + logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') + modobj.update_list(cr, 1) - mods = [k for k in tools.config['init'] if tools.config['init'][k]] - if mods: - ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)]) - if ids: - modobj.button_install(cr, 1, ids) + mods = [k for k in tools.config['init'] if tools.config['init'][k]] + if mods: + ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)]) + if ids: + modobj.button_install(cr, 1, ids) + + mods = [k for k in tools.config['update'] if tools.config['update'][k]] + if mods: + ids = modobj.search(cr, 1, ['&',('state', '=', 'installed'), ('name', 'in', mods)]) + if ids: + modobj.button_upgrade(cr, 1, ids) + + cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base')) + cr.execute("select name from ir_module_module where state in ('installed', 'to install', 'to upgrade')") + else: + cr.execute("select name from ir_module_module where state in ('installed', 'to upgrade')") + module_list = [name for (name,) in cr.fetchall()] + graph = create_graph(module_list, force) - mods = [k for k in tools.config['update'] if tools.config['update'][k]] - if mods: - ids = modobj.search(cr, 1, ['&',('state', '=', 'installed'), ('name', 'in', mods)]) - if ids: - modobj.button_upgrade(cr, 1, ids) - - cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base')) - cr.execute("select name from ir_module_module where state in ('installed', 'to install', 'to upgrade')") - else: - cr.execute("select name from ir_module_module where state in ('installed', 'to upgrade')") - module_list = [name for (name,) in cr.fetchall()] - graph = create_graph(module_list, force) - - # the 'base' module has already been updated - base = graph['base'] - base.state = 'installed' - for kind in ('init', 'demo', 'update'): - if hasattr(base, kind): - delattr(base, kind) + # the 'base' module has already been updated + base = graph['base'] + base.state = 'installed' + for kind in ('init', 'demo', 'update'): + if hasattr(base, kind): + delattr(base, kind) - load_module_graph(cr, graph, status, report=report) - if report.get_report(): - logger.notifyChannel('init', netsvc.LOG_INFO, report) + load_module_graph(cr, graph, status, report=report) + if report.get_report(): + logger.notifyChannel('init', netsvc.LOG_INFO, report) - for kind in ('init', 'demo', 'update'): - tools.config[kind]={} + for kind in ('init', 'demo', 'update'): + tools.config[kind]={} - cr.commit() - if update_module: - cr.execute("select id,name from ir_module_module where state in ('to remove')") - for mod_id, mod_name in cr.fetchall(): - pool = pooler.get_pool(cr.dbname) - cr.execute('select model,res_id from ir_model_data where not noupdate and module=%s order by id desc', (mod_name,)) - for rmod,rid in cr.fetchall(): - uid = 1 - pool.get(rmod).unlink(cr, uid, [rid]) - cr.commit() - # - # TODO: remove menu without actions of childs - # - while True: - cr.execute('''delete from - ir_ui_menu - where - (id not in (select parent_id from ir_ui_menu where parent_id is not null)) - and - (id not in (select res_id from ir_values where model='ir.ui.menu')) - and - (id not in (select res_id from ir_model_data where model='ir.ui.menu'))''') - if not cr.rowcount: - break - else: - logger.notifyChannel('init', netsvc.LOG_INFO, 'removed %d unused menus' % (cr.rowcount,)) - - cr.execute("update ir_module_module set state=%s where state in ('to remove')", ('uninstalled', )) cr.commit() - #pooler.restart_pool(cr.dbname) - cr.close() + if update_module: + cr.execute("select id,name from ir_module_module where state in ('to remove')") + for mod_id, mod_name in cr.fetchall(): + pool = pooler.get_pool(cr.dbname) + cr.execute('select model,res_id from ir_model_data where not noupdate and module=%s order by id desc', (mod_name,)) + for rmod,rid in cr.fetchall(): + uid = 1 + pool.get(rmod).unlink(cr, uid, [rid]) + cr.commit() + # + # TODO: remove menu without actions of childs + # + while True: + cr.execute('''delete from + ir_ui_menu + where + (id not in (select parent_id from ir_ui_menu where parent_id is not null)) + and + (id not in (select res_id from ir_values where model='ir.ui.menu')) + and + (id not in (select res_id from ir_model_data where model='ir.ui.menu'))''') + if not cr.rowcount: + break + else: + logger.notifyChannel('init', netsvc.LOG_INFO, 'removed %d unused menus' % (cr.rowcount,)) + + cr.execute("update ir_module_module set state=%s where state in ('to remove')", ('uninstalled', )) + cr.commit() + finally: + cr.close() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 348db86e03e021ad90474fe115e465c1cbce2bb3 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 11:24:03 +0100 Subject: [PATCH 32/86] [FIX] Close the cursor if open bzr revid: stephane@tinyerp.com-20081216102403-7kpf1n7rcho3fk1i --- bin/pooler.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/pooler.py b/bin/pooler.py index 132e99b5089..250ee4f22e5 100644 --- a/bin/pooler.py +++ b/bin/pooler.py @@ -37,9 +37,11 @@ def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False) pool_dic[db_name] = pool addons.load_modules(db, force_demo, status, update_module) cr = db.cursor() - pool.init_set(cr, False) - cr.commit() - cr.close() + try: + pool.init_set(cr, False) + cr.commit() + finally: + cr.close() if not update_module: import report From 71d69d7b4097b7883827feeab031bde5e3ac3672 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 11:33:54 +0100 Subject: [PATCH 33/86] Wrong use of the escape char '\' bzr revid: olt@tinyerp.com-20081216103354-8fl5ionxbtk1e41s --- addons/account/i18n/es_AR.po | 10 +++++----- addons/stock/i18n/es_AR.po | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/account/i18n/es_AR.po b/addons/account/i18n/es_AR.po index 0a351b3ecff..bff7d7872ea 100644 --- a/addons/account/i18n/es_AR.po +++ b/addons/account/i18n/es_AR.po @@ -713,7 +713,7 @@ msgstr "" #. module: account #: field:account.analytic.account,child_ids:0 msgid "Childs Accounts" -msgstr "Cuentas \\"hijas\\"" +msgstr "Cuentas \"hijas\"" #. module: account #: model:ir.ui.menu,name:account.menu_analytic_accounting @@ -837,7 +837,7 @@ msgstr "" #. module: account #: field:account.tax,child_ids:0 msgid "Childs Tax Account" -msgstr "Cuentas \\"hijas\\"" +msgstr "Cuentas \"hijas\"" #. module: account #: rml:account.analytic.account.cost_ledger:0 @@ -1651,7 +1651,7 @@ msgstr "" #: field:account.tax,child_depend:0 #: field:account.tax.template,child_depend:0 msgid "Tax on Childs" -msgstr "Impuesto depende de Cuentas \\"hijas\\"" +msgstr "Impuesto depende de Cuentas \"hijas\"" #. module: account #: wizard_view:account.reconcile.unreconcile,init:0 @@ -2126,7 +2126,7 @@ msgstr "Cálculo" #. module: account #: field:account.analytic.account,parent_id:0 msgid "Parent analytic account" -msgstr "Cuenta de Costos \\"padre\\"" +msgstr "Cuenta de Costos \"padre\"" #. module: account #: view:account.analytic.line:0 @@ -3401,7 +3401,7 @@ msgstr "" #: field:account.tax,parent_id:0 #: field:account.tax.template,parent_id:0 msgid "Parent Tax Account" -msgstr "Cuenta \\"padre\\"" +msgstr "Cuenta \"padre\"" #. module: account #: model:ir.model,name:account.model_account_account_type diff --git a/addons/stock/i18n/es_AR.po b/addons/stock/i18n/es_AR.po index fc30342da3e..243fbeae81a 100644 --- a/addons/stock/i18n/es_AR.po +++ b/addons/stock/i18n/es_AR.po @@ -854,7 +854,7 @@ msgstr "" #. module: stock #: field:stock.location,location_id:0 msgid "Parent Location" -msgstr "Ubicación \\"padre\\"" +msgstr "Ubicación \"padre\"" #. module: stock #: field:stock.inventory,date:0 From 85091de9ab24a0e89c6752307ed9cd863fa0c3e2 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 11:34:41 +0100 Subject: [PATCH 34/86] wrong header bzr revid: olt@tinyerp.com-20081216103441-98p30jsq16jxb55t --- addons/l10n_chart_uk_minimal/i18n/fr_FR.po | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/addons/l10n_chart_uk_minimal/i18n/fr_FR.po b/addons/l10n_chart_uk_minimal/i18n/fr_FR.po index cac6fb604cb..9274bf6623d 100644 --- a/addons/l10n_chart_uk_minimal/i18n/fr_FR.po +++ b/addons/l10n_chart_uk_minimal/i18n/fr_FR.po @@ -4,18 +4,16 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 4.3.0Report-Msgid-Bugs-To: " -"support@tinyerp.comPOT-Creation-Date: 2008-09-04 08:35:53+0000PO-Revision-" -"Date: 2008-09-04 08:35:53+0000Last-Translator: <>Language-Team: MIME-" -"Version: 1.0Content-Type: text/plain; charset=UTF-8Content-Transfer-" -"Encoding: Plural-Forms:\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-09-05 16:31+0000\n" -"PO-Revision-Date: 2008-10-14 13:30+0000\n" -"Last-Translator: Olivier Laurent \n" -"Language-Team: LANGUAGE \n" +"Project-Id-Version: OpenERP Server 5.0.0-rc1\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" +"POT-Creation-Date: 2008-11-28 16:57:27+0000\n" +"PO-Revision-Date: 2008-11-28 16:57:27+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2008-11-21 14:06+0000\n" "X-Generator: Launchpad (build Unknown)\n" From 3d84754c694e8368a9d5a5c6dd915541dcaa245b Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Tue, 16 Dec 2008 11:36:20 +0100 Subject: [PATCH 35/86] commit bzr revid: fp@tinyerp.com-20081216103620-khy4x2gv3efvh0m1 --- bin/osv/orm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 1375794aaf3..a81a8011d52 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -133,7 +133,6 @@ class browse_record(object): self._data[id] = {'id': id} self._cache = cache - pass def __getitem__(self, name): if name == 'id': @@ -2059,7 +2058,8 @@ class orm(orm_template): 'where id in ('+str_d+')', sub_ids) for order, object, ids, fields in result_store: - self.pool.get(object)._store_set_values(cr, uid, ids, fields, context) + if object<>self._name: + self.pool.get(object)._store_set_values(cr, uid, ids, fields, context) return True # From 9d592044207d96538627235261ef3cb0bccf18aa Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 11:38:14 +0100 Subject: [PATCH 36/86] Removed default language team in header bzr revid: olt@tinyerp.com-20081216103814-qmxi23srmm3jzx57 --- addons/l10n_fr/i18n/fr_FR.po | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/addons/l10n_fr/i18n/fr_FR.po b/addons/l10n_fr/i18n/fr_FR.po index e7c74850825..74a1af4ca32 100644 --- a/addons/l10n_fr/i18n/fr_FR.po +++ b/addons/l10n_fr/i18n/fr_FR.po @@ -4,16 +4,12 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 4.3.0Report-Msgid-Bugs-To: " -"support@tinyerp.comPOT-Creation-Date: 2008-09-04 08:35:53+0000PO-Revision-" -"Date: 2008-09-04 08:35:53+0000Last-Translator: <>Language-Team: MIME-" -"Version: 1.0Content-Type: text/plain; charset=UTF-8Content-Transfer-" -"Encoding: Plural-Forms:\n" -"Report-Msgid-Bugs-To: \n" +"Project-Id-Version: OpenERP Server 5.0.0-rc1\n" +"Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2008-09-05 13:45+0000\n" "PO-Revision-Date: 2008-10-14 13:30+0000\n" "Last-Translator: Olivier Laurent \n" -"Language-Team: LANGUAGE \n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" From 3cf2202d87abf6b764df1aad655f44be31d2d611 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 11:39:50 +0100 Subject: [PATCH 37/86] [FIX] Remove the unused constant bzr revid: stephane@tinyerp.com-20081216103950-cdcvcq0fnlt7cs27 --- setup.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.py b/setup.py index 125f9e7b2a5..d7de94a7850 100755 --- a/setup.py +++ b/setup.py @@ -32,8 +32,6 @@ import sys import os import glob -from stat import ST_MODE - from distutils.core import setup, Command from distutils.command.install import install From b230a3841b595b56679ab5b03df9c7cd76fcdf13 Mon Sep 17 00:00:00 2001 From: hmo-tinyerp <> Date: Tue, 16 Dec 2008 16:14:28 +0530 Subject: [PATCH 38/86] modified document data file to insert value of ressource_id (0) instand of NULL bzr revid: hmo-tinyerp-20081216104428-hlvqzr46w64z4rvd --- addons/document/document_demo.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/addons/document/document_demo.xml b/addons/document/document_demo.xml index 11d1f0a991a..95910e6031b 100644 --- a/addons/document/document_demo.xml +++ b/addons/document/document_demo.xml @@ -5,12 +5,15 @@ Documents + 0 My Folder + 0 + @@ -18,6 +21,8 @@ ressource 1 + 0 + @@ -29,6 +34,8 @@ + 0 + @@ -36,36 +43,48 @@ ressource + 0 + Products + 0 + Sales Order + 0 + All Sales Order + 0 + Quotations + 0 + Projects + 0 + From 88c097516a5e5af5acee4655a276e5bf122b4051 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 16 Dec 2008 11:58:58 +0100 Subject: [PATCH 39/86] [FIX] handle the case when xml are in unicode bzr revid: christophe@cobalt-20081216105858-q0q02gxjt95qbmus --- bin/addons/base/ir/ir_ui_view.py | 2 +- bin/osv/orm.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bin/addons/base/ir/ir_ui_view.py b/bin/addons/base/ir/ir_ui_view.py index afe4990aefc..70c336a7003 100644 --- a/bin/addons/base/ir/ir_ui_view.py +++ b/bin/addons/base/ir/ir_ui_view.py @@ -28,7 +28,7 @@ import os def _check_xml(self, cr, uid, ids, context={}): for view in self.browse(cr, uid, ids, context): - eview = etree.fromstring(view.arch) + eview = etree.fromstring(view.arch.encode('utf8')) frng = tools.file_open(os.path.join('base','rng','view.rng')) relaxng = etree.RelaxNG(file=frng) if not relaxng.validate(eview): diff --git a/bin/osv/orm.py b/bin/osv/orm.py index a81a8011d52..9b3487d71df 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -918,6 +918,12 @@ class orm_template(object): def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False): if not context: context = {} + + def encode(s): + if isinstance(s, unicode): + return s.encode('utf8') + return s + def _inherit_apply(src, inherit): def _find(node, node2): if node2.nodeType == node2.ELEMENT_NODE and node2.localName == 'xpath': @@ -940,9 +946,11 @@ class orm_template(object): if res: return res return None + - doc_src = dom.minidom.parseString(src) - doc_dest = dom.minidom.parseString(inherit) + netsvc.Logger().notifyChannel('orm', netsvc.LOG_DEBUG, type(src)) + doc_src = dom.minidom.parseString(encode(src)) + doc_dest = dom.minidom.parseString(encode(inherit)) toparse = doc_dest.childNodes while len(toparse): node2 = toparse.pop(0) @@ -1057,7 +1065,7 @@ class orm_template(object): result['field_parent'] = False result['view_id'] = 0 - doc = dom.minidom.parseString(result['arch'].encode('utf-8')) + doc = dom.minidom.parseString(encode(result['arch'])) xarch, xfields = self.__view_look_dom_arch(cr, user, doc, context=context) result['arch'] = xarch result['fields'] = xfields From 63f6d4e24ede40f11b7af29d73d6a20cf17edd17 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 16 Dec 2008 12:16:36 +0100 Subject: [PATCH 40/86] [IMP] downgrade the logging level to ERROR when the server cannot connect to the database bzr revid: christophe@cobalt-20081216111636-ahigto4u7l2kueeo --- bin/sql_db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/sql_db.py b/bin/sql_db.py index 3f4e23cc392..eef2a52e92b 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -215,7 +215,7 @@ class PoolManager(object): logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Connecting to %s' % (db_name,)) PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(1, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) except Exception, e: - logger.notifyChannel('dbpool', netsvc.LOG_CRITICAL, 'Unable to connect to %s: %s' % (db_name, e.message)) + logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % (db_name, e.message)) raise return PoolManager._pools[db_name] get = staticmethod(get) From b6c69c83a22483659703f95b61c4ba4e544fd735 Mon Sep 17 00:00:00 2001 From: Husen Daudi Date: Tue, 16 Dec 2008 17:13:15 +0530 Subject: [PATCH 41/86] Bugfix for encoding (ref:pso) lp bug: https://launchpad.net/bugs/308074 fixed bzr revid: hda@tinyerp.com-20081216114315-jhb4vfs15bt1jzik --- addons/base_module_publish/wizard/module_zip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_module_publish/wizard/module_zip.py b/addons/base_module_publish/wizard/module_zip.py index c582358df0a..c3d04ceb5c4 100644 --- a/addons/base_module_publish/wizard/module_zip.py +++ b/addons/base_module_publish/wizard/module_zip.py @@ -42,7 +42,7 @@ def _zippy(archive, fromurl, path, src=True): else: exclude = ['py','pyo','pyc'] if (path.split('.')[-1] not in exclude) or (os.path.basename(path)=='__terp__.py'): - archive.write(os.path.join(fromurl, path), path) + archive.write(os.path.join(fromurl, path).encode(), path.encode()) return True def createzip(cr, uid, moduleid, context, b64enc=True, src=True): @@ -60,7 +60,7 @@ def createzip(cr, uid, moduleid, context, b64enc=True, src=True): if os.path.isdir(os.path.join(ad, name)): archname = StringIO.StringIO('wb') archive = PyZipFile(archname, "w", ZIP_DEFLATED) - archive.writepy(os.path.join(ad, name)) + archive.writepy(os.path.join(ad, name).encode()) _zippy(archive, ad, name, src=src) archive.close() val =archname.getvalue() From 16b95805c4898c9ee2db059cd0f8c5d57ac141b2 Mon Sep 17 00:00:00 2001 From: qdp Date: Tue, 16 Dec 2008 12:57:06 +0100 Subject: [PATCH 42/86] *improvement of base_module_quality bzr revid: qdp@tinyerp.com-20081216115706-q3d68614dl17or0z --- .../base_module_quality.py | 26 +++++ .../pylint_test/__init__.py | 26 +++++ .../pylint_test/pylint_test.py | 100 ++++++++++++++++++ .../wizard/module_quality_check.py | 64 ++++++++--- .../wizard/pylint_test/pylint_test.py | 76 +++++++++---- 5 files changed, 256 insertions(+), 36 deletions(-) create mode 100644 addons/base_module_quality/pylint_test/__init__.py create mode 100644 addons/base_module_quality/pylint_test/pylint_test.py diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py index ab46c3b44be..2a49f301b87 100644 --- a/addons/base_module_quality/base_module_quality.py +++ b/addons/base_module_quality/base_module_quality.py @@ -23,5 +23,31 @@ import netsvc from osv import fields, osv +class quality_check(object): + ''' + This Class provide... + ''' + + _score = 0.0 + _result = "" + _result_details = "" + + def __init__(self, module_path=""): + ''' + this method should do the test and fill the _score, _result and _result_details var + ''' + raise 'Not Implemented' + + #~ def __get_result__(self, cr, uid, module_ids): + #~ ''' + #~ ''' + #~ return _result + + #~ def __get_detailed_result__(self, cr, uid, module_ids): + #~ ''' + #~ ''' + #~ return _result_details + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/pylint_test/__init__.py b/addons/base_module_quality/pylint_test/__init__.py new file mode 100644 index 00000000000..00dce4b7e0b --- /dev/null +++ b/addons/base_module_quality/pylint_test/__init__.py @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved +# $Id$ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +import pylint_test + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/base_module_quality/pylint_test/pylint_test.py b/addons/base_module_quality/pylint_test/pylint_test.py new file mode 100644 index 00000000000..1402c211923 --- /dev/null +++ b/addons/base_module_quality/pylint_test/pylint_test.py @@ -0,0 +1,100 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved +# $Id$ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +import netsvc +from osv import fields, osv +import os + +#~ class _test_pylint(quality_check): + + #~ def __init__(self, url, add_folder=None): + #~ print "dans le test" + #~ list_files = os.listdir(url) + #~ new_list = [] + #~ subfolder = {} + #~ for i in list_files: + #~ if os.path.isdir(i): + #~ path = os.path.join(url, i) + #~ new_list.append(os.listdir(path)) + #~ res = _test_pylint(self, path, add_folder=i) + #~ subfolder.update(res) + #~ dict_files = {} + #~ for file in list_files: + #~ if file.split('.')[-1] == 'py' and not file.startswith('__init__'): + #~ file_path = os.path.join(url, file) + #~ res = os.popen('pylint '+file_path+' | tail -4').read() + #~ if res.startswith('Global'): + #~ if add_folder: + #~ dict_files[add_folder + '/' + file] = res + #~ else: + #~ dict_files[file] = res + #~ dict_files.update(subfolder) + #~ print "dict_files", dict_files + #~ return dict_files + +class _test_pylint(base_module_quality.quality_check): + + def __init__(self, module_path): + + self._result = """ +Pylint Test: +------------ + + This test checks if the module satisfy the current coding standard used by OpenERP. + + +""" + list_files = os.listdir(module_path) + new_list = [] + subfolder = {} + for i in list_files: + path = os.path.join(module_path, i) + if os.path.isdir(path): + for j in os.listdir(path): + list_files.append(os.path.join(i, j)) + + dict_files = {} + n =0 + score = 0.0 + print list_files + for file in list_files: + if file.split('.')[-1] == 'py' and not file.endswith('__init__.py') and not file.endswith('__terp__.py'): +#--rcfile= Specify a configuration file. + file_path = os.path.join(module_path, file) + res = os.popen('pylint --persistent=n '+file_path).read() + n += 1 + leftchar = -1 + while res[leftchar:leftchar+1] != ' ' and leftchar-1 <= 0: + leftchar -=1 + rightchar = -10 + while res[rightchar:rightchar+1] != '/' and rightchar+1 <= 0: + rightchar +=1 + + score += float(res[leftchar+1:rightchar]) + self._result_details += res + self._result += file+": "+ res[leftchar+1:rightchar]+"/10\n" + self._score = score / n + return None + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/base_module_quality/wizard/module_quality_check.py b/addons/base_module_quality/wizard/module_quality_check.py index de3f333338a..41d7aed7e1c 100644 --- a/addons/base_module_quality/wizard/module_quality_check.py +++ b/addons/base_module_quality/wizard/module_quality_check.py @@ -28,6 +28,7 @@ import sys import tools import os import pylint +import base_module_quality form_check = ''' @@ -41,30 +42,65 @@ fields_check = { 'default': lambda *args: 'pylint' }, } + view_form = """ - + + + + + """ +#TODO: utiliser les nouveaux wizards pour heriter la vue et rajouter un onglet par test? +#TODO: remove the first screen which is unused view_field = { - "module_info": {'type': 'text', 'string': 'check quality', 'readonly':True}, + "general_info": {'type': 'text', 'string': 'General Info', 'readonly':True}, } + + + class wiz_quality_check(wizard.interface): - def _check(self, cr, uid, data, context): - if data['form']['test'] == 'pylint': - pool=pooler.get_pool(cr.dbname) - module_data = pool.get('ir.module.module').browse(cr, uid, data['ids']) - from pylint_test import pylint_test - ad = tools.config['addons_path'] - url = os.path.join(ad, module_data[0].name) - result = pylint_test._test_pylint(self, url) - string_ret = '' - for i in result: - string_ret = string_ret + i + ':\n' + result[i] - return {'module_info':string_ret} + def _check(self, cr, uid, data, context): + string_ret = "" + from tools import config + list_folders=os.listdir(config['addons_path']+'/base_module_quality/') + for item in list_folders: + path = config['addons_path']+'/base_module_quality/wizard/'+item + if os.path.exists(path+'/'+item+'.py') and item not in ['report','wizard', 'security']: + pool=pooler.get_pool(cr.dbname) + module_data = pool.get('ir.module.module').browse(cr, uid, data['ids']) + + ad = tools.config['addons_path'] + module_path = os.path.join(ad, module_data[0].name) + #import pylint_test + x = __import__(item) + val = x.__init__(module_path) + string_ret += val._result + + return {'general_info':string_ret} + + + #mra version + #~ result = pylint_test._test_pylint(self, url) + #~ string_ret = '' + #~ for i in result: + #~ string_ret = string_ret + i + ':\n' + result[i] + #~ string_ret = "" + #~ if data['form']['test'] == 'pylint': + #~ pool=pooler.get_pool(cr.dbname) + #~ module_data = pool.get('ir.module.module').browse(cr, uid, data['ids']) + #~ from pylint_test import pylint_test + #~ ad = tools.config['addons_path'] + #~ url = os.path.join(ad, module_data[0].name) + #~ result = pylint_test._test_pylint(self, url) + #~ string_ret = '' + #~ for i in result: + #~ string_ret = string_ret + i + ':\n' + result[i] + states = { 'init': { 'actions': [], diff --git a/addons/base_module_quality/wizard/pylint_test/pylint_test.py b/addons/base_module_quality/wizard/pylint_test/pylint_test.py index a640e37e96c..6e80e136865 100644 --- a/addons/base_module_quality/wizard/pylint_test/pylint_test.py +++ b/addons/base_module_quality/wizard/pylint_test/pylint_test.py @@ -24,28 +24,60 @@ import netsvc from osv import fields, osv import os -def _test_pylint(self, url, add_folder=None): - list_files = os.listdir(url) - new_list = [] - subfolder = {} - for i in list_files: - if os.path.isdir(i): - path = os.path.join(url, i) - new_list.append(os.listdir(path)) - res = _test_pylint(self, path, add_folder=i) - subfolder.update(res) - dict_files = {} - for file in list_files: - if file.split('.')[-1] == 'py' and not file.startswith('__init__'): - file_path = os.path.join(url, file) - res = os.popen('pylint '+file_path+' | tail -4').read() - if res.startswith('Global'): - if add_folder: - dict_files[add_folder + '/' + file] = res - else: - dict_files[file] = res - dict_files.update(subfolder) - return dict_files + + +class _test_pylint(quality_check): + + def __init__(self, url, add_folder=None): + print "dans le test" + list_files = os.listdir(url) + new_list = [] + subfolder = {} + for i in list_files: + if os.path.isdir(i): + path = os.path.join(url, i) + new_list.append(os.listdir(path)) + res = _test_pylint(self, path, add_folder=i) + subfolder.update(res) + dict_files = {} + for file in list_files: + if file.split('.')[-1] == 'py' and not file.startswith('__init__'): + file_path = os.path.join(url, file) + res = os.popen('pylint '+file_path+' | tail -4').read() + if res.startswith('Global'): + if add_folder: + dict_files[add_folder + '/' + file] = res + else: + dict_files[file] = res + dict_files.update(subfolder) + print "dict_files", dict_files + return dict_files + +_test_pylint() + + +#~ def _test_pylint(self, url, add_folder=None): + #~ list_files = os.listdir(url) + #~ new_list = [] + #~ subfolder = {} + #~ for i in list_files: + #~ if os.path.isdir(i): + #~ path = os.path.join(url, i) + #~ new_list.append(os.listdir(path)) + #~ res = _test_pylint(self, path, add_folder=i) + #~ subfolder.update(res) + #~ dict_files = {} + #~ for file in list_files: + #~ if file.split('.')[-1] == 'py' and not file.startswith('__init__'): + #~ file_path = os.path.join(url, file) + #~ res = os.popen('pylint '+file_path+' | tail -4').read() + #~ if res.startswith('Global'): + #~ if add_folder: + #~ dict_files[add_folder + '/' + file] = res + #~ else: + #~ dict_files[file] = res + #~ dict_files.update(subfolder) + #~ return dict_files # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 4566b4174e02e4a980f23f95cf074b354aa6299f Mon Sep 17 00:00:00 2001 From: hmo-tinyerp <> Date: Tue, 16 Dec 2008 18:05:15 +0530 Subject: [PATCH 43/86] fixed bug : unicode problem on display path bzr revid: hmo-tinyerp-20081216123515-qh0zve76cto3mqsy --- addons/document/document.py | 6 +++++- addons/document/ftpserver/abstracted_fs.py | 7 +++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/document/document.py b/addons/document/document.py index afb466c983a..eb5affaa853 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -37,6 +37,7 @@ import random import string from psycopg2 import Binary from tools import config +import tools def random_name(): random.seed() @@ -497,6 +498,9 @@ class document_file(osv.osv): result[id]='' else: result[id] = '' + if context.get('bin_size', False): + result[id] = tools.human_size(len(result[id])) + return result # @@ -539,7 +543,7 @@ class document_file(osv.osv): 'create_date': fields.datetime('Date Created', readonly=True), 'create_uid': fields.many2one('res.users', 'Creator', readonly=True), 'store_method': fields.selection([('db','Database'),('fs','Filesystem'),('link','Link')], "Storing Method"), - 'datas': fields.function(_data_get,method=True,store=True,fnct_inv=_data_set,string='File Content',type="binary"), + 'datas': fields.function(_data_get,method=True,fnct_inv=_data_set,string='File Content',type="binary"), 'store_fname': fields.char('Stored Filename', size=200), 'res_model': fields.char('Attached Model', size=64), #res_model 'res_id': fields.integer('Attached ID'), #res_id diff --git a/addons/document/ftpserver/abstracted_fs.py b/addons/document/ftpserver/abstracted_fs.py index c83fbb61d05..69aecb284c4 100644 --- a/addons/document/ftpserver/abstracted_fs.py +++ b/addons/document/ftpserver/abstracted_fs.py @@ -74,7 +74,7 @@ class abstracted_fs: # Ok def db_list(self): - return pooler.pool_dic.keys() + #return pooler.pool_dic.keys() s = netsvc.LocalService('db') result = s.list() self.db_name_list = [] @@ -95,8 +95,7 @@ class abstracted_fs: if cr is not None: cr.close() #if db is not None: - # pooler.close_db(db_name) - print 'Return', self.db_name_list + # pooler.close_db(db_name) return self.db_name_list # Ok @@ -689,7 +688,7 @@ class abstracted_fs: # formatting is matched with proftpd ls output yield "%s %3s %-8s %-8s %8s %s %s\r\n" %(perms, nlinks, uname, gname, - size, mtime, file.path.split('/')[-1]) + size, mtime, file.path.encode('ascii','replace').split('/')[-1]) # Ok def format_mlsx(self, basedir, listing, perms, facts, ignore_err=True): From bca0425af5c4bc565610766f427a8515e5a7102f Mon Sep 17 00:00:00 2001 From: Jay Vora Date: Tue, 16 Dec 2008 18:12:06 +0530 Subject: [PATCH 44/86] Base_Module_quality : misc changes bzr revid: jvo@tinyerp.com-20081216124206-2dqq01vdvawmlkge --- addons/base_module_quality/pylint_test/pylint_test.py | 2 +- addons/base_module_quality/wizard/module_quality_check.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/base_module_quality/pylint_test/pylint_test.py b/addons/base_module_quality/pylint_test/pylint_test.py index 1402c211923..c31a5c6599d 100644 --- a/addons/base_module_quality/pylint_test/pylint_test.py +++ b/addons/base_module_quality/pylint_test/pylint_test.py @@ -23,6 +23,7 @@ import netsvc from osv import fields, osv import os +from base_module_quality import base_module_quality #~ class _test_pylint(quality_check): @@ -54,7 +55,6 @@ import os class _test_pylint(base_module_quality.quality_check): def __init__(self, module_path): - self._result = """ Pylint Test: ------------ diff --git a/addons/base_module_quality/wizard/module_quality_check.py b/addons/base_module_quality/wizard/module_quality_check.py index 41d7aed7e1c..0e606a70f8e 100644 --- a/addons/base_module_quality/wizard/module_quality_check.py +++ b/addons/base_module_quality/wizard/module_quality_check.py @@ -77,8 +77,10 @@ class wiz_quality_check(wizard.interface): ad = tools.config['addons_path'] module_path = os.path.join(ad, module_data[0].name) #import pylint_test + item='base_module_quality.'+item x = __import__(item) - val = x.__init__(module_path) + val = x.__init__(str(module_path)) + print "VALL",x._result string_ret += val._result return {'general_info':string_ret} From 48bf6ab1e826123e667ffcd93fc6d50ccc8630cb Mon Sep 17 00:00:00 2001 From: Najlaa Date: Tue, 16 Dec 2008 13:59:34 +0100 Subject: [PATCH 45/86] call function scan language for selection field bzr revid: nel@silver-20081216125934-nmsxq3cmawhgtl3k --- bin/addons/base/module/wizard/wizard_export_lang.py | 5 +---- bin/addons/base/module/wizard/wizard_module_lang_install.py | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/bin/addons/base/module/wizard/wizard_export_lang.py b/bin/addons/base/module/wizard/wizard_export_lang.py index 2e9751e55e5..046b9ccb4dc 100644 --- a/bin/addons/base/module/wizard/wizard_export_lang.py +++ b/bin/addons/base/module/wizard/wizard_export_lang.py @@ -26,7 +26,6 @@ import base64 import StringIO import csv import pooler - from osv import fields,osv @@ -51,7 +50,6 @@ class wizard_export_lang(osv.osv_memory): mods = map(lambda m: m.name, this.modules) or ['all'] mods.sort() buf=StringIO.StringIO() - tools.trans_export(this.lang, mods, buf, this.format, dbname=cr.dbname) if this.format == 'csv': this.advice = _("Save this document to a .CSV file and open it with your favourite spreadsheet software. The file encoding is UTF-8. You have to translate the latest column before reimporting it.") @@ -64,8 +62,7 @@ class wizard_export_lang(osv.osv_memory): this.advice = _('Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad.') % (ext,) this.name = "%s.%s" % (this.lang or _('new'), this.format) - - out=base64.encodestring(buf.getvalue()) + out=base64.encodestring(buf.getvalue().encode('utf8')) buf.close() return self.write(cr, uid, ids, {'state':'get', 'data':out, 'advice':this.advice, 'name':this.name}, context=context) diff --git a/bin/addons/base/module/wizard/wizard_module_lang_install.py b/bin/addons/base/module/wizard/wizard_module_lang_install.py index a3c4d6bdb99..d904fdb2a42 100644 --- a/bin/addons/base/module/wizard/wizard_module_lang_install.py +++ b/bin/addons/base/module/wizard/wizard_module_lang_install.py @@ -54,11 +54,8 @@ class wizard_lang_install(wizard.interface): modobj.update_translations(cr, uid, mids, lang) return {} - def _get_language(sel, cr, uid, context): - return tools.scan_languages() - fields_form = { - 'lang': {'string':'Language', 'type':'selection', 'selection':_get_language, + 'lang': {'string':'Language', 'type':'selection', 'selection':tools.scan_languages(), }, } From 0cf74c1d331badd05add9688a357a572a6875938 Mon Sep 17 00:00:00 2001 From: hmo-tinyerp <> Date: Tue, 16 Dec 2008 18:35:11 +0530 Subject: [PATCH 46/86] fixed bug bzr revid: hmo-tinyerp-20081216130511-v61y9na8fw87tth4 --- addons/document/document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/document/document.py b/addons/document/document.py index eb5affaa853..ccd5c7afaf5 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -543,7 +543,7 @@ class document_file(osv.osv): 'create_date': fields.datetime('Date Created', readonly=True), 'create_uid': fields.many2one('res.users', 'Creator', readonly=True), 'store_method': fields.selection([('db','Database'),('fs','Filesystem'),('link','Link')], "Storing Method"), - 'datas': fields.function(_data_get,method=True,fnct_inv=_data_set,string='File Content',type="binary"), + 'datas': fields.function(_data_get,method=True,store=True,fnct_inv=_data_set,string='File Content',type="binary"), 'store_fname': fields.char('Stored Filename', size=200), 'res_model': fields.char('Attached Model', size=64), #res_model 'res_id': fields.integer('Attached ID'), #res_id From 41d44e6227adf913b73815574943e4de5099c210 Mon Sep 17 00:00:00 2001 From: hmo-tinyerp <> Date: Tue, 16 Dec 2008 19:12:14 +0530 Subject: [PATCH 47/86] fixed bug on rename directory name bzr revid: hmo-tinyerp-20081216134214-f6gez200817tqvdn --- addons/document/document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/document/document.py b/addons/document/document.py index ccd5c7afaf5..92b49a1b520 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -364,7 +364,7 @@ class document_directory(osv.osv): if not ressource_parent_type_id: ressource_parent_type_id=directory.ressource_parent_type_id and directory.ressource_parent_type_id.id or False if not ressource_id: - ressource_id=directory.ressource_id and directory.ressource_id.id or 0 + ressource_id=directory.ressource_id and directory.ressource_id or 0 res=self.search(cr,uid,[('id','<>',directory.id),('name','=',name),('parent_id','=',parent_id),('ressource_parent_type_id','=',ressource_parent_type_id),('ressource_id','=',ressource_id)]) if len(res): return False From 9b4ec5b9f9f42c0831a8a938030894f2f13b327e Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 14:56:07 +0100 Subject: [PATCH 48/86] Merged the Launchpad translations with the Bazaar po files bzr revid: olt@tinyerp.com-20081216135607-u803qnxy74p0xjny --- bin/addons/base/i18n/fr_FR.po | 402 +++++++++++++++++++++------------- 1 file changed, 253 insertions(+), 149 deletions(-) diff --git a/bin/addons/base/i18n/fr_FR.po b/bin/addons/base/i18n/fr_FR.po index 16e0647c81c..359b449c8c4 100644 --- a/bin/addons/base/i18n/fr_FR.po +++ b/bin/addons/base/i18n/fr_FR.po @@ -6,21 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 5.0.0-rc1\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2008-11-28 16:57:27+0000\n" -"PO-Revision-Date: 2008-11-28 16:57:27+0000\n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2008-11-28 17:09+0000\n" +"PO-Revision-Date: 2008-12-10 13:58+0000\n" +"Last-Translator: Christophe Chauvet - http://www.syleam.fr/ \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-12-16 11:00+0000\n" +"X-Generator: Launchpad (build Unknown)\n" #. module: base #: model:ir.actions.act_window,name:base.ir_cron_act #: model:ir.ui.menu,name:base.menu_ir_cron_act #: view:ir.cron:0 msgid "Scheduled Actions" -msgstr "" +msgstr "Actions Planifiées" #. module: base #: field:ir.actions.report.xml,report_name:0 @@ -44,8 +45,12 @@ msgstr "Inconnu" #. module: base #: view:wizard.module.update_translations:0 -msgid "This wizard will detect new terms in the application so that you can update them manually." +msgid "" +"This wizard will detect new terms in the application so that you can update " +"them manually." msgstr "" +"Cet assistant détectera les nouveaux termes dans l'application, ainsi, " +"vous pourrez les mettre à jour manuellement." #. module: base #: field:workflow.activity,out_transitions:0 @@ -66,7 +71,7 @@ msgstr "Changer mes préférences" #. module: base #: view:ir.actions.act_window:0 msgid "Open Window" -msgstr "" +msgstr "Ouvrir la fenêtre" #. module: base #: field:res.partner.function,name:0 @@ -116,7 +121,7 @@ msgstr "Règles d'accès" #: field:ir.ui.view,arch:0 #: field:ir.ui.view.custom,arch:0 msgid "View Architecture" -msgstr "" +msgstr "Architecture de la Vue" #. module: base #: selection:ir.ui.menu,icon:0 @@ -126,11 +131,11 @@ msgstr "STOCK_MEDIA_FORWARD" #. module: base #: selection:ir.actions.todo,state:0 msgid "Skipped" -msgstr "" +msgstr "Ignoré" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not create this kind of document! (%s)" msgstr "Vous ne pouvez pas créer ce type de document! (%s)" @@ -193,7 +198,7 @@ msgstr "ir.default" #. module: base #: selection:ir.actions.todo,state:0 msgid "Not Started" -msgstr "" +msgstr "Non démarré" #. module: base #: view:ir.sequence:0 @@ -310,8 +315,8 @@ msgid "Suffix" msgstr "Suffixe" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The unlink method is not implemented on this object !" msgstr "La méthode de suppression n'est pas implémenté sur cette objet !" @@ -412,7 +417,7 @@ msgstr "Contact du prospet" #. module: base #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "XML non valide pour l'architecture de la vue" +msgstr "XML non valide pour l'architecture de la vue!" #. module: base #: field:ir.report.custom,sortby:0 @@ -502,14 +507,17 @@ msgid "Form" msgstr "Formulaire" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Can not define a column %s. Reserved keyword !" msgstr "Impossible de définir la colonne %s. Mot clé réservé !" #. module: base #: help:ir.ui.menu,groups_id:0 -msgid "If you put groups, the visibility of this menu will be based on these groups. If this field is empty, Open ERP will compute visibility based on the related object's read access." +msgid "" +"If you put groups, the visibility of this menu will be based on these " +"groups. If this field is empty, Open ERP will compute visibility based on " +"the related object's read access." msgstr "" #. module: base @@ -533,8 +541,8 @@ msgid "STOCK_QUIT" msgstr "STOCK_QUIT" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The name_search method is not implemented on this object !" msgstr "La méthode 'name_search' n'est pas implémentée dans cet objet !" @@ -559,8 +567,8 @@ msgid "Web:" msgstr "Web:" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 +#, python-format msgid "new" msgstr "nouveau" @@ -625,10 +633,14 @@ msgid "Contact Name" msgstr "Nom du Contact" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a %s file and edit it with a specific software or a text editor. The file encoding is UTF-8." -msgstr "Sauvegardez ce document dans un fichier %s et éditez le avec un logiciel spécifique ou un éditeur de texte. L'encodage du fichier est UTF-8." +#, python-format +msgid "" +"Save this document to a %s file and edit it with a specific software or a " +"text editor. The file encoding is UTF-8." +msgstr "" +"Sauvegardez ce document dans un fichier %s et éditez le avec un logiciel " +"spécifique ou un éditeur de texte. L'encodage du fichier est UTF-8." #. module: base #: view:ir.module.module:0 @@ -641,8 +653,8 @@ msgid "Repositories" msgstr "Dépôts" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Password mismatch !" msgstr "Le mot de passe ne correspond pas !" @@ -653,8 +665,8 @@ msgid "Contact" msgstr "Contact" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "This url '%s' must provide an html file with links to zip modules" msgstr "" @@ -677,8 +689,8 @@ msgid "ir.ui.menu" msgstr "ir.ui.menu" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "ConcurrencyException" msgstr "" @@ -717,7 +729,9 @@ msgstr "En-tête de rapport" #. module: base #: view:ir.rule:0 msgid "If you don't force the domain, it will use the simple domain setup" -msgstr "Si vous ne forcez pas le domaine, il utilisera la configuration du domaine simplifiée." +msgstr "" +"Si vous ne forcez pas le domaine, il utilisera la configuration du domaine " +"simplifiée." #. module: base #: model:res.partner.title,name:base.res_partner_title_pvt_ltd @@ -821,7 +835,8 @@ msgstr "Desinstaller les modules" #. module: base #: help:res.partner.category,active:0 -msgid "The active field allows you to hide the category, without removing it." +msgid "" +"The active field allows you to hide the category, without removing it." msgstr "Le champ Actif permet de cacher la catégorie, sans l'effacer" #. module: base @@ -841,10 +856,16 @@ msgid "Select Action Type" msgstr "" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a .CSV file and open it with your favourite spreadsheet software. The file encoding is UTF-8. You have to translate the latest column before reimporting it." -msgstr "Sauvegarder ce document dans un fichier CSV et ouvrez le dans votre tableur favori. Le fichier est encodé en UTF-8. Vous devez traduire la dernière colonne avant de la réimporter." +#, python-format +msgid "" +"Save this document to a .CSV file and open it with your favourite " +"spreadsheet software. The file encoding is UTF-8. You have to translate the " +"latest column before reimporting it." +msgstr "" +"Sauvegarder ce document dans un fichier CSV et ouvrez le dans votre tableur " +"favori. Le fichier est encodé en UTF-8. Vous devez traduire la dernière " +"colonne avant de la réimporter." #. module: base #: model:ir.actions.act_window,name:base.action_currency_form @@ -860,8 +881,13 @@ msgstr "" #. module: base #: help:res.partner,lang:0 -msgid "If the selected language is loaded in the system, all documents related to this partner will be printed in this language. If not, it will be english." -msgstr "Si la langue chargée dans le système est l'anglais, tous les documents liés à ce partenaire seront imprimés dans cette langue. Sinon, ils seront imprimé en anglais." +msgid "" +"If the selected language is loaded in the system, all documents related to " +"this partner will be printed in this language. If not, it will be english." +msgstr "" +"Si la langue chargée dans le système est l'anglais, tous les documents liés " +"à ce partenaire seront imprimés dans cette langue. Sinon, ils seront imprimé " +"en anglais." #. module: base #: selection:ir.ui.menu,icon:0 @@ -894,10 +920,15 @@ msgid "Test" msgstr "Test" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 -msgid "You can not remove the admin user as it is used internally for resources created by OpenERP (updates, module installation, ...)" -msgstr "Vous ne pouvez pas supprimer l'utilisateur 'admin' car il est utilisé en interne pour les ressources créées par OpenERP (mises à jour, installation de module, ...)" +#, python-format +msgid "" +"You can not remove the admin user as it is used internally for resources " +"created by OpenERP (updates, module installation, ...)" +msgstr "" +"Vous ne pouvez pas supprimer l'utilisateur 'admin' car il est utilisé en " +"interne pour les ressources créées par OpenERP (mises à jour, installation " +"de module, ...)" #. module: base #: wizard_view:module.module.update,update:0 @@ -977,8 +1008,8 @@ msgid "Bank type" msgstr "" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "undefined get method !" msgstr "" @@ -988,8 +1019,8 @@ msgid "Header/Footer" msgstr "En-tête/Pied de page" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The read method is not implemented on this object !" msgstr "La méthode 'read' n'est pas implémentée dans cet objet !" @@ -1018,7 +1049,7 @@ msgstr "Évènements Partenaire" #. module: base #: field:ir.actions.todo,note:0 msgid "Text" -msgstr "" +msgstr "Texte" #. module: base #: selection:ir.ui.menu,icon:0 @@ -1065,7 +1096,7 @@ msgstr "" #: model:ir.actions.act_window,name:base.action_partner_addess_tree #: view:res.partner:0 msgid "Partner contacts" -msgstr "Contactes partenaires" +msgstr "Contacts partenaires" #. module: base #: field:workflow.transition,trigger_model:0 @@ -1074,9 +1105,11 @@ msgstr "" #. module: base #: help:res.country,code:0 -msgid "The ISO country code in two chars.\n" +msgid "" +"The ISO country code in two chars.\n" "You can use this field for quick search." -msgstr "Le code ISO du pays en deux caractères.\n" +msgstr "" +"Le code ISO du pays en deux caractères.\n" "Vous pouvez utiliser ce champ pour effectuer une recherche rapide." #. module: base @@ -1136,8 +1169,8 @@ msgid "Parent Menu" msgstr "Menu Parent" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Custom fields must have a name that starts with 'x_' !" msgstr "Les champs personalisés doivent avoir un nom qui commence par 'x_' !" @@ -1294,10 +1327,14 @@ msgid "Model" msgstr "Modèle" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "You try to install a module that depends on the module: %s.\nBut this module is not available in your system." +#, python-format +msgid "" +"You try to install a module that depends on the module: %s.\n" +"But this module is not available in your system." msgstr "" +"Vous essayez d'installer un module qui dépend du module: %s\n" +"Mais ce module n'est pas disponible sur votre système." #. module: base #: wizard_field:res.partner.spam_send,init,text:0 @@ -1382,8 +1419,8 @@ msgid "Sequences" msgstr "Séquences" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Unknown position in inherited view %s !" msgstr "" @@ -1408,8 +1445,8 @@ msgid "Bank account" msgstr "Compte banquaire" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Warning: using a relation field which uses an unknown object" msgstr "Avertissement: un champ relation utilise un objet inconnu" @@ -1463,9 +1500,11 @@ msgid "Supplier" msgstr "Fournisseur" #. module: base -#, python-format #: code:report/custom.py:0 -msgid "The sum of the data (2nd field) is null.\nWe can't draw a pie chart !" +#, python-format +msgid "" +"The sum of the data (2nd field) is null.\n" +"We can't draw a pie chart !" msgstr "" #. module: base @@ -1475,7 +1514,9 @@ msgstr "Traduire" #. module: base #: view:ir.actions.server:0 -msgid "Access all the fields related to the current object using expression in double brackets, i.e. [[ object.partner_id.name ]]" +msgid "" +"Access all the fields related to the current object using expression in " +"double brackets, i.e. [[ object.partner_id.name ]]" msgstr "" #. module: base @@ -1519,10 +1560,11 @@ msgid "STOCK_SELECT_FONT" msgstr "" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "You try to remove a module that is installed or will be installed" -msgstr "Vous essayez d'enlever un module qui est installé ou qui va être installé" +msgstr "" +"Vous essayez d'enlever un module qui est installé ou qui va être installé" #. module: base #: rml:ir.module.reference:0 @@ -1557,10 +1599,14 @@ msgid "STOCK_GOTO_FIRST" msgstr "" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "Can not create the module file:\n %s" +#, python-format +msgid "" +"Can not create the module file:\n" +" %s" msgstr "" +"Impossible de créer le fichier du module:\n" +" %s" #. module: base #: model:ir.actions.act_window,name:base.action_workflow_form @@ -1647,9 +1693,11 @@ msgstr "" #. module: base #: help:ir.cron,priority:0 -msgid "0=Very Urgent\n" +msgid "" +"0=Very Urgent\n" "10=Not urgent" -msgstr "0=Très Urgent\n" +msgstr "" +"0=Très Urgent\n" "10=Pas Urgent" #. module: base @@ -1670,7 +1718,8 @@ msgstr "Droits d'accès" #. module: base #: help:ir.actions.report.xml,report_rml:0 -msgid "The .rml path of the file or NULL if the content is in report_rml_content" +msgid "" +"The .rml path of the file or NULL if the content is in report_rml_content" msgstr "" #. module: base @@ -1700,8 +1749,8 @@ msgid "Partner Address" msgstr "Adresse du Partenaire" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not remove the model '%s' !" msgstr "Vous ne pouvez pas enlever le modèle '%s' !" @@ -1722,8 +1771,8 @@ msgid "Subject" msgstr "Objet" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The write method is not implemented on this object !" msgstr "La méthode 'write' n'est pas implémentée dans cet objet !" @@ -1878,14 +1927,14 @@ msgid "STOCK_OK" msgstr "" #. module: base -#, python-format #: code:report/report_sxw.py:0 +#, python-format msgid "print" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Password empty !" msgstr "Mot de passe vide !" @@ -1906,8 +1955,8 @@ msgid "None" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not write in this document! (%s)" msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)" @@ -1934,7 +1983,9 @@ msgstr "Opérande" #. module: base #: help:res.partner,supplier:0 -msgid "Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order." +msgid "" +"Check this box if the partner is a supplier. If it's not checked, purchase " +"people will not see it when encoding a purchase order." msgstr "" #. module: base @@ -1995,8 +2046,8 @@ msgid "Low" msgstr "Faible" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "Recursion error in modules dependencies !" msgstr "Erreur de Récursion dans les dépendances des modules !" @@ -2053,7 +2104,7 @@ msgstr "Nom du canal" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Continue" -msgstr "" +msgstr "Continuer" #. module: base #: selection:res.config.view,view:0 @@ -2079,7 +2130,7 @@ msgstr "" #. module: base #: field:ir.attachment,create_date:0 msgid "Date Created" -msgstr "Date de Création" +msgstr "" #. module: base #: selection:ir.rule,operator:0 @@ -2108,8 +2159,12 @@ msgstr "Obtenir le Fichier" #. module: base #: wizard_view:module.module.update,init:0 -msgid "This function will check for new modules in the 'addons' path and on module repositories:" -msgstr "Cette fonction vérifiera si des nouveaux modules sont disponibles dans le chemin 'addons' et sur les dépôts de modules :" +msgid "" +"This function will check for new modules in the 'addons' path and on module " +"repositories:" +msgstr "" +"Cette fonction vérifiera si des nouveaux modules sont disponibles dans le " +"chemin 'addons' et sur les dépôts de modules :" #. module: base #: model:ir.model,name:base.model_res_country @@ -2134,9 +2189,9 @@ msgid "STOCK_GO_BACK" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 #: code:osv/orm.py:0 +#, python-format msgid "AccessError" msgstr "Erreur d'Accès" @@ -2184,8 +2239,8 @@ msgid "unknown" msgstr "inconnu" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The create method is not implemented on this object !" msgstr "La méthode 'create' n'est pas implémentée dans cet objet !" @@ -2220,7 +2275,7 @@ msgstr "" #. module: base #: view:ir.attachment:0 msgid "Data" -msgstr "" +msgstr "Données" #. module: base #: selection:ir.translation,type:0 @@ -2374,11 +2429,11 @@ msgstr "" #. module: base #: field:ir.attachment,create_uid:0 msgid "Creator" -msgstr "Créateur" +msgstr "" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented get_memory method !" msgstr "Méthode non implémentée: 'get_memory' !" @@ -2390,8 +2445,8 @@ msgid "Python Code" msgstr "Code Python" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Bad query." msgstr "Requête incorrecte." @@ -2401,8 +2456,8 @@ msgid "Field Label" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "You try to bypass an access rule (Document type: %s)." msgstr "Vous essayez d'outrepasser une règle d'accès (Type de Document: %s)" @@ -2513,7 +2568,7 @@ msgstr "" #. module: base #: field:ir.actions.configuration.wizard,item_id:0 msgid "Next Configuration Wizard" -msgstr "" +msgstr "Prochain Assistant de Configuration" #. module: base #: field:workflow.workitem,inst_id:0 @@ -2537,8 +2592,8 @@ msgid "raw" msgstr "brut" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 +#, python-format msgid "Partners: " msgstr "Partenaires : " @@ -2559,8 +2614,8 @@ msgid "Role Name" msgstr "Nom du rôle" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 +#, python-format msgid "Can not remove root user!" msgstr "Impossible d'effacer l'utilisateur 'root' !" @@ -2608,8 +2663,11 @@ msgstr "Rapport XML" #. module: base #: help:res.partner,user_id:0 -msgid "The internal user that is in charge of communicating with this partner if any." -msgstr "L'utilisateur interne en charge de communiqué avec le partenaire éventuel." +msgid "" +"The internal user that is in charge of communicating with this partner if " +"any." +msgstr "" +"L'utilisateur interne en charge de communiqué avec le partenaire éventuel." #. module: base #: selection:ir.translation,type:0 @@ -2622,8 +2680,8 @@ msgid "Cancel Upgrade" msgstr "Annuler la Mise à Jour" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The search method is not implemented on this object !" msgstr "La méthode 'search' n'est pas implémentée dans cet objet !" @@ -2653,8 +2711,8 @@ msgid "res.lang" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Pie charts need exactly two fields" msgstr "Les graphiques en camembert ont besoin d'exactement deux champs" @@ -2739,8 +2797,8 @@ msgid "STOCK_MEDIA_PAUSE" msgstr "" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_module_import.py:0 +#, python-format msgid "Error !" msgstr "Erreur !" @@ -2757,11 +2815,14 @@ msgstr "GPL-2" #. module: base #: help:ir.module.repository,filter:0 -msgid "Regexp to search module on the repository webpage:\n" +msgid "" +"Regexp to search module on the repository webpage:\n" "- The first parenthesis must match the name of the module.\n" "- The second parenthesis must match all the version number.\n" "- The last parenthesis must match the extension of the module." -msgstr "Expression Rationelle utilisée pour rechercher le module sur la page Web du dépôt:\n" +msgstr "" +"Expression Rationelle utilisée pour rechercher le module sur la page Web du " +"dépôt:\n" "- la première parenthèse doit 'matcher' le nom du module;\n" "- la seconde parenthèse doit 'matcher' le numéro de version;\n" "- la dernière parenthèse doit 'matcher' l'extension du module;" @@ -2842,8 +2903,8 @@ msgid "ir.actions.act_window.view" msgstr "" #. module: base -#, python-format #: code:tools/translate.py:0 +#, python-format msgid "Bad file format" msgstr "Format de fichier incorrect" @@ -2879,7 +2940,9 @@ msgstr "" #. module: base #: wizard_view:module.lang.import,init:0 -msgid "You have to import a .CSV file wich is encoded in UTF-8. Please check that the first line of your file is one of the following:" +msgid "" +"You have to import a .CSV file wich is encoded in UTF-8. Please check that " +"the first line of your file is one of the following:" msgstr "" #. module: base @@ -2894,8 +2957,8 @@ msgid "Readonly" msgstr "Lecture seule" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not remove the field '%s' !" msgstr "Vous ne pouvez pas effacer le champ '%s' !" @@ -2947,10 +3010,16 @@ msgid "STOCK_STOP" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 -msgid "\"%s\" contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id" -msgstr "\"%s\" contiens trop de caractère 'point'. Les identifiants XML ne doivent pas contenir de points ! Ceux ci sont utilisés pour effectuer des références vers d'autres données de module, comme par exemple dans \"module.reference_id\"" +#, python-format +msgid "" +"\"%s\" contains too many dots. XML ids should not contain dots ! These are " +"used to refer to other modules data, as in module.reference_id" +msgstr "" +"\"%s\" contiens trop de caractère 'point'. Les identifiants XML ne doivent " +"pas contenir de points ! Ceux ci sont utilisés pour effectuer des références " +"vers d'autres données de module, comme par exemple dans " +"\"module.reference_id\"" #. module: base #: field:res.partner.bank,acc_number:0 @@ -2989,8 +3058,8 @@ msgid "Day: %(day)s" msgstr "Jour: %(day)s" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not read this document! (%s)" msgstr "Vous ne pouvez pas lire ce document ! (%s)" @@ -3114,9 +3183,11 @@ msgid "Help" msgstr "Aide" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "Some installed modules depends on the module you plan to desinstall :\n %s" +#, python-format +msgid "" +"Some installed modules depends on the module you plan to desinstall :\n" +" %s" msgstr "" #. module: base @@ -3208,8 +3279,8 @@ msgid "Create" msgstr "" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 +#, python-format msgid "The name of the group can not start with \"-\"" msgstr "Le nom du groupe ne peut pas commencer par \"-\"" @@ -3300,9 +3371,11 @@ msgid "Resource Name" msgstr "Nom de la Ressource" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad." +#, python-format +msgid "" +"Save this document to a .tgz file. This archive containt UTF-8 %s files and " +"may be uploaded to launchpad." msgstr "" #. module: base @@ -3353,8 +3426,8 @@ msgid "References" msgstr "Références" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "This record was modified in the meanwhile" msgstr "Cet enregistrement a été modifié entre temps" @@ -3380,14 +3453,14 @@ msgid "Kind" msgstr "Genre" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "This method does not exist anymore" msgstr "Cette méthode n'existe plus" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Tree can only be used in tabular reports" msgstr "Les Arbres peuvent uniquement utilisés dans les rapports tabulaires" @@ -3421,7 +3494,8 @@ msgstr "" #. module: base #: help:res.users,password:0 -msgid "Keep empty if you don't want the user to be able to connect on the system." +msgid "" +"Keep empty if you don't want the user to be able to connect on the system." msgstr "" #. module: base @@ -3450,14 +3524,14 @@ msgid "Relation Field" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Bar charts need at least two fields" msgstr "Les graphiques en barres ont besoin d'au moins deux champs" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented search_memory method !" msgstr "Utilisation d'une méthode non implémentée: 'search_memory' !" @@ -3557,7 +3631,10 @@ msgstr "" #. module: base #: view:wizard.module.lang.export:0 -msgid "The official translations pack of all OpenERP/OpenObjects module are managed through launchpad. We use their online interface to synchronize all translations efforts." +msgid "" +"The official translations pack of all OpenERP/OpenObjects module are managed " +"through launchpad. We use their online interface to synchronize all " +"translations efforts." msgstr "" #. module: base @@ -3583,8 +3660,8 @@ msgid "New Window" msgstr "Nouvelle fenêtre" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Second field should be figures" msgstr "" @@ -3599,10 +3676,13 @@ msgid "Parent Action" msgstr "Action Parente" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 -msgid "Couldn't generate the next id because some partners have an alphabetic id !" -msgstr "Impossible de générer le prochain identifiant car certains partenaires ont un identifiant alphabétique !" +#, python-format +msgid "" +"Couldn't generate the next id because some partners have an alphabetic id !" +msgstr "" +"Impossible de générer le prochain identifiant car certains partenaires ont " +"un identifiant alphabétique !" #. module: base #: selection:ir.report.custom,state:0 @@ -3622,7 +3702,7 @@ msgstr "" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Skip Step" -msgstr "" +msgstr "Passer l'Étape" #. module: base #: model:ir.actions.act_window,name:base.act_res_partner_event @@ -3655,14 +3735,14 @@ msgid "Active Partner Events" msgstr "Évènements Actifs des Partenaires" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Wrong ID for the browse record, got %r, expected an integer." msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Error occured while validating the field(s) %s: %s" msgstr "" @@ -3700,7 +3780,9 @@ msgstr "" #. module: base #: help:ir.actions.wizard,multi:0 -msgid "If set to true, the wizard will not be displayed on the right toolbar of a form views." +msgid "" +"If set to true, the wizard will not be displayed on the right toolbar of a " +"form views." msgstr "" #. module: base @@ -3911,7 +3993,7 @@ msgstr "" #. module: base #: selection:ir.actions.todo,state:0 msgid "Done" -msgstr "" +msgstr "Terminé" #. module: base #: field:ir.actions.server,trigger_obj_id:0 @@ -3927,7 +4009,9 @@ msgstr "Facture" #: help:ir.actions.report.custom,multi:0 #: help:ir.actions.report.xml,multi:0 #: help:ir.actions.act_window.view,multi:0 -msgid "If set to true, the action will not be displayed on the right toolbar of a form views." +msgid "" +"If set to true, the action will not be displayed on the right toolbar of a " +"form views." msgstr "" #. module: base @@ -3976,8 +4060,11 @@ msgstr "" #. module: base #: constraint:ir.model:0 -msgid "The Object name must start with x_ and not contain any special character !" -msgstr "Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères spéciaux !" +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères " +"spéciaux !" #. module: base #: rml:ir.module.reference:0 @@ -3987,7 +4074,7 @@ msgstr "Module :" #. module: base #: field:ir.actions.configuration.wizard,name:0 msgid "Next Wizard" -msgstr "" +msgstr "Assistant Suivant" #. module: base #: selection:ir.rule,operator:0 @@ -4019,7 +4106,9 @@ msgstr "" #. module: base #: wizard_view:module.lang.install,start:0 -msgid "The selected language has been successfully installed. You must change the preferences of the user and open a new menu to view changes." +msgid "" +"The selected language has been successfully installed. You must change the " +"preferences of the user and open a new menu to view changes." msgstr "" #. module: base @@ -4082,8 +4171,8 @@ msgid "STOCK_HOME" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Enter at least one field !" msgstr "Entrez au moins un champ !" @@ -4268,8 +4357,8 @@ msgid "Field Mappings" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The copy method is not implemented on this object !" msgstr "La méthode 'copy' n'est pas implémentée dans cet objet !" @@ -4290,8 +4379,8 @@ msgid "center" msgstr "centre" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_module_import.py:0 +#, python-format msgid "Can not create the module file: %s !" msgstr "" @@ -4408,7 +4497,7 @@ msgstr "Fichier" #. module: base #: field:ir.model,access_ids:0 msgid "Access" -msgstr "" +msgstr "Accès" #. module: base #: selection:ir.ui.menu,icon:0 @@ -4459,8 +4548,8 @@ msgid "STOCK_PRINT_PREVIEW" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The perm_read method is not implemented on this object !" msgstr "La méthode 'perm_read' n'est pas implémentée dans cet objet !" @@ -4523,8 +4612,8 @@ msgid "Repeat missed" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Couldn't find tag '%s' in parent view !" msgstr "" @@ -4598,8 +4687,8 @@ msgid "Installed modules" msgstr "" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 +#, python-format msgid "Warning" msgstr "" @@ -4614,8 +4703,8 @@ msgid "Operator" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "ValidateError" msgstr "" @@ -4667,8 +4756,8 @@ msgid "Report Footer 1" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not delete this document! (%s)" msgstr "" @@ -4716,14 +4805,14 @@ msgid "Printed:" msgstr "" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "Can not upgrade module '%s'. It is not installed." msgstr "" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented set_memory method !" msgstr "" @@ -4764,7 +4853,7 @@ msgstr "" #: view:ir.sequence:0 #: view:res.company:0 msgid "Configuration" -msgstr "Configuration" +msgstr "" #. module: base #: field:ir.model.fields,ttype:0 @@ -4819,8 +4908,8 @@ msgid "Cascade" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Field %d should be a figure" msgstr "" @@ -4832,8 +4921,8 @@ msgid "Gantt" msgstr "" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not Implemented" msgstr "" @@ -4861,7 +4950,7 @@ msgstr "" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Next Configuration Step" -msgstr "" +msgstr "Prochaine Étape de la Configuration" #. module: base #: selection:ir.ui.menu,icon:0 @@ -4882,7 +4971,10 @@ msgstr "" #. module: base #: view:res.config.view:0 -msgid "Choose the simplified interface if you are testing OpenERP for the first time. Less used options or fields are automatically hidden. You will be able to change this, later, through the Administration menu." +msgid "" +"Choose the simplified interface if you are testing OpenERP for the first " +"time. Less used options or fields are automatically hidden. You will be able " +"to change this, later, through the Administration menu." msgstr "" #. module: base @@ -4897,7 +4989,9 @@ msgstr "" #. module: base #: help:ir.actions.report.xml,attachment:0 -msgid "This is the prefix of the file name the print will be saved as attachement. Keep empty to not save the printed reports" +msgid "" +"This is the prefix of the file name the print will be saved as attachement. " +"Keep empty to not save the printed reports" msgstr "" #. module: base @@ -4944,26 +5038,32 @@ msgid "ir.actions.report.xml" msgstr "" #. module: base -#, python-format #: code:addons/base/maintenance/maintenance.py:0 +#, python-format msgid "Maintenance Error !" msgstr "" #. module: base #: view:wizard.module.lang.export:0 -msgid "To improve some terms of the official translations of OpenERP, you should modify the terms directly on the launchpad interface. If you made lots of translations for your own module, you can also publish all your translation at once." +msgid "" +"To improve some terms of the official translations of OpenERP, you should " +"modify the terms directly on the launchpad interface. If you made lots of " +"translations for your own module, you can also publish all your translation " +"at once." msgstr "" #. module: base #: view:res.users:0 -msgid "Please note that you will have to logout and relog if you change your password." +msgid "" +"Please note that you will have to logout and relog if you change your " +"password." msgstr "" #. module: base #: field:res.partner,address:0 #: view:res.partner.address:0 msgid "Contacts" -msgstr "Contacts" +msgstr "" #. module: base #: selection:ir.actions.act_window.view,view_mode:0 @@ -5003,8 +5103,8 @@ msgid "Module dependency" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The name_get method is not implemented on this object !" msgstr "" @@ -5132,8 +5232,8 @@ msgid "Import a Translation File" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_actions.py:0 +#, python-format msgid "Please specify the Partner Email address !" msgstr "" @@ -5152,7 +5252,9 @@ msgstr "" #. module: base #: view:ir.actions.server:0 -msgid "If you use a formula type, use a python expression using the variable 'object'." +msgid "" +"If you use a formula type, use a python expression using the variable " +"'object'." msgstr "" #. module: base @@ -5171,8 +5273,8 @@ msgid "VAT" msgstr "TVA" #. module: base -#, python-format #: code:addons/base/maintenance/maintenance.py:0 +#, python-format msgid "Valid Maintenance Contract !" msgstr "" @@ -5197,13 +5299,13 @@ msgid "res.partner.som" msgstr "" #. module: base -#, python-format #: code:report/custom.py:0 #: code:addons/base/ir/ir_actions.py:0 #: code:addons/base/ir/ir_model.py:0 #: code:addons/base/res/res_user.py:0 #: code:addons/base/res/res_currency.py:0 #: code:addons/base/module/module.py:0 +#, python-format msgid "Error" msgstr "" @@ -5337,7 +5439,7 @@ msgstr "" #. module: base #: constraint:res.partner:0 msgid "The VAT doesn't seem to be correct." -msgstr "Le numéro de TVA ne semble pas correct." +msgstr "" #. module: base #: view:ir.sequence:0 @@ -5434,8 +5536,8 @@ msgid "Description" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Invalid operation" msgstr "" @@ -5471,8 +5573,8 @@ msgid "ir.attachment" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The value \"%s\" for the field \"%s\" is not in the selection" msgstr "" @@ -5649,12 +5751,15 @@ msgstr "" #. module: base #: help:res.partner.address,type:0 -msgid "Used to select automatically the right address according to the context in sales and purchases documents." +msgid "" +"Used to select automatically the right address according to the context in " +"sales and purchases documents." msgstr "" #. module: base #: help:ir.cron,numbercall:0 -msgid "Number of time the function is called,\n" +msgid "" +"Number of time the function is called,\n" "a negative number indicates that the function will always be called" msgstr "" @@ -5689,8 +5794,8 @@ msgid "Cancel Install" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Please check that all your lines have %d columns." msgstr "" @@ -5703,4 +5808,3 @@ msgstr "" #: field:ir.model.data,name:0 msgid "XML Identifier" msgstr "" - From 9d857cea72fe6b7d609bdc9440e4057d6b1343d2 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 16:57:02 +0100 Subject: [PATCH 49/86] Merged the Launchpad translations with the Bazaar po files bzr revid: olt@tinyerp.com-20081216155702-014dib95v6dnkafd --- addons/account/i18n/fr_FR.po | 414 +++++++++++++++++++++++++---------- addons/board/i18n/fr_FR.po | 9 +- 2 files changed, 304 insertions(+), 119 deletions(-) diff --git a/addons/account/i18n/fr_FR.po b/addons/account/i18n/fr_FR.po index 9be79118f8c..8f2141f970b 100644 --- a/addons/account/i18n/fr_FR.po +++ b/addons/account/i18n/fr_FR.po @@ -12,8 +12,9 @@ msgstr "" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-12-16 10:59+0000\n" +"X-Generator: Launchpad (build Unknown)\n" #. module: account #, python-format @@ -39,8 +40,13 @@ msgstr "Code du compte taxe" #. module: account #: help:account.tax,domain:0 -msgid "This field is only used if you develop your own module allowing developpers to create specific taxes in a custom domain." -msgstr "Ce champ est uniquement utilisé si vous développez votre module afin de permettre aux développeur de créer des taxes spécifiques dans un domaine personnalisé." +msgid "" +"This field is only used if you develop your own module allowing developpers " +"to create specific taxes in a custom domain." +msgstr "" +"Ce champ est uniquement utilisé si vous développez votre module afin de " +"permettre aux développeur de créer des taxes spécifiques dans un domaine " +"personnalisé." #. module: account #: selection:account.subscription,period_type:0 @@ -439,7 +445,7 @@ msgstr "Rem. (%)" #. module: account #: selection:account.account.type,sign:0 msgid "Negative" -msgstr "" +msgstr "Négatif" #. module: account #: field:account.analytic.line,move_id:0 @@ -448,8 +454,14 @@ msgstr "Ligne de mouvement" #. module: account #: rml:account.overdue:0 -msgid "Would your payment have been carried out after this mail was sent, please consider the present one as void. Do not hesitate to contact our accounting departement at +32 81 81 37 00." -msgstr "Dans le cas où votre paiement aurait été effectués après l'envoi de ce mail, veuillez considérer la présente comme nulle et non avenue. N'hésitez pas à contacter notre département comptabilité au +32 81 81 37 00." +msgid "" +"Would your payment have been carried out after this mail was sent, please " +"consider the present one as void. Do not hesitate to contact our accounting " +"departement at +32 81 81 37 00." +msgstr "" +"Dans le cas où votre paiement aurait été effectués après l'envoi de ce mail, " +"veuillez considérer la présente comme nulle et non avenue. N'hésitez pas à " +"contacter notre département comptabilité au +32 81 81 37 00." #. module: account #: selection:account.move,type:0 @@ -570,8 +582,12 @@ msgstr "Méthode de report à nouveau" #. module: account #: help:res.partner,property_payment_term:0 -msgid "This payment term will be used, instead of the default one, for the current partner" -msgstr "Cette condition de paiement sera utilisée, au lieu de celle par défaut, pour le partenaire courant" +msgid "" +"This payment term will be used, instead of the default one, for the current " +"partner" +msgstr "" +"Cette condition de paiement sera utilisée, au lieu de celle par défaut, pour " +"le partenaire courant" #. module: account #: field:account.tax,ref_base_code_id:0 @@ -586,8 +602,14 @@ msgstr "Ligne" #. module: account #: help:account.analytic.journal,type:0 -msgid "Gives the type of the analytic journal. When a document (eg: an invoice) needs to create analytic entries, Tiny ERP will look for a matching journal of the same type." -msgstr "Donne the type de journal analytique. Quand un document (ex. une facture) a besoin de créer une entrée analytique, Tiny ERP regardera aprés un journal du même type." +msgid "" +"Gives the type of the analytic journal. When a document (eg: an invoice) " +"needs to create analytic entries, Tiny ERP will look for a matching journal " +"of the same type." +msgstr "" +"Donne the type de journal analytique. Quand un document (ex. une facture) a " +"besoin de créer une entrée analytique, Tiny ERP regardera aprés un journal " +"du même type." #. module: account #: selection:account.tax,applicable_type:0 @@ -695,8 +717,9 @@ msgstr "" #. module: account #, python-format -#: code:addons/account/account_move_line.py:0 -msgid "You can not do this modification on a reconciled entry ! Please note that you can just change some non important fields !" +msgid "" +"You can not do this modification on a reconciled entry ! Please note that " +"you can just change some non important fields !" msgstr "" #. module: account @@ -728,8 +751,12 @@ msgstr "Enfant" #. module: account #: help:product.category,property_account_expense_categ:0 -msgid "This account will be used, instead of the default one, to value outgoing stock for the current product category" -msgstr "Ce compte sera utilisé, au lieu de celui par defaut, pour valoriser les sorties de marchandises pour la catégorie de produit courante" +msgid "" +"This account will be used, instead of the default one, to value outgoing " +"stock for the current product category" +msgstr "" +"Ce compte sera utilisé, au lieu de celui par defaut, pour valoriser les " +"sorties de marchandises pour la catégorie de produit courante" #. module: account #: wizard_button:populate_statement_from_inv,init,customer:0 @@ -799,13 +826,21 @@ msgstr "Journal des Traitements de fin d'année" #. module: account #: help:res.partner,property_account_payable:0 -msgid "This account will be used, instead of the default one, as the payable account for the current partner" -msgstr "Ce compte sera utilisé, au lieu de celui par defaut, comme le compte de paiement pour le partenaire courant" +msgid "" +"This account will be used, instead of the default one, as the payable " +"account for the current partner" +msgstr "" +"Ce compte sera utilisé, au lieu de celui par defaut, comme le compte de " +"paiement pour le partenaire courant" #. module: account #: help:account.move.line,amount_currency:0 -msgid "The amount expressed in an optionnal other currency if it is a multi-currency entry." -msgstr "Le montant exprimé dans une autre devise optionnelle si c'est une entrée multi-devise." +msgid "" +"The amount expressed in an optionnal other currency if it is a multi-" +"currency entry." +msgstr "" +"Le montant exprimé dans une autre devise optionnelle si c'est une entrée " +"multi-devise." #. module: account #: model:ir.actions.act_window,name:account.action_tax_code_list @@ -859,7 +894,7 @@ msgstr "Générer les entrée avant:" #: model:ir.actions.report.xml,name:account.account_analytic_account_cost_ledger #: model:ir.actions.wizard,name:account.account_analytic_account_cost_ledger_report msgid "Cost Ledger" -msgstr "Livre de coûts" +msgstr "Grand livre analytique" #. module: account #: wizard_view:account.account.balance.report,checktype:0 @@ -924,7 +959,7 @@ msgstr "Comptes analytiques" #: model:ir.actions.wizard,name:account.wizard_print_journal #: model:ir.ui.menu,name:account.menu_print_journal msgid "Print Journal" -msgstr "" +msgstr "Journal détaillé par écriture" #. module: account #: model:ir.model,name:account.model_account_bank_accounts_wizard @@ -1062,8 +1097,16 @@ msgstr "" #. module: account #: help:account.journal,view_id:0 -msgid "Gives the view used when writing or browsing entries in this journal. The view tell Tiny ERP which fields should be visible, required or readonly and in which order. You can create your own view for a faster encoding in each journal." -msgstr "Donne la vue utilisée lors de l'écriture ou la navigation dans ce journal. La vue dit à Tiny ERP quels champs devront être visible, requis ou en lecture seul et dans quel ordre. Vous pouvez créer votre propre vue pour un encodage plus rapide dans chaque journal." +msgid "" +"Gives the view used when writing or browsing entries in this journal. The " +"view tell Tiny ERP which fields should be visible, required or readonly and " +"in which order. You can create your own view for a faster encoding in each " +"journal." +msgstr "" +"Donne la vue utilisée lors de l'écriture ou la navigation dans ce journal. " +"La vue dit à Tiny ERP quels champs devront être visible, requis ou en " +"lecture seul et dans quel ordre. Vous pouvez créer votre propre vue pour un " +"encodage plus rapide dans chaque journal." #. module: account #: model:ir.model,name:account.model_account_fiscal_position @@ -1153,13 +1196,17 @@ msgstr "" #. module: account #: help:account.payment.term.line,sequence:0 -msgid "The sequence field is used to order the payment term lines from the lowest sequences to the higher ones" -msgstr "Le champ sequence est utilisé pour classer les lignes de termes de paiement des plus basses séquences vers les plus hautes." +msgid "" +"The sequence field is used to order the payment term lines from the lowest " +"sequences to the higher ones" +msgstr "" +"Le champ sequence est utilisé pour classer les lignes de termes de paiement " +"des plus basses séquences vers les plus hautes." #. module: account #: field:account.chart.template,property_account_income_categ:0 msgid "Income Category Account" -msgstr "" +msgstr "Catégorie de Compte de Revenu" #. module: account #: model:ir.actions.act_window,name:account.analytic_account_form @@ -1245,12 +1292,21 @@ msgstr "Devise société" #. module: account #: help:account.journal,entry_posted:0 -msgid "Check this box if you don't want that new account moves pass through the 'draft' state and goes direclty to the 'posted state' without any manual validation." -msgstr "Cochez cette case si vous ne voulez pas que les nouveaux mouvements de comptes passent par l'état 'Brouillon' et se retrouvent directement dans l'état 'Transféré' sans validation manuelle." +msgid "" +"Check this box if you don't want that new account moves pass through the " +"'draft' state and goes direclty to the 'posted state' without any manual " +"validation." +msgstr "" +"Cochez cette case si vous ne voulez pas que les nouveaux mouvements de " +"comptes passent par l'état 'Brouillon' et se retrouvent directement dans " +"l'état 'Transféré' sans validation manuelle." #. module: account #: help:account.payment.term.line,days2:0 -msgid "Day of the month, set -1 for the last day of the current month. If it's positive, it gives the day of the next month. Set 0 for net days (otherwise it's based on the end of the month)." +msgid "" +"Day of the month, set -1 for the last day of the current month. If it's " +"positive, it gives the day of the next month. Set 0 for net days (otherwise " +"it's based on the end of the month)." msgstr "" #. module: account @@ -1378,8 +1434,12 @@ msgstr "" #. module: account #: wizard_view:account.reconcile.unreconcile,init:0 #: wizard_view:account.move.line.unreconcile,init:0 -msgid "If you unreconciliate transactions, you must also verify all the actions that are linked to those transactions because they will not be disable" -msgstr "Si vous déreconciliez des transactions, vous devez aussi vérifier toutes les actions qui sont liées à ces transactions car elles ne seront pas déactivées" +msgid "" +"If you unreconciliate transactions, you must also verify all the actions " +"that are linked to those transactions because they will not be disable" +msgstr "" +"Si vous déreconciliez des transactions, vous devez aussi vérifier toutes les " +"actions qui sont liées à ces transactions car elles ne seront pas déactivées" #. module: account #: field:wizard.multi.charts.accounts,bank_accounts_id:0 @@ -1771,7 +1831,7 @@ msgstr "Grand Livre par période" #. module: account #: wizard_field:account.analytic.line,init,from_date:0 msgid "From" -msgstr "" +msgstr "Période du" #. module: account #: model:process.node,note:account.process_node_reconciliation0 @@ -1782,7 +1842,7 @@ msgstr "" #. module: account #: wizard_view:account.central.journal.report,init:0 msgid "Print Central Journal" -msgstr "" +msgstr "Journal regroupé par compte" #. module: account #: field:account.analytic.account,code:0 @@ -2015,8 +2075,12 @@ msgstr "Notes de Crédit Client" #. module: account #: help:product.category,property_account_income_categ:0 -msgid "This account will be used, instead of the default one, to value incoming stock for the current product category" -msgstr "Ce compte sera utilisé, au lieu de celui par défaut, pour valoriser le stock sortant pour la catégorie de produit courante" +msgid "" +"This account will be used, instead of the default one, to value incoming " +"stock for the current product category" +msgstr "" +"Ce compte sera utilisé, au lieu de celui par défaut, pour valoriser le stock " +"sortant pour la catégorie de produit courante" #. module: account #: rml:account.analytic.account.quantity_cost_ledger:0 @@ -2079,8 +2143,14 @@ msgstr "Jours" #. module: account #: help:account.tax.template,sequence:0 -msgid "The sequence field is used to order the taxes lines from the lowest sequences to the higher ones. The order is important if you have a tax that have several tax children. In this case, the evaluation order is important." -msgstr "Le Champ 'Séquence' est utilisé pour trier les lignes de taxes du plus petit numéro de séquence au plus grand. L'ordre est important si vous avez plusieurs taxes enfant. Dans ce cas, l'ordre d'évaluation est important." +msgid "" +"The sequence field is used to order the taxes lines from the lowest " +"sequences to the higher ones. The order is important if you have a tax that " +"have several tax children. In this case, the evaluation order is important." +msgstr "" +"Le Champ 'Séquence' est utilisé pour trier les lignes de taxes du plus petit " +"numéro de séquence au plus grand. L'ordre est important si vous avez " +"plusieurs taxes enfant. Dans ce cas, l'ordre d'évaluation est important." #. module: account #: rml:account.general.ledger:0 @@ -2204,8 +2274,14 @@ msgstr "" #. module: account #: rml:account.overdue:0 -msgid "Exception made of a mistake of our side, it seems that the following bills stay unpaid. Please, take appropriate measures in order to carry out this payment in the next 8 days." -msgstr "Sauf erreur de notre part, il semble que les factures suivantes demeurent impayées. Nous vous prions de prendre les mesures nécessaires afin de procéder au payement dans les 8 jours." +msgid "" +"Exception made of a mistake of our side, it seems that the following bills " +"stay unpaid. Please, take appropriate measures in order to carry out this " +"payment in the next 8 days." +msgstr "" +"Sauf erreur de notre part, il semble que les factures suivantes demeurent " +"impayées. Nous vous prions de prendre les mesures nécessaires afin de " +"procéder au payement dans les 8 jours." #. module: account #: rml:account.invoice:0 @@ -2263,7 +2339,7 @@ msgstr "" #: selection:account.account.template,type:0 #: selection:account.account,type:0 msgid "Consolidation" -msgstr "" +msgstr "Consolidation" #. module: account #: field:account.invoice,date_invoice:0 @@ -2491,7 +2567,7 @@ msgstr "Informations supplémentaires" #. module: account #: field:account.config.wizard,date2:0 msgid "Ending Date" -msgstr "" +msgstr "Date de Clôture" #. module: account #: wizard_field:account.account.balance.report,checktype,fiscalyear:0 @@ -2572,7 +2648,7 @@ msgstr "Intitulé" #: selection:account.account.template,type:0 #: selection:account.account,type:0 msgid "Receivable" -msgstr "" +msgstr "Recevable" #. module: account #: wizard_view:account.move.validate,init:0 @@ -2613,8 +2689,15 @@ msgstr "L'utilisateur résponsable de ce journal" #. module: account #: help:account.tax,sequence:0 -msgid "The sequence field is used to order the taxes lines from the lowest sequences to the higher ones. The order is important if you have a tax that have several tax childs. In this case, the evaluation order is important." -msgstr "Le champ sequence est utilisé pour classer les lignes de taxes des plus basses séquences vers les plus hautes. l'ordre est important si vous avez une taxe qui a plusieurs taxes enfants. Dans ce cas, l'ordre d'évaluation est important." +msgid "" +"The sequence field is used to order the taxes lines from the lowest " +"sequences to the higher ones. The order is important if you have a tax that " +"have several tax childs. In this case, the evaluation order is important." +msgstr "" +"Le champ sequence est utilisé pour classer les lignes de taxes des plus " +"basses séquences vers les plus hautes. l'ordre est important si vous avez " +"une taxe qui a plusieurs taxes enfants. Dans ce cas, l'ordre d'évaluation " +"est important." #. module: account #, python-format @@ -2802,7 +2885,9 @@ msgstr "Total crédit" #. module: account #: rml:account.overdue:0 msgid "Best regards." -msgstr "Nous vous prions d'agréer, Madame, Monsieur, l'expression de nos sentiments distingués." +msgstr "" +"Nous vous prions d'agréer, Madame, Monsieur, l'expression de nos sentiments " +"distingués." #. module: account #: wizard_button:account.subscription.generate,init,generate:0 @@ -2831,7 +2916,12 @@ msgstr "Contrôle des ecritures" #. module: account #: help:account.account,currency_mode:0 -msgid "This will select how is computed the current currency rate for outgoing transactions. In most countries the legal method is \"average\" but only a few softwares are able to manage this. So if you import from another software, you may have to use the rate at date. Incoming transactions, always use the rate at date." +msgid "" +"This will select how is computed the current currency rate for outgoing " +"transactions. In most countries the legal method is \"average\" but only a " +"few softwares are able to manage this. So if you import from another " +"software, you may have to use the rate at date. Incoming transactions, " +"always use the rate at date." msgstr "" #. module: account @@ -2972,8 +3062,14 @@ msgstr "Lecture seule" #. module: account #: help:account.model.line,date_maturity:0 -msgid "The maturity date of the generated entries for this model. You can chosse between the date of the creation action or the the date of the creation of the entries plus the partner payment terms." -msgstr "La date d'échéance de l'entrée générée pour ce modèle. Vous pouvez choisir entre la date de création de l'action ou la date de création des entrées plus les conditions de payement du partenaire." +msgid "" +"The maturity date of the generated entries for this model. You can chosse " +"between the date of the creation action or the the date of the creation of " +"the entries plus the partner payment terms." +msgstr "" +"La date d'échéance de l'entrée générée pour ce modèle. Vous pouvez choisir " +"entre la date de création de l'action ou la date de création des entrées " +"plus les conditions de payement du partenaire." #. module: account #: constraint:account.fiscalyear:0 @@ -2982,8 +3078,12 @@ msgstr "" #. module: account #: help:product.template,property_account_income:0 -msgid "This account will be used, instead of the default one, to value incoming stock for the current product" -msgstr "Ce compte sera utilisé , au lieu de celui par défaut, pour valoriser le stock d'entrée pour le produit courant" +msgid "" +"This account will be used, instead of the default one, to value incoming " +"stock for the current product" +msgstr "" +"Ce compte sera utilisé , au lieu de celui par défaut, pour valoriser le " +"stock d'entrée pour le produit courant" #. module: account #: rml:account.invoice:0 @@ -3078,7 +3178,7 @@ msgstr "" #: selection:account.account.template,type:0 #: selection:account.account,type:0 msgid "Payable" -msgstr "" +msgstr "Payable" #. module: account #: model:ir.actions.report.xml,name:account.account_vat_declaration @@ -3087,7 +3187,9 @@ msgstr "" #. module: account #: help:account.account,merge_invoice:0 -msgid "Check this box if you want that all lines of a customer or supplier invoice using this account are created in one line only" +msgid "" +"Check this box if you want that all lines of a customer or supplier invoice " +"using this account are created in one line only" msgstr "" #. module: account @@ -3104,7 +3206,7 @@ msgstr "" #. module: account #: field:account.chart.template,property_account_expense_categ:0 msgid "Expense Category Account" -msgstr "" +msgstr "Catégorie de Compte de Dépenses" #. module: account #: wizard_button:account.move.validate,init,validate:0 @@ -3291,9 +3393,11 @@ msgid "Total debit" msgstr "Total débit" #. module: account -#, python-format #: code:addons/account/wizard/wizard_bank_reconcile.py:0 -msgid "You have to define the bank account\nin the journal definition for reconciliation." +#, python-format +msgid "" +"You have to define the bank account\n" +"in the journal definition for reconciliation." msgstr "" #. module: account @@ -3340,13 +3444,21 @@ msgstr "Comptes partenaires" #. module: account #: help:account.tax,tax_group:0 #: help:account.tax.template,tax_group:0 -msgid "If a default tax if given in the partner it only override taxes from account (or product) of the same group." -msgstr "Si une taxe par défaut est précisée pour le partenaire cela ne surcharge seulement que les taxes pour le compte (ou le produit) du même groupe." +msgid "" +"If a default tax if given in the partner it only override taxes from account " +"(or product) of the same group." +msgstr "" +"Si une taxe par défaut est précisée pour le partenaire cela ne surcharge " +"seulement que les taxes pour le compte (ou le produit) du même groupe." #. module: account #: help:account.model.line,sequence:0 -msgid "The sequence field is used to order the resources from the lowest sequences to the higher ones" -msgstr "Le champ séquence est utilisé pour ordonner les documents de la plus petit vers la plus grand" +msgid "" +"The sequence field is used to order the resources from the lowest sequences " +"to the higher ones" +msgstr "" +"Le champ séquence est utilisé pour ordonner les documents de la plus petit " +"vers la plus grand" #. module: account #: view:account.bank.statement:0 @@ -3383,8 +3495,13 @@ msgstr "Raccourci" #. module: account #: wizard_view:account.move.validate,init:0 -msgid "All draft account entries in this journal and period will be validated. It means you won't be able to modify their accouting fields." -msgstr "Toutes les entrées de comptes brouillon dans ce journal et cette période seront validées. Cela veut dire que vous ne pourrez plus modifier leurs champs de compte." +msgid "" +"All draft account entries in this journal and period will be validated. It " +"means you won't be able to modify their accouting fields." +msgstr "" +"Toutes les entrées de comptes brouillon dans ce journal et cette période " +"seront validées. Cela veut dire que vous ne pourrez plus modifier leurs " +"champs de compte." #. module: account #: selection:account.model.line,date:0 @@ -3394,8 +3511,13 @@ msgstr "Date du jour" #. module: account #: help:account.journal,centralisation:0 -msgid "Check this box if you want that each entry doesn't create a counterpart but share the same counterpart for each entry of this journal." -msgstr "Cochez cette boîte si vous voulez que chaque entrée ne crée pas de contrepartie mais partage la même contrepartie pour chaque entré de ce journal." +msgid "" +"Check this box if you want that each entry doesn't create a counterpart but " +"share the same counterpart for each entry of this journal." +msgstr "" +"Cochez cette boîte si vous voulez que chaque entrée ne crée pas de " +"contrepartie mais partage la même contrepartie pour chaque entré de ce " +"journal." #. module: account #: field:account.tax,parent_id:0 @@ -3437,7 +3559,7 @@ msgstr "Payer et réconcilier" #. module: account #: model:ir.actions.report.xml,name:account.account_central_journal msgid "Central Journal" -msgstr "" +msgstr "Journal centralisé" #. module: account #, python-format @@ -3505,7 +3627,7 @@ msgstr "Journal" #: selection:account.account.template,type:0 #: selection:account.account,type:0 msgid "Closed" -msgstr "" +msgstr "Fermé" #. module: account #: view:account.analytic.line:0 @@ -3571,7 +3693,9 @@ msgstr "Entrées standard" #. module: account #: help:account.account,check_history:0 -msgid "Check this box if you want to print all entries when printing the General Ledger, otherwise it will only print its balance." +msgid "" +"Check this box if you want to print all entries when printing the General " +"Ledger, otherwise it will only print its balance." msgstr "" #. module: account @@ -3641,9 +3765,11 @@ msgid "The journal must have centralised counterpart" msgstr "" #. module: account -#, python-format #: code:addons/account/account.py:0 -msgid "You can not modify a posted entry of this journal !\nYou should mark the journal to allow canceling entries." +#, python-format +msgid "" +"You can not modify a posted entry of this journal !\n" +"You should mark the journal to allow canceling entries." msgstr "" #. module: account @@ -3830,7 +3956,7 @@ msgstr "" #. module: account #: field:account.chart.template,property_account_payable:0 msgid "Payable Account" -msgstr "" +msgstr "Compte Payable" #. module: account #: field:account.account,currency_id:0 @@ -3858,8 +3984,12 @@ msgstr "Crédit" #. module: account #: help:account.tax,child_depend:0 #: help:account.tax.template,child_depend:0 -msgid "Indicate if the tax computation is based on the value computed for the computation of child taxes or based on the total amount." -msgstr "Indique si le calcul de taxe est basé sur la valeur calculée pour la calculation des taxes de l'enfant ou basée sur le montatn total" +msgid "" +"Indicate if the tax computation is based on the value computed for the " +"computation of child taxes or based on the total amount." +msgstr "" +"Indique si le calcul de taxe est basé sur la valeur calculée pour la " +"calculation des taxes de l'enfant ou basée sur le montatn total" #. module: account #: field:account.tax,account_paid_id:0 @@ -3891,7 +4021,9 @@ msgstr "Montant Taxé" #. module: account #: help:account.invoice,reconciled:0 -msgid "The account moves of the invoice have been reconciled with account moves of the payment(s)." +msgid "" +"The account moves of the invoice have been reconciled with account moves of " +"the payment(s)." msgstr "" #. module: account @@ -3911,7 +4043,9 @@ msgstr "Compte général" #. module: account #: help:account.move.line,quantity:0 -msgid "The optional quantity expressed by this line, eg: number of product sold. The quantity is not a legal requirement but is very usefull for some reports." +msgid "" +"The optional quantity expressed by this line, eg: number of product sold. " +"The quantity is not a legal requirement but is very usefull for some reports." msgstr "" #. module: account @@ -3921,8 +4055,12 @@ msgstr "" #. module: account #: help:account.move.line,blocked:0 -msgid "You can check this box to mark the entry line as a litigation with the associated partner" -msgstr "Vous pouvez cocher cette boîte pour marquer la ligne d'entrée comme un litige avec le partenaire associé" +msgid "" +"You can check this box to mark the entry line as a litigation with the " +"associated partner" +msgstr "" +"Vous pouvez cocher cette boîte pour marquer la ligne d'entrée comme un " +"litige avec le partenaire associé" #. module: account #: wizard_field:account.automatic.reconcile,init,account_ids:0 @@ -4031,8 +4169,11 @@ msgstr "Taxes par défaut" #. module: account #: constraint:ir.model:0 -msgid "The Object name must start with x_ and not contain any special character !" -msgstr "Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères spéciaux !" +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères " +"spéciaux !" #. module: account #: help:account.config.wizard,code:0 @@ -4041,8 +4182,12 @@ msgstr "" #. module: account #: help:account.move.line,date_maturity:0 -msgid "This field is used for payable and receivable entries. You can put the limit date for the payment of this entry line." -msgstr "Ce champ est utilisé pour les entrée à payer et à recevoir. Vous pouvez mettre la date limite pour le payement de cette ligne d'entrée." +msgid "" +"This field is used for payable and receivable entries. You can put the limit " +"date for the payment of this entry line." +msgstr "" +"Ce champ est utilisé pour les entrée à payer et à recevoir. Vous pouvez " +"mettre la date limite pour le payement de cette ligne d'entrée." #. module: account #: field:account.account,parent_left:0 @@ -4280,7 +4425,7 @@ msgstr "États" #: model:process.node,name:account.process_node_accountingentries0 #: model:process.node,name:account.process_node_supplieraccountingentries0 msgid "Accounting Entries" -msgstr "" +msgstr "Écritures comptables" #. module: account #: model:ir.actions.act_window,name:account.act_account_partner_account_move_unreconciled @@ -4365,7 +4510,9 @@ msgstr "Facture client Pro-Forma" #. module: account #: view:wizard.multi.charts.accounts:0 -msgid "This will automatically configure your chart of accounts, bank accounts, taxes and journals according to the selected template" +msgid "" +"This will automatically configure your chart of accounts, bank accounts, " +"taxes and journals according to the selected template" msgstr "" #. module: account @@ -4444,8 +4591,12 @@ msgstr "Case de la déclaration fiscale" #. module: account #: help:account.tax,include_base_amount:0 -msgid "Indicate if the amount of tax must be included in the base amount for the computation of the next taxes" -msgstr "Indique si le montant de la taxe doit être inclue dans le montant de base pour le calcul des taxes suivantes" +msgid "" +"Indicate if the amount of tax must be included in the base amount for the " +"computation of the next taxes" +msgstr "" +"Indique si le montant de la taxe doit être inclue dans le montant de base " +"pour le calcul des taxes suivantes" #. module: account #: model:process.node,name:account.process_node_draftstatement0 @@ -4519,9 +4670,11 @@ msgid "General Credit" msgstr "" #. module: account -#, python-format #: code:addons/account/invoice.py:0 -msgid "Tax base different !\nClick on compute to update tax base" +#, python-format +msgid "" +"Tax base different !\n" +"Click on compute to update tax base" msgstr "" #. module: account @@ -4587,7 +4740,7 @@ msgstr "" #: model:ir.actions.wizard,name:account.wizard_balance_report #: model:ir.ui.menu,name:account.menu_account_balance_report msgid "Account Balance" -msgstr "" +msgstr "Solde du compte" #. module: account #: model:ir.actions.report.xml,name:account.account_analytic_account_analytic_check @@ -4630,7 +4783,9 @@ msgstr "Taxes à la Vente" #. module: account #: help:account.tax.template,include_base_amount:0 -msgid "Indicate if the amount of tax must be included in the base amount for the computation of the next taxes." +msgid "" +"Indicate if the amount of tax must be included in the base amount for the " +"computation of the next taxes." msgstr "" #. module: account @@ -4655,8 +4810,13 @@ msgstr "" #. module: account #: help:account.tax.template,domain:0 -msgid "This field is only used if you develop your own module allowing developers to create specific taxes in a custom domain." -msgstr "Ce champ est uniquement utilisé si vous développez votre propre module, permettant ainsi aux développeurs de créer des taxes spécifiques dans un domaine spécifique." +msgid "" +"This field is only used if you develop your own module allowing developers " +"to create specific taxes in a custom domain." +msgstr "" +"Ce champ est uniquement utilisé si vous développez votre propre module, " +"permettant ainsi aux développeurs de créer des taxes spécifiques dans un " +"domaine spécifique." #. module: account #: field:account.bank.statement.reconcile,total_amount:0 @@ -4776,7 +4936,7 @@ msgstr "" #: rml:account.analytic.account.cost_ledger:0 #: rml:account.analytic.account.quantity_cost_ledger:0 msgid "/" -msgstr "" +msgstr "/" #. module: account #: model:process.node,note:account.process_node_invoiceinvoice0 @@ -4795,9 +4955,11 @@ msgid "Move line select" msgstr "Déplacer la ligne sélectionnée" #. module: account -#, python-format #: code:addons/account/invoice.py:0 -msgid "Please verify the price of the invoice !\nThe real total does not match the computed total." +#, python-format +msgid "" +"Please verify the price of the invoice !\n" +"The real total does not match the computed total." msgstr "" #. module: account @@ -4819,7 +4981,7 @@ msgstr "Clôturer l'année fiscale" #. module: account #: field:account.config.wizard,date1:0 msgid "Starting Date" -msgstr "" +msgstr "Date de début" #. module: account #: view:account.journal:0 @@ -4961,8 +5123,12 @@ msgstr "Annulées" #. module: account #: help:account.account,reconcile:0 -msgid "Check this account if the user can make a reconciliation of the entries in this account." -msgstr "Cochez ce compte si l'utilisateur peut faire une réconciliation des entrées dans ce compte." +msgid "" +"Check this account if the user can make a reconciliation of the entries in " +"this account." +msgstr "" +"Cochez ce compte si l'utilisateur peut faire une réconciliation des entrées " +"dans ce compte." #. module: account #: view:res.partner:0 @@ -5031,9 +5197,10 @@ msgid "Financial Management" msgstr "Finance/Comptabilité" #. module: account -#, python-format #: code:addons/account/wizard/wizard_validate_account_move.py:0 -msgid "Selected Move lines does not have any account move enties in draft state" +#, python-format +msgid "" +"Selected Move lines does not have any account move enties in draft state" msgstr "" #. module: account @@ -5164,8 +5331,12 @@ msgstr "" #. module: account #: help:account.account.template,reconcile:0 -msgid "Check this option if the user can make a reconciliation of the entries in this account." -msgstr "Cochez cette option si l'utilisateur a le droit de réconcilier les entrées de ce compte." +msgid "" +"Check this option if the user can make a reconciliation of the entries in " +"this account." +msgstr "" +"Cochez cette option si l'utilisateur a le droit de réconcilier les entrées " +"de ce compte." #. module: account #: view:account.invoice:0 @@ -5197,16 +5368,16 @@ msgid "Analytic account costs and revenues" msgstr "Compte analytique coûts et revenus" #. module: account -#, python-format #: code:addons/account/account_move_line.py:0 +#, python-format msgid "Bad account !" msgstr "" #. module: account -#, python-format #: code:addons/account/account_move_line.py:0 #: code:addons/account/account.py:0 #: code:addons/account/wizard/wizard_open_closed_fiscalyear.py:0 +#, python-format msgid "Error" msgstr "" @@ -5230,7 +5401,7 @@ msgstr "Détails de banque" #. module: account #: model:ir.actions.report.xml,name:account.account_general_journal msgid "General Journal" -msgstr "" +msgstr "Journal Général" #. module: account #: wizard_button:account.account.balance.report,account_selection,checktype:0 @@ -5239,8 +5410,8 @@ msgid "Next" msgstr "" #. module: account -#, python-format #: code:addons/account/invoice.py:0 +#, python-format msgid "Taxes missing !" msgstr "" @@ -5260,9 +5431,9 @@ msgid "Invoice Tax" msgstr "Taxe" #. module: account -#, python-format #: code:addons/account/invoice.py:0 #: code:addons/account/account_move_line.py:0 +#, python-format msgid "No piece number !" msgstr "" @@ -5305,8 +5476,8 @@ msgid "Total amount you have to pay to this supplier." msgstr "" #. module: account -#, python-format #: code:addons/account/account.py:0 +#, python-format msgid "No sequence defined in the journal !" msgstr "" @@ -5398,8 +5569,12 @@ msgstr "Année fiscale à clôturer" #. module: account #: help:product.template,property_account_expense:0 -msgid "This account will be used, instead of the default one, to value outgoing stock for the current product" -msgstr "Ce compte sera utilisé, au lieu de celui par defaut, pour valoriser le stock sortant pour le produit courant" +msgid "" +"This account will be used, instead of the default one, to value outgoing " +"stock for the current product" +msgstr "" +"Ce compte sera utilisé, au lieu de celui par defaut, pour valoriser le stock " +"sortant pour le produit courant" #. module: account #: field:account.model,name:0 @@ -5407,21 +5582,25 @@ msgid "Model Name" msgstr "Nom du modèle" #. module: account -#, python-format #: code:addons/account/invoice.py:0 +#, python-format msgid "Cannot delete invoice(s) which are already opened or paid !" msgstr "" #. module: account -#, python-format #: code:addons/account/invoice.py:0 +#, python-format msgid "Can not create invoice move on centralized journal" msgstr "" #. module: account #: help:res.partner,property_account_receivable:0 -msgid "This account will be used, instead of the default one, as the receivable account for the current partner" -msgstr "Ce compte sera utilisé, au lieu de celui par defaut, en tant que compte de créance pour le partenaire courant" +msgid "" +"This account will be used, instead of the default one, as the receivable " +"account for the current partner" +msgstr "" +"Ce compte sera utilisé, au lieu de celui par defaut, en tant que compte de " +"créance pour le partenaire courant" #. module: account #: model:ir.ui.menu,name:account.account_template_folder @@ -5526,10 +5705,14 @@ msgid "Ref." msgstr "Référence" #. module: account -#, python-format #: code:addons/account/invoice.py:0 #: code:addons/account/account_move_line.py:0 -msgid "Can not create an automatic sequence for this piece !\n\nPut a sequence in the journal definition for automatic numbering or create a sequence manually for this piece." +#, python-format +msgid "" +"Can not create an automatic sequence for this piece !\n" +"\n" +"Put a sequence in the journal definition for automatic numbering or create a " +"sequence manually for this piece." msgstr "" #. module: account @@ -5554,8 +5737,8 @@ msgid "Customer" msgstr "Client" #. module: account -#, python-format #: code:addons/account/wizard/wizard_pay_invoice.py:0 +#, python-format msgid "Can not pay draft invoice." msgstr "" @@ -5588,7 +5771,8 @@ msgstr "" #: help:account.account,currency_id:0 #: help:account.account.template,currency_id:0 msgid "Force all moves for this account to have this secondary currency." -msgstr "Force tout les mouvements pour ce compte à avoir cette devise secondaire." +msgstr "" +"Force tout les mouvements pour ce compte à avoir cette devise secondaire." #. module: account #: wizard_view:account.general.ledger.report,checktype:0 diff --git a/addons/board/i18n/fr_FR.po b/addons/board/i18n/fr_FR.po index 67df6b2ad3b..bba9d53e664 100644 --- a/addons/board/i18n/fr_FR.po +++ b/addons/board/i18n/fr_FR.po @@ -10,10 +10,12 @@ msgstr "" "PO-Revision-Date: 2008-11-28 16:57:27+0000\n" "Last-Translator: <>\n" "Language-Team: \n" +"Last-Translator: Olivier Laurent \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-12-16 11:02+0000\n" +"X-Generator: Launchpad (build Unknown)\n" #. module: board #: constraint:ir.model:0 @@ -95,7 +97,7 @@ msgstr "Créer un Menu pour le Tableau de Bord" #. module: board #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "XML non valide pour l'architecture de la vue" +msgstr "XML non valide pour l'architecture de la vue!" #. module: board #: wizard_field:board.board.menu.create,init,menu_parent_id:0 @@ -204,4 +206,3 @@ msgstr "Créer le menu" #: field:board.note,name:0 msgid "Subject" msgstr "Sujet" - From 4d3b92861091a8eba72453bcf7a891eeadbfbdbe Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 16 Dec 2008 17:21:12 +0100 Subject: [PATCH 50/86] [FIX] translate help of fields in wizards [FIX] fix unicode errors when exporting translations files lp bug: https://launchpad.net/bugs/308563 fixed lp bug: https://launchpad.net/bugs/308644 fixed bzr revid: christophe@cobalt-20081216162112-75r2kaflg3af0xxb --- .../base/module/wizard/wizard_export_lang.py | 2 +- bin/tools/translate.py | 63 ++++++++++++------- bin/wizard/__init__.py | 11 +++- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/bin/addons/base/module/wizard/wizard_export_lang.py b/bin/addons/base/module/wizard/wizard_export_lang.py index 046b9ccb4dc..b7250762bcd 100644 --- a/bin/addons/base/module/wizard/wizard_export_lang.py +++ b/bin/addons/base/module/wizard/wizard_export_lang.py @@ -62,7 +62,7 @@ class wizard_export_lang(osv.osv_memory): this.advice = _('Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad.') % (ext,) this.name = "%s.%s" % (this.lang or _('new'), this.format) - out=base64.encodestring(buf.getvalue().encode('utf8')) + out=base64.encodestring(buf.getvalue()) buf.close() return self.write(cr, uid, ids, {'state':'get', 'data':out, 'advice':this.advice, 'name':this.name}, context=context) diff --git a/bin/tools/translate.py b/bin/tools/translate.py index 7ed55f9fd94..00053a43d90 100644 --- a/bin/tools/translate.py +++ b/bin/tools/translate.py @@ -338,10 +338,17 @@ def trans_generate(lang, modules, dbname=None): tuple = (module, type, name, id, source) if source and tuple not in _to_translate: _to_translate.append(tuple) - + + def encode(s): + if isinstance(s, unicode): + return s.encode('utf8') + return s for (xml_name,model,res_id,module) in cr.fetchall(): - xml_name = module+'.'+xml_name + module = encode(module) + model = encode(model) + xml_name = "%s.%s" % (module, encode(xml_name)) + if not pool.get(model): logger.notifyChannel("db", netsvc.LOG_ERROR, "unable to find object %r" % (model,)) continue @@ -349,27 +356,32 @@ def trans_generate(lang, modules, dbname=None): if model=='ir.ui.view': d = xml.dom.minidom.parseString(obj.arch) for t in trans_parse_view(d.documentElement): - push_translation(module, 'view', obj.model, 0, t) + push_translation(module, 'view', encode(obj.model), 0, t) elif model=='ir.actions.wizard': - service_name = 'wizard.'+obj.wiz_name + service_name = 'wizard.'+encode(obj.wiz_name) obj2 = netsvc._service[service_name] for state_name, state_def in obj2.states.iteritems(): if 'result' in state_def: result = state_def['result'] if result['type'] != 'form': continue - name = obj.wiz_name + ',' + state_name + name = "%s,%s" % (encode(obj.wiz_name), state_name) + + def_params = { + 'string': ('wizard_field', lambda s: [encode(s)]), + 'selection': ('selection', lambda s: [encode(e[1]) for e in s]), + 'help': ('help', lambda s: [encode(s)]), + } # export fields for field_name, field_def in result['fields'].iteritems(): res_name = name + ',' + field_name - if 'string' in field_def: - source = field_def['string'] - push_translation(module, 'wizard_field', res_name, 0, source.encode('utf8')) - - if 'selection' in field_def: - for key, val in field_def['selection']: - push_translation(module, 'selection', res_name, 0, val.encode('utf8')) + + for fn in def_params: + if fn in field_def: + transtype, modifier = def_params[fn] + for val in modifier(field_def[fn]): + push_translation(module, transtype, res_name, 0, val) # export arch arch = result['arch'] @@ -386,17 +398,17 @@ def trans_generate(lang, modules, dbname=None): push_translation(module, 'wizard_button', res_name, 0, button_label) elif model=='ir.model.fields': - field_name = obj.name + field_name = encode(obj.name) objmodel = pool.get(obj.model) if not objmodel or not field_name in objmodel._columns: continue field_def = objmodel._columns[field_name] - name = obj.model + "," + field_name - push_translation(module, 'field', name, 0, field_def.string.encode('utf8')) + name = "%s,%s" % (encode(obj.model), field_name) + push_translation(module, 'field', name, 0, encode(field_def.string)) if field_def.help: - push_translation(module, 'help', name, 0, field_def.help.encode('utf8')) + push_translation(module, 'help', name, 0, encode(field_def.help)) if field_def.translate: ids = objmodel.search(cr, uid, []) @@ -410,14 +422,14 @@ def trans_generate(lang, modules, dbname=None): ('res_id', '=', res_id), ]) if not model_data_ids: - push_translation(module, 'model', name, 0, obj_value[field_name]) + push_translation(module, 'model', name, 0, encode(obj_value[field_name])) if hasattr(field_def, 'selection') and isinstance(field_def.selection, (list, tuple)): for key, val in field_def.selection: - push_translation(module, 'selection', name, 0, val.encode('utf8')) + push_translation(module, 'selection', name, 0, encode(val)) elif model=='ir.actions.report.xml': - name = obj.report_name + name = encode(obj.report_name) fname = "" if obj.report_rml: fname = obj.report_rml @@ -438,13 +450,13 @@ def trans_generate(lang, modules, dbname=None): for constraint in pool.get(model)._constraints: msg = constraint[1] - push_translation(module, 'constraint', model, 0, msg.encode('utf8')) + push_translation(module, 'constraint', model, 0, encode(msg)) for field_name,field_def in pool.get(model)._columns.items(): if field_def.translate: name = model + "," + field_name trad = getattr(obj, field_name) or '' - push_translation(module, 'model', name, xml_name, trad) + push_translation(module, 'model', name, xml_name, encode(trad)) # parse source code for _() calls def get_module_from_path(path): @@ -470,14 +482,17 @@ def trans_generate(lang, modules, dbname=None): '[^a-zA-Z0-9_]_\([\s]*["\'](.+?)["\'][\s]*\)', code_string, re.M) for i in iter: - push_translation(module, 'code', frelativepath, 0, i.group(1).encode('utf8')) + push_translation(module, 'code', frelativepath, 0, encode(i.group(1))) out = [["module","type","name","res_id","src","value"]] # header # translate strings marked as to be translated for module, type, name, id, source in _to_translate: trans = trans_obj._get_source(cr, uid, name, type, lang, source) - out.append([module, type, name, id, source, trans or '']) + out.append([module, type, name, id, source, encode(trans) or '']) + + from pprint import pformat + netsvc.Logger().notifyChannel('translation', netsvc.LOG_DEBUG, pformat(filter(lambda o:any(isinstance(x, unicode) for x in o), out))) cr.close() return out @@ -492,7 +507,7 @@ def trans_load(db_name, filename, lang, strict=False, verbose=True): return r except IOError: if verbose: - logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,)) # FIXME translate message + logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,)) return None def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=None, verbose=True): diff --git a/bin/wizard/__init__.py b/bin/wizard/__init__.py index fcacf67a476..8996ce0cb80 100644 --- a/bin/wizard/__init__.py +++ b/bin/wizard/__init__.py @@ -113,15 +113,22 @@ class interface(netsvc.Service): if lang: # translate fields for field in fields: - trans = translate(cr, self.wiz_name+','+state+','+field, 'wizard_field', lang) + res_name = "%s,%s,%s" % (self.wiz_name, state, field) + + trans = translate(cr, res_name, 'wizard_field', lang) if trans: fields[field]['string'] = trans if 'selection' in fields[field]: - trans = lambda x: translate(cr, self.wiz_name+','+state+','+field, 'selection', lang, x) or x + trans = lambda x: translate(cr, res_name, 'selection', lang, x) or x for idx, (key, val) in enumerate(fields[field]['selection']): fields[field]['selection'][idx] = (key, trans(val)) + if 'help' in fields[field]: + t = translate(cr, res_name, 'help', lang, fields[field]['help']) + if t: + fields[field]['help'] = t + # translate arch if not isinstance(arch, UpdateableStr): doc = dom.minidom.parseString(arch) From 2b2c7e256b4b6c6d77333ae833838bc6aa4609f7 Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Tue, 16 Dec 2008 17:23:57 +0100 Subject: [PATCH 51/86] Too much arguments to 'sale.order.write' bzr revid: olt@tinyerp.com-20081216162357-zylisiph3c21blfv --- addons/point_of_sale/report/pos_invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/point_of_sale/report/pos_invoice.py b/addons/point_of_sale/report/pos_invoice.py index e7c39ba9ef0..6c9dc757545 100644 --- a/addons/point_of_sale/report/pos_invoice.py +++ b/addons/point_of_sale/report/pos_invoice.py @@ -39,7 +39,7 @@ class pos_invoice(report_sxw.rml_parse): nids = [] for order in objects: - order.write(self.cr, self.uid, [order.id], {'nb_print': order.nb_print + 1}) + order.write({'nb_print': order.nb_print + 1}) if order.invoice_id and order.invoice_id not in iids: if not order.invoice_id: From 02694646b6146abfbee2e64a5750189550ec12ce Mon Sep 17 00:00:00 2001 From: qdp Date: Tue, 16 Dec 2008 18:20:15 +0100 Subject: [PATCH 52/86] *improvements of base_module_quality: *defined generic framework, use of inheritance, ... *restructured *added config file of pylint *added speed_test (to be continued) *removed unecessary files bzr revid: qdp@tinyerp.com-20081216172015-4o856cgffpytl9ru --- addons/base_module_quality/README.txt | 11 + addons/base_module_quality/__terp__.py | 10 +- .../base_module_quality.py | 11 +- .../pylint_test/__init__.py | 2 +- .../pylint_test/pylint_test.py | 34 +- .../pylint_test/pylint_test_config.txt | 308 ++++++++++++++++++ .../pylint_test => speed_test}/__init__.py | 3 +- .../speed_test/speed_test.py | 48 +++ .../wizard/module_quality_check.py | 65 ++-- .../wizard/pylint_test/pylint_test.py | 83 ----- 10 files changed, 410 insertions(+), 165 deletions(-) create mode 100644 addons/base_module_quality/README.txt create mode 100644 addons/base_module_quality/pylint_test/pylint_test_config.txt rename addons/base_module_quality/{wizard/pylint_test => speed_test}/__init__.py (98%) create mode 100644 addons/base_module_quality/speed_test/speed_test.py delete mode 100644 addons/base_module_quality/wizard/pylint_test/pylint_test.py diff --git a/addons/base_module_quality/README.txt b/addons/base_module_quality/README.txt new file mode 100644 index 00000000000..3819448c9c1 --- /dev/null +++ b/addons/base_module_quality/README.txt @@ -0,0 +1,11 @@ +This module provide a generic framework to define your own quality test. + + +All you have to do is to: +* create a folder with your test in 'base_module_quality' (e.g: mkdir base_module_quality\mytest) +* create a .py file in it with same name as the folder you just created (e.g: touch base_module_quality\mytest\mytest.py) +* edit your file and define a class 'quality_check' that + * inherits the class 'abstract_quality_test' (defined in base_module_quality.py) + * implements the __init__() method accordingly to what you want to test. + + diff --git a/addons/base_module_quality/__terp__.py b/addons/base_module_quality/__terp__.py index f80077e2b94..4a4d5b9fc60 100644 --- a/addons/base_module_quality/__terp__.py +++ b/addons/base_module_quality/__terp__.py @@ -24,7 +24,15 @@ "author" : "Tiny", "version" : "1.0", "depends" : ["base",], - "description": "Sample module to check the quality", + "description": """" +This module's aim is to check the quality of other modules. + + It defines a wizard on the list of modules in OpenERP, which allow you to evaluate them on different critera such as: the respect of OpenERP coding standards, the speed efficency... + + + This module also provide generic framework to define your own quality test. For further info, coders may take a look into base_module_quality\README.txt + +""", "init_xml" : [], "update_xml" : ["base_module_quality_wizard.xml"], "category" : "Tiny Specific Modules/Base module quality", diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py index 2a49f301b87..13b9de20ce4 100644 --- a/addons/base_module_quality/base_module_quality.py +++ b/addons/base_module_quality/base_module_quality.py @@ -23,7 +23,7 @@ import netsvc from osv import fields, osv -class quality_check(object): +class abstract_quality_check(object): ''' This Class provide... ''' @@ -38,15 +38,6 @@ class quality_check(object): ''' raise 'Not Implemented' - #~ def __get_result__(self, cr, uid, module_ids): - #~ ''' - #~ ''' - #~ return _result - - #~ def __get_detailed_result__(self, cr, uid, module_ids): - #~ ''' - #~ ''' - #~ return _result_details # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/pylint_test/__init__.py b/addons/base_module_quality/pylint_test/__init__.py index 00dce4b7e0b..10b090b0edd 100644 --- a/addons/base_module_quality/pylint_test/__init__.py +++ b/addons/base_module_quality/pylint_test/__init__.py @@ -20,7 +20,7 @@ # ############################################################################## -import pylint_test +#import pylint_test # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/pylint_test/pylint_test.py b/addons/base_module_quality/pylint_test/pylint_test.py index c31a5c6599d..1d46830f646 100644 --- a/addons/base_module_quality/pylint_test/pylint_test.py +++ b/addons/base_module_quality/pylint_test/pylint_test.py @@ -23,36 +23,12 @@ import netsvc from osv import fields, osv import os +from tools import config + from base_module_quality import base_module_quality -#~ class _test_pylint(quality_check): - #~ def __init__(self, url, add_folder=None): - #~ print "dans le test" - #~ list_files = os.listdir(url) - #~ new_list = [] - #~ subfolder = {} - #~ for i in list_files: - #~ if os.path.isdir(i): - #~ path = os.path.join(url, i) - #~ new_list.append(os.listdir(path)) - #~ res = _test_pylint(self, path, add_folder=i) - #~ subfolder.update(res) - #~ dict_files = {} - #~ for file in list_files: - #~ if file.split('.')[-1] == 'py' and not file.startswith('__init__'): - #~ file_path = os.path.join(url, file) - #~ res = os.popen('pylint '+file_path+' | tail -4').read() - #~ if res.startswith('Global'): - #~ if add_folder: - #~ dict_files[add_folder + '/' + file] = res - #~ else: - #~ dict_files[file] = res - #~ dict_files.update(subfolder) - #~ print "dict_files", dict_files - #~ return dict_files - -class _test_pylint(base_module_quality.quality_check): +class quality_test(base_module_quality.abstract_quality_check): def __init__(self, module_path): self._result = """ @@ -63,6 +39,7 @@ Pylint Test: """ + config_file_path = config['addons_path']+'/base_module_quality/pylint_test/pylint_test_config.txt' list_files = os.listdir(module_path) new_list = [] subfolder = {} @@ -78,9 +55,8 @@ Pylint Test: print list_files for file in list_files: if file.split('.')[-1] == 'py' and not file.endswith('__init__.py') and not file.endswith('__terp__.py'): -#--rcfile= Specify a configuration file. file_path = os.path.join(module_path, file) - res = os.popen('pylint --persistent=n '+file_path).read() + res = os.popen('pylint --rcfile='+config_file_path+' '+file_path).read() n += 1 leftchar = -1 while res[leftchar:leftchar+1] != ' ' and leftchar-1 <= 0: diff --git a/addons/base_module_quality/pylint_test/pylint_test_config.txt b/addons/base_module_quality/pylint_test/pylint_test_config.txt new file mode 100644 index 00000000000..db975430f08 --- /dev/null +++ b/addons/base_module_quality/pylint_test/pylint_test_config.txt @@ -0,0 +1,308 @@ +# lint Python modules using external checkers. +# +# This is the main checker controling the other ones and the reports +# generation. It is itself both a raw checker and an astng checker in order +# to: +# * handle message activation / deactivation at the module level +# * handle some basic but necessary stats'data (number of classes, methods...) +# +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Profiled execution. +profile=no + +# Add to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=no + +# Set the cache size for astng objects. +cache-size=500 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[COMMANDS] + +# Display a help message for the given message id and exit. The value may be a +# comma separated list of message ids. +#help-msg= + + +[MESSAGES CONTROL] + +# Enable only checker(s) with the given id(s). This option conflict with the +# disable-checker option +#enable-checker= + +# Enable all checker(s) except those with the given id(s). This option conflict +# with the disable-checker option +#disable-checker= + +# Enable all messages in the listed categories. +#enable-msg-cat= + +# Disable all messages in the listed categories. +#disable-msg-cat= + +# Enable the message(s) with the given id(s). +#enable-msg= + +# Disable the message(s) with the given id(s). +#disable-msg= + + +[REPORTS] + +# set the output format. Available formats are text, parseable, colorized and +# html +output-format=text + +# Include message's id in output +include-ids=no + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells wether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note).You have access to the variables errors warning, statement which +# respectivly contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (R0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (R0004). +comment=no + +# Enable the report(s) with the given id(s). +#enable-report= + +# Disable the report(s) with the given id(s). +#disable-report= + + +# checks for +# * unused variables / imports +# * undefined variables +# * redefinition of variable from builtins or from an outer scope +# * use of variable before assigment +# +[VARIABLES] + +# Tells wether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx=_|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +# try to find bugs in the code using type inference +# +[TYPECHECK] + +# Tells wether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# When zope mode is activated, consider the acquired-members option to ignore +# access to some undefined attributes. +zope=no + +# List of members which are usually get through zope's acquisition mecanism and +# so shouldn't trigger E0201 when accessed (need zope=yes to be considered). +acquired-members=REQUEST,acl_users,aq_parent + + +# checks for : +# * doc strings +# * modules / classes / functions / methods / arguments / variables name +# * number of arguments, local variables, branchs, returns and statements in +# functions, methods +# * required module attributes +# * dangerous default values as arguments +# * redefinition of function / method / class +# * uses of the global statement +# +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + + +# checks for +# * external modules dependencies +# * relative / wildcard imports +# * cyclic imports +# * uses of deprecated modules +# +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report R0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report R0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report R0402 must +# not be disabled) +int-import-graph= + + +# checks for : +# * methods without self as first argument +# * overridden methods signature +# * access only to existant members via self +# * attributes not defined in the __init__ method +# * supported interfaces implementation +# * unreachable code +# +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + + +# checks for sign of poor/misdesign: +# * number of methods, attributes, local variables... +# * size, complexity of functions, methods +# +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +# checks for : +# * unauthorized constructions +# * strict indentation +# * line length +# * use of <> instead of != +# +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +# checks for similarities and duplicated code. This computation may be +# memory / CPU intensive, so you should disable it if you experiments some +# problems. +# +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + + +# checks for: +# * warning notes in the code like FIXME, XXX +# * PEP 263: source code with non ascii character but no encoding declaration +# +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO diff --git a/addons/base_module_quality/wizard/pylint_test/__init__.py b/addons/base_module_quality/speed_test/__init__.py similarity index 98% rename from addons/base_module_quality/wizard/pylint_test/__init__.py rename to addons/base_module_quality/speed_test/__init__.py index 79bc02a75a6..79850888f41 100644 --- a/addons/base_module_quality/wizard/pylint_test/__init__.py +++ b/addons/base_module_quality/speed_test/__init__.py @@ -20,6 +20,5 @@ # ############################################################################## -import pylint_test -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_module_quality/speed_test/speed_test.py b/addons/base_module_quality/speed_test/speed_test.py new file mode 100644 index 00000000000..ca9a93b09f7 --- /dev/null +++ b/addons/base_module_quality/speed_test/speed_test.py @@ -0,0 +1,48 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved +# $Id$ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +import netsvc +from osv import fields, osv +import os +from tools import config + +from base_module_quality import base_module_quality + + +class quality_test(base_module_quality.abstract_quality_check): + + def __init__(self, module_path): + self._result = """ +Speed Test: +------------ + + This test checks the speed of the module + + + to be continued... + +""" + return None + + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/base_module_quality/wizard/module_quality_check.py b/addons/base_module_quality/wizard/module_quality_check.py index 0e606a70f8e..61cc031261a 100644 --- a/addons/base_module_quality/wizard/module_quality_check.py +++ b/addons/base_module_quality/wizard/module_quality_check.py @@ -27,21 +27,20 @@ import netsvc import sys import tools import os -import pylint -import base_module_quality -form_check = ''' -
- -''' -fields_check = { - 'test': { - 'string':'Tests', 'type':'selection', 'required':True, - 'selection': [('pylint', 'Pylint'), ('othertest','other')], - 'default': lambda *args: 'pylint' - }, - } +#~ form_check = ''' +#~
+ #~ +#~ ''' + +#~ fields_check = { + #~ 'test': { + #~ 'string':'Tests', 'type':'selection', 'required':True, + #~ 'selection': [('pylint', 'Pylint'), ('othertest','other')], + #~ 'default': lambda *args: 'pylint' + #~ }, + #~ } view_form = """
@@ -69,46 +68,34 @@ class wiz_quality_check(wizard.interface): from tools import config list_folders=os.listdir(config['addons_path']+'/base_module_quality/') for item in list_folders: - path = config['addons_path']+'/base_module_quality/wizard/'+item + path = config['addons_path']+'/base_module_quality/'+item if os.path.exists(path+'/'+item+'.py') and item not in ['report','wizard', 'security']: pool=pooler.get_pool(cr.dbname) module_data = pool.get('ir.module.module').browse(cr, uid, data['ids']) ad = tools.config['addons_path'] module_path = os.path.join(ad, module_data[0].name) - #import pylint_test - item='base_module_quality.'+item - x = __import__(item) - val = x.__init__(str(module_path)) - print "VALL",x._result + + from base_module_quality import base_module_quality + + item2='base_module_quality.'+item+'.'+item + x = __import__(item2) + x2 = getattr(x,item) + x3 = getattr(x2,item) + val = x3.quality_test(str(module_path)) + string_ret += val._result return {'general_info':string_ret} - #mra version - #~ result = pylint_test._test_pylint(self, url) - #~ string_ret = '' - #~ for i in result: - #~ string_ret = string_ret + i + ':\n' + result[i] - #~ string_ret = "" - #~ if data['form']['test'] == 'pylint': - #~ pool=pooler.get_pool(cr.dbname) - #~ module_data = pool.get('ir.module.module').browse(cr, uid, data['ids']) - #~ from pylint_test import pylint_test - #~ ad = tools.config['addons_path'] - #~ url = os.path.join(ad, module_data[0].name) - #~ result = pylint_test._test_pylint(self, url) - #~ string_ret = '' - #~ for i in result: - #~ string_ret = string_ret + i + ':\n' + result[i] states = { + #~ 'init': { + #~ 'actions': [], + #~ 'result': {'type':'form', 'arch':form_check, 'fields':fields_check, 'state':[('end','Cancel'),('do','Do Test')]} + #~ }, 'init': { - 'actions': [], - 'result': {'type':'form', 'arch':form_check, 'fields':fields_check, 'state':[('end','Cancel'),('do','Do Test')]} - }, - 'do': { 'actions': [_check], 'result': {'type':'form', 'arch':view_form, 'fields':view_field, 'state':[('end','Ok')]}, }, diff --git a/addons/base_module_quality/wizard/pylint_test/pylint_test.py b/addons/base_module_quality/wizard/pylint_test/pylint_test.py deleted file mode 100644 index 6e80e136865..00000000000 --- a/addons/base_module_quality/wizard/pylint_test/pylint_test.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved -# $Id$ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -############################################################################## - -import netsvc -from osv import fields, osv -import os - - - -class _test_pylint(quality_check): - - def __init__(self, url, add_folder=None): - print "dans le test" - list_files = os.listdir(url) - new_list = [] - subfolder = {} - for i in list_files: - if os.path.isdir(i): - path = os.path.join(url, i) - new_list.append(os.listdir(path)) - res = _test_pylint(self, path, add_folder=i) - subfolder.update(res) - dict_files = {} - for file in list_files: - if file.split('.')[-1] == 'py' and not file.startswith('__init__'): - file_path = os.path.join(url, file) - res = os.popen('pylint '+file_path+' | tail -4').read() - if res.startswith('Global'): - if add_folder: - dict_files[add_folder + '/' + file] = res - else: - dict_files[file] = res - dict_files.update(subfolder) - print "dict_files", dict_files - return dict_files - -_test_pylint() - - -#~ def _test_pylint(self, url, add_folder=None): - #~ list_files = os.listdir(url) - #~ new_list = [] - #~ subfolder = {} - #~ for i in list_files: - #~ if os.path.isdir(i): - #~ path = os.path.join(url, i) - #~ new_list.append(os.listdir(path)) - #~ res = _test_pylint(self, path, add_folder=i) - #~ subfolder.update(res) - #~ dict_files = {} - #~ for file in list_files: - #~ if file.split('.')[-1] == 'py' and not file.startswith('__init__'): - #~ file_path = os.path.join(url, file) - #~ res = os.popen('pylint '+file_path+' | tail -4').read() - #~ if res.startswith('Global'): - #~ if add_folder: - #~ dict_files[add_folder + '/' + file] = res - #~ else: - #~ dict_files[file] = res - #~ dict_files.update(subfolder) - #~ return dict_files - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - From 4f6843602a7852da55ccc40520fcc9fc8e923c58 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 16 Dec 2008 18:39:57 +0100 Subject: [PATCH 53/86] [FIX] %f -> %d lp bug: https://launchpad.net/bugs/308565 fixed bzr revid: christophe@cobalt-20081216173957-ihzvv05kgs1ons1h --- addons/project/project.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 41e6750ecc3..b7779bb3520 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -410,17 +410,17 @@ class project_work(osv.osv): _order = "date desc" def create(self, cr, uid, vals, *args, **kwargs): if 'task_id' in vals: - cr.execute('update project_task set remaining_hours=remaining_hours+%.2f where id=%s', (-vals.get('hours',0.0), vals['task_id'])) + cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (vals.get('hours',0.0), vals['task_id'])) return super(project_work,self).create(cr, uid, vals, *args, **kwargs) def write(self, cr, uid, ids,vals,context={}): for work in self.browse(cr, uid, ids, context): - cr.execute('update project_task set remaining_hours=remaining_hours+%.2f+(%.2f) where id=%s', (-vals.get('hours',0.0), work.hours, work.task_id.id)) + cr.execute('update project_task set remaining_hours=remaining_hours - %s + (%s) where id=%s', (vals.get('hours',0.0), work.hours, work.task_id.id)) return super(project_work,self).write(cr, uid, ids, vals, context) def unlink(self, cr, uid, ids, *args, **kwargs): for work in self.browse(cr, uid, ids): - cr.execute('update project_task set remaining_hours=remaining_hours+%.2f where id=%s', (work.hours, work.task_id.id)) + cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id)) return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs) project_work() From 501b64709292acc51e814900b09595b4dffaeca9 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Tue, 16 Dec 2008 18:56:16 +0100 Subject: [PATCH 54/86] bugfix bzr revid: fp@tinyerp.com-20081216175616-ccurcu9aochczo0d --- addons/account/account_view.xml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 319431615f7..357fcf7c566 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -902,10 +902,11 @@ - Entry lines + Entry Lines ir.actions.act_window account.move.line form + tree @@ -914,13 +915,6 @@ - - - form - - - - From 779b8ff618664147f9c40eab82a730bd21275318 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 19:10:07 +0100 Subject: [PATCH 55/86] [IMP] Use the PEP8 specification for the import bzr revid: stephane@tinyerp.com-20081216181007-0gsqhlaqnuebdpfg --- bin/tools/config.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bin/tools/config.py b/bin/tools/config.py index 224ac5e4e72..1d5a3372537 100644 --- a/bin/tools/config.py +++ b/bin/tools/config.py @@ -20,8 +20,12 @@ # ############################################################################## -import ConfigParser,optparse,os,sys -import netsvc,logging +import ConfigParser +import optparse +import os +import sys +import netsvc +import logging import release class configmanager(object): From 33cbc4a44caff8d2c920db0d3fdc960ffa02a43b Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Tue, 16 Dec 2008 19:15:35 +0100 Subject: [PATCH 56/86] improved bzr revid: fp@tinyerp.com-20081216181535-uplb4qy6omlm1k33 --- bin/addons/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index eec3f6b2370..75f4fee3184 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -545,11 +545,11 @@ def load_modules(db, force_demo=False, status=None, update_module=False): status={} cr = db.cursor() + force = [] + if force_demo: + force.append('demo') + pool = pooler.get_pool(cr.dbname) try: - force = [] - if force_demo: - force.append('demo') - pool = pooler.get_pool(cr.dbname) report = tools.assertion_report() if update_module: basegraph = create_graph(['base'], force) From 3ee905239b37c0cf86ae7cb3917f4d7765fa9e95 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Tue, 16 Dec 2008 19:58:24 +0100 Subject: [PATCH 57/86] improved_bugfix bzr revid: fp@tinyerp.com-20081216185824-stl92nzt3ij0zhf7 --- bin/osv/fields.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index e0da8d38945..6b86eb7bc7a 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -699,7 +699,11 @@ class related(function): for i in range(len(self.arg)): field_detail = self._relations[i] relation = field_detail['object'] - if not t_data[self.arg[i]]: + try: + if not t_data[self.arg[i]]: + t_data = False + break + except: t_data = False break if field_detail['type'] in ('one2many', 'many2many'): From 6d4c48770bc83a11ace426a71624d0ea439a5a17 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 16 Dec 2008 20:15:43 +0100 Subject: [PATCH 58/86] [FIX] SQL Query lp bug: https://launchpad.net/bugs/308643 fixed bzr revid: stephane@tinyerp.com-20081216191543-l4fq5ih5efyew521 --- addons/account_budget/crossovered_budget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account_budget/crossovered_budget.py b/addons/account_budget/crossovered_budget.py index c8ebaccf49b..752e8c82694 100644 --- a/addons/account_budget/crossovered_budget.py +++ b/addons/account_budget/crossovered_budget.py @@ -168,7 +168,7 @@ class crossovered_budget_lines(osv.osv): date_from = context['wizard_date_from'] if context.has_key('wizard_date_to'): date_to = context['wizard_date_to'] - cr.execute("select sum(amount) from account_analytic_line where account_id=%s and (date between to_date('%s','yyyy-mm-dd') and to_date('%s','yyyy-mm-dd')) and general_account_id in (%s)", (line.analytic_account_id.id,date_from,date_to,acc_ids)) + cr.execute('select sum(amount) from account_analytic_line where account_id=%s and (date between to_date(%s,'yyyy-mm-dd') and to_date(%s,'yyyy-mm-dd')) and general_account_id in (%s)', (line.analytic_account_id.id,date_from,date_to,acc_ids)) result=cr.fetchone()[0] if result==None: result=0.00 From 914593fe8a767fb1516088ed448c1f9859473368 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Wed, 17 Dec 2008 00:56:08 +0530 Subject: [PATCH 59/86] improvements in to the server action bzr revid: mga@tinyerp.com-20081216192608-vpjbzrcigqe94qau --- bin/addons/base/ir/ir.xml | 4 ++- bin/addons/base/ir/ir_actions.py | 42 ++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index 55792706bcf..43a1fc2fdcf 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -1154,6 +1154,7 @@ + @@ -1175,6 +1176,7 @@ +
diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index 584a1c37623..d8b24c86787 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -380,6 +380,7 @@ class actions_server(osv.osv): _name = 'ir.actions.server' _table = 'ir_act_server' _sequence = 'ir_actions_id_seq' + _order = 'sequence' _columns = { 'name': fields.char('Action Name', required=True, size=64), 'condition' : fields.char('Condition', size=256), @@ -586,6 +587,7 @@ class actions_server(osv.osv): result = self.run(cr, uid, [act.id], context) if result: res.append(result) + return res if action.state == 'loop': @@ -631,6 +633,11 @@ class actions_server(osv.osv): obj_pool = self.pool.get(action.srcmodel_id.model) rec = self.pool.get(action.model_id.model).browse(cr, uid, context.get('active_id')) id = eval(action.write_id, {'object': rec}) + try: + id = int(id) + except: + raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!")) + if type(id) != type(1): raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!")) write_id = id From 8941053bc3a6e4888786ea46251e7d24ff5270ae Mon Sep 17 00:00:00 2001 From: Jay Vora Date: Thu, 18 Dec 2008 12:15:17 +0530 Subject: [PATCH 78/86] Corrected Report Header problem bzr revid: jvo@tinyerp.com-20081218064517-7pxwdp3eroo01524 --- bin/addons/base/res/res_company.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/addons/base/res/res_company.py b/bin/addons/base/res/res_company.py index faddf9c1407..20a5a01d439 100644 --- a/bin/addons/base/res/res_company.py +++ b/bin/addons/base/res/res_company.py @@ -143,12 +143,12 @@ class res_company(osv.osv): [[ company.partner_id.name ]] - [[ company.partner_id.address and company.partner_id.address[0].street ]] - [[ company.partner_id.address and company.partner_id.address[0].zip ]] [[ company.partner_id.address and company.partner_id.address[0].city ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name ]] + [[ company.partner_id.address and company.partner_id.address[0].street or '' ]] + [[ company.partner_id.address and company.partner_id.address[0].zip or '' ]] [[ company.partner_id.address and company.partner_id.address[0].city or '' ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name or '']] Phone: - [[ company.partner_id.address and company.partner_id.address[0].phone ]] + [[ company.partner_id.address and company.partner_id.address[0].phone or '' ]] Mail: - [[ company.partner_id.address and company.partner_id.address[0].email ]] + [[ company.partner_id.address and company.partner_id.address[0].email or '' ]] 1.3cm 25.5cm 7cm 25.5cm From 89e55a38ad43c201146e1415fd6af21d860336ca Mon Sep 17 00:00:00 2001 From: Olivier Laurent Date: Thu, 18 Dec 2008 09:01:55 +0100 Subject: [PATCH 79/86] Merged with Launchpad translations bzr revid: olt@tinyerp.com-20081218080155-m1i1lycyubi709sr --- bin/addons/base/i18n/fr_FR.po | 747 ++++++++++++++++++---------------- 1 file changed, 395 insertions(+), 352 deletions(-) diff --git a/bin/addons/base/i18n/fr_FR.po b/bin/addons/base/i18n/fr_FR.po index 359b449c8c4..94d3a7e86ba 100644 --- a/bin/addons/base/i18n/fr_FR.po +++ b/bin/addons/base/i18n/fr_FR.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.0-rc1\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2008-11-28 17:09+0000\n" -"PO-Revision-Date: 2008-12-10 13:58+0000\n" -"Last-Translator: Christophe Chauvet - http://www.syleam.fr/ \n" +"PO-Revision-Date: 2008-12-17 16:29+0000\n" +"Last-Translator: Olivier Laurent \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2008-12-16 11:00+0000\n" +"X-Launchpad-Export-Date: 2008-12-17 16:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base @@ -56,7 +56,7 @@ msgstr "" #: field:workflow.activity,out_transitions:0 #: view:workflow.activity:0 msgid "Outgoing transitions" -msgstr "" +msgstr "Transitions sortante" #. module: base #: selection:ir.ui.menu,icon:0 @@ -81,7 +81,7 @@ msgstr "Nom de la Fonction" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-account" -msgstr "" +msgstr "terp-account" #. module: base #: field:res.partner.address,title:0 @@ -183,12 +183,13 @@ msgstr "Objet" #: view:wizard.module.lang.export:0 msgid "To browse official translations, you can visit this link: " msgstr "" +"Pour parcourir les traductions officielles, vous pouvez visiter ce lien: " #. module: base #: model:ir.actions.act_window,name:base.action_module_category_tree #: model:ir.ui.menu,name:base.menu_action_module_category_tree msgid "Categories of Modules" -msgstr "Catégorie de modules" +msgstr "Catégories de modules" #. module: base #: model:ir.model,name:base.model_ir_default @@ -203,7 +204,7 @@ msgstr "Non démarré" #. module: base #: view:ir.sequence:0 msgid "Minute: %(min)s" -msgstr "" +msgstr "Minute: %(min)s" #. module: base #: selection:ir.ui.menu,icon:0 @@ -274,12 +275,12 @@ msgstr "Normal" #: field:workflow.activity,in_transitions:0 #: view:workflow.activity:0 msgid "Incoming transitions" -msgstr "" +msgstr "Transitions entrante" #. module: base #: field:ir.ui.view_sc,user_id:0 msgid "User Ref." -msgstr "" +msgstr "Réf. Utilisateur" #. module: base #: wizard_view:module.lang.import,init:0 @@ -290,7 +291,7 @@ msgstr "Importer une nouvelle langue" #: wizard_field:server.action.create,step_1,report:0 #: wizard_view:server.action.create,step_1:0 msgid "Select Report" -msgstr "" +msgstr "Sélectionnez un Rapport" #. module: base #: field:ir.report.custom.fields,fc1_condition:0 @@ -328,7 +329,7 @@ msgstr "Libellés" #. module: base #: field:ir.actions.act_window,target:0 msgid "Target Window" -msgstr "" +msgstr "Fenêtre Cible" #. module: base #: view:ir.rule:0 @@ -338,7 +339,7 @@ msgstr "" #. module: base #: wizard_field:res.partner.spam_send,init,from:0 msgid "Sender's email" -msgstr "Mail de l'expéditeur" +msgstr "Courriel de l'expéditeur" #. module: base #: selection:ir.report.custom,type:0 @@ -386,7 +387,7 @@ msgstr "ir.ui.view.custom" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-2 or later version" -msgstr "" +msgstr "GPL-2 ou version supérieure" #. module: base #: selection:workflow.activity,kind:0 @@ -456,12 +457,12 @@ msgstr "Structure de la société" #. module: base #: selection:ir.module.module,license:0 msgid "Other proprietary" -msgstr "" +msgstr "Autre License Propriétaire" #. module: base #: field:ir.actions.server,address:0 msgid "Email / Mobile" -msgstr "" +msgstr "Courriel / GSM" #. module: base #: field:res.partner,comment:0 @@ -481,7 +482,7 @@ msgstr "Tous les termes" #. module: base #: field:res.partner.address,email:0 msgid "Default Email" -msgstr "" +msgstr "Courriel par défaut" #. module: base #: view:res.partner:0 @@ -528,7 +529,7 @@ msgstr "Activité de Destination" #. module: base #: model:res.partner.category,name:base.res_partner_category_10 msgid "Open Source Service Company" -msgstr "" +msgstr "Société de Service Open Source" #. module: base #: view:ir.actions.server:0 @@ -625,7 +626,7 @@ msgstr "Catégorie Parent." #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-purchase" -msgstr "" +msgstr "terp-purchase" #. module: base #: field:res.partner.address,name:0 @@ -645,7 +646,7 @@ msgstr "" #. module: base #: view:ir.module.module:0 msgid "Schedule Upgrade" -msgstr "" +msgstr "Planifier la Mise à Jour" #. module: base #: wizard_field:module.module.update,init,repositories:0 @@ -669,6 +670,8 @@ msgstr "Contact" #, python-format msgid "This url '%s' must provide an html file with links to zip modules" msgstr "" +"Cette URL '%s' doit fournir un fichier html avec les liens vers les modules " +"au format zip" #. module: base #: model:ir.ui.menu,name:base.next_id_15 @@ -692,12 +695,12 @@ msgstr "ir.ui.menu" #: code:osv/orm.py:0 #, python-format msgid "ConcurrencyException" -msgstr "" +msgstr "Exception de Concurrence" #. module: base #: field:ir.actions.act_window,view_id:0 msgid "View Ref." -msgstr "" +msgstr "Voir la Réf." #. module: base #: model:ir.model,name:base.model_workflow_transition @@ -741,7 +744,7 @@ msgstr "" #. module: base #: model:res.partner.category,name:base.res_partner_category_16 msgid "Telecom sector" -msgstr "" +msgstr "Secteur Telecom" #. module: base #: field:ir.actions.act_window_close,type:0 @@ -754,12 +757,12 @@ msgstr "Type d'action" #. module: base #: help:ir.actions.act_window,limit:0 msgid "Default limit for the list view" -msgstr "" +msgstr "Limite par défaut de la vue 'liste'" #. module: base #: model:ir.model,name:base.model_ir_server_object_lines msgid "ir.server.object.lines" -msgstr "" +msgstr "ir.server.object.lines" #. module: base #: field:ir.actions.act_window,src_model:0 @@ -769,7 +772,7 @@ msgstr "Objet Source" #. module: base #: field:res.partner.bank.type,field_ids:0 msgid "Type fields" -msgstr "" +msgstr "Champs type" #. module: base #: model:ir.actions.act_window,name:base.act_ir_actions_todo_form @@ -781,7 +784,7 @@ msgstr "Étapes de la configuration de l'assistant" #. module: base #: model:ir.model,name:base.model_ir_ui_view_sc msgid "ir.ui.view_sc" -msgstr "" +msgstr "ir.ui.view_sc" #. module: base #: field:ir.model.access,group_id:0 @@ -792,7 +795,7 @@ msgstr "Groupe" #. module: base #: help:res.partner,customer:0 msgid "Check this box if the partner is a customer." -msgstr "" +msgstr "Cochez cette case si le partenaire est un client." #. module: base #: selection:ir.ui.menu,icon:0 @@ -802,7 +805,7 @@ msgstr "STOCK_FLOPPY" #. module: base #: field:res.users,signature:0 msgid "Signature" -msgstr "" +msgstr "Signature" #. module: base #: field:ir.actions.server,sms:0 @@ -831,7 +834,7 @@ msgstr "Langues" #: model:ir.actions.act_window,name:base.open_module_tree_uninstall #: model:ir.ui.menu,name:base.menu_module_tree_uninstall msgid "Uninstalled modules" -msgstr "Desinstaller les modules" +msgstr "Modules non installés" #. module: base #: help:res.partner.category,active:0 @@ -853,7 +856,7 @@ msgstr "res.partner.event" #: wizard_field:server.action.create,init,type:0 #: wizard_view:server.action.create,init:0 msgid "Select Action Type" -msgstr "" +msgstr "Sélectionnez le Type d'Action" #. module: base #: code:addons/base/module/wizard/wizard_export_lang.py:0 @@ -877,7 +880,7 @@ msgstr "Devises" #. module: base #: selection:ir.actions.todo,type:0 msgid "Configure" -msgstr "" +msgstr "Configuration" #. module: base #: help:res.partner,lang:0 @@ -897,7 +900,7 @@ msgstr "STOCK_UNDERLINE" #. module: base #: selection:ir.model,state:0 msgid "Custom Object" -msgstr "" +msgstr "Objet Personalisé" #. module: base #: selection:ir.model.fields,select_level:0 @@ -907,7 +910,7 @@ msgstr "" #. module: base #: selection:ir.model.fields,state:0 msgid "Base Field" -msgstr "" +msgstr "Champ de Base" #. module: base #: field:workflow.instance,uid:0 @@ -949,7 +952,7 @@ msgstr "" #. module: base #: help:res.partner.address,active:0 msgid "Uncheck the active field to hide the contact." -msgstr "" +msgstr "Désélectionnez le champ 'actif' pour cacher ce contact." #. module: base #: model:ir.ui.menu,name:base.next_id_10 @@ -994,7 +997,7 @@ msgstr "Sommaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-graph" -msgstr "" +msgstr "terp-graph" #. module: base #: model:ir.model,name:base.model_workflow_instance @@ -1005,13 +1008,13 @@ msgstr "workflow.instance" #: field:res.partner.bank,state:0 #: field:res.partner.bank.type.field,bank_type_id:0 msgid "Bank type" -msgstr "" +msgstr "Type de Banque" #. module: base #: code:osv/fields.py:0 #, python-format msgid "undefined get method !" -msgstr "" +msgstr "Méthode 'get' non définie !" #. module: base #: view:res.company:0 @@ -1033,6 +1036,8 @@ msgstr "historique des Requêtes" #: view:res.users:0 msgid "Roles are used to defined available actions, provided by workflows." msgstr "" +"Les Rôles sont utilisés pour définir les actions disponibles, fournies par " +"les diagrammes de flux." #. module: base #: selection:ir.ui.menu,icon:0 @@ -1059,12 +1064,12 @@ msgstr "STOCK_CUT" #. module: base #: rml:ir.module.reference:0 msgid "Introspection report on objects" -msgstr "" +msgstr "Rapport d'introspection sur les objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_NO" -msgstr "" +msgstr "STOCK_NO" #. module: base #: selection:res.config.view,view:0 @@ -1079,7 +1084,7 @@ msgstr "Nom de la société" #. module: base #: wizard_field:base.module.import,init,module_file:0 msgid "Module .ZIP file" -msgstr "" +msgstr "Fichier .ZIP du Module" #. module: base #: wizard_button:res.partner.sms_send,init,send:0 @@ -1090,7 +1095,7 @@ msgstr "Envoyer un SMS" #. module: base #: field:ir.actions.report.custom,report_id:0 msgid "Report Ref." -msgstr "" +msgstr "Réf. du Rapport" #. module: base #: model:ir.actions.act_window,name:base.action_partner_addess_tree @@ -1101,7 +1106,7 @@ msgstr "Contacts partenaires" #. module: base #: field:workflow.transition,trigger_model:0 msgid "Trigger Object" -msgstr "" +msgstr "Objet Déclencheur" #. module: base #: help:res.country,code:0 @@ -1145,7 +1150,7 @@ msgstr "Mise à jour du Système" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REVERT_TO_SAVED" -msgstr "" +msgstr "STOCK_REVERT_TO_SAVED" #. module: base #: field:res.partner.event,event_ical_id:0 @@ -1160,7 +1165,7 @@ msgstr "Nom de la langue" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_IN" -msgstr "" +msgstr "STOCK_ZOOM_IN" #. module: base #: field:ir.ui.menu,parent_id:0 @@ -1194,7 +1199,7 @@ msgstr "Type de vue" #. module: base #: model:ir.model,name:base.model_ir_report_custom msgid "ir.report.custom" -msgstr "" +msgstr "ir.report.custom" #. module: base #: field:ir.exports.line,export_id:0 @@ -1219,12 +1224,12 @@ msgstr "" #. module: base #: view:ir.report.custom.fields:0 msgid "Report Fields" -msgstr "" +msgstr "Champs Rapport" #. module: base #: model:ir.model,name:base.model_ir_values msgid "ir.values" -msgstr "" +msgstr "ir.values" #. module: base #: selection:ir.report.custom,type:0 @@ -1239,17 +1244,17 @@ msgstr "" #. module: base #: view:ir.sequence:0 msgid "Seconde: %(sec)s" -msgstr "" +msgstr "Seconde: %(sec)s" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_CENTER" -msgstr "" +msgstr "STOCK_JUSTIFY_CENTER" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_FIT" -msgstr "" +msgstr "STOCK_ZOOM_FIT" #. module: base #: view:ir.sequence.type:0 @@ -1259,17 +1264,17 @@ msgstr "Type de Séquence" #. module: base #: field:ir.report.custom.fields,field_child2:0 msgid "field child2" -msgstr "" +msgstr "champ enfant2" #. module: base #: field:ir.report.custom.fields,field_child3:0 msgid "field child3" -msgstr "" +msgstr "champ enfant3" #. module: base #: field:ir.report.custom.fields,field_child0:0 msgid "field child0" -msgstr "" +msgstr "champ enfant0" #. module: base #: model:ir.actions.wizard,name:base.wizard_update @@ -1290,7 +1295,7 @@ msgstr "Licence" #. module: base #: model:ir.model,name:base.model_ir_actions_actions msgid "ir.actions.actions" -msgstr "" +msgstr "ir.actions.actions" #. module: base #: field:ir.module.repository,url:0 @@ -1314,7 +1319,7 @@ msgstr "Requête" #. module: base #: field:ir.actions.act_window,view_mode:0 msgid "Mode of view" -msgstr "" +msgstr "Mode de Vue" #. module: base #: selection:ir.report.custom,print_orientation:0 @@ -1340,12 +1345,12 @@ msgstr "" #: wizard_field:res.partner.spam_send,init,text:0 #: field:ir.actions.server,message:0 msgid "Message" -msgstr "" +msgstr "Message" #. module: base #: wizard_view:module.lang.install,start:0 msgid "Language file loaded." -msgstr "" +msgstr "Fichier de Langue chargé" #. module: base #: model:ir.actions.act_window,name:base.action_ui_view @@ -1377,7 +1382,7 @@ msgstr "Activité" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_INDEX" -msgstr "" +msgstr "STOCK_INDEX" #. module: base #: field:ir.report.custom,print_orientation:0 @@ -1387,7 +1392,7 @@ msgstr "Orientation de l'impression" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_BOTTOM" -msgstr "" +msgstr "STOCK_GOTO_BOTTOM" #. module: base #: field:ir.actions.report.xml,header:0 @@ -1422,12 +1427,12 @@ msgstr "Séquences" #: code:osv/orm.py:0 #, python-format msgid "Unknown position in inherited view %s !" -msgstr "" +msgstr "Position inconnue dans la vue héritée %s !" #. module: base #: view:res.users:0 msgid "Add User" -msgstr "" +msgstr "Ajouter un utilisateur" #. module: base #: field:res.request,trigger_date:0 @@ -1437,7 +1442,7 @@ msgstr "Date de déclenchement" #. module: base #: model:ir.model,name:base.model_ir_actions_configuration_wizard msgid "ir.actions.configuration.wizard" -msgstr "" +msgstr "ir.actions.configuration.wizard" #. module: base #: view:res.partner.bank:0 @@ -1453,7 +1458,7 @@ msgstr "Avertissement: un champ relation utilise un objet inconnu" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_FORWARD" -msgstr "" +msgstr "STOCK_GO_FORWARD" #. module: base #: field:res.bank,zip:0 @@ -1470,7 +1475,7 @@ msgstr "Auteur" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNDELETE" -msgstr "" +msgstr "STOCK_UNDELETE" #. module: base #: selection:wizard.module.lang.export,state:0 @@ -1532,7 +1537,7 @@ msgstr "Direction" #. module: base #: model:ir.model,name:base.model_wizard_module_update_translations msgid "wizard.module.update_translations" -msgstr "" +msgstr "wizard.module.update_translations" #. module: base #: field:ir.actions.act_window,view_ids:0 @@ -1547,17 +1552,17 @@ msgstr "Vues" #. module: base #: wizard_button:res.partner.spam_send,init,send:0 msgid "Send Email" -msgstr "Envoyer un courrier électronique" +msgstr "Envoyer un courriel" #. module: base #: model:res.partner.category,name:base.res_partner_category_4 msgid "Basic Partner" -msgstr "" +msgstr "Partenaire de Base" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SELECT_FONT" -msgstr "" +msgstr "STOCK_SELECT_FONT" #. module: base #: code:addons/base/module/module.py:0 @@ -1574,7 +1579,7 @@ msgstr "," #. module: base #: field:res.users,menu_id:0 msgid "Menu Action" -msgstr "" +msgstr "Action du Menu" #. module: base #: model:res.partner.title,name:base.res_partner_title_madam @@ -1584,7 +1589,7 @@ msgstr "Madame" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PASTE" -msgstr "" +msgstr "STOCK_PASTE" #. module: base #: model:ir.actions.act_window,name:base.action_model_model @@ -1596,7 +1601,7 @@ msgstr "Objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_FIRST" -msgstr "" +msgstr "STOCK_GOTO_FIRST" #. module: base #: code:addons/base/module/module.py:0 @@ -1613,7 +1618,7 @@ msgstr "" #: model:ir.ui.menu,name:base.menu_workflow #: model:ir.ui.menu,name:base.menu_workflow_root msgid "Workflows" -msgstr "" +msgstr "Diagramme de Flux" #. module: base #: field:ir.model.fields,model_id:0 @@ -1652,7 +1657,7 @@ msgstr "URL" #. module: base #: rml:ir.module.reference:0 msgid "Description :" -msgstr "" +msgstr "Description :" #. module: base #: field:ir.report.custom,print_format:0 @@ -1664,7 +1669,7 @@ msgstr "Format d'impression" #: model:ir.model,name:base.model_res_payterm #: view:res.payterm:0 msgid "Payment term" -msgstr "" +msgstr "Terme du Paiement" #. module: base #: field:res.request,ref_doc2:0 @@ -1674,12 +1679,12 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-calendar" -msgstr "" +msgstr "terp-calendar" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-stock" -msgstr "" +msgstr "terp-stock" #. module: base #: selection:ir.cron,interval_type:0 @@ -1689,7 +1694,7 @@ msgstr "Jours de Travail" #. module: base #: model:ir.model,name:base.model_res_roles msgid "res.roles" -msgstr "" +msgstr "res.roles" #. module: base #: help:ir.cron,priority:0 @@ -1703,12 +1708,12 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_ir_model_data msgid "ir.model.data" -msgstr "" +msgstr "ir.model.data" #. module: base #: view:ir.ui.view:0 msgid "User Interface - Views" -msgstr "" +msgstr "Interface Utilisateur - Vues" #. module: base #: view:res.groups:0 @@ -1721,11 +1726,12 @@ msgstr "Droits d'accès" msgid "" "The .rml path of the file or NULL if the content is in report_rml_content" msgstr "" +"Le chemin vers le .rml ou NULL si le contenu est dans le report_rml_content" #. module: base #: view:res.users:0 msgid "Skip" -msgstr "" +msgstr "Ignorer" #. module: base #: model:ir.actions.act_window,name:base.act_menu_create @@ -1736,7 +1742,7 @@ msgstr "Créer le menu" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_RECORD" -msgstr "" +msgstr "STOCK_MEDIA_RECORD" #. module: base #: selection:ir.rule,operator:0 @@ -1762,7 +1768,7 @@ msgstr "Nom de la catégorie" #. module: base #: field:ir.report.custom.fields,field_child1:0 msgid "field child1" -msgstr "" +msgstr "champ enfant1" #. module: base #: wizard_field:res.partner.spam_send,init,subject:0 @@ -1790,12 +1796,12 @@ msgstr "De" #. module: base #: selection:res.partner.event,partner_type:0 msgid "Retailer" -msgstr "" +msgstr "Détaillant" #. module: base #: wizard_button:server.action.create,init,step_1:0 msgid "Next" -msgstr "" +msgstr "Suivant" #. module: base #: model:ir.ui.menu,name:base.next_id_11 @@ -1815,7 +1821,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-report" -msgstr "" +msgstr "terp-report" #. module: base #: field:res.partner.event,som:0 @@ -1842,7 +1848,7 @@ msgstr "Créé Manuellement" #. module: base #: view:ir.module.module:0 msgid "Defined Reports" -msgstr "" +msgstr "Rapports Définis" #. module: base #: field:workflow.transition,act_from:0 @@ -1852,17 +1858,17 @@ msgstr "Activité Source" #. module: base #: view:ir.attachment:0 msgid "Attachment" -msgstr "" +msgstr "Pièce jointe" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_FILE" -msgstr "" +msgstr "STOCK_FILE" #. module: base #: model:res.partner.category,name:base.res_partner_category_9 msgid "Components Supplier" -msgstr "" +msgstr "Fournisseurs de Composants" #. module: base #: view:ir.rule.group:0 @@ -1894,17 +1900,17 @@ msgstr "Contenu du RML" #. module: base #: model:ir.model,name:base.model_ir_model_grid msgid "Objects Security Grid" -msgstr "" +msgstr "Grille de Sécurité des Objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CONNECT" -msgstr "" +msgstr "STOCK_CONNECT" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SAVE_AS" -msgstr "" +msgstr "STOCK_SAVE_AS" #. module: base #: selection:ir.model.fields,select_level:0 @@ -1914,7 +1920,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DND" -msgstr "" +msgstr "STOCK_DND" #. module: base #: field:ir.sequence,padding:0 @@ -1924,13 +1930,13 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_OK" -msgstr "" +msgstr "STOCK_OK" #. module: base #: code:report/report_sxw.py:0 #, python-format msgid "print" -msgstr "" +msgstr "imprimer" #. module: base #: code:addons/base/ir/ir_model.py:0 @@ -1952,7 +1958,7 @@ msgstr "Factice" #. module: base #: selection:ir.report.custom.fields,operation:0 msgid "None" -msgstr "" +msgstr "Aucun" #. module: base #: code:addons/base/ir/ir_model.py:0 @@ -1963,7 +1969,7 @@ msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)" #. module: base #: model:ir.model,name:base.model_workflow msgid "workflow" -msgstr "" +msgstr "diagramme de flux" #. module: base #: wizard_field:res.partner.sms_send,init,app_id:0 @@ -1987,6 +1993,9 @@ msgid "" "Check this box if the partner is a supplier. If it's not checked, purchase " "people will not see it when encoding a purchase order." msgstr "" +"Cochez cette case si le partenaire est un fournisseur. Si elle n'est pas " +"cochée, le personnel à l'achat ne le verra pas lorsqu'il encodera un ordre " +"d'achat." #. module: base #: wizard_view:module.module.update,init:0 @@ -2001,7 +2010,7 @@ msgstr "Dépot de Modules" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNINDENT" -msgstr "" +msgstr "STOCK_UNINDENT" #. module: base #: selection:ir.actions.todo,start_on:0 @@ -2072,13 +2081,13 @@ msgstr "Contrôle des accès" #. module: base #: model:ir.model,name:base.model_wizard_module_lang_export msgid "wizard.module.lang.export" -msgstr "" +msgstr "wizard.module.lang.export" #. module: base #: selection:ir.module.module.dependency,state:0 #: selection:ir.module.module,state:0 msgid "Installed" -msgstr "" +msgstr "Installé" #. module: base #: model:ir.actions.act_window,name:base.action_partner_function_form @@ -2125,12 +2134,12 @@ msgstr "Alignement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNDO" -msgstr "" +msgstr "STOCK_UNDO" #. module: base #: field:ir.attachment,create_date:0 msgid "Date Created" -msgstr "" +msgstr "Date de Création" #. module: base #: selection:ir.rule,operator:0 @@ -2140,7 +2149,7 @@ msgstr ">=" #. module: base #: model:ir.model,name:base.model_ir_actions_todo msgid "ir.actions.todo" -msgstr "" +msgstr "ir.actions.todo" #. module: base #: model:ir.ui.menu,name:base.menu_administration @@ -2175,7 +2184,7 @@ msgstr "" #: field:res.partner,country:0 #: view:res.country:0 msgid "Country" -msgstr "" +msgstr "Pays" #. module: base #: field:res.currency,rate_ids:0 @@ -2186,7 +2195,7 @@ msgstr "Taux" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_BACK" -msgstr "" +msgstr "STOCK_GO_BACK" #. module: base #: code:addons/base/ir/ir_model.py:0 @@ -2208,7 +2217,7 @@ msgstr "Graphique en Barres" #. module: base #: model:ir.model,name:base.model_ir_model_config msgid "ir.model.config" -msgstr "" +msgstr "ir.model.config" #. module: base #: field:ir.module.module,website:0 @@ -2252,7 +2261,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_FILL" -msgstr "" +msgstr "STOCK_JUSTIFY_FILL" #. module: base #: selection:res.request,state:0 @@ -2285,7 +2294,7 @@ msgstr "RML" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_ERROR" -msgstr "" +msgstr "STOCK_DIALOG_ERROR" #. module: base #: model:ir.actions.act_window,name:base.action_partner_category @@ -2330,12 +2339,12 @@ msgstr "Sociétés" #: model:ir.actions.act_window,name:base.action_partner_supplier_form #: model:ir.ui.menu,name:base.menu_partner_supplier_form msgid "Suppliers Partners" -msgstr "" +msgstr "Partenaires Fournisseurs" #. module: base #: model:ir.model,name:base.model_ir_sequence_type msgid "ir.sequence.type" -msgstr "" +msgstr "ir.sequence.type" #. module: base #: field:ir.actions.wizard,type:0 @@ -2355,7 +2364,7 @@ msgstr "Société Mère" #. module: base #: view:ir.attachment:0 msgid "Attached To" -msgstr "" +msgstr "Attaché à" #. module: base #: view:res.request:0 @@ -2370,12 +2379,12 @@ msgstr "# de Modules" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PLAY" -msgstr "" +msgstr "STOCK_MEDIA_PLAY" #. module: base #: field:ir.model.data,date_init:0 msgid "Init Date" -msgstr "" +msgstr "Date d'Initialisation" #. module: base #: field:res.company,rml_header2:0 @@ -2385,17 +2394,17 @@ msgstr "En-tête Interne du RML" #. module: base #: selection:ir.model,state:0 msgid "Base Object" -msgstr "" +msgstr "Objet de Base" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-crm" -msgstr "" +msgstr "terp-crm" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_STRIKETHROUGH" -msgstr "" +msgstr "STOCK_STRIKETHROUGH" #. module: base #: selection:ir.report.custom.fields,fc0_op:0 @@ -2419,17 +2428,17 @@ msgstr "Code" #. module: base #: view:ir.module.module:0 msgid "Features" -msgstr "" +msgstr "Fonctionnalités" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-partner" -msgstr "" +msgstr "terp-partner" #. module: base #: field:ir.attachment,create_uid:0 msgid "Creator" -msgstr "" +msgstr "Créateur" #. module: base #: code:osv/fields.py:0 @@ -2453,7 +2462,7 @@ msgstr "Requête incorrecte." #. module: base #: field:ir.model.fields,field_description:0 msgid "Field Label" -msgstr "" +msgstr "Libellé du Champ" #. module: base #: code:osv/orm.py:0 @@ -2489,7 +2498,7 @@ msgstr "Condition" #: model:ir.actions.act_window,name:base.action_partner_customer_form #: model:ir.ui.menu,name:base.menu_partner_customer_form msgid "Customers Partners" -msgstr "" +msgstr "Partenaires Clients" #. module: base #: wizard_button:res.partner.spam_send,init,end:0 @@ -2509,12 +2518,12 @@ msgstr "Annuler" #. module: base #: model:ir.model,name:base.model_res_users msgid "res.users" -msgstr "" +msgstr "res.users" #. module: base #: model:ir.ui.menu,name:base.menu_management msgid "Modules Management" -msgstr "" +msgstr "Gestion des Modules" #. module: base #: selection:ir.ui.menu,icon:0 @@ -2528,7 +2537,7 @@ msgstr "terp-administration" #: field:workflow.instance,res_id:0 #: field:workflow.triggers,res_id:0 msgid "Resource ID" -msgstr "" +msgstr "ID de la Ressource" #. module: base #: field:ir.model,info:0 @@ -2538,7 +2547,7 @@ msgstr "Information" #. module: base #: model:ir.model,name:base.model_ir_exports msgid "ir.exports" -msgstr "" +msgstr "ir.exports" #. module: base #: field:workflow.activity,flow_start:0 @@ -2548,7 +2557,7 @@ msgstr "Flux de départ" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MISSING_IMAGE" -msgstr "" +msgstr "STOCK_MISSING_IMAGE" #. module: base #: field:ir.report.custom.fields,bgcolor:0 @@ -2558,12 +2567,12 @@ msgstr "Couleur d'arrière-plan" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REMOVE" -msgstr "" +msgstr "STOCK_REMOVE" #. module: base #: field:ir.actions.report.xml,report_rml:0 msgid "RML path" -msgstr "" +msgstr "Chemin vers le RML" #. module: base #: field:ir.actions.configuration.wizard,item_id:0 @@ -2573,13 +2582,13 @@ msgstr "Prochain Assistant de Configuration" #. module: base #: field:workflow.workitem,inst_id:0 msgid "Instance" -msgstr "" +msgstr "Instance" #. module: base #: field:ir.values,meta:0 #: field:ir.values,meta_unpickle:0 msgid "Meta Datas" -msgstr "" +msgstr "Méta-Données" #. module: base #: model:ir.ui.menu,name:base.menu_custom @@ -2726,12 +2735,12 @@ msgstr "Banque" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_HARDDISK" -msgstr "" +msgstr "STOCK_HARDDISK" #. module: base #: selection:ir.actions.server,otype:0 msgid "Create in Same Model" -msgstr "" +msgstr "Créer dans le même Modèle" #. module: base #: field:ir.actions.todo,name:0 @@ -2764,17 +2773,17 @@ msgstr "Nom" #: model:ir.actions.wizard,name:base.wizard_lang_install #: model:ir.ui.menu,name:base.menu_wizard_lang_install msgid "Load an Official Translation" -msgstr "" +msgstr "Charger une Traduction Officielle" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_APPLY" -msgstr "" +msgstr "STOCK_APPLY" #. module: base #: field:ir.module.module,reports_by_module:0 msgid "Reports" -msgstr "" +msgstr "Rapports" #. module: base #: field:workflow,on_create:0 @@ -2784,17 +2793,17 @@ msgstr "Lors de la création" #. module: base #: wizard_view:base.module.import,init:0 msgid "Please give your module .ZIP file to import." -msgstr "" +msgstr "Veuillez donner votre fichier .ZIP à importer" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CLOSE" -msgstr "" +msgstr "STOCK_CLOSE" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PAUSE" -msgstr "" +msgstr "STOCK_MEDIA_PAUSE" #. module: base #: code:addons/base/module/wizard/wizard_module_import.py:0 @@ -2830,12 +2839,12 @@ msgstr "" #. module: base #: help:wizard.module.lang.export,lang:0 msgid "To export a new language, do not select a language." -msgstr "" +msgstr "Pour exporter une langue, ne sélectionnez aucune langue." #. module: base #: model:ir.ui.menu,name:base.menu_translation_app msgid "Application Terms" -msgstr "" +msgstr "Termes de l'Application" #. module: base #: selection:ir.report.custom.fields,operation:0 @@ -2851,7 +2860,7 @@ msgstr "Fuseau horaire" #: model:ir.actions.act_window,name:base.action_model_grid_security #: model:ir.ui.menu,name:base.menu_ir_access_grid msgid "Access Controls Grid" -msgstr "" +msgstr "Grille de Contrôles d'Accès" #. module: base #: model:ir.model,name:base.model_ir_module_module @@ -2870,17 +2879,17 @@ msgstr "Élevé" #: model:ir.actions.act_window,name:base.action_workflow_instance_form #: model:ir.ui.menu,name:base.menu_workflow_instance msgid "Instances" -msgstr "" +msgstr "Instances" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_COPY" -msgstr "" +msgstr "STOCK_COPY" #. module: base #: selection:ir.actions.todo,start_on:0 msgid "Auto" -msgstr "" +msgstr "Auto" #. module: base #: model:res.partner.category,name:base.res_partner_category_3 @@ -2890,7 +2899,7 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_res_request_link msgid "res.request.link" -msgstr "" +msgstr "res.request.link" #. module: base #: wizard_button:module.module.update,init,update:0 @@ -2900,7 +2909,7 @@ msgstr "Vérifier de nouveaux modules" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window_view msgid "ir.actions.act_window.view" -msgstr "" +msgstr "ir.actions.act_window.view" #. module: base #: code:tools/translate.py:0 @@ -2911,12 +2920,12 @@ msgstr "Format de fichier incorrect" #. module: base #: help:res.bank,bic:0 msgid "Bank Identifier Code" -msgstr "" +msgstr "Code d'Indentification Bancaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CDROM" -msgstr "" +msgstr "STOCK_CDROM" #. module: base #: field:workflow.activity,action:0 @@ -2926,7 +2935,7 @@ msgstr "Action Python" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIRECTORY" -msgstr "" +msgstr "STOCK_DIRECTORY" #. module: base #: field:res.partner.event,planned_revenue:0 @@ -2944,6 +2953,8 @@ msgid "" "You have to import a .CSV file wich is encoded in UTF-8. Please check that " "the first line of your file is one of the following:" msgstr "" +"Vous devez importer une fichier .CSV encodé en UTF-8. Veuillez vérifier que " +"la première ligne de votre fichier est l'une des suivantes:" #. module: base #: field:ir.report.custom.fields,groupby:0 @@ -2965,12 +2976,12 @@ msgstr "Vous ne pouvez pas effacer le champ '%s' !" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ITALIC" -msgstr "" +msgstr "STOCK_ITALIC" #. module: base #: help:ir.actions.report.xml,header:0 msgid "Add or not the coporate RML header" -msgstr "" +msgstr "Ajouter ou non l'entête RML de société" #. module: base #: field:res.currency,accuracy:0 @@ -2981,7 +2992,7 @@ msgstr "Précision mathématique" #: model:ir.model,name:base.model_ir_actions_wizard #: selection:ir.ui.menu,action:0 msgid "ir.actions.wizard" -msgstr "" +msgstr "ir.actions.wizard" #. module: base #: field:res.partner.event,document:0 @@ -2996,7 +3007,7 @@ msgstr "Type d'Évènement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REFRESH" -msgstr "" +msgstr "STOCK_REFRESH" #. module: base #: model:ir.actions.act_window,name:base.ir_sequence_type @@ -3007,7 +3018,7 @@ msgstr "Types de Séquence" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_STOP" -msgstr "" +msgstr "STOCK_STOP" #. module: base #: code:addons/base/ir/ir_model.py:0 @@ -3029,7 +3040,7 @@ msgstr "Numéro de compte" #. module: base #: model:ir.model,name:base.model_wizard_ir_model_menu_create_line msgid "wizard.ir.model.menu.create.line" -msgstr "" +msgstr "wizard.ir.model.menu.create.line" #. module: base #: field:ir.attachment,res_id:0 @@ -3153,12 +3164,12 @@ msgstr "Largeur fixe" #. module: base #: view:ir.actions.server:0 msgid "Other Actions Configuration" -msgstr "" +msgstr "Configuration des Autres Actions" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_EXECUTE" -msgstr "" +msgstr "STOCK_EXECUTE" #. module: base #: selection:ir.cron,interval_type:0 @@ -3189,6 +3200,9 @@ msgid "" "Some installed modules depends on the module you plan to desinstall :\n" " %s" msgstr "" +"Certains modules installés dépendent du module que vous voulez désinstaller " +":\n" +" %s" #. module: base #: model:ir.actions.act_window,name:base.res_request_link-act @@ -3199,12 +3213,12 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_YES" -msgstr "" +msgstr "STOCK_YES" #. module: base #: selection:ir.actions.server,otype:0 msgid "Create in Other Model" -msgstr "" +msgstr "Créer dans un Autre Modèle" #. module: base #: model:ir.actions.act_window,name:base.res_partner_canal-act @@ -3243,7 +3257,7 @@ msgstr "Plannifier pour Installation" #. module: base #: view:ir.sequence:0 msgid "Year without century: %(y)s" -msgstr "" +msgstr "Année sans le siècle : %(y)s" #. module: base #: selection:ir.model.fields,select_level:0 @@ -3266,7 +3280,7 @@ msgstr "Répertoire :" #. module: base #: field:ir.attachment,res_model:0 msgid "Attached Model" -msgstr "" +msgstr "Modèle Attaché" #. module: base #: field:ir.actions.server,trigger_name:0 @@ -3276,7 +3290,7 @@ msgstr "Nom du déclencheur" #. module: base #: wizard_button:server.action.create,step_1,create:0 msgid "Create" -msgstr "" +msgstr "Créer" #. module: base #: code:addons/base/res/res_user.py:0 @@ -3299,7 +3313,7 @@ msgstr "Raccourci" #. module: base #: model:ir.model,name:base.model_ir_model_access msgid "ir.model.access" -msgstr "" +msgstr "ir.model.access" #. module: base #: field:ir.cron,priority:0 @@ -3318,12 +3332,13 @@ msgstr "Source" #: model:ir.actions.act_window,name:base.action_partner_title_contact #: model:ir.ui.menu,name:base.menu_partner_title_contact msgid "Contacts Titles" -msgstr "" +msgstr "Titres des Contacts" #. module: base #: help:res.partner.address,partner_id:0 msgid "Keep empty for a private address, not related to partner." msgstr "" +"Laisser vide pour une adresse privée, sans relation avec le partenaire." #. module: base #: selection:ir.translation,type:0 @@ -3353,7 +3368,7 @@ msgstr "En-tête/Pied-de-page Interne" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_LEFT" -msgstr "" +msgstr "STOCK_JUSTIFY_LEFT" #. module: base #: view:res.partner.bank:0 @@ -3377,6 +3392,8 @@ msgid "" "Save this document to a .tgz file. This archive containt UTF-8 %s files and " "may be uploaded to launchpad." msgstr "" +"Sauvegarder ce document dans un fichier .tgz. Cette archive contient des " +"fichiers UTF-8 %s et peut être chargée vers Launchpad." #. module: base #: field:res.partner.address,type:0 @@ -3439,13 +3456,13 @@ msgstr "Notez que cette opération peut prendre quelques minutes" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_COLOR_PICKER" -msgstr "" +msgstr "STOCK_COLOR_PICKER" #. module: base #: field:res.request,act_to:0 #: field:res.request.history,act_to:0 msgid "To" -msgstr "" +msgstr "Vers" #. module: base #: field:workflow.activity,kind:0 @@ -3467,7 +3484,7 @@ msgstr "Les Arbres peuvent uniquement utilisés dans les rapports tabulaires" #. module: base #: selection:ir.actions.todo,start_on:0 msgid "Manual" -msgstr "" +msgstr "Manuel" #. module: base #: view:res.partner.bank:0 @@ -3485,18 +3502,19 @@ msgstr "Arbre" #. module: base #: model:res.partner.category,name:base.res_partner_category_12 msgid "Segmentation" -msgstr "" +msgstr "Segmentation" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CLEAR" -msgstr "" +msgstr "STOCK_CLEAR" #. module: base #: help:res.users,password:0 msgid "" "Keep empty if you don't want the user to be able to connect on the system." msgstr "" +"Laisser vide si vous ne voulez pas que l'utilisateur se connecte au système." #. module: base #: field:ir.model.access,perm_read:0 @@ -3521,7 +3539,7 @@ msgstr "Champ Personalisé" #. module: base #: field:ir.model.fields,relation_field:0 msgid "Relation Field" -msgstr "" +msgstr "Champ Relation" #. module: base #: code:addons/base/ir/ir_report_custom.py:0 @@ -3555,17 +3573,17 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_UP" -msgstr "" +msgstr "STOCK_GO_UP" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SORT_DESCENDING" -msgstr "" +msgstr "STOCK_SORT_DESCENDING" #. module: base #: model:ir.model,name:base.model_res_request msgid "res.request" -msgstr "" +msgstr "res.request" #. module: base #: field:res.groups,rule_groups:0 @@ -3578,7 +3596,7 @@ msgstr "Règles" #: model:ir.actions.act_window,name:base.action_partner_title #: model:ir.ui.menu,name:base.menu_partner_title msgid "Titles" -msgstr "" +msgstr "Titres" #. module: base #: wizard_view:module.upgrade,start:0 @@ -3600,7 +3618,7 @@ msgstr "pdf" #. module: base #: field:ir.actions.todo,start_date:0 msgid "Start Date" -msgstr "" +msgstr "Date de début" #. module: base #: model:ir.actions.act_window,name:base.action_partner_address_form @@ -3617,17 +3635,17 @@ msgstr "Chemin XML" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_FIND" -msgstr "" +msgstr "STOCK_FIND" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PROPERTIES" -msgstr "" +msgstr "STOCK_PROPERTIES" #. module: base #: model:res.partner.category,name:base.res_partner_category_11 msgid "Textile Suppliers" -msgstr "" +msgstr "Fournisseurs de Textile" #. module: base #: view:wizard.module.lang.export:0 @@ -3636,17 +3654,20 @@ msgid "" "through launchpad. We use their online interface to synchronize all " "translations efforts." msgstr "" +"Les traductions officielles de tous les modules OpenERP/OpenObjects sont " +"gérées via Launchpad. Nous utilisons leur interface en ligne pour " +"synchronizer tous les efforts de traduction." #. module: base #: model:ir.actions.act_window,name:base.grant_menu_access #: model:ir.ui.menu,name:base.menu_grant_menu_access msgid "Grant access to menu" -msgstr "" +msgstr "Permettre l'accès au menu" #. module: base #: field:ir.attachment,datas:0 msgid "File Content" -msgstr "" +msgstr "Contenu du Fichier" #. module: base #: view:ir.module.module:0 @@ -3663,7 +3684,7 @@ msgstr "Nouvelle fenêtre" #: code:addons/base/ir/ir_report_custom.py:0 #, python-format msgid "Second field should be figures" -msgstr "" +msgstr "Le second champ doit être les figures" #. module: base #: selection:res.partner.event,partner_type:0 @@ -3726,7 +3747,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_STOP" -msgstr "" +msgstr "STOCK_MEDIA_STOP" #. module: base #: model:ir.actions.act_window,name:base.res_partner_event_type-act @@ -3745,17 +3766,18 @@ msgstr "" #, python-format msgid "Error occured while validating the field(s) %s: %s" msgstr "" +"Une erreur est survenue lors de la validation du (des) champ(s) %s: %s" #. module: base #: view:res.users:0 msgid "Define New Users" -msgstr "" +msgstr "Définir de Nouveaux Utilisateurs" #. module: base #: model:ir.actions.act_window,name:base.action_rule #: model:ir.ui.menu,name:base.menu_action_rule msgid "Record Rules" -msgstr "" +msgstr "Règles d'Enregistrement" #. module: base #: field:res.config.view,view:0 @@ -3776,7 +3798,7 @@ msgstr "Numéro de téléphone" #. module: base #: view:ir.sequence:0 msgid "Day of the year: %(doy)s" -msgstr "" +msgstr "Jour de l'année: %(doy)s" #. module: base #: help:ir.actions.wizard,multi:0 @@ -3784,6 +3806,8 @@ msgid "" "If set to true, the wizard will not be displayed on the right toolbar of a " "form views." msgstr "" +"Si sélectionné, l'assistant ne sera pas affiché dans la barre d'outils de " +"droite dans les vues formulaire." #. module: base #: field:workflow.transition,role_id:0 @@ -3809,7 +3833,7 @@ msgstr "Groupes" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SPELL_CHECK" -msgstr "" +msgstr "STOCK_SPELL_CHECK" #. module: base #: field:ir.actions.todo,active:0 @@ -3832,17 +3856,17 @@ msgstr "Actif" #. module: base #: view:ir.module.module:0 msgid "Created Menus" -msgstr "" +msgstr "Menus Créés" #. module: base #: field:ir.ui.view.custom,ref_id:0 msgid "Orignal View" -msgstr "" +msgstr "Vue d'Origine" #. module: base #: selection:res.partner.event,type:0 msgid "Sale Opportunity" -msgstr "" +msgstr "Opportunité de Vente" #. module: base #: selection:ir.report.custom.fields,fc0_op:0 @@ -3860,7 +3884,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_AUTHENTICATION" -msgstr "" +msgstr "STOCK_DIALOG_AUTHENTICATION" #. module: base #: view:ir.actions.act_window:0 @@ -3870,7 +3894,7 @@ msgstr "Ouvrir une fenêtre" #. module: base #: selection:ir.cron,interval_type:0 msgid "Months" -msgstr "" +msgstr "Mois" #. module: base #: field:workflow.activity,signal_send:0 @@ -3880,7 +3904,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_OUT" -msgstr "" +msgstr "STOCK_ZOOM_OUT" #. module: base #: selection:ir.module.module.dependency,state:0 @@ -3912,17 +3936,17 @@ msgstr "Action" #. module: base #: field:ir.rule,domain_force:0 msgid "Force Domain" -msgstr "" +msgstr "Forcer le domaine" #. module: base #: view:ir.actions.server:0 msgid "Email Configuration" -msgstr "" +msgstr "Configuration de l'envoi de courriels" #. module: base #: model:ir.model,name:base.model_ir_cron msgid "ir.cron" -msgstr "" +msgstr "ir.cron" #. module: base #: selection:workflow.activity,join_mode:0 @@ -3933,7 +3957,7 @@ msgstr "Et" #. module: base #: field:ir.model.fields,relation:0 msgid "Object Relation" -msgstr "" +msgstr "Relation de l'Objet" #. module: base #: model:ir.actions.act_window,name:base.action_attachment @@ -3951,12 +3975,12 @@ msgstr "Champ" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SELECT_COLOR" -msgstr "" +msgstr "STOCK_SELECT_COLOR" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PRINT" -msgstr "" +msgstr "STOCK_PRINT" #. module: base #: field:ir.actions.wizard,multi:0 @@ -3972,23 +3996,23 @@ msgstr "Réf. Partenaire" #. module: base #: model:ir.model,name:base.model_ir_report_custom_fields msgid "ir.report.custom.fields" -msgstr "" +msgstr "ir.report.custom.fields" #. module: base #: view:ir.module.module:0 msgid "Cancel Uninstall" -msgstr "" +msgstr "Annuler la désinstallation" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window #: selection:ir.ui.menu,action:0 msgid "ir.actions.act_window" -msgstr "" +msgstr "ir.actions.act_window" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-mrp" -msgstr "" +msgstr "terp-mrp" #. module: base #: selection:ir.actions.todo,state:0 @@ -3998,7 +4022,7 @@ msgstr "Terminé" #. module: base #: field:ir.actions.server,trigger_obj_id:0 msgid "Trigger On" -msgstr "" +msgstr "Déclencher sur" #. module: base #: selection:res.partner.address,type:0 @@ -4013,6 +4037,8 @@ msgid "" "If set to true, the action will not be displayed on the right toolbar of a " "form views." msgstr "" +"Si sélectionné, l'action ne sera pas affichée dans la barre d'outils de " +"droite dans les vues formulaire." #. module: base #: model:ir.ui.menu,name:base.next_id_4 @@ -4023,22 +4049,22 @@ msgstr "Bas niveau" #: wizard_view:module.upgrade,start:0 #: wizard_view:module.upgrade,end:0 msgid "You may have to reinstall some language pack." -msgstr "" +msgstr "Vous devrez réinstaller quelques packs de langue." #. module: base #: model:ir.model,name:base.model_res_currency_rate msgid "Currency Rate" -msgstr "" +msgstr "Taux de Conversion de la Devise" #. module: base #: field:ir.model.access,perm_write:0 msgid "Write Access" -msgstr "" +msgstr "Accès en écriture" #. module: base #: view:wizard.module.lang.export:0 msgid "Export done" -msgstr "" +msgstr "Export effectué" #. module: base #: field:ir.model.fields,size:0 @@ -4097,7 +4123,7 @@ msgstr "<=" #. module: base #: view:wizard.module.lang.export:0 msgid "Export Data" -msgstr "" +msgstr "Exporter les données" #. module: base #: field:workflow.triggers,instance_id:0 @@ -4110,6 +4136,9 @@ msgid "" "The selected language has been successfully installed. You must change the " "preferences of the user and open a new menu to view changes." msgstr "" +"La langue sélectionnée a été installée avec succès. Vous devez changer les " +"préférences de l'utlisateur et ouvrir un nouveau menu pour voir les " +"changements." #. module: base #: field:ir.module.module,menus_by_module:0 @@ -4139,22 +4168,22 @@ msgstr "" #. module: base #: model:res.partner.title,name:base.res_partner_title_sir msgid "Sir" -msgstr "" +msgstr "Monsieur" #. module: base #: view:wizard.module.lang.export:0 msgid "https://translations.launchpad.net/openobject" -msgstr "" +msgstr "https://translations.launchpad.net/openobject" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_EDIT" -msgstr "" +msgstr "STOCK_EDIT" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-3 or later version" -msgstr "" +msgstr "GPL-3 ou version supérieure" #. module: base #: field:ir.actions.actions,usage:0 @@ -4168,7 +4197,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_HOME" -msgstr "" +msgstr "STOCK_HOME" #. module: base #: code:addons/base/ir/ir_report_custom.py:0 @@ -4180,28 +4209,28 @@ msgstr "Entrez au moins un champ !" #: field:ir.actions.server,child_ids:0 #: selection:ir.actions.server,state:0 msgid "Others Actions" -msgstr "" +msgstr "Autres Actions" #. module: base #: model:ir.actions.wizard,name:base.wizard_server_action_create #: view:ir.actions.server:0 msgid "Create Action" -msgstr "" +msgstr "Créer une Action" #. module: base #: model:ir.model,name:base.model_workflow_workitem msgid "workflow.workitem" -msgstr "" +msgstr "workflow.workitem" #. module: base #: field:ir.ui.view_sc,name:0 msgid "Shortcut Name" -msgstr "" +msgstr "Nom du Raccourci" #. module: base #: selection:ir.module.module,state:0 msgid "Not Installable" -msgstr "" +msgstr "Non Installable" #. module: base #: field:res.partner.event,probability:0 @@ -4211,7 +4240,7 @@ msgstr "Probabilité (0.50)" #. module: base #: field:res.partner.address,mobile:0 msgid "Mobile" -msgstr "" +msgstr "GSM" #. module: base #: selection:ir.actions.report.xml,report_type:0 @@ -4221,7 +4250,7 @@ msgstr "html" #. module: base #: field:ir.report.custom,repeat_header:0 msgid "Repeat Header" -msgstr "" +msgstr "Répéter l'Entête" #. module: base #: field:res.users,address_id:0 @@ -4231,13 +4260,13 @@ msgstr "Adresse" #. module: base #: wizard_view:module.upgrade,next:0 msgid "Your system will be upgraded." -msgstr "" +msgstr "Votre système va être mis à jour." #. module: base #: model:ir.actions.act_window,name:base.action_config_user_form #: view:res.users:0 msgid "Configure User" -msgstr "" +msgstr "Configurer l'Utilisateur" #. module: base #: rml:ir.module.reference:0 @@ -4247,12 +4276,12 @@ msgstr "Nom:" #. module: base #: help:res.country,name:0 msgid "The full name of the country." -msgstr "" +msgstr "Le nom complet du pays." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUMP_TO" -msgstr "" +msgstr "STOCK_JUMP_TO" #. module: base #: field:ir.ui.menu,child_id:0 @@ -4262,7 +4291,7 @@ msgstr "" #. module: base #: field:ir.actions.todo,end_date:0 msgid "End Date" -msgstr "" +msgstr "Date de fin" #. module: base #: field:ir.exports,resource:0 @@ -4278,17 +4307,17 @@ msgstr "Mettre à jour la Date" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-tools" -msgstr "" +msgstr "terp-tools" #. module: base #: view:ir.actions.server:0 msgid "Python code" -msgstr "" +msgstr "Code Python" #. module: base #: view:ir.actions.report.xml:0 msgid "Report xml" -msgstr "" +msgstr "Rapport XML" #. module: base #: model:ir.actions.act_window,name:base.action_module_open_categ @@ -4304,7 +4333,7 @@ msgstr "Modules" #: field:workflow.activity,subflow_id:0 #: field:workflow.workitem,subflow_id:0 msgid "Subflow" -msgstr "" +msgstr "Sous-flux" #. module: base #: help:res.partner,vat:0 @@ -4321,12 +4350,12 @@ msgstr "Valeurs" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_INFO" -msgstr "" +msgstr "STOCK_DIALOG_INFO" #. module: base #: field:workflow.transition,signal:0 msgid "Signal (button Name)" -msgstr "" +msgstr "Signal (Nom du bouton)" #. module: base #: field:res.company,logo:0 @@ -4344,17 +4373,17 @@ msgstr "Banques" #. module: base #: field:ir.cron,numbercall:0 msgid "Number of calls" -msgstr "" +msgstr "Nombre d'appels" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-sale" -msgstr "" +msgstr "terp-sale" #. module: base #: view:ir.actions.server:0 msgid "Field Mappings" -msgstr "" +msgstr "Associations du Champ" #. module: base #: code:osv/orm.py:0 @@ -4365,13 +4394,13 @@ msgstr "La méthode 'copy' n'est pas implémentée dans cet objet !" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ADD" -msgstr "" +msgstr "STOCK_ADD" #. module: base #: view:ir.model.fields:0 #: view:ir.model:0 msgid "Security on Groups" -msgstr "" +msgstr "Sécurité sur les Groupes" #. module: base #: selection:ir.report.custom.fields,alignment:0 @@ -4382,29 +4411,29 @@ msgstr "centre" #: code:addons/base/module/wizard/wizard_module_import.py:0 #, python-format msgid "Can not create the module file: %s !" -msgstr "" +msgstr "Impossible de créer le fichier du module: %s !" #. module: base #: field:ir.server.object.lines,server_id:0 msgid "Object Mapping" -msgstr "" +msgstr "Association de l'Objet" #. module: base #: field:ir.module.module,published_version:0 msgid "Published Version" -msgstr "" +msgstr "Version Publiée" #. module: base #: help:res.currency,rate:0 #: help:res.currency.rate,rate:0 msgid "The rate of the currency to the currency of rate 1" -msgstr "" +msgstr "Le taux de conversion de la devise vers la devise de taux 1" #. module: base #: model:ir.actions.act_window,name:base.action_country_state #: model:ir.ui.menu,name:base.menu_country_state_partner msgid "States" -msgstr "" +msgstr "États" #. module: base #: field:res.currency.rate,rate:0 @@ -4419,12 +4448,12 @@ msgstr "De droite à gauche" #. module: base #: view:ir.actions.server:0 msgid "Create / Write" -msgstr "" +msgstr "Créer / Écrire" #. module: base #: model:ir.model,name:base.model_ir_exports_line msgid "ir.exports.line" -msgstr "" +msgstr "ir.exports.line" #. module: base #: field:res.partner,credit_limit:0 @@ -4444,13 +4473,13 @@ msgstr "Objet :" #. module: base #: model:ir.model,name:base.model_res_country_state msgid "Country state" -msgstr "" +msgstr "état" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form_all #: model:ir.ui.menu,name:base.menu_ir_property_form_all msgid "All Properties" -msgstr "" +msgstr "Toutes les propriétés" #. module: base #: selection:ir.report.custom.fields,alignment:0 @@ -4476,17 +4505,17 @@ msgstr "Rafraîchissement automatique" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window_close msgid "ir.actions.act_window_close" -msgstr "" +msgstr "ir.actions.act_window_close" #. module: base #: selection:ir.actions.todo,type:0 msgid "Service" -msgstr "" +msgstr "Service" #. module: base #: help:ir.actions.act_window,auto_refresh:0 msgid "Add an auto-refresh on the view" -msgstr "" +msgstr "Ajouter un rafraichissement automatique sur la vue" #. module: base #: field:ir.attachment,datas_fname:0 @@ -4502,12 +4531,12 @@ msgstr "Accès" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_DOWN" -msgstr "" +msgstr "STOCK_GO_DOWN" #. module: base #: field:ir.report.custom,title:0 msgid "Report title" -msgstr "" +msgstr "Titre du Rapport" #. module: base #: selection:ir.cron,interval_type:0 @@ -4523,7 +4552,7 @@ msgstr "Nom du groupe" #: wizard_field:module.upgrade,next,module_download:0 #: wizard_view:module.upgrade,next:0 msgid "Modules to download" -msgstr "" +msgstr "Modules à télécharger" #. module: base #: field:res.bank,fax:0 @@ -4535,6 +4564,8 @@ msgstr "Fax" #: view:res.users:0 msgid "Groups are used to defined access rights on each screen and menu." msgstr "" +"Les Groupes sont utilisés pour définir les droits d'accès sur chaque écran " +"et menu." #. module: base #: model:ir.actions.act_window,name:base.action_workflow_workitem_form @@ -4545,7 +4576,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PRINT_PREVIEW" -msgstr "" +msgstr "STOCK_PRINT_PREVIEW" #. module: base #: code:osv/orm.py:0 @@ -4570,17 +4601,17 @@ msgstr "Date de création" #. module: base #: view:ir.actions.server:0 msgid "Email / SMS" -msgstr "" +msgstr "Courriel / SMS" #. module: base #: field:res.bank,bic:0 msgid "BIC/Swift code" -msgstr "" +msgstr "Code BIC/Swift" #. module: base #: model:ir.model,name:base.model_ir_sequence msgid "ir.sequence" -msgstr "" +msgstr "ir.sequence" #. module: base #: selection:ir.module.module.dependency,state:0 @@ -4609,23 +4640,23 @@ msgstr "Ok" #. module: base #: field:ir.cron,doall:0 msgid "Repeat missed" -msgstr "" +msgstr "Recommencer les manqués" #. module: base #: code:osv/orm.py:0 #, python-format msgid "Couldn't find tag '%s' in parent view !" -msgstr "" +msgstr "Balise '%s' non trouvée dans la vue parente !" #. module: base #: field:ir.ui.view,inherit_id:0 msgid "Inherited View" -msgstr "" +msgstr "Vue Héritée" #. module: base #: model:ir.model,name:base.model_ir_translation msgid "ir.translation" -msgstr "" +msgstr "ir.translation" #. module: base #: field:ir.actions.act_window,limit:0 @@ -4649,12 +4680,12 @@ msgstr "Ou" #. module: base #: model:res.partner.category,name:base.res_partner_category_7 msgid "Openstuff.net" -msgstr "" +msgstr "Openstuff.net" #. module: base #: model:ir.model,name:base.model_ir_rule_group msgid "ir.rule.group" -msgstr "" +msgstr "ir.rule.group" #. module: base #: field:res.roles,child_id:0 @@ -4678,40 +4709,40 @@ msgstr "=" #. module: base #: view:ir.sequence:0 msgid "Week of the year: %(woy)s" -msgstr "" +msgstr "Semaine de l'année : %(woy)s" #. module: base #: model:ir.actions.act_window,name:base.open_module_tree_install #: model:ir.ui.menu,name:base.menu_module_tree_install msgid "Installed modules" -msgstr "" +msgstr "Modules installés" #. module: base #: code:addons/base/res/partner/partner.py:0 #, python-format msgid "Warning" -msgstr "" +msgstr "Avertissement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ABOUT" -msgstr "" +msgstr "STOCK_ABOUT" #. module: base #: field:ir.rule,operator:0 msgid "Operator" -msgstr "" +msgstr "Opérateur" #. module: base #: code:osv/orm.py:0 #, python-format msgid "ValidateError" -msgstr "" +msgstr "Erreur de Validation" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_OPEN" -msgstr "" +msgstr "STOCK_OPEN" #. module: base #: selection:ir.actions.server,state:0 @@ -4721,78 +4752,78 @@ msgstr "" #. module: base #: selection:ir.report.custom.fields,alignment:0 msgid "right" -msgstr "" +msgstr "à droite" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PREVIOUS" -msgstr "" +msgstr "STOCK_MEDIA_PREVIOUS" #. module: base #: wizard_button:base.module.import,init,import:0 #: model:ir.actions.wizard,name:base.wizard_base_module_import #: model:ir.ui.menu,name:base.menu_wizard_module_import msgid "Import module" -msgstr "" +msgstr "Importer le module" #. module: base #: rml:ir.module.reference:0 msgid "Version:" -msgstr "" +msgstr "Version:" #. module: base #: view:ir.actions.server:0 msgid "Trigger Configuration" -msgstr "" +msgstr "Configuration du déclencheur" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DISCONNECT" -msgstr "" +msgstr "STOCK_DISCONNECT" #. module: base #: field:res.company,rml_footer1:0 msgid "Report Footer 1" -msgstr "" +msgstr "Pied de page 1 de rapport" #. module: base #: code:addons/base/ir/ir_model.py:0 #, python-format msgid "You can not delete this document! (%s)" -msgstr "" +msgstr "Vous ne pouvez pas supprimer ce document ! (%s)" #. module: base #: model:ir.actions.act_window,name:base.action_report_custom #: view:ir.report.custom:0 msgid "Custom Report" -msgstr "" +msgstr "Rapport Personalisé" #. module: base #: view:ir.sequence:0 msgid "Day of the week (0:Monday): %(weekday)s" -msgstr "" +msgstr "Jour de la semaine (0:Lundi): %(weekday)s" #. module: base #: selection:ir.actions.server,state:0 msgid "Email" -msgstr "" +msgstr "Courriel" #. module: base #: model:ir.actions.act_window,name:base.action_wizard_update_translations #: model:ir.ui.menu,name:base.menu_wizard_update_translations msgid "Resynchronise Terms" -msgstr "" +msgstr "Resynchroniser les termes" #. module: base #: field:ir.model.access,perm_create:0 msgid "Create Access" -msgstr "" +msgstr "Accès en Création" #. module: base #: model:ir.actions.act_window,name:base.action_partner_other_form #: model:ir.ui.menu,name:base.menu_partner_other_form msgid "Others Partners" -msgstr "" +msgstr "Autres partenaires" #. module: base #: field:ir.model.data,noupdate:0 @@ -4802,34 +4833,34 @@ msgstr "" #. module: base #: rml:ir.module.reference:0 msgid "Printed:" -msgstr "" +msgstr "Imprimé:" #. module: base #: code:addons/base/module/module.py:0 #, python-format msgid "Can not upgrade module '%s'. It is not installed." -msgstr "" +msgstr "Impossible de mettre à jour le module '%s'. Il n'est pas installé." #. module: base #: code:osv/fields.py:0 #, python-format msgid "Not implemented set_memory method !" -msgstr "" +msgstr "Méthode 'set_memory' pas implémentée !" #. module: base #: selection:ir.actions.act_window,target:0 msgid "Current Window" -msgstr "" +msgstr "Fenêtre Courante" #. module: base #: view:res.partner.category:0 msgid "Partner category" -msgstr "" +msgstr "Catégorie de Partenaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_NETWORK" -msgstr "" +msgstr "STOCK_NETWORK" #. module: base #: model:ir.actions.act_window,name:base.action_model_fields @@ -4841,36 +4872,36 @@ msgstr "" #: view:ir.model.fields:0 #: view:ir.model:0 msgid "Fields" -msgstr "" +msgstr "Champs" #. module: base #: model:ir.ui.menu,name:base.next_id_2 msgid "Interface" -msgstr "" +msgstr "Interface" #. module: base #: model:ir.ui.menu,name:base.menu_base_config #: view:ir.sequence:0 #: view:res.company:0 msgid "Configuration" -msgstr "" +msgstr "Configuration" #. module: base #: field:ir.model.fields,ttype:0 #: view:ir.model:0 msgid "Field Type" -msgstr "" +msgstr "Type de Champ" #. module: base #: field:ir.model.fields,complete_name:0 #: field:ir.ui.menu,complete_name:0 msgid "Complete Name" -msgstr "" +msgstr "Nom Complet" #. module: base #: field:res.country.state,code:0 msgid "State Code" -msgstr "" +msgstr "Code de l'État" #. module: base #: field:ir.model.fields,on_delete:0 @@ -4880,12 +4911,12 @@ msgstr "" #. module: base #: view:ir.sequence:0 msgid "Year with century: %(year)s" -msgstr "" +msgstr "Année avec siècle : %(year)s" #. module: base #: view:ir.report.custom:0 msgid "Subscribe Report" -msgstr "" +msgstr "Rapport des Souscriptions" #. module: base #: field:ir.values,object:0 @@ -4895,17 +4926,17 @@ msgstr "" #. module: base #: field:res.lang,translatable:0 msgid "Translatable" -msgstr "" +msgstr "Traduisible" #. module: base #: selection:ir.report.custom,frequency:0 msgid "Daily" -msgstr "" +msgstr "Journalière" #. module: base #: selection:ir.model.fields,on_delete:0 msgid "Cascade" -msgstr "" +msgstr "Cascade" #. module: base #: code:addons/base/ir/ir_report_custom.py:0 @@ -4918,13 +4949,13 @@ msgstr "" #: selection:ir.ui.view,type:0 #: selection:wizard.ir.model.menu.create.line,view_type:0 msgid "Gantt" -msgstr "" +msgstr "Gantt" #. module: base #: code:osv/fields.py:0 #, python-format msgid "Not Implemented" -msgstr "" +msgstr "Non implémenté" #. module: base #: model:res.partner.category,name:base.res_partner_category_5 @@ -4939,13 +4970,13 @@ msgstr "" #. module: base #: view:ir.property:0 msgid "Property" -msgstr "" +msgstr "Propriété" #. module: base #: model:ir.model,name:base.model_res_partner_bank_type #: view:res.partner.bank.type:0 msgid "Bank Account Type" -msgstr "" +msgstr "Type de Compte Bancaire" #. module: base #: view:ir.actions.configuration.wizard:0 @@ -4955,19 +4986,19 @@ msgstr "Prochaine Étape de la Configuration" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-project" -msgstr "" +msgstr "terp-project" #. module: base #: field:res.groups,comment:0 msgid "Comment" -msgstr "" +msgstr "Commentaires" #. module: base #: field:ir.model.fields,domain:0 #: field:ir.rule,domain:0 #: field:res.partner.title,domain:0 msgid "Domain" -msgstr "" +msgstr "Domaine" #. module: base #: view:res.config.view:0 @@ -4976,16 +5007,20 @@ msgid "" "time. Less used options or fields are automatically hidden. You will be able " "to change this, later, through the Administration menu." msgstr "" +"Choisissez l'interface simplifiée si vous testez OpenERP pour la première " +"fois.. Les options et champs les moins utilisés seront automatiquement " +"cachés. Vous pourrez changer ce paramètre plus tard, dans le menu " +"Administration." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PREFERENCES" -msgstr "" +msgstr "STOCK_PREFERENCES" #. module: base #: field:ir.module.module,shortdesc:0 msgid "Short description" -msgstr "" +msgstr "Brève description" #. module: base #: help:ir.actions.report.xml,attachment:0 @@ -4993,31 +5028,33 @@ msgid "" "This is the prefix of the file name the print will be saved as attachement. " "Keep empty to not save the printed reports" msgstr "" +"C'est le préfixe du nom du fichier d'impression qui sera sauvegardé comme " +"pièce jointe. Laissez vide pour ne pas sauvagarder les rapports d'impression." #. module: base #: field:res.country.state,name:0 msgid "State Name" -msgstr "" +msgstr "Nom de l'État" #. module: base #: view:res.company:0 msgid "Your Logo - Use a size of about 450x150 pixels." -msgstr "" +msgstr "Votre Logo - Utilisez une taille approximative de 450x150 pixels." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DELETE" -msgstr "" +msgstr "STOCK_DELETE" #. module: base #: field:workflow.activity,join_mode:0 msgid "Join Mode" -msgstr "" +msgstr "Mode de Jointure" #. module: base #: selection:ir.report.custom,print_format:0 msgid "a5" -msgstr "" +msgstr "a5" #. module: base #: selection:ir.actions.act_window.view,view_mode:0 @@ -5029,19 +5066,19 @@ msgstr "Calendrier" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_LAST" -msgstr "" +msgstr "STOCK_GOTO_LAST" #. module: base #: model:ir.model,name:base.model_ir_actions_report_xml #: selection:ir.ui.menu,action:0 msgid "ir.actions.report.xml" -msgstr "" +msgstr "ir.actions.report.xml" #. module: base #: code:addons/base/maintenance/maintenance.py:0 #, python-format msgid "Maintenance Error !" -msgstr "" +msgstr "Erreur de Maintenance !" #. module: base #: view:wizard.module.lang.export:0 @@ -5051,6 +5088,10 @@ msgid "" "translations for your own module, you can also publish all your translation " "at once." msgstr "" +"Pour améliorer certains termes des traductions officielles d'OpenERP, vous " +"devez modifier les termes directement via l'interface de Launchpad. Si vous " +"avez traduit beaucoup de termes pour votre propre module, vous pouvez " +"également publier toutes vos traductions en une fois." #. module: base #: view:res.users:0 @@ -5058,76 +5099,78 @@ msgid "" "Please note that you will have to logout and relog if you change your " "password." msgstr "" +"Veuillez noter que vous devrez vous déconnecter et vous reconnecter si vous " +"changer de mot de passe." #. module: base #: field:res.partner,address:0 #: view:res.partner.address:0 msgid "Contacts" -msgstr "" +msgstr "Contacts" #. module: base #: selection:ir.actions.act_window.view,view_mode:0 #: selection:ir.ui.view,type:0 #: selection:wizard.ir.model.menu.create.line,view_type:0 msgid "Graph" -msgstr "" +msgstr "Graphe" #. module: base #: field:ir.module.module,latest_version:0 msgid "Latest version" -msgstr "" +msgstr "Dernière version" #. module: base #: model:ir.model,name:base.model_ir_actions_server msgid "ir.actions.server" -msgstr "" +msgstr "ir.actions.server" #. module: base #: model:res.partner.category,name:base.res_partner_category_17 msgid "HR sector" -msgstr "" +msgstr "Secteur HR" #. module: base #: wizard_button:module.lang.install,init,start:0 msgid "Start installation" -msgstr "" +msgstr "Commencer l'installation" #. module: base #: view:ir.model:0 msgid "Fields Description" -msgstr "" +msgstr "Description des Champs" #. module: base #: model:ir.model,name:base.model_ir_module_module_dependency msgid "Module dependency" -msgstr "" +msgstr "Dépendance des Modules" #. module: base #: code:osv/orm.py:0 #, python-format msgid "The name_get method is not implemented on this object !" -msgstr "" +msgstr "La méthode 'name_get' n'est pas implémentée sur cet objet !" #. module: base #: model:ir.actions.wizard,name:base.wizard_upgrade #: model:ir.ui.menu,name:base.menu_wizard_upgrade msgid "Apply Scheduled Upgrades" -msgstr "" +msgstr "Appliquer les Mises à Jour Planifiées" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DND_MULTIPLE" -msgstr "" +msgstr "STOCK_DND_MULTIPLE" #. module: base #: model:res.partner.category,name:base.res_partner_category_2 msgid "OpenERP Partners" -msgstr "" +msgstr "Partnenaires OpenERP" #. module: base #: view:res.config.view:0 msgid "Choose Your Mode" -msgstr "" +msgstr "Choisissez Votre Mode" #. module: base #: view:ir.actions.report.custom:0 @@ -5138,12 +5181,12 @@ msgstr "" #: field:workflow.activity,action_id:0 #: view:ir.actions.server:0 msgid "Server Action" -msgstr "" +msgstr "Action du Serveur" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-3" -msgstr "" +msgstr "GPL-3" #. module: base #: field:ir.actions.act_window_close,name:0 @@ -5152,32 +5195,32 @@ msgstr "" #: field:ir.actions.url,name:0 #: field:ir.actions.act_window,name:0 msgid "Action Name" -msgstr "" +msgstr "Nom de l'Action" #. module: base #: field:ir.actions.configuration.wizard,progress:0 msgid "Configuration Progress" -msgstr "" +msgstr "Progression de la Configuration" #. module: base #: field:res.company,rml_footer2:0 msgid "Report Footer 2" -msgstr "" +msgstr "Pied de page 2 de rapport" #. module: base #: field:res.bank,email:0 msgid "E-Mail" -msgstr "" +msgstr "Courriel" #. module: base #: wizard_view:module.lang.import,init:0 msgid "module,type,name,res_id,src,value" -msgstr "" +msgstr "module,type,name,res_id,src,value" #. module: base #: model:ir.model,name:base.model_res_groups msgid "res.groups" -msgstr "" +msgstr "res.groups" #. module: base #: field:workflow.activity,split_mode:0 @@ -5198,7 +5241,7 @@ msgstr "" #: field:ir.module.module,dependencies_id:0 #: view:ir.module.module:0 msgid "Dependencies" -msgstr "" +msgstr "Dépendances" #. module: base #: field:ir.cron,user_id:0 @@ -5207,18 +5250,18 @@ msgstr "" #: field:res.partner.event,user_id:0 #: view:res.users:0 msgid "User" -msgstr "" +msgstr "Utilisateur" #. module: base #: field:res.partner,parent_id:0 msgid "Main Company" -msgstr "" +msgstr "Société Principale" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form #: model:ir.ui.menu,name:base.menu_ir_property_form msgid "Default properties" -msgstr "" +msgstr "Propriétés par défaut" #. module: base #: field:res.request.history,date_sent:0 @@ -5235,7 +5278,7 @@ msgstr "" #: code:addons/base/ir/ir_actions.py:0 #, python-format msgid "Please specify the Partner Email address !" -msgstr "" +msgstr "Veuillez spécifier le Courriel du Partenaire !" #. module: base #: model:ir.actions.act_window,name:base.action_partner_title_partner @@ -5265,7 +5308,7 @@ msgstr "" #. module: base #: view:workflow.transition:0 msgid "Transition" -msgstr "" +msgstr "Transition" #. module: base #: field:res.partner,vat:0 @@ -5276,17 +5319,17 @@ msgstr "TVA" #: code:addons/base/maintenance/maintenance.py:0 #, python-format msgid "Valid Maintenance Contract !" -msgstr "" +msgstr "Contrat de Maintenance Valide !" #. module: base #: field:res.partner.address,birthdate:0 msgid "Birthdate" -msgstr "" +msgstr "Date de Naissance" #. module: base #: field:ir.module.repository,filter:0 msgid "Filter" -msgstr "" +msgstr "Filtre" #. module: base #: field:res.groups,menu_access:0 @@ -5296,7 +5339,7 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_res_partner_som msgid "res.partner.som" -msgstr "" +msgstr "res.partner.som" #. module: base #: code:report/custom.py:0 @@ -5307,7 +5350,7 @@ msgstr "" #: code:addons/base/module/module.py:0 #, python-format msgid "Error" -msgstr "" +msgstr "Erreur" #. module: base #: model:ir.actions.act_window,name:base.action_partner_category_form @@ -5315,18 +5358,18 @@ msgstr "" #: model:ir.ui.menu,name:base.menu_partner_category_form #: view:res.partner.category:0 msgid "Partner Categories" -msgstr "" +msgstr "Catégories du Partenaire" #. module: base #: model:ir.model,name:base.model_workflow_activity msgid "workflow.activity" -msgstr "" +msgstr "workflow.activity" #. module: base #: field:ir.sequence,code:0 #: field:ir.sequence.type,code:0 msgid "Sequence Code" -msgstr "" +msgstr "Code de la Séquence" #. module: base #: selection:res.request,state:0 From b53c23bce0207ad5c77a33c6f1e5251f5a8efcd6 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 18 Dec 2008 10:07:01 +0100 Subject: [PATCH 80/86] [FIX] fix python2.4 compatibility bzr revid: christophe@cobalt-20081218090701-n7acd0nmsilygkjy --- bin/netsvc.py | 2 +- bin/sql_db.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index 73cbdfceeff..fca2ece17c0 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -403,7 +403,7 @@ class TinySocketClientThread(threading.Thread): import pdb tb = sys.exc_info()[2] pdb.post_mortem(tb) - e = Exception(e.message) + e = Exception(str(e)) ts.mysend(e, exception=True, traceback=tb_s) except: pass diff --git a/bin/sql_db.py b/bin/sql_db.py index 3c348bcf010..2c67b3187b7 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -215,7 +215,7 @@ class PoolManager(object): logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Connecting to %s' % (db_name,)) PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(1, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) except Exception, e: - logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % (db_name, e.message)) + logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % (db_name, str(e)) raise return PoolManager._pools[db_name] get = staticmethod(get) From 3fb0723abd945d44df86f094f9b007fca23696d5 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Thu, 18 Dec 2008 10:13:42 +0100 Subject: [PATCH 81/86] [FIX] bzr revid: stephane@tinyerp.com-20081218091342-ye0b53mnykogrzz9 --- bin/sql_db.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/sql_db.py b/bin/sql_db.py index 2c67b3187b7..9c74d0fae52 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -215,7 +215,8 @@ class PoolManager(object): logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Connecting to %s' % (db_name,)) PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(1, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) except Exception, e: - logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % (db_name, str(e)) + logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % + (db_name, str(e))) raise return PoolManager._pools[db_name] get = staticmethod(get) From 4874f789142796d6e565118d14f65c9b4be00c74 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 18 Dec 2008 10:27:27 +0100 Subject: [PATCH 82/86] [FIX] fix python 2.4 compatibility bzr revid: christophe@cobalt-20081218092727-vhhti8qj1em32xdc --- bin/tools/translate.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/bin/tools/translate.py b/bin/tools/translate.py index 00053a43d90..f1fa57e3815 100644 --- a/bin/tools/translate.py +++ b/bin/tools/translate.py @@ -491,9 +491,6 @@ def trans_generate(lang, modules, dbname=None): trans = trans_obj._get_source(cr, uid, name, type, lang, source) out.append([module, type, name, id, source, encode(trans) or '']) - from pprint import pformat - netsvc.Logger().notifyChannel('translation', netsvc.LOG_DEBUG, pformat(filter(lambda o:any(isinstance(x, unicode) for x in o), out))) - cr.close() return out From ce72e3923002c944c4468c64c46949930683d696 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 18 Dec 2008 10:50:58 +0100 Subject: [PATCH 83/86] bugfix bzr revid: fp@tinyerp.com-20081218095058-j7zawmazyxktjxv0 --- bin/osv/fields.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 7920db763f2..f692fc4c53a 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -284,10 +284,10 @@ class many2one(_column): _column.__init__(self, string=string, **args) self._obj = obj - # - # TODO: speed improvement - # - # name is the name of the relation field + def set_memory(self, cr, obj, id, field, values, user=None, context=None): + obj.datas.setdefault(id, {}) + obj.datas[id][field] = values + def get_memory(self, cr, obj, ids, name, user=None, context=None, values=None): result = {} for id in ids: From 7f1ead5a542f0c873cc0cb6960b7ff8c57bda777 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 18 Dec 2008 11:10:43 +0100 Subject: [PATCH 84/86] [IMP] add a new log-level to allow debug netrpc messages [IMP] change the log level to CRITICAL when then address can not be bind. bzr revid: christophe@cobalt-20081218101043-aornsyiulhm0teue --- bin/netsvc.py | 20 +++++++++++++++++++- bin/tools/config.py | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/bin/netsvc.py b/bin/netsvc.py index fca2ece17c0..7496a9703c0 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -144,12 +144,16 @@ def service_exist(name): def get_rpc_paths(): return map(lambda s: '/xmlrpc/%s' % s, _service) + +LOG_DEBUG_RPC = 'debug_rpc' LOG_DEBUG = 'debug' LOG_INFO = 'info' LOG_WARNING = 'warn' LOG_ERROR = 'error' LOG_CRITICAL = 'critical' +# add new log level below DEBUG +logging.DEBUG_RPC = logging.DEBUG - 1 def init_logger(): from tools import config @@ -178,6 +182,7 @@ def init_logger(): logging.getLogger().addHandler(handler) logging.getLogger().setLevel(config['log_level']) + if isinstance(handler, logging.StreamHandler) and os.name != 'nt': # change color of level names # uses of ANSI color codes @@ -188,6 +193,7 @@ def init_logger(): background = lambda f: 40 + colors.index(f) mapping = { + 'DEBUG_RPC': ('blue', 'white'), 'DEBUG': ('blue', 'default'), 'INFO': ('green', 'default'), 'WARNING': ('yellow', 'default'), @@ -203,6 +209,11 @@ def init_logger(): class Logger(object): def notifyChannel(self, name, level, msg): log = logging.getLogger(name) + + if level == LOG_DEBUG_RPC and not hasattr(log, level): + fct = lambda msg, *args, **kwargs: log.log(logging.DEBUG_RPC, msg, *args, **kwargs) + setattr(log, LOG_DEBUG_RPC, fct) + level_method = getattr(log, level) result = str(msg).strip().split('\n') @@ -297,7 +308,7 @@ class SimpleThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) SimpleXMLRPCServer.SimpleXMLRPCServer.server_bind(self) except: - Logger().notifyChannel('init', LOG_ERROR, 'Address already in use') + Logger().notifyChannel('init', LOG_CRITICAL, 'Address already in use') sys.exit(1) class HttpDaemon(threading.Thread): @@ -368,6 +379,10 @@ class TinySocketClientThread(threading.Thread): threading.Thread.__init__(self) self.sock = sock self.threads = threads + self._logger = Logger() + + def log(self, msg): + self._logger.notifyChannel('NETRPC', LOG_DEBUG_RPC, msg) def run(self): import traceback @@ -388,6 +403,7 @@ class TinySocketClientThread(threading.Thread): self.threads.remove(self) return False try: + self.log(msg) s = LocalService(msg[0]) m = getattr(s, msg[1]) s._service._response = None @@ -395,6 +411,7 @@ class TinySocketClientThread(threading.Thread): res = s._service._response if res != None: r = res + self.log(r) ts.mysend(r) except Exception, e: tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) @@ -404,6 +421,7 @@ class TinySocketClientThread(threading.Thread): tb = sys.exc_info()[2] pdb.post_mortem(tb) e = Exception(str(e)) + self.log(str(e)) ts.mysend(e, exception=True, traceback=tb_s) except: pass diff --git a/bin/tools/config.py b/bin/tools/config.py index 1d5a3372537..e93bf7aec37 100644 --- a/bin/tools/config.py +++ b/bin/tools/config.py @@ -70,7 +70,7 @@ class configmanager(object): 'assert_exit_level': logging.WARNING, # level above which a failed assert will be raise } - loglevels = dict([(getattr(netsvc, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG')]) + loglevels = dict([(getattr(netsvc, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'DEBUG_RPC')]) version = "%s %s" % (release.description, release.version) parser = optparse.OptionParser(version=version) From bf4b9a9691c90840639aff4a7c9046c97d0507a4 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 18 Dec 2008 11:20:03 +0100 Subject: [PATCH 85/86] [IMP] add debuging help method bzr revid: christophe@cobalt-20081218102003-3i5sxe18pmy16bm2 --- bin/tools/misc.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/bin/tools/misc.py b/bin/tools/misc.py index fbdaf44c55b..ebf0606601d 100644 --- a/bin/tools/misc.py +++ b/bin/tools/misc.py @@ -715,11 +715,41 @@ def logged(f): vector.append(' result: %s' % pformat(res)) vector.append(' time delta: %s' % (time.time() - timeb4)) - #netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector)) + netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector)) return res return wrapper +def debug(what): + """ + This method allow you to debug your code without print + Example: + >>> def func_foo(bar) + ... baz = bar + ... debug(baz) + ... qnx = (baz, bar) + ... debug(qnx) + ... + >>> func_foo(42) + + This will output on the logger: + + [Wed Dec 25 00:00:00 2008] DEBUG:func_foo:baz = 42 + [Wed Dec 25 00:00:00 2008] DEBUG:func_foo:qnx = (42, 42) + + To view the DEBUG lines in the logger you must start the server with the option + --log-level=debug + + """ + import netsvc + from inspect import stack + import re + from pprint import pformat + st = stack()[1] + param = re.split("debug *\((.+)\)", st[4][0].strip())[1].strip() + while param.count(')') > param.count('('): param = param[:param.rfind(')')] + netsvc.Logger().notifyChannel(st[3], netsvc.LOG_DEBUG, "%s = %s" % (param, pformat(what))) + icons = map(lambda x: (x,x), ['STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD', 'STOCK_CANCEL', 'STOCK_CDROM', 'STOCK_CLEAR', 'STOCK_CLOSE', 'STOCK_COLOR_PICKER', From f510071f6b14a5534cadc0aced4dae67c60a2c79 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Thu, 18 Dec 2008 15:02:32 +0100 Subject: [PATCH 86/86] [IMP] Add the drop_view_if_exists method lp bug: https://launchpad.net/bugs/309331 fixed bzr revid: stephane@tinyerp.com-20081218140232-828mryrisecwxs3v --- bin/sql_db.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/sql_db.py b/bin/sql_db.py index 9c74d0fae52..5cbe3e7420a 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -135,6 +135,12 @@ class Cursor(object): self.sql_into_log[res_into.group(1)][1] += mdt.now() - now return res + def drop_view_if_exists(self, viewname): + self._obj.execute("select count(1) from pg_class where relkind=%s and relname=%s", ('v', viewname,)) + if self._obj.fetchone()[0]: + self._obj.execute("DROP view %s" % (viewname,)) + self._obj.commit() + def print_log(self): def process(type): sqllogs = {'from':self.sql_from_log, 'into':self.sql_into_log}