Skip to content

Commit c5fbb62

Browse files
Fix event payload to handle holdout dict variations
CRITICAL FIX: Holdout impression events had empty variation_key and variation_id in event payloads because event_factory only checked for Variation entities, not dict variations. Root Cause: - event_factory.py lines 125-127 only handled entities.Variation type - For holdouts, event.variation is a dict (VariationDict), not Variation entity - isinstance(event.variation, entities.Variation) returned False for holdouts - variation_id and variation_key stayed as empty strings ('') - Event payload sent with empty variation_key and variation_id fields The Fix: - Added elif clause to handle dict variations - Extract 'id' and 'key' from dict using .get() method - Preserves existing behavior for Variation entities - Now handles both Variation entities and VariationDict formats Code Changes (event_factory.py lines 125-131): ```python if isinstance(event.variation, entities.Variation): variation_id = event.variation.id variation_key = event.variation.key elif isinstance(event.variation, dict): # Handle holdout variations (dict format) variation_id = event.variation.get('id', '') variation_key = event.variation.get('key', '') ``` Impact: - Holdout impression events now include correct variation_key and variation_id - Event metadata properly populated for holdout decisions - Fixes fullstack compatibility suite decide_holdouts.feature validation - Fixes decide_all_api_with_holdouts.feature validation - All 54 tests passing (35 holdout + 19 event_factory) - Backward compatible with existing Variation entity handling Aligned with Swift SDK event payload structure.
1 parent 89d00a7 commit c5fbb62

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

optimizely/event/event_factory.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ def _create_visitor(cls, event: Optional[user_event.UserEvent], logger: Logger)
125125
if isinstance(event.variation, entities.Variation):
126126
variation_id = event.variation.id
127127
variation_key = event.variation.key
128+
elif isinstance(event.variation, dict):
129+
# Handle holdout variations (dict format)
130+
variation_id = event.variation.get('id', '')
131+
variation_key = event.variation.get('key', '')
128132

129133
if event.experiment:
130134
experiment_layerId = event.experiment.layerId

0 commit comments

Comments
 (0)