From 2b2288a3bd29c096cc5eb70c4d966cfd32bffc45 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 2 Oct 2012 13:12:31 +0200 Subject: [PATCH] [FIX] a few problems introduced with the last merge bzr revid: abo@openerp.com-20121002111231-zo41jejkrm8afavu --- addons/account/account.py | 17 ++-- addons/audittrail/audittrail.py | 6 +- .../bin/script/AddAttachment.py | 2 +- .../bin/script/ConvertBracesToField.py | 42 ++++---- .../test/test_fields.py | 2 + addons/email_template/html2text.py | 97 ++++++++++--------- .../wizard/hr_timesheet_invoice_create.py | 10 +- addons/l10n_fr/l10n_fr.py | 10 ++ addons/mrp/mrp.py | 6 +- addons/project/project.py | 3 +- 10 files changed, 109 insertions(+), 86 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 803969c033f..bf072507aa0 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -595,7 +595,7 @@ class account_account(osv.osv): res.append((record['id'], name)) return res - def copy(self, cr, uid, id, None, context=None, done_list=None, local=False): + def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False): if default is None: default = {} else: @@ -2281,9 +2281,10 @@ class account_model(osv.osv): _defaults = { 'legend': lambda self, cr, uid, context:_('You can specify year, month and date in the name of the model using the following labels:\n\n%(year)s: To Specify Year \n%(month)s: To Specify Month \n%(date)s: Current Date\n\ne.g. My model on %(date)s'), } - def generate(self, cr, uid, ids, datas=None, context=None): - if datas is None: - datas = {} + + def generate(self, cr, uid, ids, data=None, context=None): + if data is None: + data = {} move_ids = [] entry = {} account_move_obj = self.pool.get('account.move') @@ -2294,8 +2295,8 @@ class account_model(osv.osv): if context is None: context = {} - if datas.get('date', False): - context.update({'date': datas['date']}) + if data.get('date', False): + context.update({'date': data['date']}) move_date = context.get('date', time.strftime('%Y-%m-%d')) move_date = datetime.strptime(move_date,"%Y-%m-%d") @@ -2481,10 +2482,10 @@ class account_subscription_line(osv.osv): all_moves = [] obj_model = self.pool.get('account.model') for line in self.browse(cr, uid, ids, context=context): - datas = { + data = { 'date': line.date, } - move_ids = obj_model.generate(cr, uid, [line.subscription_id.model_id.id], datas, context) + move_ids = obj_model.generate(cr, uid, [line.subscription_id.model_id.id], data, context) tocheck[line.subscription_id.id] = True self.write(cr, uid, [line.id], {'move_id':move_ids[0]}) all_moves.extend(move_ids) diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 514bde22a36..9232a696da8 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -353,7 +353,7 @@ class audittrail_objects_proxy(object_proxy): def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=None): """ - This function compares the old data (i.e before the method was executed) and the new data + This function compares the old data (i.e before the method was executed) and the new data (after the method was executed) and returns a structure with all the needed information to log those differences. @@ -377,7 +377,7 @@ class audittrail_objects_proxy(object_proxy): (model.id, resource_id): [] } - The reason why the structure returned is build as above is because when modifying an existing + The reason why the structure returned is build as above is because when modifying an existing record, we may have to log a change done in a x2many field of that object """ if field_list is None: @@ -439,6 +439,8 @@ class audittrail_objects_proxy(object_proxy): on specific fields only. :return: True """ + if field_list is None: + field_list = [] # loop on all the given ids for res_id in res_ids: # compare old and new values and get audittrail log lines accordingly diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py index d016c5cf057..ba69174ffc6 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/AddAttachment.py @@ -262,7 +262,7 @@ class AddAttachment(unohelper.Base, XJobExecutor ): # Can be None if len(strFilterSubName) <= 0 return filename - def _MakePropertyValue(self, cName="", uValue=u"" ): + def _MakePropertyValue(self, cName="", uValue=u""): oPropertyValue = createUnoStruct( "com.sun.star.beans.PropertyValue" ) if cName: oPropertyValue.Name = cName diff --git a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py index 49844b4bfe3..c1fa8b22a85 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/bin/script/ConvertBracesToField.py @@ -3,31 +3,31 @@ # Portions of this file are under the following copyright and license: # # -# Copyright (c) 2003-2004 Danny Brewer -# d29583@groovegarden.com -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See: http://www.gnu.org/licenses/lgpl.html +# Copyright (c) 2003-2004 Danny Brewer +# d29583@groovegarden.com +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See: http://www.gnu.org/licenses/lgpl.html +# # -# # and other portions are under the following copyright and license: # # # OpenERP, Open Source Management Solution>.. -# Copyright (C) 2004-2010 OpenERP SA (). +# Copyright (C) 2004-2010 OpenERP SA (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -216,6 +216,8 @@ class ConvertBracesToField( unohelper.Base, XJobExecutor ): return sObject def getBraces(self, aReportSyntex=None): + if aReportSyntex is None: + aReportSyntex = [] desktop=getDesktop() doc = desktop.getCurrentComponent() aSearchString=[] diff --git a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py index ac2b2fb2881..c23e0e739bf 100644 --- a/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py +++ b/addons/base_report_designer/plugin/openerp_report_designer/test/test_fields.py @@ -15,6 +15,8 @@ def get(object, level=3, ending=None, ending_excl=None, recur=None, root=''): ending = [] if ending_excl is None: ending_excl = [] + if recur is None: + recur = [] res = sock.execute('terp', 3, 'admin', 'account.invoice', 'fields_get') key = res.keys() key.sort() diff --git a/addons/email_template/html2text.py b/addons/email_template/html2text.py index 9cb3a3fe5ac..880a8bb43a8 100644 --- a/addons/email_template/html2text.py +++ b/addons/email_template/html2text.py @@ -41,13 +41,13 @@ def name2cp(k): if k.startswith("&#") and k.endswith(";"): return int(k[2:-1]) # not in latin-1 return ord(codecs.latin_1_decode(k)[0]) -unifiable = {'rsquo':"'", 'lsquo':"'", 'rdquo':'"', 'ldquo':'"', +unifiable = {'rsquo':"'", 'lsquo':"'", 'rdquo':'"', 'ldquo':'"', 'copy':'(C)', 'mdash':'--', 'nbsp':' ', 'rarr':'->', 'larr':'<-', 'middot':'*', 'ndash':'-', 'oelig':'oe', 'aelig':'ae', -'agrave':'a', 'aacute':'a', 'acirc':'a', 'atilde':'a', 'auml':'a', 'aring':'a', -'egrave':'e', 'eacute':'e', 'ecirc':'e', 'euml':'e', +'agrave':'a', 'aacute':'a', 'acirc':'a', 'atilde':'a', 'auml':'a', 'aring':'a', +'egrave':'e', 'eacute':'e', 'ecirc':'e', 'euml':'e', 'igrave':'i', 'iacute':'i', 'icirc':'i', 'iuml':'i', -'ograve':'o', 'oacute':'o', 'ocirc':'o', 'otilde':'o', 'ouml':'o', +'ograve':'o', 'oacute':'o', 'ocirc':'o', 'otilde':'o', 'ouml':'o', 'ugrave':'u', 'uacute':'u', 'ucirc':'u', 'uuml':'u'} unifiable_n = {} @@ -60,7 +60,7 @@ def charref(name): c = int(name[1:], 16) else: c = int(name) - + if not UNICODE_SNOB and c in unifiable_n.keys(): return unifiable_n[c] else: @@ -76,14 +76,14 @@ def entityref(c): def replaceEntities(s): s = s.group(1) - if s[0] == "#": + if s[0] == "#": return charref(s[1:]) else: return entityref(s) r_unescape = re.compile(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));") def unescape(s): return r_unescape.sub(replaceEntities, s) - + def fixattrs(attrs): # Fix bug in sgmllib.py if not attrs: return attrs @@ -105,7 +105,7 @@ def optwrap(text): """Wrap all paragraphs in the provided text.""" if not BODY_WIDTH: return text - + assert wrap, "Requires Python 2.3." result = '' newlines = 0 @@ -136,7 +136,7 @@ def hn(tag): class _html2text(sgmllib.SGMLParser): def __init__(self, out=sys.stdout.write, baseurl=''): sgmllib.SGMLParser.__init__(self) - + if out is None: self.out = self.outtextf else: self.out = out self.outtext = u'' @@ -157,43 +157,43 @@ class _html2text(sgmllib.SGMLParser): self.abbr_data = None # last inner HTML (for abbr being defined) self.abbr_list = {} # stack of abbreviations to write later self.baseurl = baseurl - + def outtextf(self, s): self.outtext += s - + def close(self): sgmllib.SGMLParser.close(self) - + self.pbr() self.o('', 0, 'end') - + return self.outtext - + def handle_charref(self, c): self.o(charref(c)) def handle_entityref(self, c): self.o(entityref(c)) - + def unknown_starttag(self, tag, attrs): self.handle_tag(tag, attrs, 1) - + def unknown_endtag(self, tag): self.handle_tag(tag, None, 0) - + def previousIndex(self, attrs): """ returns the index of certain set of attributes (of a link) in the self.a list - + If the set of attributes is not found, returns None """ if not attrs.has_key('href'): return None - + i = -1 for a in self.a: i += 1 match = 0 - + if a.has_key('href') and a['href'] == attrs['href']: if a.has_key('title') or attrs.has_key('title'): if (a.has_key('title') and attrs.has_key('title') and @@ -206,13 +206,13 @@ class _html2text(sgmllib.SGMLParser): def handle_tag(self, tag, attrs, start): attrs = fixattrs(attrs) - + if hn(tag): self.p() if start: self.o(hn(tag)*"#" + ' ') if tag in ['p', 'div']: self.p() - + if tag == "br" and start: self.o(" \n") if tag == "hr" and start: @@ -220,21 +220,21 @@ class _html2text(sgmllib.SGMLParser): self.o("* * *") self.p() - if tag in ["head", "style", 'script']: + if tag in ["head", "style", 'script']: if start: self.quiet += 1 else: self.quiet -= 1 if tag in ["body"]: self.quiet = 0 # sites like 9rules.com never close - + if tag == "blockquote": - if start: + if start: self.p(); self.o('> ', 0, 1); self.start = 1 self.blockquote += 1 else: self.blockquote -= 1 self.p() - + if tag in ['em', 'i', 'u']: self.o("_") if tag in ['strong', 'b']: self.o("**") if tag == "code" and not self.pre: self.o('`') #TODO: `` `this` `` @@ -243,7 +243,7 @@ class _html2text(sgmllib.SGMLParser): attrsD = {} for (x, y) in attrs: attrsD[x] = y attrs = attrsD - + self.abbr_title = None self.abbr_data = '' if attrs.has_key('title'): @@ -253,13 +253,13 @@ class _html2text(sgmllib.SGMLParser): self.abbr_list[self.abbr_data] = self.abbr_title self.abbr_title = None self.abbr_data = '' - + if tag == "a": if start: attrsD = {} for (x, y) in attrs: attrsD[x] = y attrs = attrsD - if attrs.has_key('href') and not (SKIP_INTERNAL_LINKS and attrs['href'].startswith('#')): + if attrs.has_key('href') and not (SKIP_INTERNAL_LINKS and attrs['href'].startswith('#')): self.astack.append(attrs) self.o("[") else: @@ -277,7 +277,7 @@ class _html2text(sgmllib.SGMLParser): a['outcount'] = self.outcount self.a.append(a) self.o("][" + `a['count']` + "]") - + if tag == "img" and start: attrsD = {} for (x, y) in attrs: attrsD[x] = y @@ -296,20 +296,20 @@ class _html2text(sgmllib.SGMLParser): self.o("![") self.o(alt) self.o("]["+`attrs['count']`+"]") - + if tag == 'dl' and start: self.p() if tag == 'dt' and not start: self.pbr() if tag == 'dd' and start: self.o(' ') if tag == 'dd' and not start: self.pbr() - + if tag in ["ol", "ul"]: if start: self.list.append({'name':tag, 'num':0}) else: if self.list: self.list.pop() - + self.p() - + if tag == 'li': if start: self.pbr() @@ -323,10 +323,10 @@ class _html2text(sgmllib.SGMLParser): self.start = 1 else: self.pbr() - + if tag in ["table", "tr"] and start: self.p() if tag == 'td': self.pbr() - + if tag == "pre": if start: self.startpre = 1 @@ -334,34 +334,35 @@ class _html2text(sgmllib.SGMLParser): else: self.pre = 0 self.p() - + def pbr(self): if self.p_p == 0: self.p_p = 1 def p(self): - + self.p_p = 2 + def o(self, data, puredata=0, force=0): if self.abbr_data is not None: self.abbr_data += data - - if not self.quiet: + + if not self.quiet: if puredata and not self.pre: data = re.sub('\s+', ' ', data) if data and data[0] == ' ': self.space = 1 data = data[1:] if not data and not force: return - + if self.startpre: #self.out(" :") #TODO: not output when already one there self.startpre = 0 - + bq = (">" * self.blockquote) if not (force and data and data[0] == ">") and self.blockquote: bq += " " - + if self.pre: bq += " " data = data.replace("\n", "\n"+bq) - + if self.start: self.space = 0 self.p_p = 0 @@ -377,7 +378,7 @@ class _html2text(sgmllib.SGMLParser): if self.p_p: self.out(('\n'+bq)*self.p_p) self.space = 0 - + if self.space: if not self.lastWasNL: self.out(' ') self.space = 0 @@ -388,7 +389,7 @@ class _html2text(sgmllib.SGMLParser): newa = [] for link in self.a: if self.outcount > link['outcount']: - self.out(" ["+`link['count']`+"]: " + urlparse.urljoin(self.baseurl, link['href'])) + self.out(" ["+`link['count']`+"]: " + urlparse.urljoin(self.baseurl, link['href'])) if link.has_key('title'): self.out(" ("+link['title']+")") self.out("\n") else: @@ -397,7 +398,7 @@ class _html2text(sgmllib.SGMLParser): if self.a != newa: self.out("\n") # Don't need an extra line when nothing was done. self.a = newa - + if self.abbr_list and force == "end": for abbr, definition in self.abbr_list.items(): self.out(" *[" + abbr + "]: " + definition + "\n") @@ -410,7 +411,7 @@ class _html2text(sgmllib.SGMLParser): def handle_data(self, data): if r'\/script>' in data: self.quiet -= 1 self.o(data, 1) - + def unknown_decl(self, data): pass diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py index 3029a1ae3fb..2e220a9397b 100644 --- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py +++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py @@ -52,6 +52,8 @@ class account_analytic_line(osv.osv): invoices = [] if context is None: context = {} + if data is None: + data = {} account_ids = {} for line in self.pool.get('account.analytic.line').browse(cr, uid, ids, context=context): @@ -86,14 +88,14 @@ class account_analytic_line(osv.osv): 'date_due': date_due, 'fiscal_position': account.partner_id.property_account_position.id } - + context2 = context.copy() context2['lang'] = partner.lang - # set company_id in context, so the correct default journal will be selected + # set company_id in context, so the correct default journal will be selected context2['force_company'] = curr_invoice['company_id'] - # set force_company in context so the correct product properties are selected (eg. income account) + # set force_company in context so the correct product properties are selected (eg. income account) context2['company_id'] = curr_invoice['company_id'] - + last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context2) invoices.append(last_invoice) diff --git a/addons/l10n_fr/l10n_fr.py b/addons/l10n_fr/l10n_fr.py index 5e92857e30e..e1240ddd83a 100644 --- a/addons/l10n_fr/l10n_fr.py +++ b/addons/l10n_fr/l10n_fr.py @@ -50,4 +50,14 @@ class l10n_fr_line(osv.osv): l10n_fr_line() +class res_company(osv.osv): + _inherit = 'res.company' + + _columns = { + 'siret': fields.char('SIRET', size=64), + 'ape': fields.char('APE', size=64), + } + +res_company() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 76c0a566581..cf203a60c7f 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -616,6 +616,8 @@ class mrp_production(osv.osv): @param properties: List containing dictionaries of properties. @return: No. of products. """ + if properties is None: + properties = [] results = [] bom_obj = self.pool.get('mrp.bom') uom_obj = self.pool.get('product.uom') @@ -834,7 +836,7 @@ class mrp_production(osv.osv): 'product_id': wc.product_id.id, 'unit_amount': wc_line.hour, 'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False - + } ) if wc.costs_journal_id and wc.costs_general_account_id: value = wc_line.cycle * wc.costs_cycle @@ -851,7 +853,7 @@ class mrp_production(osv.osv): 'product_id': wc.product_id.id, 'unit_amount': wc_line.cycle, 'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False - + } ) return amount diff --git a/addons/project/project.py b/addons/project/project.py index f30fbf04ce5..dd4bbdcab21 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -312,8 +312,9 @@ class project(osv.osv): def copy(self, cr, uid, id, default=None, context=None): if context is None: context = {} + if default is None: + default = {} - default = default or {} context['active_test'] = False default['state'] = 'open' default['tasks'] = []