From 2569f4dd5201f3cd3803810bdea8f4eb26fe85e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 11 Feb 2017 19:08:52 +0100 Subject: [PATCH] Allow Many2One on ModelSQL to target ModelStorage issue6237 review26081002 --- CHANGELOG | 1 + trytond/model/modelsql.py | 15 ++++++++++----- trytond/tests/__init__.py | 2 ++ trytond/tests/test.py | 17 +++++++++++++++-- trytond/tests/test_fields.py | 12 ++++++++++++ 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2a3028d62f..6381d1b567 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Allow Many2One on ModelSQL to target ModelStorage * Manage Cache in Transaction * Allow to register multiple exit functions on Transaction * Return 429 status when too many login attempts diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index d5388dc0d0..f1378f8f16 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -186,17 +186,22 @@ class ModelSQL(ModelStorage): if isinstance(field, fields.Many2One): if field.model_name in ('res.user', 'res.group'): + # XXX need to merge ir and res ref = field.model_name.replace('.', '_') else: ref_model = pool.get(field.model_name) - ref = ref_model._table - # Create foreign key table if missing - if not TableHandler.table_exist(ref): - TableHandler(ref_model) + if (isinstance(ref_model, ModelSQL) + and not ref_model.table_query()): + ref = ref_model._table + # Create foreign key table if missing + if not TableHandler.table_exist(ref): + TableHandler(ref_model) + else: + ref = None if field_name in ['create_uid', 'write_uid']: # migration from 3.6 table.drop_fk(field_name) - else: + elif ref: table.add_fk(field_name, ref, field.ondelete) table.index_action( diff --git a/trytond/tests/__init__.py b/trytond/tests/__init__.py index bd06d5ce64..f5d9fb2a55 100644 --- a/trytond/tests/__init__.py +++ b/trytond/tests/__init__.py @@ -172,6 +172,8 @@ def register(): Many2OneSearch, Many2OneTree, Many2OneMPTT, + Many2OneNoForeignKey, + Many2OneTargetStorage, TestHistory, TestHistoryLine, FieldContextChild, diff --git a/trytond/tests/test.py b/trytond/tests/test.py index 68c8b9ef8e..dd31b74a93 100644 --- a/trytond/tests/test.py +++ b/trytond/tests/test.py @@ -3,7 +3,8 @@ import datetime from decimal import Decimal -from trytond.model import ModelSQL, DictSchemaMixin, fields, Unique +from trytond.model import ( + ModelSQL, ModelStorage, DictSchemaMixin, fields, Unique) from trytond.pyson import Eval __all__ = [ @@ -37,7 +38,8 @@ __all__ = [ 'DictSchema', 'Dict', 'DictDefault', 'DictRequired', 'Binary', 'BinaryDefault', 'BinaryRequired', 'BinaryFileStorage', 'Many2OneDomainValidation', 'Many2OneTarget', 'Many2OneOrderBy', - 'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT', + 'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT', 'Many2OneNoForeignKey', + 'Many2OneTargetStorage' ] @@ -794,3 +796,14 @@ class Many2OneMPTT(ModelSQL): @classmethod def default_right(cls): return 0 + + +class Many2OneNoForeignKey(ModelSQL): + "Many2One No Foreign Key" + __name__ = 'test.many2one_no_foreign_key' + many2one = fields.Many2One('test.many2one_target_storage', 'many2one') + + +class Many2OneTargetStorage(ModelStorage): + "Many2One Target Storage" + __name__ = 'test.many2one_target_storage' diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py index 0049daa552..c94670bcc2 100644 --- a/trytond/tests/test_fields.py +++ b/trytond/tests/test_fields.py @@ -3496,6 +3496,18 @@ class FieldsTestCase(unittest.TestCase): transaction.rollback() + @with_transaction() + def test_many2one_no_foreign_key(self): + "Test Many2One without Foreign Key" + pool = Pool() + Many2OneNoForeignKey = pool.get('test.many2one_no_foreign_key') + Many2OneTargetStorage = pool.get('test.many2one_target_storage') + + record = Many2OneNoForeignKey(many2one=1) + record.save() + + self.assertIsInstance(record.many2one, Many2OneTargetStorage) + @with_transaction() def test_timedelta(self): 'Test timedelta'