diff --git a/api/src/backend/api/filters.py b/api/src/backend/api/filters.py index 0bf6121996..a7912b0d14 100644 --- a/api/src/backend/api/filters.py +++ b/api/src/backend/api/filters.py @@ -485,6 +485,29 @@ class UserFilter(FilterSet): class RoleFilter(FilterSet): inserted_at = DateFilter(field_name="inserted_at", lookup_expr="date") updated_at = DateFilter(field_name="updated_at", lookup_expr="date") + permission_state = CharFilter(method="filter_permission_state") + + def filter_permission_state(self, queryset, name, value): + permission_fields = [ + "manage_users", + "manage_account", + "manage_billing", + "manage_providers", + "manage_integrations", + "manage_scans", + ] + + q_all_true = Q(**{field: True for field in permission_fields}) + q_all_false = Q(**{field: False for field in permission_fields}) + + if value == "unlimited": + return queryset.filter(q_all_true) + elif value == "none": + return queryset.filter(q_all_false) + elif value == "limited": + return queryset.exclude(q_all_true | q_all_false) + else: + return queryset.none() class Meta: model = Role diff --git a/api/src/backend/api/v1/serializers.py b/api/src/backend/api/v1/serializers.py index f80959bf88..05fc1ccece 100644 --- a/api/src/backend/api/v1/serializers.py +++ b/api/src/backend/api/v1/serializers.py @@ -1278,6 +1278,27 @@ class RoleSerializer(RLSSerializer, BaseWriteSerializer): many=True, queryset=ProviderGroup.objects.all() ) + permission_state = serializers.SerializerMethodField() + + def get_permission_state(self, obj): + permission_fields = [ + "manage_users", + "manage_account", + "manage_billing", + "manage_providers", + "manage_integrations", + "manage_scans", + ] + + values = [getattr(obj, field) for field in permission_fields] + + if all(values): + return "unlimited" + elif not any(values): + return "none" + else: + return "limited" + def validate(self, attrs): if Role.objects.filter(name=attrs.get("name")).exists(): raise serializers.ValidationError( @@ -1306,6 +1327,7 @@ class RoleSerializer(RLSSerializer, BaseWriteSerializer): "manage_providers", "manage_integrations", "manage_scans", + "permission_state", "unlimited_visibility", "inserted_at", "updated_at",