changeset e972eaafe958 in proteus:default
details: https://hg.tryton.org/proteus?cmd=changeset;node=e972eaafe958
description:
Prevent assign unknown attributes on Model
by adding __slots__ on proteus classes.
issue6573
review254081002
diffstat:
CHANGELOG | 2 ++
proteus/__init__.py | 16 +++++++++++++++-
proteus/tests/test_model.py | 9 ++++++++-
3 files changed, 25 insertions(+), 2 deletions(-)
diffs (110 lines):
diff -r ebc47cb5291a -r e972eaafe958 CHANGELOG
--- a/CHANGELOG Mon Sep 02 18:22:43 2019 +0200
+++ b/CHANGELOG Sat Sep 07 23:38:20 2019 +0200
@@ -1,3 +1,5 @@
+* Add __slots__
+
Version 5.2.0 - 2019-05-06
* Bug fixes (see mercurial logs for details)
* Remove support for Python 3.4
diff -r ebc47cb5291a -r e972eaafe958 proteus/__init__.py
--- a/proteus/__init__.py Mon Sep 02 18:22:43 2019 +0200
+++ b/proteus/__init__.py Sat Sep 07 23:38:20 2019 +0200
@@ -18,6 +18,8 @@
class _EvalEnvironment(dict):
'Dictionary for evaluation'
+ __slots__ = ('parent', 'eval_type')
+
def __init__(self, parent, eval_type='eval'):
super(_EvalEnvironment, self).__init__()
self.parent = parent
@@ -82,6 +84,8 @@
>>> Example().method()
1
"""
+ __slots__ = ('func')
+
def __init__(self, func):
self.func = func
@@ -447,6 +451,8 @@
class MetaModel(type):
'Meta class for Model'
+ __slots__ = ()
+
def __new__(mcs, name, bases, dict):
if self.model_name in getattr(_MODELS, models_key):
return getattr(_MODELS, models_key)[self.model_name]
@@ -481,6 +487,9 @@
class ModelList(list):
'List for Model'
+ __slots__ = ('model_name', 'parent', 'parent_field_name', 'parent_name',
+ 'domain', 'context', 'add_remove', 'search_order', 'search_context',
+ 'record_removed', 'record_deleted')
def __init__(self, definition, sequence=None, parent=None,
parent_field_name=''):
@@ -650,6 +659,7 @@
class Model(object):
'Model class for Tryton records'
+ __slots__ = ('__id', '_values', '_changed', '_group', '__context')
__counter = -1
_proxy = None
@@ -725,7 +735,7 @@
name = name.encode('utf-8')
class Spam(Model, metaclass=MetaModelFactory(name, config=config)()):
- pass
+ __slots__ = ()
return Spam
@classmethod
@@ -1132,6 +1142,9 @@
class Wizard(object):
'Wizard class for Tryton wizards'
+ __slots__ = ('name', 'form', 'form_state', 'actions', '_config',
+ '_context', '_proxy', 'session_id', 'start_state', 'end_state',
+ 'states', 'state', 'models', 'action')
def __init__(self, name, models=None, action=None, config=None,
context=None):
@@ -1210,6 +1223,7 @@
class Report(object):
'Report class for Tryton reports'
+ __slots__ = ('name', '_config', '_context', '_proxy')
def __init__(self, name, config=None, context=None):
super(Report, self).__init__()
diff -r ebc47cb5291a -r e972eaafe958 proteus/tests/test_model.py
--- a/proteus/tests/test_model.py Mon Sep 02 18:22:43 2019 +0200
+++ b/proteus/tests/test_model.py Sat Sep 07 23:38:20 2019 +0200
@@ -103,6 +103,14 @@
self.assertEqual(len(User(groups=[x.id for x in groups]).groups),
len(groups))
+ def test_assign_unknown_field(self):
+ "Test it is not allowed to assign unknown field"
+ User = Model.get('res.user')
+ user = User()
+
+ with self.assertRaises(AttributeError):
+ user.unknown_field = 'foo'
+
def test_save(self):
User = Model.get('res.user')
test = User()
@@ -286,7 +294,6 @@
Group = Model.get('res.group')
test = Group()
test.name = 'Test delete'
- test.login = 'test delete'
test.save()
test.delete()