72
72
e.ownerDocument = xdoc
77
class record(yaml.YAMLObject):
79
def __init__(self, model, id=None, attrs={}):
84
return '!record {model: %s, id: %s}:' % (str(self.model,), str(self.id,))
86
class workflow(yaml.YAMLObject):
87
yaml_tag = u'!workflow'
88
def __init__(self, model, action, ref=None):
93
return '!workflow {model: %s, action: %s, ref: %s}' % (str(self.model,), str(self.action,), str(self.ref,))
95
class ref(yaml.YAMLObject):
97
def __init__(self, expr="False"):
100
return 'ref(%s)' % (str(self.expr,))
102
class eval(yaml.YAMLObject):
104
def __init__(self, expr="False"):
107
return 'eval(%s)' % (str(self.expr,))
75
109
class base_module_record(osv.osv):
76
110
_name = "ir.module.record"
105
139
dt = self.pool.get('ir.model.data')
106
140
dtids = dt.search(cr, uid, [('model','=',model), ('res_id','=',id)])
109
143
obj = dt.browse(cr, uid, dtids[0])
110
144
self.depends[obj.module] = True
111
145
return obj.module+'.'+obj.name, obj.noupdate
113
147
def _create_record(self, cr, uid, doc, model, data, record_id, noupdate=False):
149
data_pool = self.pool.get('ir.model.data')
150
model_pool = self.pool.get(model)
114
152
record = doc.createElement('record')
115
153
record.setAttribute("id", record_id)
116
154
record.setAttribute("model", model)
117
155
record_list = [record]
118
lids = self.pool.get('ir.model.data').search(cr, uid, [('model','=',model)])
119
res = self.pool.get('ir.model.data').read(cr, uid, lids[:1], ['module'])
156
lids = data_pool.search(cr, uid, [('model','=',model)])
157
res = data_pool.read(cr, uid, lids[:1], ['module'])
121
159
self.depends[res[0]['module']]=True
122
fields = self.pool.get(model).fields_get(cr, uid)
160
fields = model_pool.fields_get(cr, uid)
123
161
for key,val in data.items():
124
162
if not (val or (fields[key]['type']=='boolean')):
142
180
id,update = self._get_id(cr, uid, fields[key]['relation'], val)
143
181
noupdate = noupdate or update
183
relation_pool = self.pool.get(fields[key]['relation'])
145
185
field.setAttribute("model", fields[key]['relation'])
146
fld_nm = self.pool.get(fields[key]['relation'])._rec_name
147
name = self.pool.get(fields[key]['relation']).read(cr, uid, val,[fld_nm])[fld_nm] or False
186
fld_nm = relation_pool._rec_name
187
name = relation_pool.read(cr, uid, val,[fld_nm])[fld_nm] or False
148
188
field.setAttribute("search", str([(str(fld_nm) ,'=', name)]))
150
190
field.setAttribute("ref", id)
189
229
return record_list, noupdate
231
def _create_yaml_record(self, cr, uid, model, data, record_id):
232
record={'model': model, 'id': str(record_id)}
234
model_pool = self.pool.get(model)
235
data_pool = self.pool.get('ir.model.data')
237
lids = data_pool.search(cr, uid, [('model','=',model)])
238
res = data_pool.read(cr, uid, lids[:1], ['module'])
241
self.depends[res[0]['module']]=True
242
fields = model_pool.fields_get(cr, uid)
244
defaults[model] = model_pool.default_get(cr, uid, data)
245
for key,val in data.items():
246
if ((key in defaults[model]) and (val == defaults[model][key])) and not(fields[key].get('required',False)):
248
if not (val or (fields[key]['type']=='boolean')):
250
elif fields[key]['type'] in ('boolean',):
254
elif fields[key]['type'] in ('integer','float'):
256
elif fields[key]['type'] in ('many2one',):
257
if type(val) in (type(''), type(u'')):
260
id, update = self._get_id(cr, uid, fields[key]['relation'], val)
262
elif fields[key]['type'] in ('one2many',):
264
for valitem in (val or []):
265
if valitem[0] in (0,1):
266
if key in model_pool._columns:
267
fname = model_pool._columns[key]._fields_id
269
fname = model_pool._inherit_fields[key][2]._fields_id
270
valitem[2][fname] = record_id
271
newid,update = self._get_id(cr, uid, fields[key]['relation'], valitem[1])
273
newid = self._create_id(cr, uid, fields[key]['relation'], valitem[2])
274
self.ids[(fields[key]['relation'], valitem[1])] = newid
275
childrecord = self._create_yaml_record(cr, uid, fields[key]['relation'],valitem[2], newid)
276
items[0].append(childrecord['attrs'])
278
elif fields[key]['type'] in ('many2many',):
279
if (key in defaults[model]) and (val[0][2] == defaults[model][key]):
282
for valitem in (val or []):
284
for id2 in valitem[2]:
285
id,update = self._get_id(cr, uid, fields[key]['relation'], id2)
286
self.ids[(fields[key]['relation'],id2)] = id
292
val=val.replace('"','\'')
296
attrs[key]=tools.ustr(val)
297
record['attrs'] = attrs
191
300
def get_copy_data(self, cr, uid, model, id, result):
193
302
obj=self.pool.get(model)
272
381
noupdate = noupdate or update
273
382
record_list += record
275
elif rec[4]=='create':
276
id = self._create_id(cr, uid, rec[3],rec[5])
277
record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[5], id)
384
elif rec[3]=='create':
385
id = self._create_id(cr, uid, rec[2],rec[4])
386
record,noupdate = self._create_record(cr, uid, doc, rec[2], rec[4], id)
278
387
self.ids[(rec[3], result)] = id
279
388
record_list += record
282
data=self.get_copy_data(cr,uid,rec[3],rec[5],rec[6])
283
copy_rec=(rec[0],rec[1],rec[2],rec[3],rec[4],rec[5],data,rec[7])
391
data=self.get_copy_data(cr,uid,rec[2],rec[4],rec[5])
392
copy_rec=(rec[0],rec[1],rec[2],rec[3],rec[4],data,rec[5])
285
394
rec_data=[(self.recording_data[0][0],rec,self.recording_data[0][2],self.recording_data[0][3])]
286
395
self.recording_data=rec_data
287
id = self._create_id(cr, uid, rec[3],rec[6])
288
record,noupdate = self._create_record(cr, uid, doc, rec[3], rec[6], id)
289
self.ids[(rec[3], result)] = id
396
id = self._create_id(cr, uid, rec[2],rec[5])
397
record,noupdate = self._create_record(cr, uid, doc, rec[2], rec[5], id)
398
self.ids[(rec[2], result)] = id
290
399
record_list += record
292
401
return record_list,noupdate
403
def _generate_object_yaml(self, cr, uid, rec, result=None):
404
if self.mode=="create":
405
id = self._create_id(cr, uid, rec[2],rec[4])
406
self.ids[(rec[2], result)] = id
407
record = self._create_yaml_record(cr, uid, rec[2], rec[4], id)
409
if self.mode=="workflow":
410
id,update = self._get_id(cr, uid, rec[2], rec[4])
412
data['model'] = rec[2]
413
data['action'] = rec[3]
416
if self.mode=="write":
417
id,update = self._get_id(cr, uid, rec[2],rec[4][0])
418
record = self._create_yaml_record(cr, uid, rec[2], rec[5], id)
420
data=self.get_copy_data(cr,uid,rec[2],rec[4],rec[5])
421
copy_rec=(rec[0],rec[1],rec[2],rec[3],rec[4],data,rec[5])
423
rec_data=[(self.recording_data[0][0],rec,self.recording_data[0][2],self.recording_data[0][3])]
424
self.recording_data=rec_data
425
id = self._create_id(cr, uid, rec[2],rec[5])
426
record = self._create_yaml_record(cr, uid, str(rec[2]), rec[5], id)
427
self.ids[(rec[2], result)] = id
294
430
def _generate_assert_xml(self, rec, doc):
327
463
elif rec[0]=='assert':
329
465
return doc.toprettyxml(indent="\t").encode('utf-8')
467
def generate_yaml(self, cr, uid):
469
if len(self.recording_data):
472
for rec in self.recording_data:
473
if rec[1][3] == 'create':
475
elif rec[1][3] == 'write':
477
elif rec[1][3] == 'copy':
479
elif rec[0] == 'workflow':
483
if self.mode == "workflow":
484
record= self._generate_object_yaml(cr, uid, rec[1],rec[0])
485
object=yaml.load(unicode('''\n !workflow %s \n'''%record,'iso-8859-1'))
486
yaml_file += str(object) + '''\n'''
488
record= self._generate_object_yaml(cr, uid, rec[1],rec[3])
489
object= yaml.load(unicode('''\n !record %s \n'''%record,'iso-8859-1'))
490
yaml_file += str(object) + '''\n'''
491
attrs=yaml.dump(object.attrs, default_flow_style=False)
492
yaml_file += attrs + '''\n\n'''
495
for line in yaml_file.split('\n'):
496
line=line.replace("''","'")
497
if line.find('!record') == 0:
498
line = "- \n" + " " + line
499
elif line.find('!workflow') == 0:
500
line = "- \n" + " " + line
501
elif line.find('- -') != -1:
502
line=line.replace('- -',' -')
506
yaml_result += line + '''\n'''
330
510
base_module_record()
331
511
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: