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 = []
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:
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:
_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))
_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
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
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):
_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
_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:
# 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]
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([]):
#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] = []
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
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
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)
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:
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)
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)
}, 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)
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)
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
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 = []
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):
#
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()
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 []
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():
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'
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)):
#
# 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)):
#
# 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 = []
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)
#
# 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)):
# 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))
#
# 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
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)
#
# 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:
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:
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)
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)
# 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:
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')
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:
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 = [], []
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)
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:
# 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)
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
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
"""
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)
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 <?xml ...?> and the "root" tag)
iter = re.finditer('<[^>]*>', xml)
#
# TODO: The translation doesn't work for "<tag t="1">textext<tag> tex</tag>text</tag>"
#
- 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 ...
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))
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)])
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)])
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)
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
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
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]:
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)
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
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:
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()
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')
# 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)
#
# 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
#----------------------------------------------------------
# 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
#----------------------------------------------------------
# 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
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]
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: