From c6caa836b4fc897b6327fb573cbbcd67764d1cbd Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sat, 30 Jan 2016 04:18:31 +0100 Subject: Account: Support direct setting of attributes Direct access to additional attributes was possible before, but setting the same value, created a new local property: >>> acc = Account(...) >>> acc.mail == acc.attributes['mail'] True >>> acc.mail = "foobar" >>> acc.mail == acc.attributes['mail'] False Not also assignments are possible and all assignments to unknown properties will create new attributes. --- accounts/models.py | 8 ++++++++ accounts/views/admin/__init__.py | 2 +- accounts/views/default/__init__.py | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/accounts/models.py b/accounts/models.py index 421b392..0c7ffdb 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -10,6 +10,7 @@ class Account(UserMixin): An Account represents a complex ldap tree entry for spline users. For each service a spline user can have a different password. """ + _ready = False def __init__(self, uid, mail, services=[], dn=None, password=None): self.uid = uid.encode('utf8') if isinstance(uid, unicode) else uid @@ -21,6 +22,7 @@ class Account(UserMixin): self.attributes = {} self._set_attribute('mail', mail) + self._ready = True def __repr__(self): return "" % self.uid @@ -66,6 +68,12 @@ class Account(UserMixin): raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) + def __setattr__(self, name, value): + if self._ready and name not in self.__dict__: + self._set_attribute(name, value) + else: + super(Account, self).__setattr__(name, value) + def get_id(self): """ This is for flask-login. The returned string is saved inside diff --git a/accounts/views/admin/__init__.py b/accounts/views/admin/__init__.py index be90e7f..f6ac51a 100644 --- a/accounts/views/admin/__init__.py +++ b/accounts/views/admin/__init__.py @@ -69,7 +69,7 @@ def disable_account(): for service in current_app.all_services: form.user.reset_password(service.id) - oldmail = form.user.attributes['mail'] + oldmail = form.user.mail mail = current_app.config['DISABLED_ACCOUNT_MAILADDRESS_TEMPLATE'] % form.user.uid form.user.change_email(mail) diff --git a/accounts/views/default/__init__.py b/accounts/views/default/__init__.py index edcac21..0a7e65d 100644 --- a/accounts/views/default/__init__.py +++ b/accounts/views/default/__init__.py @@ -131,7 +131,7 @@ def lost_password_complete(token): @templated('index.html') @login_required def index(): - form = SettingsForm(request.form, mail=current_user.attributes['mail']) + form = SettingsForm(request.form, mail=current_user.mail) if form.validate_on_submit(): changed = False @@ -143,7 +143,7 @@ def index(): changed = True elif request.form.get('submit_main'): - if form.mail.data and form.mail.data != current_user.attributes['mail']: + if form.mail.data and form.mail.data != current_user.mail: confirm_token = Confirmation('change_mail').dumps((current_user.uid, form.mail.data)) confirm_link = url_for('.change_mail', token=confirm_token, _external=True) -- cgit v1.2.3-1-g7c22