Allow Many2One on ModelSQL to target ModelStorage
issue6237 review26081002
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -172,6 +172,8 @@ def register():
|
||||
Many2OneSearch,
|
||||
Many2OneTree,
|
||||
Many2OneMPTT,
|
||||
Many2OneNoForeignKey,
|
||||
Many2OneTargetStorage,
|
||||
TestHistory,
|
||||
TestHistoryLine,
|
||||
FieldContextChild,
|
||||
|
||||
+15
-2
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user