15
15
16
16
import copy
17
17
import threading
18
- from collections import namedtuple
19
18
20
19
from . import logger
21
20
from .decision .optimizely_decision_message import OptimizelyDecisionMessage
@@ -50,7 +49,22 @@ def __init__(self, optimizely_client, user_id, user_attributes=None):
50
49
self .forced_decisions = {}
51
50
self .log = logger .SimpleLogger (min_level = enums .LogLevels .INFO )
52
51
53
- ForcedDecisionKeys = namedtuple ('ForcedDecisionKeys' , 'flag_key rule_key' )
52
+ # decision context
53
+ class OptimizelyDecisionContext (object ):
54
+ def __init__ (self , flag_key , rule_key ):
55
+ self .flag_key = flag_key
56
+ self .rule_key = rule_key
57
+
58
+ def __hash__ (self ):
59
+ return hash ((self .flag_key , self .rule_key ))
60
+
61
+ def __eq__ (self , other ):
62
+ return (self .flag_key , self .rule_key ) == (other .flag_key , other .rule_key )
63
+
64
+ # forced decision
65
+ class OptimizelyForcedDecision (object ):
66
+ def __init__ (self , variation_key ):
67
+ self .variation_key = variation_key
54
68
55
69
def _clone (self ):
56
70
if not self .client :
@@ -133,14 +147,13 @@ def as_json(self):
133
147
'attributes' : self .get_user_attributes (),
134
148
}
135
149
136
- def set_forced_decision (self , flag_key , rule_key , variation_key ):
150
+ def set_forced_decision (self , OptimizelyDecisionContext , OptimizelyForcedDecision ):
137
151
"""
138
- Sets the forced decision (variation key) for a given flag and an optional rule .
152
+ Sets the forced decision for a given decision context .
139
153
140
154
Args:
141
- flag_key: A flag key.
142
- rule_key: An experiment or delivery rule key (optional).
143
- variation_key: A variation key.
155
+ OptimizelyDecisionContext: a decision context.
156
+ OptimizelyForcedDecision: a forced decision.
144
157
145
158
Returns:
146
159
True if the forced decision has been set successfully.
@@ -151,18 +164,19 @@ def set_forced_decision(self, flag_key, rule_key, variation_key):
151
164
self .log .logger .error (OptimizelyDecisionMessage .SDK_NOT_READY )
152
165
return False
153
166
154
- forced_decision_key = self .ForcedDecisionKeys (flag_key , rule_key )
155
- self .forced_decisions [forced_decision_key ] = variation_key
167
+ context = OptimizelyDecisionContext
168
+ decision = OptimizelyForcedDecision
169
+
170
+ self .forced_decisions [context ] = decision
156
171
157
172
return True
158
173
159
- def get_forced_decision (self , flag_key , rule_key ):
174
+ def get_forced_decision (self , OptimizelyDecisionContext ):
160
175
"""
161
- Gets the forced decision (variation key) for a given flag and an optional rule .
176
+ Gets the forced decision (variation key) for a given decision context .
162
177
163
178
Args:
164
- flag_key: A flag key.
165
- rule_key: An experiment or delivery rule key (optional).
179
+ OptimizelyDecisionContext: a decision context.
166
180
167
181
Returns:
168
182
A variation key or None if forced decisions are not set for the parameters.
@@ -173,17 +187,16 @@ def get_forced_decision(self, flag_key, rule_key):
173
187
self .log .logger .error (OptimizelyDecisionMessage .SDK_NOT_READY )
174
188
return None
175
189
176
- forced_decision_key = self .find_forced_decision (flag_key , rule_key )
190
+ forced_decision_key = self .find_forced_decision (OptimizelyDecisionContext )
177
191
178
192
return forced_decision_key if forced_decision_key else None
179
193
180
- def remove_forced_decision (self , flag_key , rule_key ):
194
+ def remove_forced_decision (self , OptimizelyDecisionContext ):
181
195
"""
182
196
Removes the forced decision for a given flag and an optional rule.
183
197
184
198
Args:
185
- flag_key: A flag key.
186
- rule_key: An experiment or delivery rule key (optional).
199
+ OptimizelyDecisionContext: a decision context.
187
200
188
201
Returns:
189
202
Returns: true if the forced decision has been removed successfully.
@@ -194,9 +207,9 @@ def remove_forced_decision(self, flag_key, rule_key):
194
207
self .log .logger .error (OptimizelyDecisionMessage .SDK_NOT_READY )
195
208
return False
196
209
197
- forced_decision_key = self .ForcedDecisionKeys ( flag_key , rule_key )
198
- if self .forced_decisions [forced_decision_key ]:
199
- del self . forced_decisions [ forced_decision_key ]
210
+ if self .forced_decisions [ OptimizelyDecisionContext ]:
211
+ del self .forced_decisions [OptimizelyDecisionContext ]
212
+ return True
200
213
201
214
return False
202
215
@@ -217,35 +230,36 @@ def remove_all_forced_decisions(self):
217
230
218
231
return True
219
232
220
- def find_forced_decision (self , flag_key , rule_key ):
233
+ def find_forced_decision (self , OptimizelyDecisionContext ):
221
234
222
235
if not self .forced_decisions :
223
236
return None
224
237
225
- forced_decision_key = self .ForcedDecisionKeys (flag_key , rule_key )
226
- variation_key = self .forced_decisions .get (forced_decision_key , None )
227
-
228
- return variation_key if variation_key else None
238
+ # must allow None to be returned for the Flags only case
239
+ return self .forced_decisions .get (OptimizelyDecisionContext )
229
240
230
- def find_validated_forced_decision (self , flag_key , rule_key , options ):
241
+ def find_validated_forced_decision (self , OptimizelyDecisionContext , options ):
231
242
232
243
reasons = []
233
244
234
- variation_key = self .find_forced_decision (flag_key , rule_key )
245
+ forced_decision_response = self .find_forced_decision (OptimizelyDecisionContext )
246
+
247
+ flag_key = OptimizelyDecisionContext .flag_key
248
+ rule_key = OptimizelyDecisionContext .rule_key
235
249
236
- if variation_key :
237
- variation = self .client .get_flag_variation_by_key (flag_key , variation_key )
250
+ if forced_decision_response :
251
+ variation = self .client .get_flag_variation_by_key (flag_key , forced_decision_response )
238
252
if variation :
239
253
if rule_key :
240
254
user_has_forced_decision = enums .ForcedDecisionLogs \
241
- .USER_HAS_FORCED_DECISION_WITH_RULE_SPECIFIED .format (variation_key ,
255
+ .USER_HAS_FORCED_DECISION_WITH_RULE_SPECIFIED .format (forced_decision_response ,
242
256
flag_key ,
243
257
rule_key ,
244
258
self .user_id )
245
259
246
260
else :
247
261
user_has_forced_decision = enums .ForcedDecisionLogs \
248
- .USER_HAS_FORCED_DECISION_WITHOUT_RULE_SPECIFIED .format (variation_key ,
262
+ .USER_HAS_FORCED_DECISION_WITHOUT_RULE_SPECIFIED .format (forced_decision_response ,
249
263
flag_key ,
250
264
self .user_id )
251
265
0 commit comments