users: look for attributes in extra fields (#22389)

This commit is contained in:
Frédéric Péters 2018-03-08 20:02:15 +01:00
parent b8fa1798fd
commit 653a2b8efc
2 changed files with 34 additions and 0 deletions

View File

@ -5,9 +5,12 @@ import shutil
import sys
import time
import pytest
from quixote import cleanup
from wcs import publisher
from wcs import fields
from utilities import create_temporary_pub
@ -54,3 +57,23 @@ def test_get_users_with_role():
assert len(pub.user_class.get_users_with_role(1)) == 1
assert pub.user_class.get_users_with_role(1)[0].name == 'Pierre'
def test_user_formdef_getattr():
from wcs.admin.settings import UserFieldsFormDef
formdef = UserFieldsFormDef(pub)
formdef.fields = [
fields.StringField(id='3', label='test', type='string', varname='plop'),
fields.StringField(id='9', label='noop', type='string', varname='get_formdef'),
]
formdef.store()
user = pub.user_class()
assert user.plop is None
assert user.get_formdef() # get_formdef is not overrided by varname "get_formdef"
user.form_data = {'3': 'Bar', '9': 'Foo'}
assert user.plop == 'Bar'
assert user.get_formdef != 'Foo'
with pytest.raises(AttributeError):
user.xxx

View File

@ -179,9 +179,20 @@ class User(StorableObject):
def __getattr__(self, attr):
if attr in self.__dict__:
return self.__dict__[attr]
formdef = self.get_formdef()
if formdef:
# lookup based on field varname
field = [x for x in formdef.fields if x.varname == attr]
if field:
if 'form_data' not in self.__dict__:
return None
return self.__dict__['form_data'].get(field[0].id)
if attr[0] == 'f' and (self.__dict__['form_data'] and attr[0] == 'f' and
self.__dict__['form_data']):
return self.__dict__['form_data'].get(attr[1:])
raise AttributeError()
def get_json_export_dict(self):