changeset 5687:69e738523107

db: match case-insensitively using func.lower, not ilike ilike() uses SQL ILIKE operator internally, which means it interprets '%' and '_' in the match pattern as wildcards. Instead of ilike(), it's better to turn both operands to the lower case and compare them. This also unbreaks the test case introduced in 13d0fe6f751a.
author Andrew Shadura <andrew@shadura.me>
date Sun, 31 Jan 2016 16:51:32 +0100
parents b3a51c3987be
children 0d213881f2ca
files kallithea/model/db.py
diffstat 1 files changed, 5 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/model/db.py	Sat Jan 30 12:15:23 2016 +0100
+++ b/kallithea/model/db.py	Sun Jan 31 16:51:32 2016 +0100
@@ -555,7 +555,7 @@
     @classmethod
     def get_by_username(cls, username, case_insensitive=False, cache=False):
         if case_insensitive:
-            q = cls.query().filter(cls.username.ilike(username))
+            q = cls.query().filter(func.lower(cls.username) == func.lower(username))
         else:
             q = cls.query().filter(cls.username == username)
 
@@ -592,7 +592,7 @@
 
     @classmethod
     def get_by_email(cls, email, cache=False):
-        q = cls.query().filter(cls.email.ilike(email))
+        q = cls.query().filter(func.lower(cls.email) == func.lower(email))
 
         if cache:
             q = q.options(FromCache("sql_cache_short",
@@ -602,7 +602,7 @@
         if ret is None:
             q = UserEmailMap.query()
             # try fetching in alternate email map
-            q = q.filter(UserEmailMap.email.ilike(email))
+            q = q.filter(func.lower(UserEmailMap.email) == func.lower(email))
             q = q.options(joinedload(UserEmailMap.user))
             if cache:
                 q = q.options(FromCache("sql_cache_short",
@@ -851,7 +851,7 @@
     def get_by_group_name(cls, group_name, cache=False,
                           case_insensitive=False):
         if case_insensitive:
-            q = cls.query().filter(cls.users_group_name.ilike(group_name))
+            q = cls.query().filter(func.lower(cls.users_group_name) == func.lower(group_name))
         else:
             q = cls.query().filter(cls.users_group_name == group_name)
         if cache:
@@ -1520,7 +1520,7 @@
     def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
         if case_insensitive:
             gr = cls.query() \
-                .filter(cls.group_name.ilike(group_name))
+                .filter(func.lower(cls.group_name) == func.lower(group_name))
         else:
             gr = cls.query() \
                 .filter(cls.group_name == group_name)