summaryrefslogtreecommitdiff
path: root/addons/import_base/import_framework.py
diff options
context:
space:
mode:
authortfr@openerp.com <>2011-07-13 15:56:04 +0200
committertfr@openerp.com <>2011-07-13 15:56:04 +0200
commit43e1fa4c54356cac2b4040e6077b5d1c6cb93dec (patch)
tree64239805637e0e256843ebe23fb8501d8a717ade /addons/import_base/import_framework.py
parent212cc3c6038ad9c880dcd560c685909463b03c73 (diff)
parent23b3ecc1984f189eb0a4ec07d1f9b78da485bb01 (diff)
[MERGE] backlog correction by atp team + error reporting + soft dependency, if the module is not installed, ignore data
bzr revid: tfr@openerp.com-20110713135604-i4ydmqmyjt65e5f9
Diffstat (limited to 'addons/import_base/import_framework.py')
-rw-r--r--addons/import_base/import_framework.py62
1 files changed, 42 insertions, 20 deletions
diff --git a/addons/import_base/import_framework.py b/addons/import_base/import_framework.py
index b6d22f42012..6f350dfb97a 100644
--- a/addons/import_base/import_framework.py
+++ b/addons/import_base/import_framework.py
@@ -22,11 +22,13 @@ import pprint
import mapper
import pooler
import tools
-
+from tools.translate import _
from threading import Thread
import datetime
import logging
+import StringIO
+import traceback
pp = pprint.PrettyPrinter(indent=4)
@@ -58,6 +60,7 @@ class import_framework(Thread):
self.context = context or {}
self.email = email_to_notify
self.table_list = []
+ self.logger = logging.getLogger('import_framework')
"""
Abstract Method to be implemented in
@@ -175,8 +178,9 @@ class import_framework(Thread):
model_obj = self.obj.pool.get(model)
if not model_obj:
- raise ValueError("%s is not a valid model name" % model)
-
+ raise ValueError(_("%s is not a valid model name") % model)
+ self.logger.debug(_("fields imported : "))
+ self.logger.debug(fields)
(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, field_name) in self_dependencies:
self._import_self_dependencies(model_obj, field, datas)
@@ -311,6 +315,9 @@ class import_framework(Thread):
"""
domain_search = not domain_search and [('name', 'ilike', name)] or domain_search
obj = self.obj.pool.get(model)
+ if not obj: #if the model doesn't exist
+ return False
+
xml_id = self._generate_xml_id(name, table)
xml_ref = self.mapped_id_if_exist(model, domain_search, table, name)
fields.append('id')
@@ -359,6 +366,7 @@ 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()
+ error = False
try:
self.initialize()
result = []
@@ -369,16 +377,22 @@ class import_framework(Thread):
res = self._resolve_dependencies(self.get_mapping()[table].get('dependencies', []), imported)
result.extend(res)
if to_import:
+ self.logger.debug(_("import : ") + table )
(position, warning) = self._import_table(table)
result.append((table, position, warning))
imported.add(table)
self.cr.commit()
-
+
+ except Exception, err:
+ sh = StringIO.StringIO()
+ traceback.print_exc(file=sh)
+ error = sh.getvalue()
+ print error
finally:
self.cr.close()
+
self.date_ended = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- self._send_notification_email(result)
-
+ self._send_notification_email(result, error)
def _resolve_dependencies(self, dep, imported):
"""
@@ -392,26 +406,29 @@ class import_framework(Thread):
res = self._resolve_dependencies(self.get_mapping()[dependency].get('dependencies', []), imported)
result.extend(res)
if to_import:
+ self.logger.debug("import dependency : " + dependency)
r = self._import_table(dependency)
(position, warning) = r
result.append((dependency, position, warning))
imported.add(dependency)
return result
- def _send_notification_email(self, result):
- if not self.email:
+ def _send_notification_email(self, result, error):
+ if not self.email or not self.email[0]:
return False
tools.email_send(
'import@module.openerp',
self.email,
- self.get_email_subject(result),
- self.get_email_body(result),
+ self.get_email_subject(result, error),
+ self.get_email_body(result, error),
)
- logger = logging.getLogger('import_sugarcam')
- logger.info("Import finished, notification email sended")
+ if error:
+ self.logger.error(_("Import failed due to an unexpected error"))
+ else:
+ self.logger.info(_("Import finished, notification email sended"))
- def get_email_subject(self, result):
+ def get_email_subject(self, result, error=False):
"""
This method define the subject of the email send by openerp at the end of import
@param result: a list of tuple
@@ -419,9 +436,11 @@ class import_framework(Thread):
@return the subject of the mail
"""
- return "Import of your data finished at %s" % self.date_ended
+ if error:
+ return _("Data Import failed at %s due to an unexpected error") % self.date_ended
+ return _("Import of your data finished at %s") % self.date_ended
- def get_email_body(self, result):
+ def get_email_body(self, result, error=False):
"""
This method define the body of the email send by openerp at the end of import. The body is separated in two part
the header (@see get_body_header), and the generate body with the list of table and number of record imported.
@@ -432,20 +451,23 @@ class import_framework(Thread):
"""
- body = "started at %s and finished at %s \n" % (self.data_started, self.date_ended)
+ body = _("started at %s and finished at %s \n") % (self.data_started, self.date_ended)
+ if error:
+ body += _("but failed, in consequence no data were imported to keep database consistency \n error : \n") + error
+
for (table, nb, warning) in result:
if not warning:
- warning = "with no warning"
+ warning = _("with no warning")
else:
- warning = "with warning : %s" % warning
- body += "%s records were imported from table %s, %s \n" % (nb, table, warning)
+ warning = _("with warning : %s") % warning
+ body += _("%s records were imported from table %s, %s \n") % (nb, table, warning)
return self.get_body_header(result) + "\n\n" + body
def get_body_header(self, result):
"""
@return the first sentences written in the mail's body
"""
- return "The import of data \n instance name : %s \n" % self.instance_name
+ return _("The import of data \n instance name : %s \n") % self.instance_name
#TODO documentation test