Reviewers: ,
Please review this at http://codereview.tryton.org/76002/
Affected files:
M trytond/ir/ui/view.py
M trytond/res/request.py
M trytond/res/user.py
M trytond/tests/test_tryton.py
M trytond/workflow/workflow.py
Index: trytond/ir/ui/view.py
===================================================================
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -32,11 +32,11 @@
ondelete='CASCADE')
field_childs = fields.Char('Children Field', states={
'invisible': Not(Equal(Eval('type'), 'tree')),
- })
+ }, depends=['type'])
module = fields.Char('Module', readonly=True)
domain = fields.Char('Domain', states={
'invisible': Not(Bool(Eval('inherit'))),
- })
+ }, depends=['inherit'])
def __init__(self):
super(View, self).__init__()
Index: trytond/res/request.py
===================================================================
--- a/trytond/res/request.py
+++ b/trytond/res/request.py
@@ -25,38 +25,39 @@
If(Equal(Eval('state'), 'chatting'),
Not(Equal(Eval('act_from'), Eval('_user'))),
False))
+_DEPENDS = ['state', 'act_from']
class Request(ModelSQL, ModelView):
"Request"
_name = 'res.request'
_description = __doc__
name = fields.Char('Subject', states={
- 'readonly': _READONLY,
- }, required=True)
+ 'readonly': _READONLY,
+ }, required=True, depends=_DEPENDS)
active = fields.Boolean('Active')
priority = fields.Selection(_PRIORITIES, 'Priority', states={
- 'readonly': _READONLY,
- }, required=True, order_field='priority')
+ 'readonly': _READONLY,
+ }, required=True, order_field='priority', depends=_DEPENDS)
act_from = fields.Many2One('res.user', 'From', required=True,
readonly=True)
act_to = fields.Many2One('res.user', 'To', required=True,
domain=[('active', '=', True)],
states={
'readonly': _READONLY,
- })
+ }, depends=_DEPENDS)
body = fields.Text('Body', states={
- 'readonly': _READONLY,
- })
+ 'readonly': _READONLY,
+ }, depends=_DEPENDS)
date_sent = fields.DateTime('Date', readonly=True)
trigger_date = fields.DateTime('Trigger Date', states={
- 'readonly': _READONLY,
- })
+ 'readonly': _READONLY,
+ }, depends=_DEPENDS)
references = fields.One2Many('res.request.reference', 'request',
- 'References', states={
- 'readonly': If(Equal(Eval('state'), 'closed'),
- True,
- Not(Equal(Eval('act_from', 0), Eval('_user', 0)))),
- })
+ 'References', states={
+ 'readonly': If(Equal(Eval('state'), 'closed'),
+ True,
+ Not(Equal(Eval('act_from', 0), Eval('_user', 0)))),
+ }, depends=['state', 'act_from'])
number_references = fields.Function(fields.Integer('Number of
References',
on_change_with=['references']), 'get_number_references')
state = fields.Selection(_STATES, 'State', required=True,
readonly=True)
Index: trytond/res/user.py
===================================================================
--- a/trytond/res/user.py
+++ b/trytond/res/user.py
@@ -16,7 +16,7 @@
from trytond.security import get_connections
from trytond.transaction import Transaction
from trytond.cache import Cache
-from trytond.pyson import Eval, Greater
+from trytond.pyson import Eval, Not, Equal
from trytond.pool import Pool
@@ -31,8 +31,8 @@
signature = fields.Text('Signature')
active = fields.Boolean('Active')
action = fields.Many2One('ir.action', 'Home Action', states={
- 'required': Greater(Eval('active_id', 0), 0),
- })
+ 'required': Not(Equal(Eval('login'), 'root')),
+ }, depends=['login'])
menu = fields.Many2One('ir.action', 'Menu Action',
domain=[('usage','=','menu')], required=True)
groups = fields.Many2Many('res.user-res.group',
Index: trytond/tests/test_tryton.py
===================================================================
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -33,6 +33,7 @@
from trytond.backend import Database
from trytond.protocols.dispatcher import create
from trytond.transaction import Transaction
+from trytond.pyson import PYSONEncoder, Eval
register_classes()
@@ -87,6 +88,22 @@
'''
test_view('webdav')
+
+class FieldDependsTestCase(unittest.TestCase):
+ '''
+ Test Field depends
+ '''
+
+ def setUp(self):
+ install_module('ir')
+ install_module('res')
+ install_module('workflow')
+ install_module('webdav')
+
+ def test0010depends(self):
+ test_depends()
+
+
def install_module(name):
'''
Install module for the tested database
@@ -153,6 +170,39 @@
assert field in res['fields']
transaction.cursor.rollback()
+def test_depends():
+ '''
+ Test for missing depends
+ '''
+ class Encoder(PYSONEncoder):
+
+ def __init__(self, *args, **kwargs):
+ super(Encoder, self).__init__(*args, **kwargs)
+ self.fields = set()
+
+ def default(self, obj):
+ if isinstance(obj, Eval):
+ fname = obj._value
+ if not fname.startswith('_parent_'):
+ self.fields.add(fname)
+ return super(Encoder, self).default(obj)
+
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ for mname, model in Pool().iterobject():
+ for fname, field in model._columns.iteritems():
+ encoder = Encoder()
+ for pyson in (field.domain, field.states):
+ encoder.encode(pyson)
+ if hasattr(field, 'digits'):
+ encoder.encode(field.digits)
+ encoder.fields.discard(fname)
+ encoder.fields.discard('context')
+ encoder.fields.discard('_user') # TODO should be replaced
by context
+ depends = set(field.depends)
+ assert encoder.fields <= depends, (
+ 'Missing depends %s in "%s"."%s"' % (
+ list(encoder.fields - depends), mname, fname))
+
def suite():
'''
Return test suite for other modules
@@ -174,6 +224,8 @@
suite_.addTests(test_modelsingleton.suite())
suite_.addTests(unittest.TestLoader(
).loadTestsFromTestCase(ModelViewTestCase))
+ suite_.addTests(unittest.TestLoader(
+ ).loadTestsFromTestCase(FieldDependsTestCase))
import trytond.tests.test_mptt as test_mptt
suite_.addTests(test_mptt.suite())
import trytond.tests.test_importdata as test_importdata
Index: trytond/workflow/workflow.py
===================================================================
--- a/trytond/workflow/workflow.py
+++ b/trytond/workflow/workflow.py
@@ -72,13 +72,13 @@
action = fields.Text('Action', states={
'readonly': Equal(Eval('kind'), 'dummy'),
'required': Equal(Eval('kind'), 'function'),
- })
+ }, depends=['kind'])
flow_start = fields.Boolean('Flow Start')
flow_stop = fields.Boolean('Flow Stop')
subflow = fields.Many2One('workflow', 'Subflow', states={
'readonly': Not(Equal(Eval('kind'), 'subflow')),
'required': Equal(Eval('kind'), 'subflow'),
- })
+ }, depends=['kind'])
signal_send = fields.Char('Signal (subflow.*)')
out_transitions = fields.One2Many('workflow.transition', 'act_from',
'Outgoing transitions')
--
[email protected] mailing list