Skip to content

Commit

Permalink
fix: Filter versioned features (#3756)
Browse files Browse the repository at this point in the history
  • Loading branch information
zachaysan committed Apr 26, 2024
1 parent fe21496 commit 686e1ab
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 11 deletions.
10 changes: 4 additions & 6 deletions api/features/versioning/versioning_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
from django.db.models import Prefetch, Q, QuerySet
from django.utils import timezone

from environments.models import Environment
from features.models import FeatureState
from features.versioning.models import EnvironmentFeatureVersion

if typing.TYPE_CHECKING:
from environments.models import Environment


def get_environment_flags_queryset(
environment: "Environment", feature_name: str = None
environment: Environment, feature_name: str = None
) -> QuerySet[FeatureState]:
"""
Get a queryset of the latest live versions of an environments' feature states
Expand All @@ -21,14 +19,14 @@ def get_environment_flags_queryset(


def get_environment_flags_list(
environment: "Environment",
environment: Environment,
feature_name: str = None,
additional_filters: Q = None,
additional_select_related_args: typing.Iterable[str] = None,
additional_prefetch_related_args: typing.Iterable[
typing.Union[str, Prefetch]
] = None,
) -> typing.List["FeatureState"]:
) -> list[FeatureState]:
"""
Get a list of the latest committed versions of FeatureState objects that are
associated with the given environment. Can be filtered to remove segment /
Expand Down
10 changes: 7 additions & 3 deletions api/features/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,12 +258,16 @@ def apply_state_to_queryset(
if not getattr(self, "environment", None):
self.environment = Environment.objects.get(id=environment_id)

feature_states = FeatureState.objects.get_live_feature_states(
feature_states = get_environment_flags_list(
environment=self.environment,
additional_filters=base_q & filter_search_q & filter_enabled_q,
additional_filters=base_q,
)

feature_ids = {fs.feature_id for fs in feature_states}
feature_ids = FeatureState.objects.filter(
filter_search_q & filter_enabled_q,
id__in=[fs.id for fs in feature_states],
).values_list("feature_id", flat=True)

return queryset.filter(id__in=feature_ids)

@swagger_auto_schema(
Expand Down
30 changes: 28 additions & 2 deletions api/tests/unit/features/test_unit_features_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2632,13 +2632,16 @@ def test_list_features_with_feature_state(

def test_list_features_with_filter_by_value_search_string_and_int(
staff_client: APIClient,
staff_user: FFAdminUser,
project: Project,
feature: Feature,
with_project_permissions: WithProjectPermissionsCallable,
environment: Environment,
environment_v2_versioning: Environment,
) -> None:
# Given
with_project_permissions([VIEW_PROJECT])
environment = environment_v2_versioning

feature2 = Feature.objects.create(
name="another_feature", project=project, initial_value="initial_value"
)
Expand All @@ -2654,10 +2657,33 @@ def test_list_features_with_filter_by_value_search_string_and_int(
project=project,
)

feature_state1 = feature.feature_states.filter(environment=environment).first()
environment_feature_version1 = EnvironmentFeatureVersion.objects.create(
environment=environment,
feature=feature,
)

feature_state1 = FeatureState.objects.filter(
environment_feature_version=environment_feature_version1
).first()
feature_state1.enabled = True
feature_state1.save()

# Create a secondary feature state that will be versioned in the past.
environment_feature_version1b = EnvironmentFeatureVersion.objects.create(
environment=environment,
feature=feature,
)

feature_state1b = FeatureState.objects.filter(
environment_feature_version=environment_feature_version1b
).first()
feature_state1b.enabled = False
feature_state1b.save()

environment_feature_version1b.publish(staff_user)

environment_feature_version1.publish(staff_user)

feature_state_value1 = feature_state1.feature_state_value
feature_state_value1.string_value = None
feature_state_value1.integer_value = 1945
Expand Down

0 comments on commit 686e1ab

Please sign in to comment.