Allow Many2One on ModelSQL to target ModelStorage

issue6237
review26081002
This commit is contained in:
Cédric Krier
2017-02-11 19:08:52 +01:00
parent 631c9782a3
commit 2569f4dd52
5 changed files with 40 additions and 7 deletions
+1
View File
@@ -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
+10 -5
View File
@@ -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(
+2
View File
@@ -172,6 +172,8 @@ def register():
Many2OneSearch,
Many2OneTree,
Many2OneMPTT,
Many2OneNoForeignKey,
Many2OneTargetStorage,
TestHistory,
TestHistoryLine,
FieldContextChild,
+15 -2
View File
@@ -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'
+12
View File
@@ -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'