diff --git a/engine/apps/api/tests/test_user.py b/engine/apps/api/tests/test_user.py index 5d7dc538..0d853861 100644 --- a/engine/apps/api/tests/test_user.py +++ b/engine/apps/api/tests/test_user.py @@ -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 diff --git a/engine/apps/api/views/user.py b/engine/apps/api/views/user.py index 8cd517c1..fe8e9cb6 100644 --- a/engine/apps/api/views/user.py +++ b/engine/apps/api/views/user.py @@ -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 diff --git a/engine/common/api_helpers/filters.py b/engine/common/api_helpers/filters.py index 12e1fe41..daa3523a 100644 --- a/engine/common/api_helpers/filters.py +++ b/engine/common/api_helpers/filters.py @@ -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()