Skip to content

Commit 93c2310

Browse files
committed
restore override_traits behaviour
1 parent 7f0f21c commit 93c2310

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

flag_engine/context/mappers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
import typing
2+
13
from flag_engine.context.types import EvaluationContext
24
from flag_engine.environments.models import EnvironmentModel
35
from flag_engine.identities.models import IdentityModel
6+
from flag_engine.identities.traits.models import TraitModel
47

58

69
def map_environment_identity_to_context(
710
environment: EnvironmentModel,
811
identity: IdentityModel,
12+
override_traits: typing.Optional[typing.List[TraitModel]],
913
) -> EvaluationContext:
1014
"""
1115
Maps an EnvironmentModel and IdentityModel to an EvaluationContext.
@@ -23,7 +27,12 @@ def map_environment_identity_to_context(
2327
"identifier": identity.identifier,
2428
"key": str(identity.django_id or identity.composite_key),
2529
"traits": {
26-
trait.trait_key: trait.trait_value for trait in identity.identity_traits
30+
trait.trait_key: trait.trait_value
31+
for trait in (
32+
override_traits
33+
if override_traits is not None
34+
else identity.identity_traits
35+
)
2736
},
2837
},
2938
}

flag_engine/engine.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22

33
from flag_engine.context.mappers import map_environment_identity_to_context
4+
from flag_engine.context.types import EvaluationContext
45
from flag_engine.environments.models import EnvironmentModel
56
from flag_engine.features.models import FeatureModel, FeatureStateModel
67
from flag_engine.identities.models import IdentityModel
@@ -54,9 +55,16 @@ def get_identity_feature_states(
5455
:return: list of feature state models based on the environment, any matching
5556
segments and any specific identity overrides
5657
"""
58+
context = map_environment_identity_to_context(
59+
environment=environment,
60+
identity=identity,
61+
override_traits=override_traits,
62+
)
63+
5764
feature_states = list(
5865
_get_identity_feature_states_dict(
59-
environment, identity, override_traits
66+
environment=environment,
67+
context=context,
6068
).values()
6169
)
6270
if environment.get_hide_disabled_flags():
@@ -80,8 +88,15 @@ def get_identity_feature_state(
8088
:return: feature state model based on the environment, any matching
8189
segments and any specific identity overrides
8290
"""
91+
context = map_environment_identity_to_context(
92+
environment=environment,
93+
identity=identity,
94+
override_traits=override_traits,
95+
)
96+
8397
feature_states = _get_identity_feature_states_dict(
84-
environment, identity, override_traits
98+
environment=environment,
99+
context=context,
85100
)
86101
matching_feature = next(
87102
filter(lambda feature: feature.name == feature_name, feature_states.keys()),
@@ -96,23 +111,11 @@ def get_identity_feature_state(
96111

97112
def _get_identity_feature_states_dict(
98113
environment: EnvironmentModel,
99-
identity: IdentityModel,
100-
override_traits: typing.Optional[typing.List[TraitModel]],
114+
context: EvaluationContext,
101115
) -> typing.Dict[FeatureModel, FeatureStateModel]:
102116
# Get feature states from the environment
103117
feature_states_by_feature = {fs.feature: fs for fs in environment.feature_states}
104118

105-
context = map_environment_identity_to_context(
106-
environment=environment,
107-
identity=identity,
108-
)
109-
if override_traits:
110-
if typing.TYPE_CHECKING: # pragma: no cover
111-
assert context["identity"]
112-
context["identity"].setdefault("traits", {}).update(
113-
{trait.trait_key: trait.trait_value for trait in override_traits}
114-
)
115-
116119
# Override with any feature states defined by matching segments
117120
for context_segment in get_context_segments(
118121
context=context,

0 commit comments

Comments
 (0)