@@ -52,14 +52,48 @@ def map_environment_identity_to_context(
5252 segment_ctx_data ["overrides" ] = list (
5353 _map_feature_states_to_feature_contexts (segment_feature_states ).values ()
5454 )
55- segments [segment .name ] = segment_ctx_data
56- # Concatenate feature states overriden for identities
57- # to segment contexts
55+ segments [str (segment .id )] = segment_ctx_data
56+ identity_overrides = environment .identity_overrides + [identity ] if identity else []
57+ segments .update (_map_identity_overrides_to_segment_contexts (identity_overrides ))
58+ return {
59+ "environment" : {
60+ "key" : environment .api_key ,
61+ "name" : environment .name or "" ,
62+ },
63+ "identity" : (
64+ {
65+ "identifier" : identity .identifier ,
66+ "key" : str (identity .django_id or identity .composite_key ),
67+ "traits" : {
68+ trait .trait_key : trait .trait_value
69+ for trait in (
70+ override_traits
71+ if override_traits is not None
72+ else identity .identity_traits
73+ )
74+ },
75+ }
76+ if identity
77+ else None
78+ ),
79+ "features" : features ,
80+ "segments" : segments ,
81+ }
82+
83+
84+ def _map_identity_overrides_to_segment_contexts (
85+ identity_overrides : typing .List [IdentityModel ],
86+ ) -> typing .Dict [str , SegmentContext ]:
87+ """
88+ Map identity overrides to segment contexts.
89+
90+ :param identity_overrides: A list of IdentityModel objects.
91+ :return: A dictionary mapping segment ids to SegmentContext objects.
92+ """
5893 features_to_identifiers : typing .Dict [
5994 OverridesKey ,
6095 typing .List [str ],
6196 ] = defaultdict (list )
62- identity_overrides = environment .identity_overrides + [identity ] if identity else []
6397 for identity_override in identity_overrides :
6498 identity_features : typing .List [FeatureStateModel ] = (
6599 identity_override .identity_features
@@ -76,9 +110,10 @@ def map_environment_identity_to_context(
76110 for feature_state in sorted (identity_features , key = _get_name )
77111 )
78112 features_to_identifiers [overrides_key ].append (identity_override .identifier )
113+ segment_contexts : typing .Dict [str , SegmentContext ] = {}
79114 for overrides_key , identifiers in features_to_identifiers .items ():
80115 segment_name = f"overrides_{ abs (hash (overrides_key ))} "
81- segments [segment_name ] = SegmentContext (
116+ segment_contexts [segment_name ] = SegmentContext (
82117 key = "" , # Identity override segments never use % Split operator
83118 name = segment_name ,
84119 rules = [
@@ -110,30 +145,7 @@ def map_environment_identity_to_context(
110145 for feature_key , feature_name , feature_enabled , feature_value in overrides_key
111146 ],
112147 )
113- return {
114- "environment" : {
115- "key" : environment .api_key ,
116- "name" : environment .name or "" ,
117- },
118- "identity" : (
119- {
120- "identifier" : identity .identifier ,
121- "key" : str (identity .django_id or identity .composite_key ),
122- "traits" : {
123- trait .trait_key : trait .trait_value
124- for trait in (
125- override_traits
126- if override_traits is not None
127- else identity .identity_traits
128- )
129- },
130- }
131- if identity
132- else None
133- ),
134- "features" : features ,
135- "segments" : segments ,
136- }
148+ return segment_contexts
137149
138150
139151def _map_feature_states_to_feature_contexts (
@@ -158,8 +170,7 @@ def _map_feature_states_to_feature_contexts(
158170 MultivariateFeatureStateValueModel
159171 ]
160172 if (
161- multivariate_feature_state_values
162- := feature_state .multivariate_feature_state_values
173+ multivariate_feature_state_values := feature_state .multivariate_feature_state_values
163174 ):
164175 feature_ctx_data ["variants" ] = [
165176 {
0 commit comments