api: use indexes for looking up the user (#5002)

This commit is contained in:
Frédéric Péters 2014-06-19 15:12:20 +02:00
parent 5e0e960a4c
commit 7079869fda
3 changed files with 24 additions and 3 deletions

View File

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

View File

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

View File

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