Skip to content

Commit 97b78ee

Browse files
feat(nimbus): use channels in table filters (mozilla#13244)
Becuase * We want to be able to filter on both the channel and channels fields * This should be transparent to the user so there should only be one channel filter This commit * Searches both the channel and channels fields in the channel filter on the table page fixes mozilla#13239
1 parent 01a10ad commit 97b78ee

3 files changed

Lines changed: 95 additions & 12 deletions

File tree

experimenter/experimenter/experiments/tests/factories.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -455,16 +455,18 @@ class NimbusExperimentFactory(factory.django.DjangoModelFactory):
455455
channels = factory.LazyAttribute(
456456
lambda o: [
457457
str(c)
458-
for c in random.choices(
459-
list(
460-
set(
461-
NimbusExperiment.APPLICATION_CONFIGS[
462-
o.application
463-
].channel_app_id.keys()
464-
)
465-
- {NimbusExperiment.Channel.NO_CHANNEL}
466-
),
467-
k=2,
458+
for c in set(
459+
random.choices(
460+
list(
461+
set(
462+
NimbusExperiment.APPLICATION_CONFIGS[
463+
o.application
464+
].channel_app_id.keys()
465+
)
466+
- {NimbusExperiment.Channel.NO_CHANNEL}
467+
),
468+
k=2,
469+
)
468470
)
469471
]
470472
)

experimenter/experimenter/nimbus_ui/filtersets.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class NimbusExperimentFilter(django_filters.FilterSet):
126126
),
127127
)
128128
channel = django_filters.MultipleChoiceFilter(
129+
method="filter_channel",
129130
choices=NimbusExperiment.Channel.choices,
130131
widget=IconMultiSelectWidget(
131132
icon="fa-solid fa-road",
@@ -301,3 +302,9 @@ def filter_takeaways(self, queryset, name, values):
301302
elif value in NimbusExperiment.ConclusionRecommendation:
302303
query |= Q(conclusion_recommendations__contains=[value])
303304
return queryset.filter(query)
305+
306+
def filter_channel(self, queryset, name, value):
307+
query = Q(channel__in=value)
308+
for channel in value:
309+
query |= Q(channels__contains=[channel])
310+
return queryset.filter(query)

experimenter/experimenter/nimbus_ui/tests/test_views.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,20 @@ def test_filter_application(self):
299299
def test_filter_channel(self):
300300
channel = NimbusExperiment.Channel.NIGHTLY
301301
experiment = NimbusExperimentFactory.create(
302-
status=NimbusExperiment.Status.LIVE, channel=channel
302+
application=NimbusExperiment.Application.FENIX,
303+
slug=f"channel-{channel}",
304+
status=NimbusExperiment.Status.LIVE,
305+
channel=channel,
306+
channels=[],
303307
)
304308
[
305-
NimbusExperimentFactory.create(status=NimbusExperiment.Status.LIVE, channel=c)
309+
NimbusExperimentFactory.create(
310+
application=NimbusExperiment.Application.FENIX,
311+
slug=f"channel-{c}",
312+
status=NimbusExperiment.Status.LIVE,
313+
channel=c,
314+
channels=[],
315+
)
306316
for c in {*list(NimbusExperiment.Channel)} - {channel}
307317
]
308318

@@ -315,6 +325,70 @@ def test_filter_channel(self):
315325
{e.slug for e in response.context["experiments"]}, {experiment.slug}
316326
)
317327

328+
def test_filter_channels(self):
329+
experiment_nightly = NimbusExperimentFactory.create(
330+
slug="nightly",
331+
status=NimbusExperiment.Status.LIVE,
332+
application=NimbusExperiment.Application.FENIX,
333+
channel=NimbusExperiment.Channel.NIGHTLY,
334+
channels=[],
335+
)
336+
experiment_nightly_beta = NimbusExperimentFactory.create(
337+
slug="nightly-beta",
338+
status=NimbusExperiment.Status.LIVE,
339+
application=NimbusExperiment.Application.DESKTOP,
340+
channel=NimbusExperiment.Channel.NO_CHANNEL,
341+
channels=[NimbusExperiment.Channel.NIGHTLY, NimbusExperiment.Channel.BETA],
342+
)
343+
experiment_release_beta = NimbusExperimentFactory.create(
344+
slug="release-beta",
345+
status=NimbusExperiment.Status.LIVE,
346+
application=NimbusExperiment.Application.DESKTOP,
347+
channel=NimbusExperiment.Channel.NO_CHANNEL,
348+
channels=[NimbusExperiment.Channel.RELEASE, NimbusExperiment.Channel.BETA],
349+
)
350+
experiment_release_dev = NimbusExperimentFactory.create(
351+
slug="release-dev",
352+
status=NimbusExperiment.Status.LIVE,
353+
application=NimbusExperiment.Application.DESKTOP,
354+
channel=NimbusExperiment.Channel.NO_CHANNEL,
355+
channels=[
356+
NimbusExperiment.Channel.RELEASE,
357+
NimbusExperiment.Channel.DEVELOPER,
358+
],
359+
)
360+
NimbusExperimentFactory.create(
361+
slug="aurora-dev",
362+
status=NimbusExperiment.Status.LIVE,
363+
application=NimbusExperiment.Application.DESKTOP,
364+
channel=NimbusExperiment.Channel.NO_CHANNEL,
365+
channels=[
366+
NimbusExperiment.Channel.AURORA,
367+
NimbusExperiment.Channel.DEVELOPER,
368+
],
369+
)
370+
371+
response = self.client.get(
372+
reverse("nimbus-list"),
373+
{
374+
"status": NimbusExperiment.Status.LIVE,
375+
"channel": [
376+
NimbusExperiment.Channel.NIGHTLY,
377+
NimbusExperiment.Channel.RELEASE,
378+
],
379+
},
380+
)
381+
382+
self.assertEqual(
383+
{e.slug for e in response.context["experiments"]},
384+
{
385+
experiment_nightly.slug,
386+
experiment_nightly_beta.slug,
387+
experiment_release_beta.slug,
388+
experiment_release_dev.slug,
389+
},
390+
)
391+
318392
def test_filter_version(self):
319393
version = NimbusExperiment.Version.FIREFOX_120
320394
experiment = NimbusExperimentFactory.create(

0 commit comments

Comments
 (0)