From ff0a10ed5a956b568d9872800903f52a25efbd76 Mon Sep 17 00:00:00 2001 From: Naresh Choksy Date: Wed, 12 Nov 2008 17:20:10 +0530 Subject: [PATCH] =?UTF-8?q?fixed=20the=20following=20bugs=20in=20ModuleRec?= =?UTF-8?q?order:=20It=20generates=20an=20error=20when=20the=20MR=20tries?= =?UTF-8?q?=20to=20set=20an=20ID=20more=20then=2064=20char=20to=20a=20reco?= =?UTF-8?q?rd.=20*=20It=20only=20record=20on=20create,=20it=20doesn't=20re?= =?UTF-8?q?cord=20the=20duplicated=20records=20*=20I=20trying=20to=20put?= =?UTF-8?q?=20the=20'=E2=82=AC'=20sign=20in=20a=20text=20box=20and=20got?= =?UTF-8?q?=20an=20Utf8=20error=20*=20When=20creating=20an=20object=20from?= =?UTF-8?q?=20a=20one2many=20it=20add=20an=20non=20necessary=20line=20that?= =?UTF-8?q?=20causes=20an=20error=20at=20loading=20*=20When=20clicking=20o?= =?UTF-8?q?n=20save=20without=20filling=20any=20field,=20it=20record=20an?= =?UTF-8?q?=20empty=20record=20that=20causes=20an=20error=20at=20loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bzr revid: nch@tinyerp.com-20081112115010-yoayy0ti3uh6xzf5 --- .../base_module_record/base_module_record.py | 145 +++++++++++++----- .../wizard/base_module_save.py | 27 +++- addons/crm_configuration/__init__.pyc | Bin 233 -> 0 bytes addons/crm_configuration/crm_config.pyc | Bin 6587 -> 0 bytes addons/report_intrastat/__init__.pyc | Bin 213 -> 0 bytes addons/report_intrastat/report_intrastat.pyc | Bin 5797 -> 0 bytes 6 files changed, 131 insertions(+), 41 deletions(-) delete mode 100644 addons/crm_configuration/__init__.pyc delete mode 100644 addons/crm_configuration/crm_config.pyc delete mode 100644 addons/report_intrastat/__init__.pyc delete mode 100644 addons/report_intrastat/report_intrastat.pyc diff --git a/addons/base_module_record/base_module_record.py b/addons/base_module_record/base_module_record.py index e1a9b1452d3..18289f3531c 100644 --- a/addons/base_module_record/base_module_record.py +++ b/addons/base_module_record/base_module_record.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -26,6 +26,7 @@ import netsvc import pooler import string + class base_module_record(osv.osv): _name = "ir.module.record" _columns = { @@ -55,6 +56,8 @@ class base_module_record(osv.osv): return val def _get_id(self, cr, uid, model, id): +# if type(id)==type(()): +# id=id[0] if (model,id) in self.ids: return self.ids[(model,id)], False dt = self.pool.get('ir.model.data') @@ -66,14 +69,16 @@ class base_module_record(osv.osv): return obj.module+'.'+obj.name, obj.noupdate def _create_record(self, cr, uid, doc, model, data, record_id, noupdate=False): - record = doc.createElement('record') - record.setAttribute("id", record_id) - record.setAttribute("model", model) + record_list=[] + if record_id not in self.ids.values(): + record = doc.createElement('record') + record.setAttribute("id", record_id) + record.setAttribute("model", model) + record_list = [record] lids = self.pool.get('ir.model.data').search(cr, uid, [('model','=',model)]) res = self.pool.get('ir.model.data').read(cr, uid, lids[:1], ['module']) if res: self.depends[res[0]['module']]=True - record_list = [record] fields = self.pool.get(model).fields_get(cr, uid) for key,val in data.items(): if not (val or (fields[key]['type']=='boolean')): @@ -142,16 +147,63 @@ class base_module_record(osv.osv): val = val and ('"""%s"""' % val.replace('\\', '\\\\').replace('"', '\"')) or 'False' if isinstance(val, basestring): + val=val.encode('utf8') val = val.decode('utf8') - field.setAttribute(u"eval", val) record.appendChild(field) return record_list, noupdate + def get_o2m_list(self,cr,uid,model,id): + result={} + data=self.pool.get(model).read(cr, uid,id) + del data['id'] + fields = self.pool.get(model).fields_get(cr, uid) + res=[0,0] + for key,val in data.items(): + if fields[key]['type'] == 'many2one': + result[key]=data[key][0] + else: + result[key]=data[key] + res.append(result) + return res + + + def get_copy_data(self, cr, uid,model,id): + result={} + res = [] + data=self.pool.get(model).read(cr, uid,id) + del data['id'] + fields = self.pool.get(model).fields_get(cr, uid) + + for key,val in data.items(): + if fields[key]['type'] == 'many2one': + if type(data[key])==type(True): + result[key]=data[key] + else: + result[key]=data[key][0] + + elif fields[key]['type'] in ('one2many',): + rel = fields[key]['relation'] + if len(data[key]): + for rel_id in data[key]: + res.append((self.get_o2m_list(cr, uid,rel,rel_id))) + result[key]=res + else: + result[key]=data[key] + + elif fields[key]['type'] == 'many2many': + result[key]=[(6,0,data[key])] + + else: + result[key]=data[key] + for k,v in self.pool.get(model)._inherits.items(): + del result[v] + return result + def _generate_object_xml(self, cr, uid, rec, recv, doc, result=None): record_list = [] noupdate = False - if rec[4]=='write': + if rec[4]=='write' : for id in rec[5]: id,update = self._get_id(cr, uid, rec[3], id) noupdate = noupdate or update @@ -160,47 +212,62 @@ class base_module_record(osv.osv): record,update = self._create_record(cr, uid, doc, rec[3], rec[6], id) noupdate = noupdate or update record_list += record + elif rec[4]=='create': id = self._create_id(cr, uid, rec[3],rec[5]) record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[5], id) self.ids[(rec[3],result)] = id record_list += record + + elif rec[4]=='copy': + data=self.get_copy_data(cr,uid,rec[3],rec[5]) + copy_rec=(rec[0],rec[1],rec[2],rec[3],rec[4],rec[5],data,rec[7]) + rec=copy_rec + rec_data=[(self.recording_data[0][0],rec,self.recording_data[0][2],self.recording_data[0][3])] + self.recording_data=rec_data + id = self._create_id(cr, uid, rec[3],rec[6]) + record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[6], id) + self.ids[(rec[3],result)] = id + record_list += record + return record_list,noupdate + def _generate_assert_xml(self, rec, doc): pass def generate_xml(self, cr, uid): # Create the minidom document - self.ids = {} - doc = minidom.Document() - terp = doc.createElement("openerp") - doc.appendChild(terp) - for rec in self.recording_data: - if rec[0]=='workflow': - rec_id,noupdate = self._get_id(cr, uid, rec[1][3], rec[1][5]) - if not rec_id: - continue - data = doc.createElement("data") - terp.appendChild(data) - wkf = doc.createElement('workflow') - data.appendChild(wkf) - wkf.setAttribute("model", rec[1][3]) - wkf.setAttribute("action", rec[1][4]) - if noupdate: - data.setAttribute("noupdate", "1") - wkf.setAttribute("ref", rec_id) - if rec[0]=='query': - res_list,noupdate = self._generate_object_xml(cr, uid, rec[1], rec[2], doc, rec[3]) - data = doc.createElement("data") - if noupdate: - data.setAttribute("noupdate", "1") - if res_list: + if len(self.recording_data): + self.ids = {} + doc = minidom.Document() + terp = doc.createElement("openerp") + doc.appendChild(terp) + for rec in self.recording_data: + if rec[0]=='workflow': + rec_id,noupdate = self._get_id(cr, uid, rec[1][3], rec[1][5]) + if not rec_id: + continue + data = doc.createElement("data") terp.appendChild(data) - for res in res_list: - data.appendChild(res) - elif rec[0]=='assert': - pass - res = doc.toprettyxml(indent="\t") - return doc.toprettyxml(indent="\t").encode('utf8') + wkf = doc.createElement('workflow') + data.appendChild(wkf) + wkf.setAttribute("model", rec[1][3]) + wkf.setAttribute("action", rec[1][4]) + if noupdate: + data.setAttribute("noupdate", "1") + wkf.setAttribute("ref", rec_id) + if rec[0]=='query': + res_list,noupdate = self._generate_object_xml(cr, uid, rec[1], rec[2], doc, rec[3]) + data = doc.createElement("data") + if noupdate: + data.setAttribute("noupdate", "1") + if res_list: + terp.appendChild(data) + for res in res_list: + data.appendChild(res) + elif rec[0]=='assert': + pass + res = doc.toprettyxml(indent="\t") + return doc.toprettyxml(indent="\t").encode('utf8') base_module_record() def fnct_call(fnct): @@ -209,6 +276,7 @@ def fnct_call(fnct): _old_args = args[5].copy() else: _old_args = None + db=args[0] res = fnct(*args, **argv) pool = pooler.get_pool(args[0]) mod = pool.get('ir.module.record') @@ -216,7 +284,8 @@ def fnct_call(fnct): if args[4] not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc'): if _old_args is not None: args[5].update(_old_args) - mod.recording_data.append(('query', args, argv,res)) + if args[5]: + mod.recording_data.append(('query', args, argv,res)) return res return execute diff --git a/addons/base_module_record/wizard/base_module_save.py b/addons/base_module_record/wizard/base_module_save.py index 9a3e103b9bd..da1da2a7895 100644 --- a/addons/base_module_record/wizard/base_module_save.py +++ b/addons/base_module_record/wizard/base_module_save.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -24,6 +24,11 @@ import wizard import osv import pooler +info = ''' +
+