From 55fa50891d070c8aca0c3b8901477816a82e9139 Mon Sep 17 00:00:00 2001
From: Samus CTO <cto@openerp.com>
Date: Tue, 25 Nov 2014 17:04:32 +0100
Subject: [PATCH] [FIX] Use _unknown model for missing models in relation
 fields

During a migration of database, it is possible that some custom field
("x_", state is 'manual') are relational to model from a module that is
not provided.

Note: this used to work in Odoo 7.0 but crashed in 8.0.

Closes #3877
---
 openerp/addons/base/ir/ir_model.py | 7 +++++++
 openerp/fields.py                  | 6 ++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py
index c50044d3ff99..96819f918dcb 100644
--- a/openerp/addons/base/ir/ir_model.py
+++ b/openerp/addons/base/ir/ir_model.py
@@ -62,6 +62,13 @@ def _in_modules(self, cr, uid, ids, field_name, arg, context=None):
         result[k] = ', '.join(sorted(installed_modules & set(xml_id.split('.')[0] for xml_id in v)))
     return result
 
+class unknown(models.AbstractModel):
+    """
+    Abstract model used as a substitute for relational fields with an unknown
+    comodel.
+    """
+    _name = '_unknown'
+
 class ir_model(osv.osv):
     _name = 'ir.model'
     _description = "Models"
diff --git a/openerp/fields.py b/openerp/fields.py
index 88a6fe8ef5f3..df9cb9a3f36e 100644
--- a/openerp/fields.py
+++ b/openerp/fields.py
@@ -1372,8 +1372,10 @@ class _Relational(Field):
 
     def _setup(self, env):
         super(_Relational, self)._setup(env)
-        assert self.comodel_name in env.registry, \
-            "Field %s with unknown comodel_name %r" % (self, self.comodel_name)
+        if self.comodel_name not in env.registry:
+            _logger.warning("Field %s with unknown comodel_name %r"
+                            % (self, self.comodel_name))
+            self.comodel_name = '_unknown'
 
     @property
     def _related_domain(self):
-- 
GitLab