From d9d06783284fa93bd284be1ea66d322291b1abf3 Mon Sep 17 00:00:00 2001 From: ced <> Date: Mon, 23 Jul 2007 05:16:03 +0000 Subject: [PATCH] kernel: don't use mutable as default value in function defintion. bzr revid: ced-824ee7e22dca5a4b4f2d8d5095aa20650f5a2469 --- bin/addons/__init__.py | 13 +++- bin/netsvc.py | 6 +- bin/osv/fields.py | 71 +++++++++++++------ bin/osv/orm.py | 110 ++++++++++++++++++++++-------- bin/osv/osv.py | 10 ++- bin/pooler.py | 6 +- bin/report/custom.py | 4 +- bin/report/interface.py | 14 ++-- bin/report/print_xml.py | 12 +++- bin/report/printscreen/ps_form.py | 4 +- bin/report/printscreen/ps_list.py | 4 +- bin/report/report_sxw.py | 16 +++-- bin/service/web_services.py | 20 ++++-- bin/sql_db.py | 4 +- bin/tools/convert.py | 8 ++- bin/tools/misc.py | 14 +++- bin/wizard/__init__.py | 10 ++- 17 files changed, 243 insertions(+), 83 deletions(-) diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index b761276774f..991a1ade3bb 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -126,7 +126,9 @@ class Node(Singleton): s += '%s`-> %s' % (' ' * depth, c._pprint(depth+1)) return s -def create_graph(module_list, force=[]): +def create_graph(module_list, force=None): + if not force: + force=[] graph = Graph() packages = [] @@ -177,7 +179,10 @@ def init_module_objects(cr, module_name, obj_list): obj._auto_init(cr) cr.commit() -def load_module_graph(cr, graph, status={}): +def load_module_graph(cr, graph, status=None): + if not status: + status={} + status = status.copy() package_todo = [] statusi = 0 for package in graph: @@ -248,7 +253,9 @@ def register_classes(): except zipimport.ZipImportError: logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m) -def load_modules(db, force_demo=False, status={}, update_module=False): +def load_modules(db, force_demo=False, status=None, update_module=False): + if not status: + status={} cr = db.cursor() force = [] if force_demo: diff --git a/bin/netsvc.py b/bin/netsvc.py index 48c789fe014..0b3f9bf14ce 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -158,7 +158,11 @@ class Agent(object): _timers = [] _logger = Logger() - def setAlarm(self, fn, dt, args=[], kwargs={}): + def setAlarm(self, fn, dt, args=None, kwargs=None): + if not args: + args=[] + if not kwargs: + kwargs={} wait = dt - time.time() if wait > 0: self._logger.notifyChannel('timers', LOG_DEBUG, "Job scheduled in %s seconds for %s.%s" % (wait, fn.im_class.__name__, fn.func_name)) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 90663816d64..4d8bc2e35de 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -66,8 +66,8 @@ class _column(object): _symbol_set = (_symbol_c, _symbol_f) _symbol_get = None - def __init__(self, string='unknown', required=False, readonly=False, domain=[], context='', states={}, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, **args): - self.states = states + def __init__(self, string='unknown', required=False, readonly=False, domain=None, context='', states=None, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, **args): + self.states = states or {} self.string = string self.readonly = readonly self.required = required @@ -77,7 +77,7 @@ class _column(object): self.change_default = change_default self.ondelete = ondelete self.translate = translate - self._domain = domain + self._domain = domain or [] self.relate =False self._context = context self.group_name = False @@ -90,10 +90,10 @@ class _column(object): warnings.warn("The relate attribute doesn't work anymore, use act_window tag instead", DeprecationWarning) - def set(self, cr, obj, id, name, value, user=None, context={}): + def set(self, cr, obj, id, name, value, user=None, context=None): cr.execute('update '+obj._table+' set '+name+'='+self._symbol_set[0]+' where id=%d', (self._symbol_set[1](value),id) ) - def get(self, cr, obj, ids, name, context={}, values={}): + def get(self, cr, obj, ids, name, context=None, values=None): raise 'undefined get method !' def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None): @@ -212,7 +212,9 @@ class selection(_column): _column.__init__(self, string=string, **args) self.selection = selection - def set(self, cr, obj, id, name, value, user=None, context={}): + def set(self, cr, obj, id, name, value, user=None, context=None): + if not context: + context={} #CHECKME: a priori, ceci n'est jamais appelé puisque le test ci-dessous est mauvais # la raison est que selection n'est pas en classic_write = false # a noter qu'on pourrait fournir un _symbol_set specifique, et ca suffirait @@ -244,7 +246,9 @@ class one2one(_column): _column.__init__(self, string=string, **args) self._obj = obj - def set(self, cr, obj_src, id, field, act, user=None, context={}): + def set(self, cr, obj_src, id, field, act, user=None, context=None): + if not context: + context={} obj = obj_src.pool.get(self._obj) self._table = obj_src.pool.get(self._obj)._table if act[0]==0: @@ -272,7 +276,11 @@ class many2one(_column): # TODO: speed improvement # # name is the name of the relation field - def get(self, cr, obj, ids, name, user=None, context={}, values={}): + def get(self, cr, obj, ids, name, user=None, context=None, values=None): + if not context: + context={} + if not values: + values={} res = {} for r in values: res[r['id']] = r[name] @@ -300,7 +308,9 @@ class many2one(_column): res[r] = False return res - def set(self, cr, obj_src, id, field, values, user=None, context={}): + def set(self, cr, obj_src, id, field, values, user=None, context=None): + if not context: + context={} obj = obj_src.pool.get(self._obj) self._table = obj_src.pool.get(self._obj)._table if type(values)==type([]): @@ -338,7 +348,11 @@ class one2many(_column): #one2many can't be used as condition for defaults assert(self.change_default != True) - def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}): + def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): + if not context: + context = {} + if not values: + values = {} res = {} for id in ids: res[id] = [] @@ -347,7 +361,9 @@ class one2many(_column): res[r[self._fields_id]].append( r['id'] ) return res - def set(self, cr, obj, id, field, values, user=None, context={}): + def set(self, cr, obj, id, field, values, user=None, context=None): + if not context: + context={} if not values: return _table = obj.pool.get(self._obj)._table @@ -397,7 +413,11 @@ class many2many(_column): self._id2 = id2 self._limit = limit - def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}): + def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): + if not context: + context={} + if not values: + values={} res = {} if not ids: return res @@ -416,7 +436,9 @@ class many2many(_column): res[r[1]].append(r[0]) return res - def set(self, cr, obj, id, name, values, user=None, context={}): + def set(self, cr, obj, id, name, values, user=None, context=None): + if not context: + context={} if not values: return obj = obj.pool.get(self._obj) @@ -486,7 +508,11 @@ class function(_column): return [] return self._fnct_search(obj, cr, uid, obj, name, args) - def get(self, cr, obj, ids, name, user=None, context={}, values={}): + def get(self, cr, obj, ids, name, user=None, context=None, values=None): + if not context: + context={} + if not values: + values={} res = {} table = obj._table if self._method: @@ -495,7 +521,9 @@ class function(_column): else: return self._fnct(cr, table, ids, name, self._arg, context) - def set(self, cr, obj, id, name, value, user=None, context={}): + def set(self, cr, obj, id, name, value, user=None, context=None): + if not context: + context={} if self._fnct_inv: self._fnct_inv(obj, cr, user, id, name, value, self._fnct_inv_arg, context) @@ -512,7 +540,9 @@ class serialized(_column): super(serialized, self).__init__(string=string, **args) class property(function): - def _fnct_write(self2, self, cr, uid, id, prop, id_val, val, context={}): + def _fnct_write(self2, self, cr, uid, id, prop, id_val, val, context=None): + if not context: + context={} (obj_dest,) = val definition_id = self2._field_get(self, cr, uid, prop) @@ -540,7 +570,9 @@ class property(function): }, context=context) return res - def _fnct_read(self2, self, cr, uid, ids, prop, val, context={}): + def _fnct_read(self2, self, cr, uid, ids, prop, val, context=None): + if not context: + context={} property = self.pool.get('ir.property') definition_id = self2._field_get(self, cr, uid, prop) @@ -577,7 +609,4 @@ class property(function): def __init__(self, obj_prop, **args): self.field_id = {} - function.__init__(self, - self._fnct_read, False, - self._fnct_write, (obj_prop, ), - **args) + function.__init__(self, self._fnct_read, False, self._fnct_write, (obj_prop, ), **args) diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 4746cc2feb1..6a8bdbc901f 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -516,7 +516,9 @@ class orm(object): self._inherit_fields=res self._inherits_reload_src() - def browse(self, cr, uid, select, context={}, list_class=None): + def browse(self, cr, uid, select, context=None, list_class=None): + if not context: + context={} self._list_class = list_class or browse_record_list cache = {} # need to accepts ints and longs because ids coming from a method @@ -529,7 +531,9 @@ class orm(object): return [] # TODO: implement this - def __export_row(self, cr, uid, row, fields, prefix, context={}): + def __export_row(self, cr, uid, row, fields, prefix, context=None): + if not context: + context={} lines = [] data = map(lambda x: '', range(len(fields))) done = [] @@ -564,14 +568,18 @@ class orm(object): data[fpos] = str(r or '') return [data] + lines - def export_data(self, cr, uid, ids, fields, context={}): + def export_data(self, cr, uid, ids, fields, context=None): + if not context: + context={} fields = map(lambda x: x.split('/'), fields) datas = [] for row in self.browse(cr, uid, ids, context): datas += self.__export_row(cr, uid, row, fields, [], context) return datas - def import_data(self, cr, uid, fields, datas, mode='init', current_module=None, noupdate=False, context={}): + def import_data(self, cr, uid, fields, datas, mode='init', current_module=None, noupdate=False, context=None): + if not context: + context={} fields = map(lambda x: x.split('/'), fields) logger = netsvc.Logger() def process_liness(self, datas, prefix, fields_def, position=0): @@ -712,7 +720,9 @@ class orm(object): # return (done, 0, 0, 0) - def read(self, cr, user, ids, fields=None, context={}, load='_classic_read'): + def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'): + if not context: + context={} self.pool.get('ir.model.access').check(cr, user, self._name, 'read') if not fields: fields = self._columns.keys() + self._inherit_fields.keys() @@ -728,7 +738,9 @@ class orm(object): return result[0] return result - def _read_flat(self, cr, user, ids, fields, context={}, load='_classic_read'): + def _read_flat(self, cr, user, ids, fields, context=None, load='_classic_read'): + if not context: + context={} if not ids: return [] @@ -809,7 +821,9 @@ class orm(object): cr.rollback() raise except_orm('ValidateError', ('\n'.join(field_err_str), ','.join(field_error))) - def default_get(self, cr, uid, fields, context={}): + def default_get(self, cr, uid, fields, context=None): + if not context: + context={} value = {} # get the default values for the inherited fields for t in self._inherits.keys(): @@ -828,7 +842,9 @@ class orm(object): value[field] = field_value return value - def perm_read(self, cr, user, ids, context={}, details=True): + def perm_read(self, cr, user, ids, context=None, details=True): + if not context: + context={} if not ids: return [] fields = ', p.level, p.uid, p.gid' @@ -854,7 +870,9 @@ class orm(object): return res[ids] return res - def unlink(self, cr, uid, ids, context={}): + def unlink(self, cr, uid, ids, context=None): + if not context: + context={} if not ids: return True if isinstance(ids, (int, long)): @@ -893,7 +911,9 @@ class orm(object): # # TODO: Validate # - def write(self, cr, user, ids, vals, context={}): + def write(self, cr, user, ids, vals, context=None): + if not context: + context={} if not ids: return True if isinstance(ids, (int, long)): @@ -984,12 +1004,14 @@ class orm(object): # # TODO: Should set perm to user.xxx # - def create(self, cr, user, vals, context={}): + def create(self, cr, user, vals, context=None): """ create(cr, user, vals, context) -> int cr = database cursor user = user id vals = dictionary of the form {'field_name':field_value, ...} """ + if not context: + context={} self.pool.get('ir.model.access').check(cr, user, self._name, 'create') default = [] @@ -1056,7 +1078,9 @@ class orm(object): self._update_function_stored(cr, user, [id_new], context=context) return id_new - def _update_function_stored(self, cr, user, ids, context={}): + def _update_function_stored(self, cr, user, ids, context=None): + if not context: + context={} f=filter(lambda a: isinstance(self._columns[a], fields.function) and self._columns[a].store, self._columns) if f: result=self.read(cr, user, ids, fields=f, context=context) @@ -1075,7 +1099,9 @@ class orm(object): # # TODO: Validate # - def perm_write(self, cr, user, ids, fields, context={}): + def perm_write(self, cr, user, ids, fields, context=None): + if not context: + context={} if not ids: return True if isinstance(ids, (int, long)): @@ -1100,7 +1126,9 @@ class orm(object): # returns the definition of each field in the object # the optional fields parameter can limit the result to some fields - def fields_get(self, cr, user, fields=None, context={}): + def fields_get(self, cr, user, fields=None, context=None): + if not context: + context={} res = {} for parent in self._inherits: res.update(self.pool.get(parent).fields_get(cr, user, fields, context)) @@ -1153,10 +1181,12 @@ class orm(object): # # Overload this method if you need a window title which depends on the context # - def view_header_get(self, cr, user, view_id=None, view_type='form', context={}): + def view_header_get(self, cr, user, view_id=None, view_type='form', context=None): return False - def __view_look_dom(self, cr, user, node, context={}): + def __view_look_dom(self, cr, user, node, context=None): + if not context: + context={} result = False fields = {} childs = True @@ -1230,7 +1260,9 @@ class orm(object): fields.update(self.__view_look_dom(cr, user, f,context)) return fields - def __view_look_dom_arch(self, cr, user, node, context={}): + def __view_look_dom_arch(self, cr, user, node, context=None): + if not context: + context={} fields_def = self.__view_look_dom(cr, user, node, context=context) arch = node.toxml() fields = self.fields_get(cr, user, fields_def.keys(), context) @@ -1242,7 +1274,9 @@ class orm(object): # # if view_id, view_type is not required # - def fields_view_get(self, cr, user, view_id=None, view_type='form', context={}, toolbar=False): + def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False): + if not context: + context={} def _inherit_apply(src, inherit): def _find(node, node2): if node.nodeType==node.ELEMENT_NODE and node.localName==node2.localName: @@ -1387,8 +1421,10 @@ class orm(object): return result # TODO: ameliorer avec NULL - def _where_calc(self, cr, user, args2, context={}): - args = args2[:] + def _where_calc(self, cr, user, args, context=None): + if not context: + context={} + args = args[:] # if the object has a field named 'active', filter out all inactive # records unless they were explicitely asked for if 'active' in self._columns: @@ -1581,7 +1617,9 @@ class orm(object): qu1.append(' (1=0)') return (qu1,qu2,tables) - def search_count(self, cr, user, args, context={}): + def search_count(self, cr, user, args, context=None): + if not context: + context={} # compute the count of records (qu1,qu2,tables) = self._where_calc(cr, user, args, context) @@ -1601,7 +1639,9 @@ class orm(object): res = cr.fetchall() return res[0][0] - def search(self, cr, user, args, offset=0, limit=None, order=None, context={}): + def search(self, cr, user, args, offset=0, limit=None, order=None, context=None): + if not context: + context={} # compute the where, order by, limit and offset clauses (qu1,qu2,tables) = self._where_calc(cr, user, args, context) @@ -1628,27 +1668,37 @@ class orm(object): # returns the different values ever entered for one field # this is used, for example, in the client when the user hits enter on # a char field - def distinct_field_get(self, cr, uid, field, value, args=[], offset=0, limit=None): + def distinct_field_get(self, cr, uid, field, value, args=None, offset=0, limit=None): + if not args: + args=[] if field in self._inherit_fields: return self.pool.get(self._inherit_fields[field][0]).distinct_field_get(cr, uid,field,value,args,offset,limit) else: return self._columns[field].search(cr, self, args, field, value, offset, limit, uid) - def name_get(self, cr, user, ids, context={}): + def name_get(self, cr, user, ids, context=None): + if not context: + context={} if not ids: return [] if isinstance(ids, (int, long)): ids = [ids] return [(r['id'], r[self._rec_name]) for r in self.read(cr, user, ids, [self._rec_name], context, load='_classic_write')] - def name_search(self, cr, user, name='', args=[], operator='ilike', context={}, limit=80): + def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=80): + if not args: + args=[] + if not context: + context={} if name: args += [(self._rec_name,operator,name)] ids = self.search(cr, user, args, limit=limit) res = self.name_get(cr, user, ids, context) return res - def copy(self, cr, uid, id, default=None, context={}): + def copy(self, cr, uid, id, default=None, context=None): + if not context: + context={} if not default: default = {} if 'state' not in default: @@ -1687,7 +1737,9 @@ class orm(object): del data[self._inherits[v]] return self.create(cr, uid, data) - def read_string(self, cr, uid, id, langs, fields=None, context={}): + def read_string(self, cr, uid, id, langs, fields=None, context=None): + if not context: + context={} res = {} res2 = {} self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'read') @@ -1712,7 +1764,9 @@ class orm(object): res[lang][f]=res2[lang][f] return res - def write_string(self, cr, uid, id, langs, vals, context={}): + def write_string(self, cr, uid, id, langs, vals, context=None): + if not context: + context={} self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'write') for lang in langs: for field in vals: diff --git a/bin/osv/osv.py b/bin/osv/osv.py index 9e94b3c651c..4c503a00095 100644 --- a/bin/osv/osv.py +++ b/bin/osv/osv.py @@ -292,7 +292,11 @@ class cacheable_osv(osv, Cacheable): def __init__(self): super(cacheable_osv, self).__init__() - def read(self, cr, user, ids, fields=[], context={}, load='_classic_read'): + def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'): + if not fields: + fields=[] + if not context: + context={} fields = fields or self._columns.keys() ctx = [context.get(x, False) for x in self._relevant] result, tofetch = [], [] @@ -332,7 +336,9 @@ class cacheable_osv(osv, Cacheable): def invalidate(self, key): del self._cache[key[0]][key[1]] - def write(self, cr, user, ids, values, context={}): + def write(self, cr, user, ids, values, context=None): + if not context: + context={} for id in ids: self.invalidate((self._name, id)) return super(cacheable_osv, self).write(cr, user, ids, values, context) diff --git a/bin/pooler.py b/bin/pooler.py index 0854770078d..89d78cc9326 100644 --- a/bin/pooler.py +++ b/bin/pooler.py @@ -34,7 +34,9 @@ import netsvc db_dic = {} pool_dic = {} -def get_db_and_pool(db_name, force_demo=False, status={}, update_module=False): +def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False): + if not status: + status={} if db_name in db_dic: db = db_dic[db_name] else: @@ -80,7 +82,7 @@ def get_db(db_name): # print "get_db", db_name return get_db_and_pool(db_name)[0] -def get_pool(db_name, force_demo=False, status={}, update_module=False): +def get_pool(db_name, force_demo=False, status=None, update_module=False): # print "get_pool", db_name pool = get_db_and_pool(db_name, force_demo, status, update_module)[1] # addons.load_modules(db_name, False) diff --git a/bin/report/custom.py b/bin/report/custom.py index 2d4aef9c137..01286ac00b4 100644 --- a/bin/report/custom.py +++ b/bin/report/custom.py @@ -132,7 +132,9 @@ class report_custom(report_int): return result - def create(self, cr, uid, ids, datas, context={}): + def create(self, cr, uid, ids, datas, context=None): + if not context: + context={} self.pool = pooler.get_pool(cr.dbname) report = self.pool.get('ir.report.custom').browse(cr, uid, [datas['report_id']])[0] datas['model'] = report.model_id.model diff --git a/bin/report/interface.py b/bin/report/interface.py index 4091c717650..8974a8a1839 100644 --- a/bin/report/interface.py +++ b/bin/report/interface.py @@ -64,7 +64,7 @@ class report_int(netsvc.Service): self.joinGroup('report') self.exportMethod(self.create) - def create(self, cr, uid, ids, datas, context={}): + def create(self, cr, uid, ids, datas, context=None): return False """ @@ -94,7 +94,9 @@ class report_rml(report_int): pdf = create_doc(rml) return (pdf, report_type) - def create_xml(self, cr, uid, ids, datas, context={}): + def create_xml(self, cr, uid, ids, datas, context=None): + if not context: + context={} doc = print_xml.document(cr, uid, datas, {}) self.bin_datas = doc.bin_datas doc.parse(self.tmpl, ids, self.table, context) @@ -102,7 +104,9 @@ class report_rml(report_int): doc.close() return self.post_process_xml_data(cr, uid, xml, context) - def post_process_xml_data(self, cr, uid, xml, context={}): + def post_process_xml_data(self, cr, uid, xml, context=None): + if not context: + context={} # find the position of the 3rd tag # (skip the and the "root" tag) iter = re.finditer('<[^>]*>', xml) @@ -126,7 +130,9 @@ class report_rml(report_int): # # TODO: The translation doesn't work for "textext textext" # - def create_rml(self, cr, xml, uid, context={}): + def create_rml(self, cr, xml, uid, context=None): + if not context: + context={} service = netsvc.LocalService("object_proxy") # In some case we might not use xsl ... diff --git a/bin/report/print_xml.py b/bin/report/print_xml.py index 671ec9806d1..82ffe6d206c 100644 --- a/bin/report/print_xml.py +++ b/bin/report/print_xml.py @@ -334,18 +334,24 @@ class document(object): def xml_get(self): return self.doc.toxml('utf-8') - def parse_tree(self, ids, model, context={}): + def parse_tree(self, ids, model, context=None): + if not context: + context={} browser = self.pool.get(model).browse(self.cr, self.uid, ids, context) self.parse_node(self.dom.documentElement, self.doc, browser) - def parse_string(self, xml, ids, model, context={}): + def parse_string(self, xml, ids, model, context=None): + if not context: + context={} # parses the xml template to memory self.dom = minidom.parseString(xml) # create the xml data from the xml template self.parse_tree(ids, model, context) - def parse(self, filename, ids, model, context={}): + def parse(self, filename, ids, model, context=None): + if not context: + context={} # parses the xml template to memory self.dom = minidom.parse(os.path.join(tools.config['root_path'],filename)) diff --git a/bin/report/printscreen/ps_form.py b/bin/report/printscreen/ps_form.py index 06bf69545ed..f93955c9f02 100644 --- a/bin/report/printscreen/ps_form.py +++ b/bin/report/printscreen/ps_form.py @@ -60,7 +60,9 @@ class report_printscreen_list(report_int): dom = minidom.parseString(view) return self._parse_node(dom) - def create(self, cr, uid, ids, datas, context={}): + def create(self, cr, uid, ids, datas, context=None): + if not context: + context={} datas['ids'] = ids pool = pooler.get_pool(cr.dbname) model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)]) diff --git a/bin/report/printscreen/ps_list.py b/bin/report/printscreen/ps_list.py index ab81f2395c0..c6210f33e36 100644 --- a/bin/report/printscreen/ps_list.py +++ b/bin/report/printscreen/ps_list.py @@ -60,7 +60,9 @@ class report_printscreen_list(report_int): dom = minidom.parseString(view.encode('utf-8')) return self._parse_node(dom) - def create(self, cr, uid, ids, datas, context={}): + def create(self, cr, uid, ids, datas, context=None): + if not context: + context={} pool = pooler.get_pool(cr.dbname) model = pool.get(datas['model']) model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)]) diff --git a/bin/report/report_sxw.py b/bin/report/report_sxw.py index 4f02627c1a0..b554bd0521a 100644 --- a/bin/report/report_sxw.py +++ b/bin/report/report_sxw.py @@ -87,7 +87,9 @@ class browse_record_list(list): return None class rml_parse(object): - def __init__(self, cr, uid, name, context={}): + def __init__(self, cr, uid, name, context=None): + if not context: + context={} self.cr = cr self.uid = uid self.pool = pooler.get_pool(cr.dbname) @@ -107,7 +109,9 @@ class rml_parse(object): self._node = None # self.already = {} - def setTag(self, oldtag, newtag, attrs={}): + def setTag(self, oldtag, newtag, attrs=None): + if not attrs: + attrs={} node = self._find_parent(self._node, [oldtag]) if node: node.tagName = newtag @@ -169,7 +173,9 @@ class rml_parse(object): break return node - def _parse_text(self, text, level=[]): + def _parse_text(self, text, level=None): + if not level: + level=[] res = self._regex.findall(text) todo = [] # translate the text @@ -307,7 +313,9 @@ class report_sxw(report_rml): table_obj = pooler.get_pool(cr.dbname).get(self.table) return table_obj.browse(cr, uid, ids, list_class=browse_record_list, context=context) - def create(self, cr, uid, ids, data, context={}): + def create(self, cr, uid, ids, data, context=None): + if not context: + context={} cr.execute('select report_rml_content from ir_act_report_xml where report_name=%s', (self.name[7:],)) result = cr.fetchone() if result and result[0]: diff --git a/bin/service/web_services.py b/bin/service/web_services.py index 46f42a79809..8db9abbda78 100644 --- a/bin/service/web_services.py +++ b/bin/service/web_services.py @@ -277,7 +277,11 @@ class common(netsvc.Service): cr.close() return res - def ir_get(self, db, uid, password, keys, args=[], meta=None, context={}): + def ir_get(self, db, uid, password, keys, args=None, meta=None, context=None): + if not args: + args=[] + if not context: + context={} security.check(db, uid, password) cr = pooler.get_db(db).cursor() res = ir.ir_get(cr,uid, keys, args, meta, context) @@ -361,7 +365,9 @@ class wizard(netsvc.Service): wiz = netsvc.LocalService('wizard.'+self.wiz_name[wiz_id]) return wiz.execute(db, uid, self.wiz_datas[wiz_id], action, context) - def create(self, db, uid, passwd, wiz_name, datas={}): + def create(self, db, uid, passwd, wiz_name, datas=None): + if not datas: + datas={} security.check(db, uid, passwd) #FIXME: this is not thread-safe self.id += 1 @@ -370,7 +376,9 @@ class wizard(netsvc.Service): self.wiz_uid[self.id] = uid return self.id - def execute(self, db, uid, passwd, wiz_id, datas, action='init', context={}): + def execute(self, db, uid, passwd, wiz_id, datas, action='init', context=None): + if not context: + context={} security.check(db, uid, passwd) if wiz_id in self.wiz_uid: @@ -398,7 +406,11 @@ class report_spool(netsvc.Service): self.id = 0 self.id_protect = threading.Semaphore() - def report(self, db, uid, passwd, object, ids, datas={}, context={}): + def report(self, db, uid, passwd, object, ids, datas=None, context=None): + if not datas: + datas={} + if not context: + context={} security.check(db, uid, passwd) self.id_protect.acquire() diff --git a/bin/sql_db.py b/bin/sql_db.py index ff1fd63ea00..3b426b2c16c 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -80,7 +80,9 @@ class fake_cursor: fake_cursor.nbr += 1 return self.obj.execute(*args) - def execute(self, sql, params=()): + def execute(self, sql, params=None): + if not params: + params=() def base_string(s): if isinstance(s, unicode): return s.encode('utf-8') diff --git a/bin/tools/convert.py b/bin/tools/convert.py index 2963ca86b70..9eb902b728e 100644 --- a/bin/tools/convert.py +++ b/bin/tools/convert.py @@ -460,7 +460,9 @@ class xml_import(object): # delimiter: , # encoding: UTF8 # -def convert_csv_import(cr, module, fname, csvcontent, idref={}, mode='init', noupdate=False): +def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', noupdate=False): + if not idref: + idref={} model = ('.'.join(fname.split('.')[:-1]).split('-'))[0] #remove folder path from model head, model = os.path.split(model) @@ -490,7 +492,9 @@ def convert_csv_import(cr, module, fname, csvcontent, idref={}, mode='init', nou # # xml import/export # -def convert_xml_import(cr, module, xmlstr, idref={}, mode='init'): +def convert_xml_import(cr, module, xmlstr, idref=None, mode='init'): + if not idref: + idref={} obj = xml_import(cr, module, idref, mode) obj.parse(xmlstr) del obj diff --git a/bin/tools/misc.py b/bin/tools/misc.py index 09ebf5f9210..93822d3b091 100644 --- a/bin/tools/misc.py +++ b/bin/tools/misc.py @@ -189,8 +189,12 @@ def file_open(name, mode="r", subdir='addons'): #---------------------------------------------------------- # Emails #---------------------------------------------------------- -def email_send(email_from, email_to, subject, body, email_cc=[], email_bcc=[], on_error=False, reply_to=False): +def email_send(email_from, email_to, subject, body, email_cc=None, email_bcc=None, on_error=False, reply_to=False): """Send an email.""" + if not email_cc: + email_cc=[] + if not email_bcc: + email_bcc=[] import smtplib from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart @@ -225,8 +229,14 @@ def email_send(email_from, email_to, subject, body, email_cc=[], email_bcc=[], o #---------------------------------------------------------- # Emails #---------------------------------------------------------- -def email_send_attach(email_from, email_to, subject, body, email_cc=[], email_bcc=[], on_error=False, reply_to=False, attach=[]): +def email_send_attach(email_from, email_to, subject, body, email_cc=None, email_bcc=None, on_error=False, reply_to=False, attach=None): """Send an email.""" + if not email_cc: + email_cc=[] + if not email_bcc: + email_bcc=[] + if not attach: + attach=[] import smtplib from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase diff --git a/bin/wizard/__init__.py b/bin/wizard/__init__.py index 08ff36574b4..88a2d59c461 100644 --- a/bin/wizard/__init__.py +++ b/bin/wizard/__init__.py @@ -56,8 +56,10 @@ class interface(netsvc.Service): node.setAttribute('string', trans.decode('utf8')) for n in node.childNodes: self.translate_view(cr, uid, n, state, lang) - - def execute_cr(self, cr, uid, data, state='init', context={}): + + def execute_cr(self, cr, uid, data, state='init', context=None): + if not context: + context={} res = {} try: state_def = self.states[state] @@ -140,7 +142,9 @@ class interface(netsvc.Service): return res - def execute(self, db, uid, data, state='init', context={}): + def execute(self, db, uid, data, state='init', context=None): + if not context: + context={} cr = pooler.get_db(db).cursor() try: try: