From f9b1a4ebeab78ad8dc9bc38e9c77ff724250bf6e Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Fri, 1 Jul 2011 11:42:50 +0200 Subject: [PATCH] [MERGE] All modification from all import_project bzr revid: tfr@openerp.com-20110701094250-ce3wn9pjku3l3blq --- addons/import_base/__openerp__.py | 2 +- addons/import_base/import_base_view.xml | 6 ++++ addons/import_base/import_framework.py | 49 +++++++++++++++++++++++++------ addons/import_base/mapper.py | 14 +++++---- 4 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 addons/import_base/import_base_view.xml diff --git a/addons/import_base/__openerp__.py b/addons/import_base/__openerp__.py index 962541f..f244338 100644 --- a/addons/import_base/__openerp__.py +++ b/addons/import_base/__openerp__.py @@ -31,7 +31,7 @@ 'website': 'http://www.openerp.com', 'depends': ['base'], 'init_xml': [], - 'update_xml': [], + 'update_xml': ["import_base_view.xml"], 'demo_xml': [], 'test': [], #TODO provide test 'installable': True, diff --git a/addons/import_base/import_base_view.xml b/addons/import_base/import_base_view.xml new file mode 100644 index 0000000..f536e81 --- /dev/null +++ b/addons/import_base/import_base_view.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py index d041951..aa217ce 100644 --- a/addons/import_base/import_framework.py +++ b/addons/import_base/import_framework.py @@ -46,8 +46,11 @@ class import_framework(Thread): """ DO_NOT_FIND_DOMAIN = [('id', '=', 0)] + #TODO don't use context to pass credential parameters def __init__(self, obj, cr, uid, instance_name, module_name, email_to_notify=False, context=None): Thread.__init__(self) + #change this value to set another default field for unique ID in the external table + self.external_id_field = 'id' self.obj = obj self.cr = cr self.uid = uid @@ -58,8 +61,6 @@ class import_framework(Thread): self.table_list = [] self.initialize() - - """ Abstract Method to be implemented in the real instance @@ -78,6 +79,22 @@ class import_framework(Thread): """ return [{}] + def get_link(self, from_table, ids, to_table): + """ + @return: a dictionaries that contains the association between the id (from_table) + and the list (to table) of id linked + """ + return {} + + def get_external_id(self, data): + """ + @return the external id + the default implementation return self.external_id_field (that has 'id') by default + if the name of id field is different, you can overwrite this method or change the value + of self.external_id_field + """ + return data[self.external_id_field] + def get_mapping(self): """ @return: { TABLE_NAME : { @@ -154,7 +171,7 @@ class import_framework(Thread): for k, field_name in self_dependencies: data[k] = data.get(field_name) and self._generate_xml_id(data.get(field_name), table) - data['id_new'] = self._generate_xml_id(data['id'], table) + data['id_new'] = self._generate_xml_id(self.get_external_id(data), table) fields, values = self._fields_mapp(data, mapping, table) res.append(values) @@ -214,7 +231,6 @@ class import_framework(Thread): fields.append(key) value = val(dict(dict_sugar)) data_lst.append(value) - return fields, data_lst def _generate_xml_id(self, name, table): @@ -238,6 +254,7 @@ class import_framework(Thread): Check if the external id exist in the openerp database in order to check if the id exist the table where it come from should be provide + @return the xml_id generated if the external_id exist in the database or false """ if not external_id: return False @@ -297,7 +314,6 @@ class import_framework(Thread): domain_search = not domain_search and [('name', 'ilike', name)] or domain_search obj = self.obj.pool.get(model) xml_id = self._generate_xml_id(name, table) - xml_ref = self.mapped_id_if_exist(model, domain_search, table, name) fields.append('id') data.append(xml_id) @@ -342,7 +358,6 @@ class import_framework(Thread): """ - self.data_started = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.cr = pooler.get_db(self.cr.dbname).cursor() try: @@ -385,9 +400,9 @@ class import_framework(Thread): def _send_notification_email(self, result): if not self.email: - return + return False tools.email_send( - 'import_sugarcrm@module.openerp', + 'import@module.openerp', self.email, self.get_email_subject(result), self.get_email_body(result), @@ -431,4 +446,20 @@ class import_framework(Thread): """ return "The import of data \n instance name : %s \n" % self.instance_name -#For example of use see import_sugarcrm \ No newline at end of file + + #TODO documentation test + def run_test(self): + back_get_data = self.get_data + back_get_link = self.get_link + self.get_data = self.get_data_test + self.get_link = self.get_link_test + self.run() + self.get_data = back_get_data + self.get_link = back_get_link + + + def get_data_test(self, table): + return [{}] + + def get_link_test(self, from_table, ids, to_table): + return {} diff --git a/addons/import_base/mapper.py b/addons/import_base/mapper.py index 582a45e..4f34712 100644 --- a/addons/import_base/mapper.py +++ b/addons/import_base/mapper.py @@ -57,7 +57,7 @@ class concat(mapper): self.delimiter = delimiter and delimiter.get('delimiter', ' ') or ' ' def __call__(self, external_values): - return self.delimiter.join(map(lambda x : external_values.get(x,''), self.arg)) + return self.delimiter.join(map(lambda x : str(external_values.get(x,'')), self.arg)) class ppconcat(mapper): """ @@ -71,7 +71,7 @@ class ppconcat(mapper): self.delimiter = delimiter and delimiter.get('delimiter', ' ') or '\n\n' def __call__(self, external_values): - return self.delimiter.join(map(lambda x : x + ": " + external_values.get(x,''), self.arg)) + return self.delimiter.join(map(lambda x : x + ": " + str(external_values.get(x,'')), self.arg)) class const(mapper): """ @@ -94,12 +94,16 @@ class value(mapper): and don't care about the name of the field call(self.method, value('field1')) """ - def __init__(self, val, default=''): + def __init__(self, val, default='', fallback=False): self.val = val self.default = default + self.fallback = fallback def __call__(self, external_values): - return external_values.get(self.val, self.default) + val = external_values.get(self.val, self.default) + if self.fallback and (not val or val == self.default): + val = external_values.get(self.fallback, self.default) + return val class map_val(mapper): """ @@ -163,5 +167,3 @@ class call(mapper): else: args.append(arg) return self.fun(external_values, *args) - - \ No newline at end of file -- 1.7.10.4