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())
This commit is contained in:
Marcin Kuzminski 2019-10-30 14:49:42 +01:00
parent 898c62f70d
commit e350c718ba
2 changed files with 44 additions and 8 deletions

View file

@ -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

View file

@ -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,
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)
'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,
'_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