Update and refactor users API team filter (#3703)

This should hopefully fix the lint issue
[here](https://drone.grafana.net/grafana/oncall/3361/1/7)
This commit is contained in:
Matias Bordese 2024-01-17 12:18:08 -03:00 committed by GitHub
parent 36d2c3bdb7
commit 0a077ccfdb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 9 deletions

View file

@ -298,6 +298,7 @@ def test_list_users_filtered_by_team(
organization = make_organization()
user1 = make_user_for_organization(organization)
user2 = make_user_for_organization(organization)
user3 = make_user_for_organization(organization)
team1 = make_team(organization)
team2 = make_team(organization)
@ -314,7 +315,7 @@ def test_list_users_filtered_by_team(
def _get_user_pks(teams):
response = client.get(
url,
data={"team": [team.public_primary_key for team in teams]}, # these are query params
data={"team": [team.public_primary_key if team else "null" for team in teams]}, # these are query params
**make_user_auth_headers(user1, token),
)
assert response.status_code == status.HTTP_200_OK
@ -323,9 +324,11 @@ def test_list_users_filtered_by_team(
assert _get_user_pks([team1]) == [user1.public_primary_key]
assert _get_user_pks([team1, team2]) == [user1.public_primary_key, user2.public_primary_key]
assert _get_user_pks([team3]) == []
assert _get_user_pks([team1, None]) == [user1.public_primary_key, user3.public_primary_key]
assert _get_user_pks([None]) == [user3.public_primary_key]
# check non-existent team returns bad request
response = client.get(f"{url}?team=null", **make_user_auth_headers(user1, token))
response = client.get(f"{url}?team=non-existing", **make_user_auth_headers(user1, token))
assert response.status_code == status.HTTP_400_BAD_REQUEST

View file

@ -138,7 +138,7 @@ class UserFilter(ByTeamModelFieldFilterMixin, filters.FilterSet):
# TODO: remove "roles" in next version
roles = filters.MultipleChoiceFilter(field_name="role", choices=LegacyAccessControlRole.choices())
permission = filters.ChoiceFilter(method="filter_by_permission", choices=ALL_PERMISSION_CHOICES)
team = TeamModelMultipleChoiceFilter(field_name="teams", null_label=None, null_value=None)
team = TeamModelMultipleChoiceFilter(field_name="teams")
class Meta:
model = User

View file

@ -86,13 +86,14 @@ class ByTeamModelFieldFilterMixin:
return queryset
filter = self.filters[ByTeamModelFieldFilterMixin.FILTER_FIELD_NAME]
null_team_lookup = None
for value in values:
if filter.null_value == value:
null_team_lookup = Q(**{f"{name}__isnull": True})
values.remove(value)
teams_lookup = Q(**{f"{name}__in": values})
if filter.null_value in values:
null_team_lookup = Q(**{f"{name}__isnull": True})
values.remove(filter.null_value)
teams_lookup = None
if values:
teams_lookup = Q(**{f"{name}__in": values})
if null_team_lookup is not None:
teams_lookup = teams_lookup | null_team_lookup
teams_lookup = teams_lookup | null_team_lookup if teams_lookup else null_team_lookup
return queryset.filter(teams_lookup).distinct()