Changeset - a86569aef600
[Not reviewed]
default
0 1 0
Thomas De Schampheleire - 5 years ago 2020-09-25 11:14:12
thomas.de_schampheleire@nokia.com
autocomplete: also query 'firstname lastname' and 'lastname firstname' combinations

The autocomplete functionality for user names, e.g. in pull request reviewer
lists, @mentions, etc. would match the input term only on firstname,
lastname or username, but not a combination of firstname lastname.

This is a problem when there are many matches on the same firstname or
lastname, in particular with Chinese names like 'Wang', 'Cheng', etc. If you
know the full name and type it, you would not get any matches.

Instead, adapt the queries to also match on 'firstname lastname' and
'lastname firstname'.

This means that simple matching on only username or only lastname, can be
removed.
1 file changed with 2 insertions and 2 deletions:
0 comments (0 inline, 0 general)
kallithea/controllers/home.py
Show inline comments
 
@@ -151,50 +151,50 @@ class HomeController(BaseController):
 

	
 
        You can either use the 'key' GET parameter to get a user by providing
 
        the exact user key or you can use the 'query' parameter to
 
        search for users by user key, first name and last name.
 
        'types' defaults to just 'users' but can be set to 'users,groups' to
 
        get both users and groups.
 
        No more than 500 results (of each kind) will be returned.
 
        """
 
        types = request.GET.get('types', 'users').split(',')
 
        key = request.GET.get('key', '')
 
        query = request.GET.get('query', '')
 
        results = []
 
        if 'users' in types:
 
            user_list = []
 
            if key:
 
                u = User.get_by_username(key)
 
                if u:
 
                    user_list = [u]
 
            elif query:
 
                user_list = User.query() \
 
                    .filter(User.is_default_user == False) \
 
                    .filter(User.active == True) \
 
                    .filter(or_(
 
                        User.username.ilike("%%" + query + "%%"),
 
                        User.name.ilike("%%" + query + "%%"),
 
                        User.lastname.ilike("%%" + query + "%%"),
 
                        User.name.concat(' ').concat(User.lastname).ilike("%%" + query + "%%"),
 
                        User.lastname.concat(' ').concat(User.name).ilike("%%" + query + "%%"),
 
                    )) \
 
                    .order_by(User.username) \
 
                    .limit(500) \
 
                    .all()
 
            for u in user_list:
 
                results.append({
 
                    'type': 'user',
 
                    'id': u.user_id,
 
                    'nname': u.username,
 
                    'fname': u.name,
 
                    'lname': u.lastname,
 
                    'gravatar_lnk': h.gravatar_url(u.email, size=28, default='default'),
 
                    'gravatar_size': 14,
 
                })
 
        if 'groups' in types:
 
            grp_list = []
 
            if key:
 
                grp = UserGroup.get_by_group_name(key)
 
                if grp:
 
                    grp_list = [grp]
 
            elif query:
 
                grp_list = UserGroup.query() \
 
                    .filter(UserGroup.users_group_name.ilike("%%" + query + "%%")) \
 
                    .filter(UserGroup.users_group_active == True) \
0 comments (0 inline, 0 general)