forked from Flagsmith/flagsmith
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: ignore old versions when validating segment override limit (Flag…
- Loading branch information
1 parent
d60b3b7
commit 52b9780
Showing
6 changed files
with
442 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
from django.db.models import Q | ||
|
||
from environments.models import Environment | ||
from features.versioning.models import EnvironmentFeatureVersion | ||
|
||
SEGMENT_OVERRIDE_LIMIT_EXCEEDED_MESSAGE = ( | ||
"The environment has reached the maximum allowed segments overrides limit." | ||
) | ||
|
||
|
||
def exceeds_segment_override_limit( | ||
environment: Environment, | ||
segment_ids_to_create_overrides: list[int] | None = None, | ||
segment_ids_to_delete_overrides: list[int] | None = None, | ||
exclusive: bool = False, | ||
) -> bool: | ||
q = Q() | ||
|
||
segment_ids_to_create_overrides = segment_ids_to_create_overrides or [] | ||
segment_ids_to_delete_overrides = segment_ids_to_delete_overrides or [] | ||
|
||
def _check(left: int, right: int) -> bool: | ||
if exclusive: | ||
return left > right | ||
return left >= right | ||
|
||
if environment.use_v2_feature_versioning: | ||
latest_versions = ( | ||
EnvironmentFeatureVersion.objects.get_latest_versions_by_environment_id( | ||
environment_id=environment.id | ||
) | ||
) | ||
q = q & Q(environment_feature_version__in=latest_versions) | ||
|
||
existing_overridden_segment_ids = set( | ||
environment.feature_segments.filter(q).values_list("segment_id", flat=True) | ||
) | ||
segment_override_count = len(existing_overridden_segment_ids) | ||
|
||
extra = len(segment_ids_to_create_overrides) - len( | ||
set(segment_ids_to_delete_overrides).intersection( | ||
existing_overridden_segment_ids | ||
) | ||
) | ||
|
||
return _check( | ||
segment_override_count + extra, | ||
environment.project.max_segment_overrides_allowed, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
27 changes: 27 additions & 0 deletions
27
api/tests/unit/features/feature_segments/test_unit_feature_segments_limits.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
from environments.models import Environment | ||
from features.feature_segments.limits import exceeds_segment_override_limit | ||
from features.models import Feature | ||
from projects.models import Project | ||
from segments.models import Segment | ||
|
||
|
||
def test_segment_override_limit_does_not_exclude_invalid_overrides_being_deleted( | ||
feature: Feature, | ||
segment: Segment, | ||
another_segment: Segment, | ||
environment_v2_versioning: Environment, | ||
project: Project, | ||
) -> None: | ||
# Given | ||
project.max_segment_overrides_allowed = 0 | ||
project.save() | ||
|
||
# When | ||
result = exceeds_segment_override_limit( | ||
environment=environment_v2_versioning, | ||
segment_ids_to_create_overrides=[another_segment.id], | ||
segment_ids_to_delete_overrides=[segment.id], | ||
) | ||
|
||
# Then | ||
assert result is True |
Oops, something went wrong.