Forward port of branch saas-3 up to fc9fc3e
[odoo/odoo.git] / openerp / addons / base / ir / ir_translation.py
index 15c0a2a..9e0dd5e 100644 (file)
@@ -79,6 +79,15 @@ class ir_translation_import_cursor(object):
         """Feed a translation, as a dictionary, into the cursor
         """
         params = dict(trans_dict, state="translated" if trans_dict['value'] else "to_translate")
+
+        if params['type'] == 'view':
+            # ugly hack for QWeb views - pending refactoring of translations in master
+            if params['imd_model'] == 'website':
+                params['imd_model'] = "ir.ui.view"
+            # non-QWeb views do not need a matching res_id -> force to 0 to avoid dropping them
+            elif params['res_id'] is None:
+                params['res_id'] = 0
+
         self._cr.execute("""INSERT INTO %s (name, lang, res_id, src, type, imd_model, module, imd_name, value, state, comments)
                             VALUES (%%(name)s, %%(lang)s, %%(res_id)s, %%(src)s, %%(type)s, %%(imd_model)s, %%(module)s,
                                     %%(imd_name)s, %%(value)s, %%(state)s, %%(comments)s)""" % self._table_name,
@@ -99,15 +108,14 @@ class ir_translation_import_cursor(object):
             FROM ir_model_data AS imd
             WHERE ti.res_id IS NULL
                 AND ti.module IS NOT NULL AND ti.imd_name IS NOT NULL
-
                 AND ti.module = imd.module AND ti.imd_name = imd.name
                 AND ti.imd_model = imd.model; """ % self._table_name)
 
         if self._debug:
-            cr.execute("SELECT module, imd_model, imd_name FROM %s " \
+            cr.execute("SELECT module, imd_name, imd_model FROM %s " \
                 "WHERE res_id IS NULL AND module IS NOT NULL" % self._table_name)
             for row in cr.fetchall():
-                _logger.debug("ir.translation.cursor: missing res_id for %s. %s/%s ", *row)
+                _logger.info("ir.translation.cursor: missing res_id for %s.%s <%s> ", *row)
 
         # Records w/o res_id must _not_ be inserted into our db, because they are
         # referencing non-existent data.
@@ -169,11 +177,11 @@ class ir_translation(osv.osv):
             else:
                 model_name, field = record.name.split(',')
                 model = self.pool.get(model_name)
-                if model and model.exists(cr, uid, record.res_id, context=context):
+                if model is not None:
                     # Pass context without lang, need to read real stored field, not translation
                     context_no_lang = dict(context, lang=None)
-                    result = model.read(cr, uid, record.res_id, [field], context=context_no_lang)
-                    res[record.id] = result[field] if result else False
+                    result = model.read(cr, uid, [record.res_id], [field], context=context_no_lang)
+                    res[record.id] = result[0][field] if result else False
         return res
 
     def _set_src(self, cr, uid, id, name, value, args, context=None):
@@ -289,6 +297,31 @@ class ir_translation(osv.osv):
                 })
         return len(ids)
 
+    def _get_source_query(self, cr, uid, name, types, lang, source, res_id):
+        if source:
+            query = """SELECT value
+                       FROM ir_translation
+                       WHERE lang=%s
+                        AND type in %s
+                        AND src=%s"""
+            params = (lang or '', types, tools.ustr(source))
+            if res_id:
+                query += " AND res_id=%s"
+                params += (res_id,)
+            if name:
+                query += " AND name=%s"
+                params += (tools.ustr(name),)
+        else:
+            query = """SELECT value
+                       FROM ir_translation
+                       WHERE lang=%s
+                        AND type in %s
+                        AND name=%s"""
+
+            params = (lang or '', types, tools.ustr(name))
+        
+        return (query, params)
+
     @tools.ormcache(skiparg=3)
     def _get_source(self, cr, uid, name, types, lang, source=None, res_id=None):
         """
@@ -311,27 +344,10 @@ class ir_translation(osv.osv):
             return tools.ustr(source or '')
         if isinstance(types, basestring):
             types = (types,)
-        if source:
-            query = """SELECT value
-                       FROM ir_translation
-                       WHERE lang=%s
-                        AND type in %s
-                        AND src=%s"""
-            params = (lang or '', types, tools.ustr(source))
-            if res_id:
-                query += "AND res_id=%s"
-                params += (res_id,)
-            if name:
-                query += " AND name=%s"
-                params += (tools.ustr(name),)
-            cr.execute(query, params)
-        else:
-            cr.execute("""SELECT value
-                          FROM ir_translation
-                          WHERE lang=%s
-                           AND type in %s
-                           AND name=%s""",
-                    (lang or '', types, tools.ustr(name)))
+        
+        query, params = self._get_source_query(cr, uid, name, types, lang, source, res_id)
+        
+        cr.execute(query, params)
         res = cr.fetchone()
         trad = res and res[0] or u''
         if source and not trad: