manager: add multi-word role search (#86979)
gitea/authentic/pipeline/head This commit looks good Details

This commit is contained in:
Yann Weber 2024-02-29 09:52:56 +01:00 committed by Benjamin Dauvergne
parent af6ad87f92
commit 35e0425386
2 changed files with 58 additions and 1 deletions

View File

@ -402,7 +402,10 @@ class ServiceRoleSearchForm(CssClass, PrefixFormMixin, FormWithRequest):
if hasattr(super(), 'filter'):
qs = super().filter(qs)
if self.cleaned_data.get('text'):
qs = qs.filter(name__icontains=self.cleaned_data['text'])
for word in (w.strip() for w in self.cleaned_data.get('text').split(' ')):
if not word:
continue
qs = qs.filter(name__icontains=word)
if not app_settings.SHOW_INTERNAL_ROLES and not self.cleaned_data.get('internals'):
qs = qs.exclude(slug__startswith='_')
return qs

View File

@ -17,8 +17,10 @@
import json
import django_tables2 as tables
import pytest
from django.urls import reverse
from django.utils.encoding import force_bytes, force_str
from pyquery import PyQuery
from webtest import Upload
from authentic2.a2_rbac.models import OrganizationalUnit, Role
@ -384,6 +386,58 @@ def test_manager_role_csv_import(app, admin, ou1, ou2):
assert 'name,slug,ou' in resp.text
@pytest.mark.parametrize(
'role_names,search_text,expt_found',
[
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
' rand role',
[0],
),
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
' test rand ',
[0, 1],
),
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
'test some',
[2, 4],
),
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
' SoMe ',
[2, 3, 4],
),
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
' teste some',
[],
),
(
['A random test role', 'Random test stuff', 'Some test role', 'Something else', 'SomeTest'],
' ',
[0, 1, 2, 3, 4],
),
],
)
def test_manager_role_search(app, admin, role_names, search_text, expt_found):
roles = [Role.objects.create(name=name, ou=get_default_ou()) for name in role_names]
resp = login(app, admin, '/manage/roles/')
resp.form['search-text'] = search_text
result = resp.form.submit()
for expt_role in [roles[i] for i in expt_found]:
assert (
len(PyQuery(result.text).find(f'tr[data-pk="{expt_role.pk}"]')) == 1
), 'Role %r should be found with %r' % (expt_role.name, search_text)
for non_expt_role_pk in [roles[i].pk for i in range(len(role_names)) if i not in expt_found]:
assert (
len(PyQuery(result.text).find(f'tr[data-pk="{non_expt_role_pk}"]')) == 0
), 'Role %r should not be found with %r' % (expt_role.name, search_text)
def test_role_members_display_role_parents(app, superuser, settings, simple_role):
url = reverse('a2-manager-role-members', kwargs={'pk': simple_role.pk})