File tree Expand file tree Collapse file tree 4 files changed +48
-9
lines changed
Expand file tree Collapse file tree 4 files changed +48
-9
lines changed Original file line number Diff line number Diff line change 77from boto3 .dynamodb .conditions import Attr , Key
88from django .conf import settings
99from django .core .exceptions import ObjectDoesNotExist
10+ from flag_engine .context .mappers import map_environment_identity_to_context
1011from flag_engine .environments .models import EnvironmentModel
1112from flag_engine .identities .models import IdentityModel
12- from flag_engine .segments .evaluator import get_identity_segments
13+ from flag_engine .segments .evaluator import get_context_segments
1314from rest_framework .exceptions import NotFound
1415
1516from edge_api .identities .search import EdgeIdentitySearchData
@@ -189,7 +190,12 @@ def get_segment_ids(
189190 environment = EnvironmentModel .model_validate (
190191 environment_wrapper .get_item (identity .environment_api_key )
191192 )
192- segments = get_identity_segments (environment , identity )
193+ context = map_environment_identity_to_context (
194+ environment = environment ,
195+ identity = identity ,
196+ override_traits = None ,
197+ )
198+ segments = get_context_segments (context , environment .project .segments )
193199 return [segment .id for segment in segments ]
194200
195201 return []
Original file line number Diff line number Diff line change 33
44from django .db import models
55from django .db .models import Prefetch , Q
6- from flag_engine .segments .evaluator import evaluate_identity_in_segment
6+ from flag_engine .context .mappers import map_environment_identity_to_context
7+ from flag_engine .segments .evaluator import is_context_in_segment
78
89from environments .identities .managers import IdentityManager
910from environments .identities .traits .models import Trait
@@ -170,10 +171,15 @@ def get_segments(
170171 for segment in all_segments :
171172 engine_segment = map_segment_to_engine (segment )
172173
173- if evaluate_identity_in_segment (
174+ context = map_environment_identity_to_context (
175+ environment = self .environment ,
174176 identity = engine_identity ,
175- segment = engine_segment ,
176177 override_traits = engine_traits ,
178+ )
179+
180+ if is_context_in_segment (
181+ context = context ,
182+ segment = engine_segment ,
177183 ):
178184 matching_segments .append (segment )
179185
Original file line number Diff line number Diff line change 11import typing
22
33from django .db .models import Q
4- from flag_engine .segments .evaluator import evaluate_identity_in_segment
4+ from flag_engine .segments .evaluator import is_context_in_segment
55from rest_framework import serializers
66
77from features .serializers import FeatureStateSerializerFull
88from integrations .common .serializers import (
99 BaseEnvironmentIntegrationModelSerializer ,
1010)
1111from segments .models import Segment
12- from util .mappers .engine import map_identity_to_engine , map_segment_to_engine
12+ from util .mappers .engine import (
13+ map_engine_identity_to_context ,
14+ map_identity_to_engine ,
15+ map_segment_to_engine ,
16+ )
1317
1418from .models import WebhookConfiguration
1519
@@ -33,8 +37,9 @@ def get_member(self, obj: Segment) -> bool:
3337 with_overrides = False ,
3438 )
3539 engine_segment = map_segment_to_engine (obj )
36- return evaluate_identity_in_segment (
37- identity = engine_identity ,
40+ context = map_engine_identity_to_context (engine_identity )
41+ return is_context_in_segment (
42+ context = context ,
3843 segment = engine_segment ,
3944 )
4045
Original file line number Diff line number Diff line change 33from typing import TYPE_CHECKING , Dict , List , Optional
44from uuid import UUID
55
6+ from flag_engine .context .types import EvaluationContext
67from flag_engine .environments .integrations .models import IntegrationModel
78from flag_engine .environments .models import (
89 EnvironmentAPIKeyModel ,
@@ -418,6 +419,27 @@ def map_identity_to_engine(
418419 )
419420
420421
422+ def map_engine_identity_to_context (
423+ identity : IdentityModel ,
424+ ) -> "EvaluationContext" :
425+ """
426+ A special mapper to produce a minimal EvaluationContext
427+ in an environment-less form.
428+ Used when an environment object is not available,
429+ like when evaluating segments in UI, which happens at the project level.
430+ """
431+ return {
432+ "environment" : {"key" : identity .environment_api_key , "name" : "" },
433+ "identity" : {
434+ "identifier" : identity .identifier ,
435+ "key" : str (identity .django_id or identity .composite_key ),
436+ "traits" : {
437+ trait .trait_key : trait .trait_value for trait in identity .identity_traits
438+ },
439+ },
440+ }
441+
442+
421443def _get_prioritised_feature_states (
422444 feature_states : Iterable ["FeatureState" ],
423445) -> List ["FeatureState" ]:
You can’t perform that action at this time.
0 commit comments