api: use indexes for looking up the user (#5002)
This commit is contained in:
parent
5e0e960a4c
commit
7079869fda
|
@ -50,15 +50,14 @@ def get_user_from_api_query_string():
|
|||
return None
|
||||
|
||||
user = None
|
||||
# XXX: we need to index on email/NameID, to accelerate that part
|
||||
if get_request().form.get('email'):
|
||||
email = get_request().form.get('email')
|
||||
users = list(get_publisher().user_class.select(lambda x: x.email == email))
|
||||
users = list(get_publisher().user_class.get_users_with_email(email))
|
||||
if users:
|
||||
user = users[0]
|
||||
elif get_request().form.get('NameID'):
|
||||
ni = get_request().form.get('NameID')
|
||||
users = list(get_publisher().user_class.select(lambda x: ni in x.name_identifiers))
|
||||
users = list(get_publisher().user_class.get_users_with_name_identifier(ni))
|
||||
if users:
|
||||
user = users[0]
|
||||
|
||||
|
|
18
wcs/sql.py
18
wcs/sql.py
|
@ -1031,6 +1031,24 @@ class SqlUser(SqlMixin, wcs.users.User):
|
|||
return objects
|
||||
get_users_with_name_identifier = classmethod(get_users_with_name_identifier)
|
||||
|
||||
@guard_postgres
|
||||
def get_users_with_email(cls, email):
|
||||
conn, cur = get_connection_and_cursor()
|
||||
|
||||
sql_statement = '''SELECT %s
|
||||
FROM %s
|
||||
WHERE email = %%(value)s''' % (
|
||||
', '.join([x[0] for x in cls._table_static_fields]
|
||||
+ cls.get_data_fields()),
|
||||
cls._table_name)
|
||||
cur.execute(sql_statement, {'value': email})
|
||||
objects = cls.get_objects(cur)
|
||||
conn.commit()
|
||||
cur.close()
|
||||
|
||||
return objects
|
||||
get_users_with_email = classmethod(get_users_with_email)
|
||||
|
||||
@guard_postgres
|
||||
def get_users_with_role(cls, role_id):
|
||||
conn, cur = get_connection_and_cursor()
|
||||
|
|
|
@ -141,6 +141,10 @@ class User(StorableObject):
|
|||
return cls.select(lambda x: name_identifier in x.name_identifiers)
|
||||
get_users_with_name_identifier = classmethod(get_users_with_name_identifier)
|
||||
|
||||
def get_users_with_email(cls, email):
|
||||
return cls.select(lambda x: x.email == email)
|
||||
get_users_with_email = classmethod(get_users_with_email)
|
||||
|
||||
def get_substitution_variables(self, prefix='session_'):
|
||||
d = {
|
||||
prefix+'user': self,
|
||||
|
|
Loading…
Reference in New Issue