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

Reply via email to