Skip to content

Commit 093c073

Browse files
committed
Workaround for a bug
1 parent 1f4b62a commit 093c073

File tree

4 files changed

+81
-31
lines changed

4 files changed

+81
-31
lines changed

optimizely/integrations/django/apps.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.apps import AppConfig
22

33
from ... import integrations
4+
from ...optimizely import enums
45
from . import sdk
56
from .settings import optimizely_settings
67

@@ -14,6 +15,11 @@ def __init__(self, app_name, app_module):
1415

1516
def ready(self):
1617
optimizely_sdk.refresh()
18+
import optimizely
19+
optimizely.optimizely_sdk = optimizely_sdk
1720

1821

19-
optimizely_sdk = sdk.DjangoOptimizely(sdk_key=optimizely_settings.SDK_KEY)
22+
optimizely_sdk = sdk.DjangoOptimizely(
23+
sdk_key=optimizely_settings.SDK_KEY,
24+
datafile_fetching_strategy=enums.DatafileFetchingStrategy.MANUAL,
25+
)

optimizely/integrations/django/management/commands/sync_attributes.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,14 @@ def handle(self, *args, **options):
3939
for field in fields:
4040
attribute_key = utils.attribute_key_for_field(field)
4141
if attribute_key not in keys:
42-
attribute_name = '{}: {}'.format(model_name, field.verbose_name.title())
42+
attribute_name = utils.attribute_name_for_field(field)
4343
names_and_keys.append({'name': attribute_name,
4444
'key': attribute_key})
4545
for additional_attribute in model_config.get('ADDITIONAL_ATTRIBUTES', []):
4646
attribute_key = utils.attribute_key_for_model(additional_attribute['key'], feature_flag_model)
4747
if attribute_key not in keys:
48-
attribute_name = '{}: {}'.format(model_name,
49-
additional_attribute.get('name',
50-
additional_attribute['key'].title()))
48+
attribute_name = utils.attribute_name_for_additional_attribute(additional_attribute,
49+
feature_flag_model)
5150
names_and_keys.append({'name': attribute_name, 'key': attribute_key})
5251

5352
for name_and_key in names_and_keys:

optimizely/integrations/django/sdk.py

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from django.db import models
2+
13
from ...optimizely import Optimizely
24

35
from . import utils
@@ -16,62 +18,92 @@ class DjangoOptimizely(Optimizely):
1618
"""
1719

1820
def activate(self, experiment_key, user_id, attributes=None):
19-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
20-
return super(DjangoOptimizely, self).activate(experiment_key, formated_user_id,
21+
if not isinstance(user_id, models.Model):
22+
return super(DjangoOptimizely, self).activate(experiment_key, user_id, attributes=attributes)
23+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
24+
return super(DjangoOptimizely, self).activate(experiment_key, formatted_user_id,
2125
attributes=formatted_attributes)
2226

2327
def track(self, event_key, user_id, attributes=None, event_tags=None):
24-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
25-
return super(DjangoOptimizely, self).track(event_key, formated_user_id,
28+
if not isinstance(user_id, models.Model):
29+
return super(DjangoOptimizely, self).track(event_key, user_id, attributes=attributes, event_tags=event_tags)
30+
31+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
32+
return super(DjangoOptimizely, self).track(event_key, formatted_user_id,
2633
attributes=formatted_attributes, event_tags=event_tags)
2734

2835
def is_feature_enabled(self, feature_key, user_id, attributes=None):
29-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
30-
return super(DjangoOptimizely, self).is_feature_enabled(feature_key, formated_user_id,
36+
if not isinstance(user_id, models.Model):
37+
return super(DjangoOptimizely, self).is_feature_enabled(feature_key, user_id, attributes=attributes)
38+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
39+
return super(DjangoOptimizely, self).is_feature_enabled(feature_key, formatted_user_id,
3140
attributes=formatted_attributes)
3241

3342
def get_variation(self, experiment_key, user_id, attributes=None):
34-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
35-
return super(DjangoOptimizely, self).get_variation(experiment_key, formated_user_id,
43+
if not isinstance(user_id, models.Model):
44+
return super(DjangoOptimizely, self).get_variation(experiment_key, user_id, attributes=attributes)
45+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
46+
return super(DjangoOptimizely, self).get_variation(experiment_key, formatted_user_id,
3647
attributes=formatted_attributes)
3748

3849
def get_enabled_features(self, user_id, attributes=None):
39-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
40-
return super(DjangoOptimizely, self).get_enabled_features(formated_user_id, attributes=formatted_attributes)
50+
if not isinstance(user_id, models.Model):
51+
return super(DjangoOptimizely, self).get_enabled_features(user_id, attributes=attributes)
52+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
53+
return super(DjangoOptimizely, self).get_enabled_features(formatted_user_id, attributes=formatted_attributes)
4154

4255
def get_feature_variable(self, feature_key, variable_key, user_id, attributes=None):
43-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
56+
if not isinstance(user_id, models.Model):
57+
return super(DjangoOptimizely, self).get_feature_variable(feature_key, variable_key, user_id,
58+
attributes=attributes)
59+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
4460
return super(DjangoOptimizely, self).get_feature_variable(feature_key, variable_key,
45-
formated_user_id, attributes=formatted_attributes)
61+
formatted_user_id, attributes=formatted_attributes)
4662

4763
def get_feature_variable_boolean(self, feature_key, variable_key, user_id, attributes=None):
48-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
64+
if not isinstance(user_id, models.Model):
65+
return super(DjangoOptimizely, self).get_feature_variable_boolean(feature_key, variable_key, user_id,
66+
attributes=attributes)
67+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
4968
return super(DjangoOptimizely, self).get_feature_variable_boolean(feature_key, variable_key,
50-
formated_user_id,
69+
formatted_user_id,
5170
attributes=formatted_attributes)
5271

5372
def get_feature_variable_double(self, feature_key, variable_key, user_id, attributes=None):
54-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
73+
if not isinstance(user_id, models.Model):
74+
return super(DjangoOptimizely, self).get_feature_variable_double(feature_key, variable_key, user_id,
75+
attributes=attributes)
76+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
5577
return super(DjangoOptimizely, self).get_feature_variable_double(feature_key, variable_key,
56-
formated_user_id,
78+
formatted_user_id,
5779
attributes=formatted_attributes)
5880

5981
def get_feature_variable_integer(self, feature_key, variable_key, user_id, attributes=None):
60-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
82+
if not isinstance(user_id, models.Model):
83+
return super(DjangoOptimizely, self).get_feature_variable_integer(feature_key, variable_key, user_id,
84+
attributes=attributes)
85+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
6186
return super(DjangoOptimizely, self).get_feature_variable_integer(feature_key, variable_key,
62-
formated_user_id,
87+
formatted_user_id,
6388
attributes=formatted_attributes)
6489

6590
def get_feature_variable_string(self, feature_key, variable_key, user_id, attributes=None):
66-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
91+
if not isinstance(user_id, models.Model):
92+
return super(DjangoOptimizely, self).get_feature_variable_string(feature_key, variable_key, user_id,
93+
attributes=attributes)
94+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
6795
return super(DjangoOptimizely, self).get_feature_variable_string(feature_key, variable_key,
68-
formated_user_id,
96+
formatted_user_id,
6997
attributes=formatted_attributes)
7098

7199
def get_forced_variation(self, experiment_key, user_id):
72-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
73-
return super(DjangoOptimizely, self).get_forced_variation(experiment_key, formated_user_id)
100+
if not isinstance(user_id, models.Model):
101+
return super(DjangoOptimizely, self).get_forced_variation(experiment_key, user_id)
102+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
103+
return super(DjangoOptimizely, self).get_forced_variation(experiment_key, formatted_user_id)
74104

75105
def set_forced_variation(self, experiment_key, user_id, variation_key):
76-
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
77-
return super(DjangoOptimizely, self).set_forced_variation(experiment_key, formated_user_id, variation_key)
106+
if not isinstance(user_id, models.Model):
107+
return super(DjangoOptimizely, self).set_forced_variation(experiment_key, user_id, variation_key)
108+
formatted_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
109+
return super(DjangoOptimizely, self).set_forced_variation(experiment_key, formatted_user_id, variation_key)

optimizely/integrations/django/utils.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ def fields_for_attributes_for_model(model_class):
1414
return [model_class._meta.get_field(field) if isinstance(field, six.string_types) else field for field in fields]
1515

1616

17+
def attribute_name_for_field(field):
18+
model_name = optimizely_settings.FEATURE_FLAG_MODELS[field.model].get('MODEL_NAME',
19+
field.model._meta.verbose_name.title())
20+
return '{}: {}'.format(model_name, field.verbose_name.title())
21+
22+
23+
def attribute_name_for_additional_attribute(additional_attribute, model_class):
24+
model_name = optimizely_settings.FEATURE_FLAG_MODELS[model_class].get('MODEL_NAME',
25+
model_class._meta.verbose_name.title())
26+
return '{}: {}'.format(model_name, additional_attribute.get('name', additional_attribute['key'].title()))
27+
28+
1729
def attribute_key_for_field(field):
1830
return attribute_key_for_model(field.name, field.model)
1931

@@ -41,11 +53,12 @@ def model_instance_id_and_attributes(model_instance, attribute_overrides=None):
4153
attributes = {}
4254
model_class = type(model_instance)
4355
for field in fields_for_attributes_for_model(model_class):
44-
attribute_key = attribute_key_for_field(field)
56+
attribute_key = attribute_name_for_field(field) # Note this is a bug IRL
4557
attributes[attribute_key] = getattr(model_instance, field.attname)
4658

4759
for additional_attribute in optimizely_settings.FEATURE_FLAG_MODELS[model_class].get('ADDITIONAL_ATTRIBUTES', []):
48-
attribute_key = attribute_key_for_model(additional_attribute['key'], model_class)
60+
attribute_key = attribute_name_for_additional_attribute(additional_attribute,
61+
model_class) # Note there is a bug here IRL
4962
attributes[attribute_key] = additional_attribute['value'](model_instance)
5063

5164
if attribute_overrides:

0 commit comments

Comments
 (0)