[IMP] EDI: introduce new methods in edi class

edi_import_relation: create record of relation object if does not match with relation value
edi_xml_id: generate xml id with unique db id. create record of ir.model.data if xml id is not found for particular record.

bzr revid: hmo@tinyerp.com-20110627122145-v2d2wtkjut68rcba
This commit is contained in:
Harry (OpenERP)
2011-06-27 17:51:45 +05:30
parent 5ac271fa1f
commit 25dcd09489
+37 -37
View File
@@ -190,6 +190,22 @@ class edi(object):
Classes that inherit from this mixin class should override the
``edi_import()`` and ``edi_export()`` methods to implement their
specific behavior, based on the primitives provided by this superclass."""
def edi_xml_id(self, cr, uid, record, context=None):
model_data_pool = self.pool.get('ir.model.data')
uuid = safe_unique_id(record._name, record.id)
data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)])
if len(data_ids):
xml_record_id = data_ids[0]
else:
xml_record_id = model_data_pool.create(cr, uid, {
'name': uuid,
'model': record._name,
'module': edi_module,
'res_id': record.id}, context=context)
xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context)
db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name)
return db_uuid
def edi_metadata(self, cr, uid, records, context=None):
"""Return a list representing the boilerplate EDI structure for
@@ -206,7 +222,6 @@ class edi(object):
"""
if context is None:
context = {}
model_data_pool = self.pool.get('ir.model.data')
data_ids = []
attachment_object = self.pool.get('ir.attachment')
edi_dict_list = []
@@ -230,21 +245,7 @@ class edi(object):
})
data_ids = model_data_pool.search(cr, uid, [('res_id','=',record.id),('model','=',record._name)])
uuid = safe_unique_id(record._name, record.id)
if len(data_ids):
xml_record_id = data_ids[0]
else:
xml_record_id = model_data_pool.create(cr, uid, {
'name': uuid,
'model': record._name,
'module': edi_module,
'res_id': record.id}, context=context)
xml_record = model_data_pool.browse(cr, uid, xml_record_id, context=context)
db_uuid = '%s:%s.%s' % (uuid, xml_record.module, xml_record.name)
db_uuid = self.edi_xml_id(cr, uid, record, context=context)
edi_dict = {
'__id': db_uuid,
'__last_update': False, #record.write_date, #TODO: convert into UTC
@@ -267,20 +268,13 @@ class edi(object):
Exmaple: ['db-uuid:xml-id', 'Partner Name']
"""
# generic implementation!
data_object = self.pool.get('ir.model.data')
db_uuid = safe_unique_id(record._name, record.id)
xml_ids = data_object.search(cr, uid, [('model','=',record._name),('res_id','=',record.id)])
if xml_ids:
xml_id = data_object.browse(cr, uid, xml_ids[0], context=context)
xml_id = '%s.%s' %(xml_id.module, xml_id.name)
else:
xml_id = record._name
db_uuid = '%s:%s' %(db_uuid, xml_id)
name = record.name
db_uuid = self.edi_xml_id(cr, uid, record, context=context)
relation_model_pool = self.pool.get(record._name)
name = relation_model_pool.name_get(cr, uid, [record.id], context=context)
name = name and name[0][1] or False
return [db_uuid, name]
def edi_o2m(self, cr, uid, records, context=None):
def edi_o2m(self, cr, uid, records, edi_struct=None, context=None):
"""Return a list representing a O2M EDI value for
the browse_records from the given browse_record_list.
@@ -301,7 +295,7 @@ class edi(object):
for record in records:
model_obj = self.pool.get(record._name)
dict_list += model_obj.edi_export(cr, uid, [record], context=ctx)
dict_list += model_obj.edi_export(cr, uid, [record], edi_struct=edi_struct, context=ctx)
return dict_list
@@ -368,12 +362,22 @@ class edi(object):
elif cols['type'] == 'many2many':
value = self.edi_m2m(cr, uid, record, context=context)
elif cols['type'] == 'one2many':
value = self.edi_o2m(cr, uid, record, context=context )
value = self.edi_o2m(cr, uid, record, edi_struct=edi_struct.get(field, {}), context=context )
else:
value = record
edi_dict[field] = value
edi_dict_list.append(edi_dict)
return edi_dict_list
def edi_import_relation(self, cr, uid, relation_model, relation_value, values={}, context=None):
relation_object = self.pool.get(relation_model)
relation_ids = relation_object.name_search(cr, uid, relation_value, context=context)
if relation_ids and len(relation_ids) == 1:
relation_id = relation_ids[0][0]
else:
values.update({'name': relation_value})
relation_id = relation_object.create(cr, uid, values, context=context)
return relation_id
def edi_import(self, cr, uid, edi_document, context=None):
@@ -465,13 +469,9 @@ class edi(object):
#multiple results are found, go to next step.
#Create the new record using the only field value that is known: the
#name, and create the ir.model.data entry to map to it.
relation_object = self.pool.get(_fields[field]['relation'])
relation_ids = relation_object.search(cr, uid, [('name','=',edi_parent_document[1])])
if relation_ids and len(relation_ids) == 1:
relation_id = relation_ids[0]
else:
relation_id = relation_object.create(cr, uid, {'name': edi_parent_document[1]}, context=context)
relation_model = _fields[field]['relation']
relation_id = self.edi_import_relation(cr, uid, relation_model, edi_parent_document[1], context=context)
relation_object = self.pool.get(relation_model)
model_data.create(cr, uid, {
'name': xml_id,
'model': relation_object._name,