Skip to content

Commit c93a44d

Browse files
committed
Refactor helper methods out to utils module
1 parent c038c6f commit c93a44d

File tree

2 files changed

+50
-47
lines changed

2 files changed

+50
-47
lines changed

optimizely/integrations/django/sdk.py

Lines changed: 14 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from ...optimizely import Optimizely
22

3+
from . import utils
4+
35

46
class DjangoOptimizely(Optimizely):
57
"""
@@ -13,98 +15,63 @@ class DjangoOptimizely(Optimizely):
1315
don't accidentally get unnecessarily shared. Additional fields can be added in settings.
1416
"""
1517

16-
def _get_fields_for_attributes_for_model(self, model_class):
17-
"""
18-
19-
:param model_class:
20-
:return:
21-
"""
22-
return (model_class._meta.pk,)
23-
24-
def _format_attribute_key_for_field(self, field):
25-
return '{field.model._meta.label}:{field.name}'.format(field=field)
26-
27-
def _get_model_instance_id_and_attributes(self, model_instance, attribute_overrides=None):
28-
"""
29-
Helper for forming id + attributes that get passed in.
30-
31-
:param model_instance: Django model instance
32-
:param attribute_overrides dict
33-
:return: (str, dict)
34-
str will be of the form 'app_label.ModelClass:{model_instance.pk}'
35-
dict will be a generated dict of field names and values based on a list
36-
of attributes provided in settings.:
37-
{'users.User:id': 12345,
38-
'users.User:first_name': 'Michael',
39-
'users.User:last_name': 'Bluth',
40-
'users.User:email': 'michael@thebluthcompany.com'}
41-
"""
42-
formatted_user_id = '{instance._meta.label}:{instance.pk}'.format(instance=model_instance)
43-
attributes = {}
44-
for field in self._get_fields_for_attributes_for_model(model_instance):
45-
attribute_key = self._format_attribute_key_for_field(field)
46-
attributes[attribute_key] = getattr(model_instance, field.attname)
47-
if attribute_overrides:
48-
attributes.update(attribute_overrides)
49-
return formatted_user_id, attributes
50-
5118
def activate(self, experiment_key, user_id, attributes=None):
52-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
19+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
5320
return super(DjangoOptimizely, self).activate(experiment_key, formated_user_id,
5421
attributes=formatted_attributes)
5522

5623
def track(self, event_key, user_id, attributes=None, event_tags=None):
57-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
24+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
5825
return super(DjangoOptimizely, self).track(event_key, formated_user_id,
5926
attributes=formatted_attributes, event_tags=event_tags)
6027

6128
def is_feature_enabled(self, feature_key, user_id, attributes=None):
62-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
29+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
6330
return super(DjangoOptimizely, self).is_feature_enabled(feature_key, formated_user_id,
6431
attributes=formatted_attributes)
6532

6633
def get_variation(self, experiment_key, user_id, attributes=None):
67-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
34+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
6835
return super(DjangoOptimizely, self).get_variation(experiment_key, formated_user_id,
6936
attributes=formatted_attributes)
7037

7138
def get_enabled_features(self, user_id, attributes=None):
72-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
39+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
7340
return super(DjangoOptimizely, self).get_enabled_features(formated_user_id, attributes=formatted_attributes)
7441

7542
def get_feature_variable(self, feature_key, variable_key, user_id, attributes=None):
76-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
43+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
7744
return super(DjangoOptimizely, self).get_feature_variable(feature_key, variable_key,
7845
formated_user_id, attributes=formatted_attributes)
7946

8047
def get_feature_variable_boolean(self, feature_key, variable_key, user_id, attributes=None):
81-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
48+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
8249
return super(DjangoOptimizely, self).get_feature_variable_boolean(feature_key, variable_key,
8350
formated_user_id,
8451
attributes=formatted_attributes)
8552

8653
def get_feature_variable_double(self, feature_key, variable_key, user_id, attributes=None):
87-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
54+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
8855
return super(DjangoOptimizely, self).get_feature_variable_double(feature_key, variable_key,
8956
formated_user_id,
9057
attributes=formatted_attributes)
9158

9259
def get_feature_variable_integer(self, feature_key, variable_key, user_id, attributes=None):
93-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
60+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
9461
return super(DjangoOptimizely, self).get_feature_variable_integer(feature_key, variable_key,
9562
formated_user_id,
9663
attributes=formatted_attributes)
9764

9865
def get_feature_variable_string(self, feature_key, variable_key, user_id, attributes=None):
99-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id, attributes)
66+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id, attributes)
10067
return super(DjangoOptimizely, self).get_feature_variable_string(feature_key, variable_key,
10168
formated_user_id,
10269
attributes=formatted_attributes)
10370

10471
def get_forced_variation(self, experiment_key, user_id):
105-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id)
72+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
10673
return super(DjangoOptimizely, self).get_forced_variation(experiment_key, formated_user_id)
10774

10875
def set_forced_variation(self, experiment_key, user_id, variation_key):
109-
formated_user_id, formatted_attributes = self._get_model_instance_id_and_attributes(user_id)
76+
formated_user_id, formatted_attributes = utils.model_instance_id_and_attributes(user_id)
11077
return super(DjangoOptimizely, self).set_forced_variation(experiment_key, formated_user_id, variation_key)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
def fields_for_attributes_for_model(model_class):
2+
"""
3+
4+
:param model_class:
5+
:return:
6+
"""
7+
return (model_class._meta.pk,)
8+
9+
10+
def attribute_key_for_field(field):
11+
return '{field.model._meta.label}__{field.name}'.format(field=field)
12+
13+
14+
def model_instance_id_and_attributes(model_instance, attribute_overrides=None):
15+
"""
16+
Helper for forming id + attributes that get passed in.
17+
18+
:param model_instance: Django model instance
19+
:param attribute_overrides dict
20+
:return: (str, dict)
21+
str will be of the form 'app_label.ModelClass:{model_instance.pk}'
22+
dict will be a generated dict of field names and values based on a list
23+
of attributes provided in settings.:
24+
{'users.User:id': 12345,
25+
'users.User:first_name': 'Michael',
26+
'users.User:last_name': 'Bluth',
27+
'users.User:email': 'michael@thebluthcompany.com'}
28+
"""
29+
formatted_user_id = '{instance._meta.label}:{instance.pk}'.format(instance=model_instance)
30+
attributes = {}
31+
for field in fields_for_attributes_for_model(model_instance):
32+
attribute_key = attribute_key_for_field(field)
33+
attributes[attribute_key] = getattr(model_instance, field.attname)
34+
if attribute_overrides:
35+
attributes.update(attribute_overrides)
36+
return formatted_user_id, attributes

0 commit comments

Comments
 (0)