diff --git a/addons/account/account.py b/addons/account/account.py index 6095c2aa113..cabf51586fc 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -231,9 +231,9 @@ class account_account(osv.osv): aml_query = self.pool.get('account.move.line')._query_get(cr, uid, context=context) wheres = [""] - if query: + if query.strip(): wheres.append(query.strip()) - if aml_query: + if aml_query.strip(): wheres.append(aml_query.strip()) query = " AND ".join(wheres) @@ -251,6 +251,7 @@ class account_account(osv.osv): # consolidate accounts with direct children + ids2.reverse() brs = list(self.browse(cr, uid, ids2, context=context)) sums = {} while brs: @@ -270,8 +271,9 @@ class account_account(osv.osv): if current.child_id: sums[current.id][fn] += sum(sums[child.id][fn] for child in current.child_id) res = {} + null_result = dict((fn, 0.0) for fn in field_names) for id in ids: - res[id] = sums[id] + res[id] = sums.get(id, null_result) return res def _get_company_currency(self, cr, uid, ids, field_name, arg, context={}): @@ -313,7 +315,7 @@ class account_account(osv.osv): 'user_type': fields.many2one('account.account.type', 'Account Type', required=True, help="These types are defined according to your country. The type contains more information "\ "about the account and its specificities."), - 'parent_id': fields.many2one('account.account', 'Parent', ondelete='cascade'), + 'parent_id': fields.many2one('account.account', 'Parent', ondelete='cascade', domain=[('type','=','view')]), 'child_parent_ids': fields.one2many('account.account','parent_id','Children'), 'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'), 'child_id': fields.function(_get_child_ids, method=True, type='many2many', relation="account.account", string="Child Accounts"), @@ -450,18 +452,42 @@ class account_account(osv.osv): def _check_moves(self, cr, uid, ids, method, context): line_obj = self.pool.get('account.move.line') account_ids = self.search(cr, uid, [('id', 'child_of', ids)]) + if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]): if method == 'write': raise osv.except_osv(_('Error !'), _('You cannot deactivate an account that contains account moves.')) elif method == 'unlink': raise osv.except_osv(_('Error !'), _('You cannot remove an account which has account entries!. ')) + #Checking whether the account is set as a property to any Partner or not + value = 'account.account,' + str(ids[0]) + partner_prop_acc = self.pool.get('ir.property').search(cr, uid, [('value_reference','=',value)], context=context) + if partner_prop_acc: + raise osv.except_osv(_('Warning !'), _('You cannot remove/deactivate an account which is set as a property to any Partner.')) + return True + + def _check_allow_type_change(self, cr, uid, ids, new_type, context): + group1 = ['payable', 'receivable', 'other'] + group2 = ['consolidation','view'] + line_obj = self.pool.get('account.move.line') + for account in self.browse(cr, uid, ids, context=context): + old_type = account.type + account_ids = self.search(cr, uid, [('id', 'child_of', [account.id])]) + if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]): + #Check for 'Closed' type + if old_type == 'closed' and new_type !='closed': + raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from 'Closed' to any other type which contains account entries!")) + #Check for change From group1 to group2 and vice versa + if (old_type in group1 and new_type in group2) or (old_type in group2 and new_type in group1): + raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from '%s' to '%s' type as it contains account entries!") % (old_type,new_type,)) return True def write(self, cr, uid, ids, vals, context=None): - if not context: + if context is None: context = {} if 'active' in vals and not vals['active']: self._check_moves(cr, uid, ids, "write", context) + if 'type' in vals.keys(): + self._check_allow_type_change(cr, uid, ids, vals['type'], context=context) return super(account_account, self).write(cr, uid, ids, vals, context=context) def unlink(self, cr, uid, ids, context={}): @@ -557,15 +583,16 @@ class account_journal(osv.osv): def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): if not args: - args=[] - if not context: - context={} + args = [] + if context is None: + context = {} ids = [] if name: - ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit) + ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit, context=context) if not ids: - ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit) + ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit, context=context) return self.name_get(cr, user, ids, context=context) + account_journal() class account_fiscalyear(osv.osv): @@ -631,6 +658,19 @@ class account_fiscalyear(osv.osv): else: return False return ids[0] + + def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): + if args is None: + args = [] + if context is None: + context = {} + ids = [] + if name: + ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit) + if not ids: + ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit) + return self.name_get(cr, user, ids, context=context) + account_fiscalyear() class account_period(osv.osv): @@ -706,6 +746,18 @@ class account_period(osv.osv): cr.execute('update account_journal_period set state=%s where period_id=%s', (mode, id)) cr.execute('update account_period set state=%s where id=%s', (mode, id)) return True + + def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): + if args is None: + args = [] + if context is None: + context = {} + ids = [] + if name: + ids = self.search(cr, user, [('code','ilike',name)]+ args, limit=limit) + if not ids: + ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit) + return self.name_get(cr, user, ids, context=context) account_period() @@ -950,7 +1002,6 @@ class account_move(osv.osv): l[2]['period_id'] = default_period context['period_id'] = default_period - accnt_journal = self.pool.get('account.journal').browse(cr, uid, vals['journal_id']) if 'line_id' in vals: c = context.copy() c['novalidate'] = True @@ -1248,7 +1299,7 @@ class account_tax_code(osv.osv): _description = 'Tax Code' _rec_name = 'code' _columns = { - 'name': fields.char('Tax Case Name', size=64, required=True), + 'name': fields.char('Tax Case Name', size=64, required=True, translate=True), 'code': fields.char('Case Code', size=64), 'info': fields.text('Description'), 'sum': fields.function(_sum_year, method=True, string="Year Sum"), @@ -1262,6 +1313,15 @@ class account_tax_code(osv.osv): } + def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): + if not args: + args = [] + if context is None: + context = {} + ids = self.search(cr, user, ['|',('name',operator,name),('code',operator,name)] + args, limit=limit, context=context) + return self.name_get(cr, user, ids, context) + + def name_get(self, cr, uid, ids, context=None): if not len(ids): return [] @@ -1290,7 +1350,15 @@ class account_tax_code(osv.osv): return False level -= 1 return True + + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + default = default.copy() + default.update({'line_ids': []}) + return super(account_tax_code, self).copy(cr, uid, id, default, context) + _constraints = [ (_check_recursion, 'Error ! You can not create recursive accounts.', ['parent_id']) ] diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index deb010c7cd0..c23bd35b6a7 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -558,35 +558,40 @@ class account_bank_statement_line(osv.osv): def onchange_partner_id(self, cursor, user, line_id, partner_id, type, currency_id, context={}): + res = {'value': {}} if not partner_id: - return {} - res_currency_obj = self.pool.get('res.currency') - res_users_obj = self.pool.get('res.users') - - company_currency_id = res_users_obj.browse(cursor, user, user, - context=context).company_id.currency_id.id - - if not currency_id: - currency_id = company_currency_id - - part = self.pool.get('res.partner').browse(cursor, user, partner_id, + return res + line = self.browse(cursor, user, line_id) + + if not line or (line and not line[0].account_id): + part = self.pool.get('res.partner').browse(cursor, user, partner_id, context=context) - if type == 'supplier': - account_id = part.property_account_payable.id - else: - account_id = part.property_account_receivable.id + if type == 'supplier': + account_id = part.property_account_payable.id + else: + account_id = part.property_account_receivable.id + res['value']['account_id'] = account_id - cursor.execute('SELECT sum(debit-credit) \ + if not line or (line and not line[0].amount): + res_users_obj = self.pool.get('res.users') + res_currency_obj = self.pool.get('res.currency') + company_currency_id = res_users_obj.browse(cursor, user, user, + context=context).company_id.currency_id.id + if not currency_id: + currency_id = company_currency_id + + cursor.execute('SELECT sum(debit-credit) \ FROM account_move_line \ WHERE (reconcile_id is null) \ AND partner_id = %s \ AND account_id=%s', (partner_id, account_id)) - res = cursor.fetchone() - balance = res and res[0] or 0.0 + pgres = cursor.fetchone() + balance = pgres and pgres[0] or 0.0 - balance = res_currency_obj.compute(cursor, user, company_currency_id, + balance = res_currency_obj.compute(cursor, user, company_currency_id, currency_id, balance, context=context) - return {'value': {'amount': balance, 'account_id': account_id}} + res['value']['amount'] = balance + return res def _reconcile_amount(self, cursor, user, ids, name, args, context=None): if not ids: @@ -633,7 +638,7 @@ class account_bank_statement_line(osv.osv): 'note': fields.text('Notes'), 'reconcile_amount': fields.function(_reconcile_amount, string='Amount reconciled', method=True, type='float'), - 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bank statement line."), + 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bank statement lines."), } _defaults = { 'name': lambda self,cr,uid,context={}: self.pool.get('ir.sequence').get(cr, uid, 'account.bank.statement.line'), diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 2ce4324f7c6..2da7c71021c 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -478,9 +478,11 @@ - - + + + + res.partner.invoice.info.inherit res.partner diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index a86fce20772..d4f913a32ce 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -577,11 +577,12 @@ class account_move_line(osv.osv): merges_rec = [] for line in self.browse(cr, uid, ids, context): if line.reconcile_id: - raise osv.except_osv(_('Already Reconciled'), _('Already Reconciled')) + raise osv.except_osv(_('Warning'), _('Already Reconciled!')) if line.reconcile_partial_id: for line2 in line.reconcile_partial_id.line_partial_ids: if not line2.reconcile_id: - merges.append(line2.id) + if line2.id not in merges: + merges.append(line2.id) total += (line2.debit or 0.0) - (line2.credit or 0.0) merges_rec.append(line.reconcile_partial_id.id) else: @@ -774,6 +775,17 @@ class account_move_line(osv.osv): result['fields'] = self.fields_get(cr, uid, fields, context) return result + def _check_moves(self, cr, uid, context): + # use the first move ever created for this journal and period + cr.execute('select id, state, name from account_move where journal_id=%s and period_id=%s order by id limit 1', (context['journal_id'],context['period_id'])) + res = cr.fetchone() + if res: + if res[1] != 'draft': + raise osv.except_osv(_('UserError'), + _('The account move (%s) for centralisation ' \ + 'has been confirmed!') % res[2]) + return res + def unlink(self, cr, uid, ids, context={}, check=True): self._update_check(cr, uid, ids, context) result = False @@ -809,7 +821,7 @@ class account_move_line(osv.osv): return True def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True): - if not context: + if context is None: context={} if vals.get('account_tax_id', False): raise osv.except_osv(_('Unable to change tax !'), _('You can not change the tax, you should remove and recreate lines !')) @@ -825,6 +837,24 @@ class account_move_line(osv.osv): if vals.get('date', False): todo_date = vals['date'] del vals['date'] + + for line in self.browse(cr, uid, ids,context=context): + ctx = context.copy() + if ('journal_id' not in ctx): + if line.move_id: + ctx['journal_id'] = line.move_id.journal_id.id + else: + ctx['journal_id'] = line.journal_id.id + if ('period_id' not in ctx): + if line.move_id: + ctx['period_id'] = line.move_id.period_id.id + else: + ctx['period_id'] = line.period_id.id + #Check for centralisation + journal = self.pool.get('account.journal').browse(cr, uid, ctx['journal_id'], context=ctx) + if journal.centralisation: + self._check_moves(cr, uid, context=ctx) + result = super(account_move_line, self).write(cr, uid, ids, vals, context) if check: @@ -891,14 +921,9 @@ class account_move_line(osv.osv): is_new_move = False if not move_id: if journal.centralisation: - # use the first move ever created for this journal and period - cr.execute('select id, state, name from account_move where journal_id=%s and period_id=%s order by id limit 1', (context['journal_id'],context['period_id'])) - res = cr.fetchone() + #Check for centralisation + res = self._check_moves(cr, uid, context) if res: - if res[1] != 'draft': - raise osv.except_osv(_('UserError'), - _('The Ledger Posting (%s) for centralisation ' \ - 'has been confirmed!') % res[2]) vals['move_id'] = res[0] if not vals.get('move_id', False): @@ -926,7 +951,7 @@ class account_move_line(osv.osv): break if journal.account_control_ids and not ok: for a in journal.account_control_ids: - if a.id==vals['account_id']: + if a.id == vals['account_id']: ok = True break if (account.currency_id) and 'amount_currency' not in vals and account.currency_id.id <> company_currency: @@ -941,7 +966,7 @@ class account_move_line(osv.osv): if not ok: raise osv.except_osv(_('Bad account !'), _('You can not use this general account in this journal !')) - if 'analytic_account_id' in vals and vals['analytic_account_id']: + if vals.get('analytic_account_id',False): if journal.analytic_journal_id: vals['analytic_lines'] = [(0,0, { 'name': vals['name'], @@ -961,8 +986,8 @@ class account_move_line(osv.osv): result = super(osv.osv, self).create(cr, uid, vals, context) # CREATE Taxes - if 'account_tax_id' in vals and vals['account_tax_id']: - tax_id=tax_obj.browse(cr,uid,vals['account_tax_id']) + if vals.get('account_tax_id',False): + tax_id = tax_obj.browse(cr, uid, vals['account_tax_id']) total = vals['debit'] - vals['credit'] if journal.refund_journal: base_code = 'ref_base_code_id' @@ -978,7 +1003,7 @@ class account_move_line(osv.osv): tax_sign = 'tax_sign' tmp_cnt = 0 - for tax in tax_obj.compute(cr,uid,[tax_id],total,1.00): + for tax in tax_obj.compute(cr, uid, [tax_id], total, 1.00): #create the base movement if tmp_cnt == 0: if tax[base_code]: @@ -1031,7 +1056,7 @@ class account_move_line(osv.osv): # if context and ('__last_update' in context): # del context['__last_update'] # self.pool.get('account.move').write(cr, uid, [move_id], {'date':vals['date']}, context=context) - if check and not context.get('no_store_function'): + if check and ((not context.get('no_store_function')) or journal.entry_posted): tmp = self.pool.get('account.move').validate(cr, uid, [vals['move_id']], context) if journal.entry_posted and tmp: self.pool.get('account.move').button_validate(cr,uid, [vals['move_id']],context) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 5e514041d1d..6c5be231657 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -531,7 +531,10 @@ + + + @@ -551,6 +554,7 @@ + @@ -562,7 +566,7 @@
- + @@ -648,9 +652,9 @@ - + - + @@ -1453,9 +1457,11 @@ - + - + + + Account Add wizard diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 34c7aa3e6ba..a289c7af93d 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -23,8 +23,8 @@ import time import decimal_precision as dp import netsvc + from osv import fields, osv, orm -import ir import pooler from tools import config from tools.translate import _ @@ -333,7 +333,7 @@ class account_invoice(osv.osv): raise orm.except_orm(_('Configuration Error!'), _('There is no Accounting Journal of type Sale/Purchase defined!')) else: - raise + raise orm.except_orm(_('UnknownError'), str(e)) def unlink(self, cr, uid, ids, context=None): invoices = self.read(cr, uid, ids, ['state']) @@ -350,7 +350,7 @@ class account_invoice(osv.osv): # res = self.pool.get('res.partner').address_get(cr, uid, [part], ['invoice']) # return [{}] def onchange_partner_id(self, cr, uid, ids, type, partner_id, - date_invoice=False, payment_term=False, partner_bank_id=False, company_id=False): + date_invoice=False, payment_term=False, partner_bank=False, company_id=False): invoice_addr_id = False contact_addr_id = False partner_payment_term = False @@ -415,7 +415,7 @@ class account_invoice(osv.osv): else: result['value']['date_due'] = False - if partner_bank_id != bank_id: + if partner_bank != bank_id: to_update = self.onchange_partner_bank(cr, uid, ids, bank_id) result['value'].update(to_update['value']) return result @@ -450,7 +450,7 @@ class account_invoice(osv.osv): def onchange_invoice_line(self, cr, uid, ids, lines): return {} - def onchange_partner_bank(self, cursor, user, ids, partner_bank_id): + def onchange_partner_bank(self, cursor, user, ids, partner_bank): return {'value': {}} def onchange_company_id(self, cr, uid, ids, company_id, part_id, type, invoice_line, currency_id): @@ -650,6 +650,16 @@ class account_invoice(osv.osv): self.write(cr, uid, [inv.id], res['value']) return True + def finalize_invoice_move_lines(self, cr, uid, invoice_browse, move_lines): + """finalize_invoice_move_lines(cr, uid, invoice, move_lines) -> move_lines + Hook method to be overridden in additional modules to verify and possibly alter the + move lines to be created by an invoice, for special cases. + :param invoice_browse: browsable record of the invoice that is generating the move lines + :param move_lines: list of dictionaries with the account.move.lines (as for create()) + :return: the (possibly updated) final move_lines to create for this invoice + """ + return move_lines + def check_tax_lines(self, cr, uid, inv, compute_taxes, ait_obj): if not inv.tax_line: for tax in compute_taxes.values(): @@ -912,7 +922,12 @@ class account_invoice(osv.osv): # will be automatically deleted too account_move_obj.unlink(cr, uid, [i['move_id'][0]]) if i['payment_ids']: - self.pool.get('account.move.line').write(cr, uid, i['payment_ids'], {'reconcile_partial_id': False}) + account_move_line_obj = self.pool.get('account.move.line') + pay_ids = account_move_line_obj.browse(cr, uid , i['payment_ids']) + for move_line in pay_ids: + if move_line.reconcile_partial_id and move_line.reconcile_partial_id.line_partial_ids: + raise osv.except_osv(_('Error !'), _('You cannot cancel the Invoice which is Partially Paid! You need to unreconcile concerned payment entries!')) + self.write(cr, uid, ids, {'state':'cancel', 'move_id':False}) self._log_event(cr, uid, ids,-1.0, 'Cancel Invoice') return True @@ -1147,7 +1162,7 @@ class account_invoice_line(osv.osv): t = t - (p * l[2].get('quantity')) taxes = l[2].get('invoice_line_tax_id') if len(taxes[0]) >= 3 and taxes[0][2]: - taxes=tax_obj.browse(cr, uid, taxes[0][2]) + taxes = tax_obj.browse(cr, uid, taxes[0][2]) for tax in tax_obj.compute(cr, uid, taxes, p,l[2].get('quantity'), context.get('address_invoice_id', False), l[2].get('product_id', False), context.get('partner_id', False)): t = t - tax['amount'] return t @@ -1200,8 +1215,8 @@ class account_invoice_line(osv.osv): part = self.pool.get('res.partner').browse(cr, uid, partner_id) fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False - lang=part.lang - context.update({'lang': lang}) + if part.lang: + context.update({'lang': part.lang}) result = {} res = self.pool.get('product.product').browse(cr, uid, product, context=context) diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index 494c0f71a48..edbe704d4db 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -113,6 +113,7 @@ + diff --git a/addons/account/project/report/analytic_check.py b/addons/account/project/report/analytic_check.py index 54fbaddc4d9..458827d8bf3 100644 --- a/addons/account/project/report/analytic_check.py +++ b/addons/account/project/report/analytic_check.py @@ -54,12 +54,12 @@ class account_analytic_analytic_check(report_sxw.rml_parse): self.cr.execute("SELECT abs(sum(amount)) AS balance \ FROM account_analytic_line \ - WHERE date>=%s AND date<=%s AND amount>0 AND general_account_id = %s", (date1, date2, a['id'])) + WHERE date>=%s AND date<=%s AND amount<0 AND general_account_id = %s", (date1, date2, a['id'])) (ad,) = self.cr.fetchone() ad = ad or 0.0 self.cr.execute("SELECT abs(sum(amount)) AS balance \ FROM account_analytic_line \ - WHERE date>=%s AND date<=%s AND amount<0 AND general_account_id = %s", (date1, date2, a['id'])) + WHERE date>=%s AND date<=%s AND amount>0 AND general_account_id = %s", (date1, date2, a['id'])) (ac,) = self.cr.fetchone() ac = ac or 0.0 diff --git a/addons/account/report/overdue.rml b/addons/account/report/overdue.rml index 2713b665d06..e8e1a7dc84c 100644 --- a/addons/account/report/overdue.rml +++ b/addons/account/report/overdue.rml @@ -84,8 +84,8 @@ + - [[ repeatIn(objects,'o') ]] [[ setLang(o.lang) ]] @@ -177,16 +177,16 @@ [[ line['ref'] ]] - [[ line['date_maturity'] ]] + [[ line['date_maturity'] and formatLang(line['date_maturity'],date=True) or '' ]] - [[ formatLang(line['debit']) and formatLang(line['debit'] * (line['account_id']['type'] == 'payable' and -1 or 1)) ]] + [[ (line['account_id']['type'] == 'receivable' and formatLang(line['debit']) or 0) or (line['account_id']['type'] == 'payable' and formatLang(line['credit'] * -1) or ' ') ]] - [[ formatLang(line['credit']) and formatLang(line['credit'] * (line['account_id']['type'] == 'payable' and -1 or 1)) ]] + [[ (line['account_id']['type'] == 'receivable' and formatLang(line['credit']) or 0) or (line['account_id']['type'] == 'payable' and formatLang(line['debit'] * -1) or 0) ]] - [[ formatLang((line['date_maturity'] < time.strftime('%Y-%m-%d')) and ((line['debit'] - line['credit']) * (line['account_id']['type'] == 'payable' and -1 or 1))) ]] + [[ formatLang((line['date_maturity'] < time.strftime('%Y-%m-%d'))) and (line['debit'] - line['credit']) ]] [[ line['blocked'] and 'X' or '' ]] @@ -205,13 +205,13 @@ Sub-Total : - [[ formatLang((reduce(lambda x, y: x + (y['debit'] * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]] + [[ formatLang((reduce(lambda x, y: x + ((y['account_id']['type'] == 'receivable' and y['debit'] or 0) or (y['account_id']['type'] == 'payable' and y['credit'] * -1 or 0)), getLines(o), 0))) ]] - [[ formatLang((reduce(lambda x ,y: x + (y['credit'] * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]] + [[ formatLang((reduce(lambda x, y: x + ((y['account_id']['type'] == 'receivable' and y['credit'] or 0) or (y['account_id']['type'] == 'payable' and y['debit'] * -1 or 0)), getLines(o), 0))) ]] - [[ formatLang((reduce(lambda x, y: x + ((y['debit'] - y['credit']) * (y['account_id']['type'] == 'payable' and -1 or 1)), filter(lambda x: x['date_maturity'] < time.strftime('%Y-%m-%d'), getLines(o)), 0))) ]] + [[ formatLang((reduce(lambda x, y: x + (y['debit'] - y['credit']), filter(lambda x: x['date_maturity'] < time.strftime('%Y-%m-%d'), getLines(o)), 0))) ]] @@ -229,7 +229,7 @@ Balance : - [[ formatLang((reduce(lambda x, y: x +((y['debit'] - y['credit']) * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]] + [[ formatLang((reduce(lambda x, y: x +(y['debit'] - y['credit']), getLines(o), 0))) ]] @@ -248,9 +248,9 @@ - Total amount due: [[ formatLang((reduce(lambda x, y: x + ((y['debit'] - y['credit']) * (y['account_id']['type'] == 'payable' and -1 or 1)), getLines(o), 0))) ]] [[ company.currency_id.name ]]. + Total amount due: [[ formatLang((reduce(lambda x, y: x + (y['debit'] - y['credit']), getLines(o), 0))) ]] [[ company.currency_id.name ]]. - + \ No newline at end of file diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index e1aa3b6510a..ba5bf65592c 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -15,8 +15,8 @@ "access_account_move","account.move","model_account_move","account.group_account_user",1,1,1,1 "access_account_move_line","account.move.line","model_account_move_line","account.group_account_user",1,1,1,1 "access_account_move_reconcile","account.move.reconcile","model_account_move_reconcile","account.group_account_user",1,1,1,1 -"access_account_tax_code","account.tax.code","model_account_tax_code",,1,0,0,0 -"access_account_tax","account.tax","model_account_tax",,1,0,0,0 +"access_account_tax_code","account.tax.code","model_account_tax_code","account.group_account_invoice",1,0,0,0 +"access_account_tax","account.tax","model_account_tax","account.group_account_invoice",1,0,0,0 "access_account_model","account.model","model_account_model","account.group_account_user",1,1,1,1 "access_account_model_line","account.model.line","model_account_model_line","account.group_account_user",1,1,1,1 "access_account_subscription","account.subscription","model_account_subscription","account.group_account_user",1,1,1,1 diff --git a/addons/account/sequence.py b/addons/account/sequence.py index d48f23eb1cf..e23ec1e3def 100644 --- a/addons/account/sequence.py +++ b/addons/account/sequence.py @@ -42,7 +42,7 @@ class ir_sequence(osv.osv): _columns = { 'fiscal_ids' : fields.one2many('account.sequence.fiscalyear', 'sequence_main_id', 'Sequences') } - def get_id(self, cr, uid, sequence_id, test='id', context={}): + def get_id(self, cr, uid, sequence_id, test='id', context={}): cr.execute('select id from ir_sequence where '+test+'=%s and active=%s', (sequence_id, True,)) res = cr.dictfetchone() if res: diff --git a/addons/account/wizard/account_invoice_refund.py b/addons/account/wizard/account_invoice_refund.py index f7e9d79b27a..506155e1ff1 100644 --- a/addons/account/wizard/account_invoice_refund.py +++ b/addons/account/wizard/account_invoice_refund.py @@ -21,6 +21,7 @@ from osv import fields, osv from tools.translate import _ import netsvc +import time class account_invoice_refund(osv.osv_memory): @@ -29,10 +30,14 @@ class account_invoice_refund(osv.osv_memory): _name = "account.invoice.refund" _description = "Invoice Refund" _columns = { - 'date': fields.date('Operation date', required=False), + 'date': fields.date('Operation date', required=False, help='This date will be used as the invoice date for Refund Invoice and Period will be chosen accordingly!'), 'period': fields.many2one('account.period', 'Force period', required=False), 'description': fields.char('Description', size=150, required=True), - } + } + + _defaults = { + 'date': time.strftime('%Y-%m-%d'), + } def compute_refund(self, cr, uid, ids, mode, context=None): """ @@ -167,7 +172,7 @@ class account_invoice_refund(osv.osv_memory): xml_id = 'action_invoice_tree1' elif inv.type == 'in_invoice': xml_id = 'action_invoice_tree2' - elif type == 'out_refund': + elif inv.type == 'out_refund': xml_id = 'action_invoice_tree3' else: xml_id = 'action_invoice_tree4' diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py index 1f745419c5a..be0ebc40677 100644 --- a/addons/account/wizard/account_reconcile.py +++ b/addons/account/wizard/account_reconcile.py @@ -19,7 +19,6 @@ # ############################################################################## import time -import datetime from osv import fields, osv from tools.translate import _ diff --git a/addons/account/wizard/account_unreconcile.py b/addons/account/wizard/account_unreconcile.py index d50994a6f28..c1de3294c79 100644 --- a/addons/account/wizard/account_unreconcile.py +++ b/addons/account/wizard/account_unreconcile.py @@ -29,11 +29,17 @@ class account_unreconcile(osv.osv_memory): obj_move_reconcile = self.pool.get('account.move.reconcile') if context is None: context = {} - recs = obj_move_line.read(cr, uid, context['active_ids'], ['reconcile_id',]) - recs = filter(lambda x: x['reconcile_id'], recs) - rec_ids = [rec['reconcile_id'][0] for rec in recs] - if len(rec_ids): - obj_move_reconcile.unlink(cr, uid, rec_ids) + recs = pool.get('account.move.line').read(cr, uid, data['ids'], ['reconcile_id','reconcile_partial_id']) + unlink_ids = [] + full_recs = filter(lambda x: x['reconcile_id'], recs) + rec_ids = [rec['reconcile_id'][0] for rec in full_recs] + part_recs = filter(lambda x: x['reconcile_partial_id'], recs) + part_rec_ids = [rec['reconcile_partial_id'][0] for rec in part_recs] + unlink_ids += rec_ids + unlink_ids += part_rec_ids + + if len(unlink_ids): + pooler.get_pool(cr.dbname).get('account.move.reconcile').unlink(cr, uid, unlink_ids) return {} account_unreconcile() @@ -44,10 +50,11 @@ class account_unreconcile_reconcile(osv.osv_memory): def trans_unrec_reconcile(self, cr, uid, ids, context=None): obj_move_reconcile = self.pool.get('account.move.reconcile') + rec_ids = context['active_ids'] if context is None: context = {} if len(rec_ids): - obj_move_reconcile.unlink(cr, uid, context['active_ids']) + obj_move_reconcile.unlink(cr, uid, rec_ids) return {} account_unreconcile_reconcile() diff --git a/addons/account_analytic_default/account_analytic_default.py b/addons/account_analytic_default/account_analytic_default.py index ab81e7d88fc..6ee1a1ce68c 100644 --- a/addons/account_analytic_default/account_analytic_default.py +++ b/addons/account_analytic_default/account_analytic_default.py @@ -103,6 +103,8 @@ class sale_order_line(osv.osv): # Method overridden to set the analytic account by default on criterion match def invoice_line_create(self, cr, uid, ids, context={}): create_ids = super(sale_order_line,self).invoice_line_create(cr, uid, ids, context) + if not ids: + return create_ids sale_line_obj = self.browse(cr, uid, ids[0], context) pool_inv_line = self.pool.get('account.invoice.line') diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index 57acdb6dee5..828d1b1e847 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -297,14 +297,15 @@ class account_move_line(osv.osv): def create_analytic_lines(self, cr, uid, ids, context={}): super(account_move_line, self).create_analytic_lines(cr, uid, ids, context) + analytic_line_obj = self.pool.get('account.analytic.line') for line in self.browse(cr, uid, ids, context): if line.analytics_id: if not line.journal_id.analytic_journal_id: raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (line.journal_id.name,)) - toremove = self.pool.get('account.analytic.line').search(cr, uid, [('move_id','=',line.id)], context=context) + toremove = analytic_line_obj.search(cr, uid, [('move_id','=',line.id)], context=context) if toremove: - line.unlink(cr, uid, toremove, context=context) + analytic_line_obj.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) @@ -321,7 +322,7 @@ class account_move_line(osv.osv): 'journal_id': line.journal_id.analytic_journal_id.id, 'ref': line.ref, } - ali_id=self.pool.get('account.analytic.line').create(cr,uid,al_vals) + ali_id=analytic_line_obj.create(cr, uid, al_vals, context=context) return True account_move_line() diff --git a/addons/account_followup/followup_view.xml b/addons/account_followup/followup_view.xml index 4b5e77beb87..ae31f7253a2 100644 --- a/addons/account_followup/followup_view.xml +++ b/addons/account_followup/followup_view.xml @@ -124,7 +124,7 @@ - + diff --git a/addons/account_payment/payment_view.xml b/addons/account_payment/payment_view.xml index 63dd950520f..d238fe952fc 100644 --- a/addons/account_payment/payment_view.xml +++ b/addons/account_payment/payment_view.xml @@ -25,6 +25,8 @@ + + @@ -279,7 +281,6 @@ - diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py index 001804c9e8a..266dcb535d8 100644 --- a/addons/account_payment/wizard/account_payment_order.py +++ b/addons/account_payment/wizard/account_payment_order.py @@ -104,7 +104,7 @@ class payment_order_create(osv.osv_memory): # Search for move line to pay: domain = [('reconcile_id', '=', False),('account_id.type', '=', 'payable'),('amount_to_pay', '>', 0)] - domain = domain + ['|',('date_maturity','<',search_due_date),('date_maturity','=',False)] + domain = domain + ['|',('date_maturity','<=',search_due_date),('date_maturity','=',False)] line_ids = line_obj.search(cr, uid, domain, context=context) context.update({'line_ids': line_ids}) model_data_ids = mod_obj.search(cr, uid,[('model','=','ir.ui.view'),('name','=','view_create_payment_order_lines')], context=context) diff --git a/addons/account_payment/wizard/account_payment_populate_statement.py b/addons/account_payment/wizard/account_payment_populate_statement.py index 3f8f9330343..381f0d0f8f7 100644 --- a/addons/account_payment/wizard/account_payment_populate_statement.py +++ b/addons/account_payment/wizard/account_payment_populate_statement.py @@ -106,5 +106,3 @@ class account_payment_populate_statement(osv.osv_memory): return {'type' : 'ir.actions.act_window_close'} account_payment_populate_statement() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py index 66b701fb97a..140442aa02e 100644 --- a/addons/account_voucher/voucher.py +++ b/addons/account_voucher/voucher.py @@ -103,7 +103,7 @@ class account_voucher(osv.osv): ],'Type', readonly=True, select=True , size=128), 'date':fields.date('Date', readonly=True, states={'draft':[('readonly',False)]}), 'journal_id':fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}), - 'account_id':fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}), + 'account_id':fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}, domain=[('type','<>','view')]), 'payment_ids':fields.one2many('account.voucher.line','voucher_id','Voucher Lines', readonly=False, states={'proforma':[('readonly',True)]}), 'period_id': fields.many2one('account.period', 'Period', required=True, states={'posted':[('readonly',True)]}), 'narration':fields.text('Narration', readonly=True, states={'draft':[('readonly',False)]}, required=True), @@ -167,15 +167,14 @@ class account_voucher(osv.osv): 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 + obj = self.pool.get('account.voucher').browse(cr,uid,ids) + total = 0 for i in obj[0].payment_ids: - total+=i.amount - if total!=0: - self.write(cr,uid,ids,{'amount':total}) - self.write(cr, uid, ids, {'state':'proforma'}) + total += i.amount + if total != 0: + self.write(cr, uid, ids, {'amount':total, 'state':'proforma'}) else: - raise osv.except_osv('Invalid action !', 'You can not post to Pro-Forma a voucher with Total amount = 0') + raise osv.except_osv('Invalid action !', 'You cannot post to Pro-Forma a voucher with Total amount = 0 !') return True def proforma_voucher(self, cr, uid, ids, context={}): @@ -302,9 +301,9 @@ class account_voucher(osv.osv): name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) move = { - 'name': name, + 'name' : name, 'journal_id': journal_id, - 'voucher_type':inv.type, + 'type' : inv.type, 'narration' : inv.narration } if inv.period_id: @@ -487,7 +486,7 @@ class account_voucher_line(osv.osv): _columns = { 'voucher_id':fields.many2one('account.voucher', 'Voucher'), 'name':fields.char('Description', size=256, required=True), - 'account_id':fields.many2one('account.account','Account', required=True), + 'account_id':fields.many2one('account.account','Account', required=True, domain=[('type','<>','view')]), 'partner_id': fields.many2one('res.partner', 'Partner', change_default=True), 'amount':fields.float('Amount'), 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Type'), diff --git a/addons/analytic/project.py b/addons/analytic/project.py index c0f01322a6c..c3f9eb28fcb 100644 --- a/addons/analytic/project.py +++ b/addons/analytic/project.py @@ -343,7 +343,7 @@ class account_analytic_line(osv.osv): } _defaults = { 'date': lambda *a: time.strftime('%Y-%m-%d'), - 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', c), + 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', context=c), } _order = 'date' account_analytic_line() diff --git a/addons/analytic_user_function/analytic_user_function.py b/addons/analytic_user_function/analytic_user_function.py index c5c2af729a0..fe238d373be 100644 --- a/addons/analytic_user_function/analytic_user_function.py +++ b/addons/analytic_user_function/analytic_user_function.py @@ -100,7 +100,7 @@ class hr_analytic_timesheet(osv.osv): 'for this product: "%s" (id:%d)') % \ (r.product_id.name, r.product_id.id,)) # Compute based on pricetype - amount_unit=self.on_change_unit_amount(cr, uid, ids, + amount_unit = self.on_change_unit_amount(cr, uid, ids, r.product_id.id, unit_amount, r.product_id.uom_id.id)['value']['amount'] amount = unit_amount * amount_unit @@ -136,7 +136,7 @@ class hr_analytic_timesheet(osv.osv): 'for this product: "%s" (id:%d)') % \ (r.product_id.name, r.product_id.id,)) # Compute based on pricetype - amount_unit=self.on_change_unit_amount(cr, uid, ids, + amount_unit = self.on_change_unit_amount(cr, uid, ids, r.product_id.id, unit_amount, r.product_id.uom_id.id)['value']['amount'] amount = unit_amount * amount_unit diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py index 9b4cc656acc..b98d20adc84 100644 --- a/addons/base_contact/base_contact.py +++ b/addons/base_contact/base_contact.py @@ -19,7 +19,6 @@ # ############################################################################## -import netsvc from osv import fields, osv class res_partner_contact(osv.osv): @@ -116,22 +115,6 @@ res_partner_contact() class res_partner_address(osv.osv): - def search(self, cr, user, args, offset=0, limit=None, order=None, - context=None, count=False): - """ search parnter address - @param self: The object pointer - @param cr: the current row, from the database cursor, - @param user: the current user - @param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...]. - @param offset: The Number of Results to Pass - @param limit: The Number of Results to Return - @param context: A standard dictionary for contextual values - """ - - if context and context.has_key('address_partner_id' ) and context['address_partner_id']: - args.append(('partner_id', '=', context['address_partner_id'])) - return super(res_partner_address, self).search(cr, user, args, offset, limit, order, context, count) - #overriding of the name_get defined in base in order to remove the old contact name def name_get(self, cr, user, ids, context={}): """ @@ -208,6 +191,8 @@ class res_partner_job(osv.osv): if arg[2] and not count: search_arg = ['|', ('first_name', 'ilike', arg[2]), ('name', 'ilike', arg[2])] contact_ids = contact_obj.search(cr, user, search_arg, offset=offset, limit=limit, order=order, context=context, count=count) + if not contact_ids: + continue contacts = contact_obj.browse(cr, user, contact_ids, context=context) for contact in contacts: job_ids.extend([item.id for item in contact.job_ids]) @@ -224,10 +209,10 @@ class res_partner_job(osv.osv): _order = 'sequence_contact' _columns = { - 'name': fields.related('address_id','partner_id', type='many2one',\ + 'name': fields.related('address_id', 'partner_id', type='many2one',\ relation='res.partner', string='Partner', help="You may\ enter Address first,Partner will be linked automatically if any."), - 'address_id': fields.many2one('res.partner.address','Address', \ + 'address_id': fields.many2one('res.partner.address', 'Address', domain=[('partner_id', '=', name)], \ help='Address which is linked to the Partner'), 'contact_id': fields.many2one('res.partner.contact','Contact', required=True, ondelete='cascade'), 'function_id': fields.many2one('res.partner.function','Partner Function', \ @@ -251,7 +236,34 @@ class res_partner_job(osv.osv): 'sequence_contact' : lambda *a: 0, 'state': lambda *a: 'current', } + + def onchange_partner(self, cr, uid, _, partner_id, context=None): + """ + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user, + @param _: List of IDs, + @partner_id : ID of the Partner selected, + @param context: A standard dictionary for contextual values + """ + return {'value': {'address_id': False}} + def onchange_address(self, cr, uid, _, address_id, context=None): + """ + @@param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user, + @param _: List of IDs, + @address_id : ID of the Address selected, + @param context: A standard dictionary for contextual values + """ + partner_id = False + if address_id: + address = self.pool.get('res.partner.address')\ + .browse(cr, uid, address_id, context) + partner_id = address.partner_id.id + return {'value': {'name': partner_id}} + res_partner_job() diff --git a/addons/base_contact/base_contact_view.xml b/addons/base_contact/base_contact_view.xml index 49147fb2112..42f2e51b2ee 100644 --- a/addons/base_contact/base_contact_view.xml +++ b/addons/base_contact/base_contact_view.xml @@ -52,7 +52,7 @@
- + @@ -357,23 +357,19 @@ form - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/addons/base_iban/base_iban_view.xml b/addons/base_iban/base_iban_view.xml index d93e9ffb086..00203665c50 100644 --- a/addons/base_iban/base_iban_view.xml +++ b/addons/base_iban/base_iban_view.xml @@ -42,6 +42,17 @@ + + res.partner.form.iban.inherit.list + res.partner + + form + + + + + + diff --git a/addons/base_module_quality/speed_test/speed_test.py b/addons/base_module_quality/speed_test/speed_test.py index ab50afe1293..f3d802451f4 100644 --- a/addons/base_module_quality/speed_test/speed_test.py +++ b/addons/base_module_quality/speed_test/speed_test.py @@ -19,12 +19,28 @@ # ############################################################################## -from osv import fields, osv from tools.translate import _ import pooler from base_module_quality import base_module_quality +class CounterCursor(object): + def __init__(self, real_cursor): + self.cr = real_cursor + self.count = 0 + + def reset(self): + self.count = 0 + + def execute(self, query, params=None): + if query.lower().startswith('select '): + self.count += 1 + return self.cr.execute(query, params) + + def __getattr__(self, attr): + return getattr(self.cr, attr) + + class quality_test(base_module_quality.abstract_quality_check): def __init__(self): @@ -63,6 +79,7 @@ This test checks the speed of the module. Note that at least 5 demo data is need result_dict = {} result_dict2 = {} self.result_details += _("O(1) means that the number of SQL requests to read the object does not depand on the number of objects we are reading. This feature is hardly wished.\n") + ccr = CounterCursor(cr) for obj, ids in obj_ids.items(): code_base_complexity = 0 code_half_complexity = 0 @@ -73,22 +90,22 @@ This test checks the speed of the module. Note that at least 5 demo data is need list2 = [] if size: speed_list = [] - #we perform the operation twice, and count the number of queries in the second run. This allows to avoid the cache effect. (like translated terms that asks for more queries) try: - pool.get(obj).read(cr, uid, [ids[0]]) - cnt = cr.count - pool.get(obj).read(cr, uid, [ids[0]]) - code_base_complexity = cr.count - cnt - - pool.get(obj).read(cr, uid, ids[:size/2]) - cnt = cr.count - pool.get(obj).read(cr, uid, ids[:size/2]) - code_half_complexity = cr.count - cnt - + # perform the operation once to put data in cache pool.get(obj).read(cr, uid, ids) - cnt = cr.count - pool.get(obj).read(cr, uid, ids) - code_size_complexity = cr.count - cnt + + ccr.reset() + pool.get(obj).read(ccr, uid, [ids[0]]) + code_base_complexity = ccr.count + + ccr.reset() + pool.get(obj).read(ccr, uid, ids[:size/2]) + code_half_complexity = ccr.count + + ccr.reset() + pool.get(obj).read(ccr, uid, ids) + code_size_complexity = ccr.count + except Exception, e: list2 = [obj, _("Error in Read method")] speed_list = [obj, size, code_base_complexity, code_half_complexity, code_size_complexity, _("Error in Read method:" + str(e))] diff --git a/addons/base_report_creator/base_report_creator.py b/addons/base_report_creator/base_report_creator.py index 33c2608c85a..764753f5cc2 100644 --- a/addons/base_report_creator/base_report_creator.py +++ b/addons/base_report_creator/base_report_creator.py @@ -35,7 +35,7 @@ class report_creator(osv.osv): # def export_data(self, cr, uid, ids, fields_to_export, context=None): - if not context: + if context is None: context = {} data_l = self.read(cr, uid, ids, ['sql_query'], context) final_datas = [] @@ -61,7 +61,7 @@ class report_creator(osv.osv): @param Fields: List of field of customer reports form. @return: Dictionary of Fields """ - if not context: + if context is None: context = {} data = context and context.get('report_id', False) or False @@ -95,7 +95,7 @@ class report_creator(osv.osv): @param user: the current user’s ID for security checks, @return: Dictionary of Fields, arch and toolbar. """ - if not context: + if context is None: context = {} data = context and context.get('report_id', False) or False @@ -116,9 +116,11 @@ class report_creator(osv.osv): arch = '\n' if view_type == 'graph': - arch += '' % (report.name, report.view_graph_type, report.view_graph_orientation) + orientation_eval = {'horz':'horizontal','vert' :'vertical'} + orientation = eval(report.view_graph_orientation,orientation_eval) + arch +='' % (report.name, report.view_graph_type, orientation) + i = 0 for val in ('x','y'): - i = 0 for f in report.field_ids: if f.graph_mode == val: if f.field_id.model: @@ -191,7 +193,9 @@ class report_creator(osv.osv): @param fields: List of fields. @return: List of Dictionary of form [{‘name_of_the_field’: value, ...}, ...] """ - data = context and context.get('report_id', False) or False + if context is None: + context = {} + data = context.get('report_id', False) if (not context) or 'report_id' not in context: return super(report_creator, self).read(cr, user, ids, fields, context, load) ctx = context or {} @@ -225,8 +229,9 @@ class report_creator(osv.osv): @param args: list of tuples of form [(‘name_of_the_field’, ‘operator’, value), ...]. @return: List of id """ - - context_id = context and context.get('report_id', False) or False + if context is None: + context = {} + context_id = context.get('report_id', False) if (not context) or 'report_id' not in context: return super(report_creator, self).search(cr, user, args, offset, limit, order, context, count) @@ -372,9 +377,10 @@ class report_creator(osv.osv): t = self.pool.get(f.field_id.model_id.model)._table if f.group_method == 'group': fields.append('\t'+t+'.'+f.field_id.name+' as field'+str(i)) + groupby.append(t+'.'+f.field_id.name) else: fields.append('\t'+f.group_method+'('+t+'.'+f.field_id.name+')'+' as field'+str(i)) - groupby.append(t+'.'+f.field_id.name) + i += 1 models = self._path_get(cr, uid, obj.model_ids, obj.filter_ids) check = self._id_get(cr, uid, ids[0], context) diff --git a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py index 9ba1fc6dfaa..7f7a8178ded 100644 --- a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py +++ b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py @@ -309,27 +309,32 @@ class PyOpenOffice(object): return new_c def sxw2rml(sxw_file, xsl, output='.', save_pict=False): - import libxslt - import libxml2 + from lxml import etree + from StringIO import StringIO + tool = PyOpenOffice(output, save_pict = save_pict) res = tool.unpackNormalize(sxw_file) - styledoc = libxml2.parseDoc(xsl) - style = libxslt.parseStylesheetDoc(styledoc) - doc = libxml2.parseMemory(res,len(res)) - result = style.applyStylesheet(doc, None) - - root = result.xpathEval("/document/stylesheet") + + f = StringIO(xsl) + styledoc = etree.parse(f) + style = etree.XSLT(styledoc) + + f = StringIO(res) + doc = etree.parse(f) + result = style(doc) + root = etree.XPathEvaluator(result)("/document/stylesheet") + if root: root=root[0] - images = libxml2.newNode("images") + images = etree.Element("images") for img in tool.images: - node = libxml2.newNode('image') - node.setProp('name', img) - node.setContent( base64.encodestring(tool.images[img])) - images.addChild(node) - root.addNextSibling(images) + node = etree.Element('image', name=img) + node.text = base64.encodestring(tool.images[img]) + images.append(node) + root.append(images) + try: - xml = style.saveResultToString(result) + xml = str(result) return xml except: return result @@ -349,7 +354,7 @@ if __name__ == "__main__": import StringIO fname = sys.argv[1] - f = StringIO.StringIO(file(fname).read()) + f = fname xsl_file = 'normalized_oo2rml.xsl' z = zipfile.ZipFile(fname,"r") mimetype = z.read('mimetype') diff --git a/addons/base_setup/gtk_contact_form.py b/addons/base_setup/gtk_contact_form.py index bdc503a06f1..a9fde39ffde 100644 --- a/addons/base_setup/gtk_contact_form.py +++ b/addons/base_setup/gtk_contact_form.py @@ -74,21 +74,26 @@ class base_gtkcontactform(osv.osv_memory): 'contact_me':fields.boolean('Contact Me'), } def execute(self, cr, uid, ids, context=None): - company_id = self.pool.get('base.setup.company').search(cr, uid, []) - company_data = self.pool.get('base.setup.company').read(cr, uid, company_id) - company_data = company_data and company_data[0] or False + if context is None: + context = {} + + company_id = self.pool.get('base.setup.company').search(cr, uid, [], context=context) + company_data = self.pool.get('base.setup.company').read(cr, uid, company_id, context=context) + company_data = company_data and company_data[0] or {} country = '' - if company_data and company_data.get('country_id', False): - country = self.pool.get('res.country').read(cr, uid, company_data['country_id'],['name'])['name'] - for res in self.read(cr, uid, ids): + + if company_data.get('country_id', False): + country = self.pool.get('res.country').read(cr, uid, company_data['country_id'],['name'], context=context)['name'] + + for res in self.read(cr, uid, ids, context=context): email = res.get('email','') - result = "\ncompany: "+ str(company_data.get('name','')) - result += "\nname: " + str(res.get('name','')) - result += "\njob: " + str(res.get('job','')) + result = "\ncompany: "+ tools.ustr(company_data.get('name','')) + result += "\nname: " + tools.ustr(res.get('name','')) + result += "\njob: " + tools.ustr(res.get('job','')) result += "\nphone: " + str(res.get('phone','')) - result += "\ncity: " + str(company_data.get('city','')) + result += "\ncity: " + tools.ustr(company_data.get('city','')) result += "\ncountry: " + str(country) - result += "\nindustry: " + str(res.get('industry', '')) + result += "\nindustry: " + tools.ustr(res.get('industry', '')) result += "\ntotal_employees: " + str(res.get('total_employees', '')) result += "\nplan_use: " + str(res.get('use_openerp', False)) result += "\nalready_using_openerp: " + str(res.get('already_using_openerp', False)) diff --git a/addons/base_setup/todo.py b/addons/base_setup/todo.py index c072891179a..5f6318ec5a1 100644 --- a/addons/base_setup/todo.py +++ b/addons/base_setup/todo.py @@ -152,5 +152,23 @@ IBAN: BE74 1262 0121 6907 - SWIFT: CPDF BE71 - VAT: BE0477.472.701'''), context=context) base_setup_company() +class res_currency(osv.osv): + _inherit = 'res.currency' + + def name_get(self, cr, uid, ids, context=None): + if context is None: + context = {} +# We can use the following line,if we want to restrict this name_get for company setup only +# But, its better to show currencies as name(Code). +# if not (context.get('active_model','') == 'ir.actions.todo'): +# return super(res_currency,self).name_get(cr, uid, ids, context=context) + if not len(ids): + return [] + if isinstance(ids, (int, long)): + ids = [ids] + reads = self.read(cr, uid, ids, ['name','code'], context, load='_classic_write') + return [(x['id'], tools.ustr(x['name']) + ' (' + tools.ustr(x['code']) + ')') for x in reads] + +res_currency() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml index 82561f372d2..ce29a2056d5 100644 --- a/addons/crm/crm_lead_menu.xml +++ b/addons/crm/crm_lead_menu.xml @@ -10,6 +10,7 @@ {"search_default_user_id":uid,'search_default_current':1} + {'search_default_current':1} diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index f70ba338ff7..886492a9470 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -47,7 +47,7 @@ name="convert_opportunity" string="Convert" help="Convert to Opportunity" - icon="gtk-index" + icon="gtk-index" type="object" attrs="{'invisible':[('opportunity_id','!=',False)]}"/> diff --git a/addons/crm/crm_meeting_menu.xml b/addons/crm/crm_meeting_menu.xml index 1a47043e07e..064f55676af 100644 --- a/addons/crm/crm_meeting_menu.xml +++ b/addons/crm/crm_meeting_menu.xml @@ -50,7 +50,7 @@ crm.meeting calendar,tree,form,gantt - {'search_default_current':1,"search_default_user_id":uid} + {"search_default_user_id":uid} diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index 09e245f97d1..0a781007ce0 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -274,7 +274,7 @@
- + - +
diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py index 6d8d5a17bd1..5a5d0528cf3 100644 --- a/addons/delivery/stock.py +++ b/addons/delivery/stock.py @@ -55,7 +55,7 @@ class stock_picking(osv.osv): 'weight': fields.function(_cal_weight, method=True, type='float', string='Weight', digits_compute= dp.get_precision('Stock Weight'), store={ 'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20), - 'stock.move': (_get_picking_line, ['product_id','product_uos_qty'], 20), + 'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20), }), } diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py index 58fe3cc358b..70870b50783 100644 --- a/addons/document_ftp/ftpserver/abstracted_fs.py +++ b/addons/document_ftp/ftpserver/abstracted_fs.py @@ -123,7 +123,7 @@ class abstracted_fs: def db_list(self): #return pooler.pool_dic.keys() s = netsvc.ExportService.getService('db') - result = s.exp_list() + result = s.exp_list(document=True) self.db_name_list = [] for db_name in result: db, cr = None, None diff --git a/addons/document_ics/document_ics.py b/addons/document_ics/document_ics.py index 00f8927eb18..56998a9408a 100644 --- a/addons/document_ics/document_ics.py +++ b/addons/document_ics/document_ics.py @@ -177,7 +177,6 @@ class document_directory_content(osv.osv): fexprs[n.name] = n.expr if 'uid' not in fields: - print "uid not in ", fields # FIXME: should pass return True for child in parsedCal.getChildren(): @@ -189,7 +188,6 @@ class document_directory_content(osv.osv): if enl =='uid': uuid = event.value if not enl in fields: - # print "skip", enl continue if fields[enl] and funcs[enl] == 'field': if ICS_TAGS[enl]=='normal': @@ -216,7 +214,6 @@ class document_directory_content(osv.osv): # end for if not uuid: - print "Skipping cal", child # FIXME: should pass continue diff --git a/addons/event/event.py b/addons/event/event.py index ffdeb84d15d..6c214694887 100644 --- a/addons/event/event.py +++ b/addons/event/event.py @@ -218,11 +218,13 @@ class event_registration(osv.osv): args[1]['description']= event.mail_confirm return super(event_registration, self).write(cr, uid, *args, **argv) - def mail_user_confirm(self,cr,uid,ids): - reg_ids=self.browse(cr,uid,ids) + def mail_user_confirm(self, cr, uid, ids): + reg_ids = self.browse(cr,uid,ids) for reg_id in reg_ids: src = reg_id.event_id.reply_to or False - dest = [reg_id.email_from] + dest = [] + if reg_id.email_from: + dest += [reg_id.email_from] if reg_id.email_cc: dest += [reg_id.email_cc] if dest and src: @@ -231,11 +233,13 @@ class event_registration(osv.osv): raise osv.except_osv(_('Error!'), _('You must define a reply-to address in order to mail the participant. You can do this in the Mailing tab of your event. Note that this is also the place where you can configure your event to not send emails automaticly while registering')) return False - def mail_user(self,cr,uid,ids): - reg_ids=self.browse(cr,uid,ids) + def mail_user(self, cr, uid, ids): + reg_ids = self.browse(cr, uid, ids) for reg_id in reg_ids: src = reg_id.event_id.reply_to or False - dest = [reg_id.email_from] + dest = [] + if reg_id.email_from: + dest += [reg_id.email_from] if reg_id.email_cc: dest += [reg_id.email_cc] if reg_id.event_id.mail_auto_confirm or reg_id.event_id.mail_auto_registr: diff --git a/addons/event/wizard/event_make_invoice.py b/addons/event/wizard/event_make_invoice.py index 1df4d2f2277..1e8505a74e9 100644 --- a/addons/event/wizard/event_make_invoice.py +++ b/addons/event/wizard/event_make_invoice.py @@ -68,8 +68,11 @@ class event_make_invoice(osv.osv_memory): inv_reject = inv_reject + 1 inv_rej_reason += "ID "+str(reg.id)+": Registration doesn't have any partner to invoice. \n" continue - partner_address_list = reg.partner_invoice_id and self.pool.get('res.partner').address_get(cr, uid, [reg.partner_invoice_id.id], adr_pref=['invoice']) - partner_address_id = partner_address_list['invoice'] + else: + val_invoice = pool_obj.get('account.invoice').onchange_partner_id(cr, uid, [], 'out_invoice', reg.partner_invoice_id.id, False, False) + val_invoice['value'].update({'partner_id': reg.partner_invoice_id.id}) + partner_address_id = val_invoice['value']['address_invoice_id'] + if not partner_address_id: inv_reject = inv_reject + 1 inv_rej_reason += "ID "+str(reg.id)+": Registered partner doesn't have an address to make the invoice. \n" @@ -82,8 +85,9 @@ class event_make_invoice(osv.osv_memory): tax_ids.append(tax.id) vals = value['value'] + c_name = reg.contact_id and ('-' + self.pool.get('res.partner.contact').name_get(cr, uid, [reg.contact_id.id])[0][1]) or '' vals.update({ - 'name': reg.name, + 'name': reg.invoice_label + '-' + c_name, 'price_unit': reg.unit_price, 'quantity': reg.nb_register, 'product_id':reg.event_id.product_id.id, @@ -91,23 +95,14 @@ class event_make_invoice(osv.osv_memory): }) inv_line_ids = obj_event_reg._create_invoice_lines(cr, uid, [reg.id], vals) - inv = { - 'name': reg.invoice_label, + val_invoice['value'].update({ 'origin': reg.invoice_label, - 'type': 'out_invoice', 'reference': False, - 'account_id': reg.partner_invoice_id.property_account_receivable.id, - 'partner_id': reg.partner_invoice_id.id, - 'address_invoice_id':partner_address_id, - 'address_contact_id':partner_address_id, 'invoice_line': [(6,0,[inv_line_ids])], - 'currency_id' :reg.partner_invoice_id.property_product_pricelist.currency_id.id, 'comment': "", - 'payment_term':reg.partner_invoice_id.property_payment_term.id, - 'fiscal_position': reg.partner_invoice_id.property_account_position.id - } + }) - inv_id = inv_obj.create(cr, uid, inv) + inv_id = inv_obj.create(cr, uid, val_invoice['value']) list_inv.append(inv_id) obj_event_reg.write(cr, uid, reg.id, {'invoice_id': inv_id, 'state': 'done'}) obj_event_reg._history(cr, uid, [reg.id], 'Invoiced', history=True) diff --git a/addons/hr_contract/hr_contract_view.xml b/addons/hr_contract/hr_contract_view.xml index 9951a9e3982..74d1bcd8d7b 100644 --- a/addons/hr_contract/hr_contract_view.xml +++ b/addons/hr_contract/hr_contract_view.xml @@ -153,7 +153,7 @@
- + hr.contract.view.form hr.contract diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 3337c09ea13..1ac61fe7909 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -21,7 +21,7 @@ # ############################################################################## import time - +import datetime import pooler import netsvc from osv import fields, osv @@ -182,14 +182,14 @@ class hr_holidays(osv.osv): } return result - def _get_number_of_days(date_from, date_to): + def _get_number_of_days(self, date_from, date_to): """Returns a float equals to the timedelta between two dates given as string.""" DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" from_dt = datetime.datetime.strptime(date_from, DATETIME_FORMAT) to_dt = datetime.datetime.strptime(date_to, DATETIME_FORMAT) timedelta = to_dt - from_dt - diff_day = timedelta.days + float(timedelata.seconds) / 86400 + diff_day = timedelta.days + float(timedelta.seconds) / 86400 return diff_day def _update_user_holidays(self, cr, uid, ids): @@ -204,14 +204,16 @@ class hr_holidays(osv.osv): self.unlink(cr, uid, list_ids) def _check_date(self, cr, uid, ids): - if ids: - cr.execute('select number_of_days_temp from hr_holidays where id in ('+','.join(map(str, ids))+')') - res = cr.fetchall() - if res and res[0][0] and res[0][0] < 0: + for rec in self.read(cr, uid, ids, ['number_of_days_temp','date_from','date_to']): + if rec['number_of_days_temp'] < 0: + return False + date_from = time.strptime(rec['date_from'], '%Y-%m-%d %H:%M:%S') + date_to = time.strptime(rec['date_to'], '%Y-%m-%d %H:%M:%S') + if date_from > date_to: return False return True - _constraints = [(_check_date, 'Start date should not be larger than end date! ', ['number_of_days'])] + _constraints = [(_check_date, 'Start date should not be larger than end date!\nNumber of Days should be greater than 1!', ['number_of_days_temp'])] def unlink(self, cr, uid, ids, context={}): leave_obj = self.pool.get('resource.calendar.leaves') @@ -235,7 +237,7 @@ class hr_holidays(osv.osv): return result def onchange_date_to(self, cr, uid, ids, date_from, date_to): - return onchange_date_from(cr, uid, ids, date_to, date_from) + return self.onchange_date_from(cr, uid, ids, date_to, date_from) def onchange_sec_id(self, cr, uid, ids, status, context={}): warning = {} diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py index 25c61483391..fc120aa2b4c 100644 --- a/addons/hr_timesheet/hr_timesheet.py +++ b/addons/hr_timesheet/hr_timesheet.py @@ -60,7 +60,7 @@ class hr_analytic_timesheet(osv.osv): # if prod_id and unit_amount: if prod_id: # find company - company_id=self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', context) + company_id=self.pool.get('res.company')._company_default_get(cr, uid, 'account.analytic.line', context=context) res = self.pool.get('account.analytic.line').on_change_unit_amount(cr, uid, id, prod_id, unit_amount,company_id,unit, context) return res diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index b7d395ac2e0..b6078648147 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -364,7 +364,7 @@ class hr_timesheet_line(osv.osv): res[line_id] = False return res - def _sheet_search(self, cursor, user, obj, name, args, context): + def _sheet_search(self, cursor, user, obj, name, args, context=None): if not len(args): return [] sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') @@ -482,7 +482,7 @@ class hr_attendance(osv.osv): res[line_id] = False return res - def _sheet_search(self, cursor, user, obj, name, args, context={}): + def _sheet_search(self, cursor, user, obj, name, args, context=None): if not len(args): return [] sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') diff --git a/addons/l10n_be/account_pcmn_belgium.xml b/addons/l10n_be/account_pcmn_belgium.xml index e11815a7234..e4a9c52a437 100644 --- a/addons/l10n_be/account_pcmn_belgium.xml +++ b/addons/l10n_be/account_pcmn_belgium.xml @@ -7029,8 +7029,8 @@ V-EXTRA 0 percent - - + + sale diff --git a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py index d141fd44f1d..3ee7a427265 100644 --- a/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py +++ b/addons/l10n_be/wizard/l10n_be_account_vat_declaration.py @@ -36,7 +36,7 @@ class l10n_be_vat_declaration(osv.osv_memory): 'file_save': fields.binary('Save File'), 'ask_resitution': fields.boolean('Ask Restitution'), 'ask_payment': fields.boolean('Ask Payment'), - 'client_nihil': fields.boolean('Last Declaration of Entreprise',help='Thick this case only if it concerns only the last statement on the civil or cessation of activity'), + 'client_nihil': fields.boolean('Last Declaration of Enterprise',help='Tick this case only if it concerns only the last statement on the civil or cessation of activity'), } _defaults = { diff --git a/addons/l10n_be/wizard/l10n_be_account_vat_declaration_view.xml b/addons/l10n_be/wizard/l10n_be_account_vat_declaration_view.xml index f3e4b23771e..faaf4805417 100644 --- a/addons/l10n_be/wizard/l10n_be_account_vat_declaration_view.xml +++ b/addons/l10n_be/wizard/l10n_be_account_vat_declaration_view.xml @@ -14,11 +14,11 @@
- - - - -