# HG changeset patch # User Marcin Kuzminski # Date 2019-10-30 13:49:42 # Node ID e79bd0880a17c3d65624160b841e603eb51b8e64 # Parent da40b4bb2f943ae23bae8dead7fbb5258ac7c025 user: speed up data propagatation for auth users by pre-filling only selected variables skipping some not-required and using faster update method (not setattr()) diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -696,6 +696,17 @@ class User(Base, BaseModel): .all() return [self.email] + [x.email for x in other] + def emails_cached(self): + emails = UserEmailMap.query()\ + .filter(UserEmailMap.user == self) \ + .order_by(UserEmailMap.email_id.asc()) + + emails = emails.options( + FromCache("sql_cache_short", "get_user_{}_emails".format(self.user_id)) + ) + + return [self.email] + [x.email for x in emails] + @property def auth_tokens(self): auth_tokens = self.get_auth_tokens() @@ -854,6 +865,10 @@ class User(Base, BaseModel): def is_admin(self): return self.admin + @property + def language(self): + return self.user_data.get('language') + def AuthUser(self, **kwargs): """ Returns instance of AuthUser for this user diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -734,19 +734,40 @@ class UserModel(BaseModel): return False log.debug('AuthUser: filling found user:%s data', dbuser) - user_data = dbuser.get_dict() - user_data.update({ - # set explicit the safe escaped values + attrs = { + 'user_id': dbuser.user_id, + 'username': dbuser.username, + 'name': dbuser.name, 'first_name': dbuser.first_name, + 'firstname': dbuser.firstname, 'last_name': dbuser.last_name, - }) + 'lastname': dbuser.lastname, + 'admin': dbuser.admin, + 'active': dbuser.active, + + 'email': dbuser.email, + 'emails': dbuser.emails_cached(), + 'short_contact': dbuser.short_contact, + 'full_contact': dbuser.full_contact, + 'full_name': dbuser.full_name, + 'full_name_or_username': dbuser.full_name_or_username, - for k, v in user_data.items(): - # properties of auth user we dont update - if k not in ['auth_tokens', 'permissions']: - setattr(auth_user, k, v) + '_api_key': dbuser._api_key, + '_user_data': dbuser._user_data, + + 'created_on': dbuser.created_on, + 'extern_name': dbuser.extern_name, + 'extern_type': dbuser.extern_type, + 'inherit_default_permissions': dbuser.inherit_default_permissions, + + 'language': dbuser.language, + 'last_activity': dbuser.last_activity, + 'last_login': dbuser.last_login, + 'password': dbuser.password, + } + auth_user.__dict__.update(attrs) except Exception: log.error(traceback.format_exc()) auth_user.is_authenticated = False