Skip to content

Commit aabdbb7

Browse files
uhlissuhjaredlockhart
authored andcommitted
Fix rollout timeline/pop page fixes #2403 (#2406)
* Fix rollout timeline/pop page fixes #2403 * Split into two methods of enrollment and playbook * Add values to options Co-authored-by: Jared Lockhart <119884+jaredlockhart@users.noreply.github.com>
1 parent 629993f commit aabdbb7

File tree

9 files changed

+236
-23
lines changed

9 files changed

+236
-23
lines changed

app/experimenter/docs/openapi-schema.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4556,6 +4556,10 @@
45564556
"type": "integer",
45574557
"nullable": true
45584558
},
4559+
"rollout_playbook": {
4560+
"type": "string",
4561+
"nullable": true
4562+
},
45594563
"proposed_duration": {
45604564
"type": "integer",
45614565
"nullable": true
@@ -4662,6 +4666,10 @@
46624666
"type": "integer",
46634667
"nullable": true
46644668
},
4669+
"rollout_playbook": {
4670+
"type": "string",
4671+
"nullable": true
4672+
},
46654673
"proposed_duration": {
46664674
"type": "integer",
46674675
"nullable": true
@@ -4744,6 +4752,10 @@
47444752
"type": "integer",
47454753
"nullable": true
47464754
},
4755+
"rollout_playbook": {
4756+
"type": "string",
4757+
"nullable": true
4758+
},
47474759
"proposed_duration": {
47484760
"type": "integer",
47494761
"nullable": true
@@ -4826,6 +4838,10 @@
48264838
"type": "integer",
48274839
"nullable": true
48284840
},
4841+
"rollout_playbook": {
4842+
"type": "string",
4843+
"nullable": true
4844+
},
48294845
"proposed_duration": {
48304846
"type": "integer",
48314847
"nullable": true
@@ -4913,6 +4929,10 @@
49134929
"type": "integer",
49144930
"nullable": true
49154931
},
4932+
"rollout_playbook": {
4933+
"type": "string",
4934+
"nullable": true
4935+
},
49164936
"proposed_duration": {
49174937
"type": "integer",
49184938
"nullable": true
@@ -5019,6 +5039,10 @@
50195039
"type": "integer",
50205040
"nullable": true
50215041
},
5042+
"rollout_playbook": {
5043+
"type": "string",
5044+
"nullable": true
5045+
},
50225046
"proposed_duration": {
50235047
"type": "integer",
50245048
"nullable": true
@@ -5101,6 +5125,10 @@
51015125
"type": "integer",
51025126
"nullable": true
51035127
},
5128+
"rollout_playbook": {
5129+
"type": "string",
5130+
"nullable": true
5131+
},
51045132
"proposed_duration": {
51055133
"type": "integer",
51065134
"nullable": true
@@ -5183,6 +5211,10 @@
51835211
"type": "integer",
51845212
"nullable": true
51855213
},
5214+
"rollout_playbook": {
5215+
"type": "string",
5216+
"nullable": true
5217+
},
51865218
"proposed_duration": {
51875219
"type": "integer",
51885220
"nullable": true
@@ -5270,6 +5302,10 @@
52705302
"type": "integer",
52715303
"nullable": true
52725304
},
5305+
"rollout_playbook": {
5306+
"type": "string",
5307+
"nullable": true
5308+
},
52735309
"proposed_duration": {
52745310
"type": "integer",
52755311
"nullable": true

app/experimenter/docs/swagger-ui.html

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4568,6 +4568,10 @@
45684568
"type": "integer",
45694569
"nullable": true
45704570
},
4571+
"rollout_playbook": {
4572+
"type": "string",
4573+
"nullable": true
4574+
},
45714575
"proposed_duration": {
45724576
"type": "integer",
45734577
"nullable": true
@@ -4674,6 +4678,10 @@
46744678
"type": "integer",
46754679
"nullable": true
46764680
},
4681+
"rollout_playbook": {
4682+
"type": "string",
4683+
"nullable": true
4684+
},
46774685
"proposed_duration": {
46784686
"type": "integer",
46794687
"nullable": true
@@ -4756,6 +4764,10 @@
47564764
"type": "integer",
47574765
"nullable": true
47584766
},
4767+
"rollout_playbook": {
4768+
"type": "string",
4769+
"nullable": true
4770+
},
47594771
"proposed_duration": {
47604772
"type": "integer",
47614773
"nullable": true
@@ -4838,6 +4850,10 @@
48384850
"type": "integer",
48394851
"nullable": true
48404852
},
4853+
"rollout_playbook": {
4854+
"type": "string",
4855+
"nullable": true
4856+
},
48414857
"proposed_duration": {
48424858
"type": "integer",
48434859
"nullable": true
@@ -4925,6 +4941,10 @@
49254941
"type": "integer",
49264942
"nullable": true
49274943
},
4944+
"rollout_playbook": {
4945+
"type": "string",
4946+
"nullable": true
4947+
},
49284948
"proposed_duration": {
49294949
"type": "integer",
49304950
"nullable": true
@@ -5031,6 +5051,10 @@
50315051
"type": "integer",
50325052
"nullable": true
50335053
},
5054+
"rollout_playbook": {
5055+
"type": "string",
5056+
"nullable": true
5057+
},
50345058
"proposed_duration": {
50355059
"type": "integer",
50365060
"nullable": true
@@ -5113,6 +5137,10 @@
51135137
"type": "integer",
51145138
"nullable": true
51155139
},
5140+
"rollout_playbook": {
5141+
"type": "string",
5142+
"nullable": true
5143+
},
51165144
"proposed_duration": {
51175145
"type": "integer",
51185146
"nullable": true
@@ -5195,6 +5223,10 @@
51955223
"type": "integer",
51965224
"nullable": true
51975225
},
5226+
"rollout_playbook": {
5227+
"type": "string",
5228+
"nullable": true
5229+
},
51985230
"proposed_duration": {
51995231
"type": "integer",
52005232
"nullable": true
@@ -5282,6 +5314,10 @@
52825314
"type": "integer",
52835315
"nullable": true
52845316
},
5317+
"rollout_playbook": {
5318+
"type": "string",
5319+
"nullable": true
5320+
},
52855321
"proposed_duration": {
52865322
"type": "integer",
52875323
"nullable": true

app/experimenter/experiments/serializers/timeline_population.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class ExperimentTimelinePopSerializer(
3636
proposed_enrollment = serializers.IntegerField(
3737
required=False, allow_null=True, default=None
3838
)
39+
rollout_playbook = serializers.CharField(
40+
required=False, allow_null=True, default=None
41+
)
3942
population_percent = serializers.DecimalField(
4043
required=False,
4144
max_digits=7,
@@ -65,6 +68,7 @@ class Meta:
6568
fields = (
6669
"proposed_start_date",
6770
"proposed_enrollment",
71+
"rollout_playbook",
6872
"proposed_duration",
6973
"population_percent",
7074
"firefox_channel",

app/experimenter/experiments/tests/serializers/test_timeline_population.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def setUp(self):
4848
population_percent="30.0000",
4949
)
5050

51-
def test_serializer_outputs_expected_schema(self):
51+
def test_serializer_outputs_expected_schema_pref(self):
5252

5353
serializer = ExperimentTimelinePopSerializer(self.experiment)
5454

@@ -58,6 +58,7 @@ def test_serializer_outputs_expected_schema(self):
5858
"proposed_start_date": self.experiment.proposed_start_date.strftime(
5959
"%Y-%m-%d"
6060
),
61+
"rollout_playbook": None,
6162
"proposed_enrollment": self.experiment.proposed_enrollment,
6263
"proposed_duration": self.experiment.proposed_duration,
6364
"population_percent": self.experiment.population_percent,
@@ -152,3 +153,57 @@ def test_serializer_rejects_enrollment_greater_duration(self):
152153

153154
self.assertFalse(serializer.is_valid())
154155
self.assertIn("proposed_enrollment", serializer.errors)
156+
157+
def test_serializer_outputs_expected_schema_rollout(self):
158+
experiment = ExperimentFactory.create(
159+
type=ExperimentConstants.TYPE_ROLLOUT,
160+
rollout_playbook="Low Risk Schedule",
161+
locales=[self.locale],
162+
countries=[self.country],
163+
population_percent="30.0000",
164+
proposed_enrollment=None,
165+
)
166+
167+
serializer = ExperimentTimelinePopSerializer(experiment)
168+
169+
self.assertEqual(
170+
serializer.data,
171+
{
172+
"proposed_start_date": experiment.proposed_start_date.strftime(
173+
"%Y-%m-%d"
174+
),
175+
"proposed_enrollment": experiment.proposed_enrollment,
176+
"rollout_playbook": experiment.rollout_playbook,
177+
"proposed_duration": experiment.proposed_duration,
178+
"population_percent": experiment.population_percent,
179+
"firefox_channel": experiment.firefox_channel,
180+
"firefox_min_version": experiment.firefox_min_version,
181+
"firefox_max_version": experiment.firefox_max_version,
182+
"locales": [{"value": self.locale.id, "label": self.locale.name}],
183+
"countries": [{"value": self.country.id, "label": self.country.name}],
184+
"platform": experiment.platform,
185+
"client_matching": experiment.client_matching,
186+
},
187+
)
188+
189+
def test_serializer_saves_rollout_playbook_field(self):
190+
experiment = ExperimentFactory.create(
191+
type=ExperimentConstants.TYPE_ROLLOUT,
192+
rollout_playbook="Low Risk Schedule",
193+
locales=[self.locale],
194+
countries=[self.country],
195+
population_percent="30.0000",
196+
proposed_enrollment=None,
197+
)
198+
199+
data = {"rollout_playbook": "High Risk Schedule", "countries": [], "locales": []}
200+
201+
serializer = ExperimentTimelinePopSerializer(
202+
instance=experiment, data=data, context={"request": self.request}
203+
)
204+
205+
self.assertTrue(serializer.is_valid())
206+
207+
experiment = serializer.save()
208+
209+
self.assertEqual(experiment.rollout_playbook, "High Risk Schedule")

0 commit comments

Comments
 (0)