[MERGE] All modification from all import_project
authortfr@openerp.com <>
Fri, 1 Jul 2011 09:42:50 +0000 (11:42 +0200)
committertfr@openerp.com <>
Fri, 1 Jul 2011 09:42:50 +0000 (11:42 +0200)
bzr revid: tfr@openerp.com-20110701094250-ce3wn9pjku3l3blq

addons/import_base/__openerp__.py
addons/import_base/import_base_view.xml [new file with mode: 0644]
addons/import_base/import_framework.py
addons/import_base/mapper.py

index 962541f..f244338 100644 (file)
@@ -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 (file)
index 0000000..f536e81
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+               <menuitem name="Import" id="menu_import" parent="base.menu_base_partner"/>
+       </data>
+</openerp>
\ No newline at end of file
index d041951..aa217ce 100644 (file)
@@ -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 {}
index 582a45e..4f34712 100644 (file)
@@ -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