From 1d470e1c8cc4ada54baf35285c952b149f6983bb Mon Sep 17 00:00:00 2001
From: "tfr@openerp.com" <>
Date: Mon, 16 May 2011 11:22:59 +0200
Subject: [PATCH 1/3] [IMP] run in a different thread, don't freezee the
client, email notification + begin of error handling
bzr revid: tfr@openerp.com-20110516092259-m7j07g2k9mbypakk
---
addons/import_base/import_framework.py | 77 +++++++++++++++++++++-----
1 file changed, 62 insertions(+), 15 deletions(-)
diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py
index febfbb68d44..b2b0c9a7494 100644
--- a/addons/import_base/import_framework.py
+++ b/addons/import_base/import_framework.py
@@ -20,12 +20,20 @@
##############################################################################
import pprint
import mapper
+import pooler
+import tools
+
+
+from threading import Thread
+import datetime
+from reportlab.lib import logger
+import logging
pp = pprint.PrettyPrinter(indent=4)
-class import_framework():
+class import_framework(Thread):
"""
This class should be extends,
get_data and get_mapping have to extends
@@ -39,13 +47,15 @@ class import_framework():
"""
DO_NOT_FIND_DOMAIN = [('id', '=', 0)]
- def __init__(self, obj, cr, uid, instance_name, module_name, context):
+ def __init__(self, obj, cr, uid, instance_name, module_name, email_to_notify, context):
+ Thread.__init__(self)
self.obj = obj
self.cr = cr
self.uid = uid
self.instance_name = instance_name
self.module_name = module_name
self.context = context or {}
+ self.email = email_to_notify
self.initialize()
@@ -115,7 +125,7 @@ class import_framework():
res = hook(val)
if res:
final_data.append(res)
- self._save_data(model, map, final_data, table)
+ return self._save_data(model, map, final_data, table)
def _save_data(self, model, mapping, datas, table):
"""
@@ -149,9 +159,10 @@ class import_framework():
if not model_obj:
raise ValueError("%s is not a valid model name" % model)
- model_obj.import_data(self.cr, self.uid, fields, res, mode='update', current_module=self.module_name, noupdate=True, context=self.context)
+ (p, r, warning, s) = model_obj.import_data(self.cr, self.uid, fields, res, mode='update', current_module=self.module_name, noupdate=True, context=self.context)
for field in self_dependencies:
self._import_self_dependencies(model_obj, field, datas)
+ return (len(res), warning)
def _import_self_dependencies(self, obj, parent_field, datas):
"""
@@ -313,22 +324,38 @@ class import_framework():
return False
- def import_all(self, table_list):
+ def set_table_list(self, table_list):
+ self.table_list = table_list
+
+ def run(self):
"""Import all data into openerp,
this is the Entry point to launch the process of import
@param table_list: the list of external table to import
['Leads', 'Opportunity']
"""
- imported = set() #to invoid importing 2 times the sames modules
- for table in table_list:
- to_import = self.get_mapping()[table].get('import', True)
- if not table in imported:
- self._resolve_dependencies(self.get_mapping()[table].get('dependencies', []), imported)
- if to_import:
- self._import_table(table)
- imported.add(table)
-
+
+ self.data_started = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.cr = pooler.get_db(self.cr.dbname).cursor()
+ try:
+ result = []
+ imported = set() #to invoid importing 2 times the sames modules
+ for table in self.table_list:
+ to_import = self.get_mapping()[table].get('import', True)
+ if not table in imported:
+ self._resolve_dependencies(self.get_mapping()[table].get('dependencies', []), imported)
+ if to_import:
+ (position, warning) = self._import_table(table)
+ result.append((table, position, warning))
+ imported.add(table)
+ self.cr.commit()
+
+ finally:
+ self.cr.close()
+ self.date_ended = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self._send_notification_email(result)
+
+
def _resolve_dependencies(self, dep, imported):
"""
import dependencies recursively
@@ -341,8 +368,28 @@ class import_framework():
if to_import:
self._import_table(dependency)
imported.add(dependency)
+
+ def _send_notification_email(self, result):
+ subject = "Openerp has finish to import your data at %s" % self.date_ended
+ tools.email_send(
+ 'import_sugarcrm@module.openerp',
+ self.email,
+ subject,
+ self._get_email_body(result),
+ )
+ logger = logging.getLogger('import_sugarcam')
+ logger.info("Import finished, notification email sended")
-
+ def _get_email_body(self, result):
+ header = "The import of sugarcrm data \n instance name : %s \n started at %s is finished at %s" % (self.instance_name, self.data_started, self.date_ended)
+ body = ""
+ for (table, nb, warning) in result:
+ if not warning:
+ warning = "with no warning"
+ else:
+ warning = "with warning : %s" % warning
+ body += "%s records were imported from table %s, %s \n" % (nb, table, warning)
+ return header + "\n\n" + body
class dummy_import(import_framework):
From 63f989735f04a32e64fe6b3a6c2d478e523f7a89 Mon Sep 17 00:00:00 2001
From: "tfr@openerp.com" <>
Date: Mon, 16 May 2011 11:32:16 +0200
Subject: [PATCH 2/3] [FIX] email to notify not required
bzr revid: tfr@openerp.com-20110516093216-iu61m6xlx1vi4i47
---
addons/import_base/import_framework.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py
index b2b0c9a7494..0e4f4c00b7f 100644
--- a/addons/import_base/import_framework.py
+++ b/addons/import_base/import_framework.py
@@ -47,7 +47,7 @@ class import_framework(Thread):
"""
DO_NOT_FIND_DOMAIN = [('id', '=', 0)]
- def __init__(self, obj, cr, uid, instance_name, module_name, email_to_notify, context):
+ def __init__(self, obj, cr, uid, instance_name, module_name, email_to_notify=False, context=None):
Thread.__init__(self)
self.obj = obj
self.cr = cr
@@ -370,6 +370,8 @@ class import_framework(Thread):
imported.add(dependency)
def _send_notification_email(self, result):
+ if not self.email:
+ return
subject = "Openerp has finish to import your data at %s" % self.date_ended
tools.email_send(
'import_sugarcrm@module.openerp',
From 1ba0c607f48d99843c9387555b5d72a558a02d96 Mon Sep 17 00:00:00 2001
From: "tfr@openerp.com" <>
Date: Mon, 16 May 2011 11:35:47 +0200
Subject: [PATCH 3/3] [add] email notification example
bzr revid: tfr@openerp.com-20110516093547-6x3wjq1sjfymer1z
---
addons/import_base/import_framework.py | 4 ++--
addons/import_sugarcrm/import_sugarcrm.py | 5 +++--
addons/import_sugarcrm/wizard/import_message_view.xml | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py
index 0e4f4c00b7f..097cff211ec 100644
--- a/addons/import_base/import_framework.py
+++ b/addons/import_base/import_framework.py
@@ -370,8 +370,8 @@ class import_framework(Thread):
imported.add(dependency)
def _send_notification_email(self, result):
- if not self.email:
- return
+ if not self.email:
+ return
subject = "Openerp has finish to import your data at %s" % self.date_ended
tools.email_send(
'import_sugarcrm@module.openerp',
diff --git a/addons/import_sugarcrm/import_sugarcrm.py b/addons/import_sugarcrm/import_sugarcrm.py
index 3a6592318ac..009b25abbbd 100644
--- a/addons/import_sugarcrm/import_sugarcrm.py
+++ b/addons/import_sugarcrm/import_sugarcrm.py
@@ -540,8 +540,9 @@ class import_sugarcrm(osv.osv):
# """Import all sugarcrm data into openerp module"""
keys = self.get_key(cr, uid, ids, context)
- imp = sugar_import(self, cr, uid, "sugarcrm", "import_sugarcrm", context)
- imp.import_all(keys)
+ imp = sugar_import(self, cr, uid, "sugarcrm", "import_sugarcrm", ["tfr@openerp.com"], context)
+ imp.set_table_list(keys)
+ imp.start()
obj_model = self.pool.get('ir.model.data')
model_data_ids = obj_model.search(cr,uid,[('model','=','ir.ui.view'),('name','=','import.message.form')])
diff --git a/addons/import_sugarcrm/wizard/import_message_view.xml b/addons/import_sugarcrm/wizard/import_message_view.xml
index ac619ef428d..a3ec860e728 100644
--- a/addons/import_sugarcrm/wizard/import_message_view.xml
+++ b/addons/import_sugarcrm/wizard/import_message_view.xml
@@ -9,7 +9,7 @@
form