(
self, query_data: dict[str, typing.Any], queryset: QuerySet[Feature]
)
| 347 | return context |
| 348 | |
| 349 | def apply_state_to_queryset( |
| 350 | self, query_data: dict[str, typing.Any], queryset: QuerySet[Feature] |
| 351 | ) -> QuerySet[Feature]: |
| 352 | if not query_data.get("environment"): |
| 353 | raise serializers.ValidationError( |
| 354 | "Environment is required in order to filter by state search or by state enabled" |
| 355 | ) |
| 356 | is_enabled = query_data["is_enabled"] |
| 357 | value_search = query_data["value_search"] |
| 358 | environment_id = query_data["environment"] |
| 359 | |
| 360 | filter_search_q = Q() |
| 361 | if value_search is not None: |
| 362 | filter_search_q = filter_search_q | Q( |
| 363 | feature_state_value__string_value__icontains=value_search, |
| 364 | feature_state_value__type=STRING, |
| 365 | ) |
| 366 | |
| 367 | if value_search.lower() in {"true", "false"}: |
| 368 | boolean_search = value_search.lower() == "true" |
| 369 | filter_search_q = filter_search_q | Q( |
| 370 | feature_state_value__boolean_value=boolean_search, |
| 371 | feature_state_value__type=BOOLEAN, |
| 372 | ) |
| 373 | |
| 374 | if value_search.isdigit(): |
| 375 | integer_search = int(value_search) |
| 376 | filter_search_q = filter_search_q | Q( |
| 377 | feature_state_value__integer_value=integer_search, |
| 378 | feature_state_value__type=INTEGER, |
| 379 | ) |
| 380 | filter_enabled_q = Q() |
| 381 | if is_enabled is not None: |
| 382 | filter_enabled_q = filter_enabled_q | Q(enabled=is_enabled) |
| 383 | |
| 384 | base_q = Q( |
| 385 | identity__isnull=True, |
| 386 | feature_segment__isnull=True, |
| 387 | ) |
| 388 | if not getattr(self, "environment", None): |
| 389 | self.environment = Environment.objects.get(id=environment_id) |
| 390 | |
| 391 | feature_states = get_environment_flags_list( |
| 392 | environment=self.environment, |
| 393 | additional_filters=base_q, |
| 394 | ) |
| 395 | |
| 396 | feature_ids = FeatureState.objects.filter( |
| 397 | filter_search_q & filter_enabled_q, |
| 398 | id__in=[fs.id for fs in feature_states], |
| 399 | ).values_list("feature_id", flat=True) |
| 400 | |
| 401 | return queryset.filter(id__in=feature_ids) |
| 402 | |
| 403 | @extend_schema( |
| 404 | request=FeatureGroupOwnerInputSerializer, |
no test coverage detected