Skip to content

Commit f9bcb01

Browse files
authored
feat(nimbus): setup results page with required data (#13718)
Because - Results page view context requires specific data to render contents This commit - Passes the required context data through the view Fixes #13682
1 parent 919af0d commit f9bcb01

File tree

4 files changed

+157
-0
lines changed

4 files changed

+157
-0
lines changed

experimenter/experimenter/experiments/models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,6 +1568,19 @@ def has_displayable_results(self):
15681568

15691569
return False
15701570

1571+
@property
1572+
def has_exposures(self):
1573+
# True if there are any exposures in the results data
1574+
if self.results_data and "v3" in self.results_data:
1575+
results_data = self.results_data["v3"]
1576+
for window in ["overall", "weekly"]:
1577+
if results_data.get(window):
1578+
exposure_data = results_data[window].get("exposures", {}).get("all")
1579+
if exposure_data is not None:
1580+
return True
1581+
1582+
return False
1583+
15711584
@property
15721585
def show_results_url(self):
15731586
# if there are results, show them! even if the dates are wrong

experimenter/experimenter/experiments/tests/test_models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3259,6 +3259,22 @@ def test_has_displayable_results_true(self, results_data):
32593259

32603260
self.assertTrue(experiment.has_displayable_results)
32613261

3262+
def test_has_exposures_results_true(self):
3263+
results_data = {"v3": {"overall": {"exposures": {"all": {}}}}}
3264+
experiment = NimbusExperimentFactory.create()
3265+
experiment.results_data = results_data
3266+
experiment.save()
3267+
3268+
self.assertTrue(experiment.has_exposures)
3269+
3270+
def test_has_exposures_results_false(self):
3271+
results_data = {"v3": {"overall": {"enrollments": {"all": {}}}}}
3272+
experiment = NimbusExperimentFactory.create()
3273+
experiment.results_data = results_data
3274+
experiment.save()
3275+
3276+
self.assertFalse(experiment.has_exposures)
3277+
32623278
@parameterized.expand(
32633279
[
32643280
({},),

experimenter/experimenter/nimbus_ui/tests/test_views.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,6 +2988,102 @@ def test_render_to_response(self):
29882988
self.assertEqual(response.context["experiment"], experiment)
29892989
self.assertTemplateUsed(response, "nimbus_experiments/results.html")
29902990

2991+
@parameterized.expand(
2992+
[
2993+
(
2994+
{
2995+
"v3": {
2996+
"other_metrics": {"group": {"metricA": "Metric A"}},
2997+
"metadata": {
2998+
"metrics": {"metricA": {"friendlyName": "Friendly Metric A"}},
2999+
},
3000+
"overall": {
3001+
"enrollments": {"all": {}},
3002+
"exposures": {"all": {}},
3003+
},
3004+
"weekly": {
3005+
"enrollments": {"all": {}},
3006+
"exposures": {"all": {}},
3007+
},
3008+
}
3009+
},
3010+
"exposures",
3011+
{"metricA": "Friendly Metric A"},
3012+
),
3013+
(
3014+
{
3015+
"v3": {
3016+
"other_metrics": {"group": {"metricA": "Metric A"}},
3017+
"metadata": {
3018+
"metrics": {"metricA": {"friendlyName": "Friendly Metric A"}},
3019+
},
3020+
"overall": {"enrollments": {"all": {}}},
3021+
}
3022+
},
3023+
"enrollments",
3024+
{"metricA": "Friendly Metric A"},
3025+
),
3026+
]
3027+
)
3028+
def test_results_view_context_and_defaults(
3029+
self, results_data, selected_analysis_basis, default_metrics
3030+
):
3031+
experiment = NimbusExperimentFactory.create_with_lifecycle(
3032+
NimbusExperimentFactory.Lifecycles.ENDING_APPROVE_APPROVE,
3033+
)
3034+
3035+
experiment.results_data = results_data
3036+
experiment.save()
3037+
3038+
response = self.client.get(
3039+
reverse("nimbus-ui-results", kwargs={"slug": experiment.slug}),
3040+
)
3041+
3042+
self.assertEqual(response.status_code, 200)
3043+
self.assertEqual(
3044+
response.context["results_data"], experiment.results_data.get("v3")
3045+
)
3046+
self.assertEqual(response.context["default_metrics"], default_metrics)
3047+
self.assertEqual(
3048+
response.context["selected_reference_branch"],
3049+
experiment.reference_branch.name,
3050+
)
3051+
self.assertEqual(response.context["selected_segment"], "all")
3052+
self.assertEqual(
3053+
response.context["selected_analysis_basis"], selected_analysis_basis
3054+
)
3055+
3056+
def test_results_view_query_param_overrides(self):
3057+
experiment = NimbusExperimentFactory.create_with_lifecycle(
3058+
NimbusExperimentFactory.Lifecycles.ENDING_APPROVE_APPROVE,
3059+
)
3060+
3061+
experiment.results_data = {
3062+
"v3": {
3063+
"other_metrics": {},
3064+
"metadata": {"metrics": {}},
3065+
"overall": {"enrollments": {"all": {}}, "exposures": {"all": {}}},
3066+
}
3067+
}
3068+
experiment.save()
3069+
3070+
response = self.client.get(
3071+
reverse(
3072+
"nimbus-ui-results",
3073+
kwargs={"slug": experiment.slug},
3074+
query={
3075+
"reference_branch": "treatment-a",
3076+
"segment": "foo",
3077+
"analysis_basis": "enrollments",
3078+
},
3079+
)
3080+
)
3081+
3082+
self.assertEqual(response.status_code, 200)
3083+
self.assertEqual(response.context["selected_reference_branch"], "treatment-a")
3084+
self.assertEqual(response.context["selected_segment"], "foo")
3085+
self.assertEqual(response.context["selected_analysis_basis"], "enrollments")
3086+
29913087

29923088
class TestBranchScreenshotCreateView(AuthTestCase):
29933089
def test_post_creates_screenshot(self):

experimenter/experimenter/nimbus_ui/views.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,38 @@ class ApproveUpdateRolloutView(StatusUpdateView):
651651
class ResultsView(NimbusExperimentViewMixin, DetailView):
652652
template_name = "nimbus_experiments/results.html"
653653

654+
def get_context_data(self, **kwargs):
655+
context = super().get_context_data(**kwargs)
656+
experiment = self.get_object()
657+
658+
analysis_data = experiment.results_data.get("v3", {})
659+
other_metrics = analysis_data.get("other_metrics", {})
660+
metrics_metadata = analysis_data.get("metadata", {}).get("metrics", {})
661+
default_metrics = {}
662+
663+
for value in other_metrics.values():
664+
for metricKey, metricValue in value.items():
665+
default_metrics[metricKey] = metrics_metadata.get(metricKey, {}).get(
666+
"friendlyName", metricValue
667+
)
668+
669+
context["default_metrics"] = default_metrics
670+
671+
selected_reference_branch = self.request.GET.get(
672+
"reference_branch", experiment.reference_branch.name
673+
)
674+
context["selected_reference_branch"] = selected_reference_branch
675+
676+
selected_segment = self.request.GET.get("segment", "all")
677+
context["selected_segment"] = selected_segment
678+
analysis_basis = self.request.GET.get(
679+
"analysis_basis", "exposures" if experiment.has_exposures else "enrollments"
680+
)
681+
context["selected_analysis_basis"] = analysis_basis
682+
683+
context["results_data"] = analysis_data
684+
return context
685+
654686

655687
class NimbusFeaturesView(TemplateView):
656688
template_name = "nimbus_experiments/features.html"

0 commit comments

Comments
 (0)