Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ LOAD_COUNTRIES = python manage.py loaddata ./experimenter/base/fixtures/countrie
LOAD_LOCALES = python manage.py loaddata ./experimenter/base/fixtures/locales.json
LOAD_LANGUAGES = python manage.py loaddata ./experimenter/base/fixtures/languages.json
LOAD_FEATURES = python manage.py load_feature_configs
LOAD_DUMMY_EXPERIMENTS = [[ -z $$SKIP_DUMMY ]] && python manage.py load_dummy_experiments || python manage.py load_dummy_projects
LOAD_DUMMY_EXPERIMENTS = [[ -z $$SKIP_DUMMY ]] && python manage.py load_dummy_experiments || python manage.py load_dummy_tags

JETSTREAM_CONFIG_URL = https://github.com/mozilla/metric-hub/archive/main.zip

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import logging

from django.core.management.base import BaseCommand

from experimenter.experiments.tests.factories import TagFactory

logger = logging.getLogger()


class Command(BaseCommand):
help = "Generates dummy tags"

def handle(self, *args, **options):
for _ in range(8):
tag = TagFactory.create()
logger.info(f"Created tag: {tag.name} ({tag.color})")

This file was deleted.

11 changes: 11 additions & 0 deletions experimenter/experimenter/base/tests/test_load_dummy_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django.core.management import call_command
from django.test import TestCase

from experimenter.experiments.models import Tag


class TestInitialData(TestCase):
def test_load_dummy_tags(self):
self.assertFalse(Tag.objects.exists())
call_command("load_dummy_tags")
self.assertEqual(Tag.objects.all().count(), 8)
1 change: 1 addition & 0 deletions experimenter/experimenter/experiments/changelog_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class NimbusExperimentChangeLogSerializer(serializers.ModelSerializer):
subscribers = serializers.SlugRelatedField(
many=True, read_only=True, slug_field="email"
)
tags = serializers.SlugRelatedField(many=True, read_only=True, slug_field="name")

class Meta:
model = NimbusExperiment
Expand Down
16 changes: 15 additions & 1 deletion experimenter/experimenter/experiments/tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,20 @@ def projects(self, create, extracted, **kwargs):
for _ in range(3):
self.projects.add(ProjectFactory.create())

@factory.post_generation
def tags(self, create, extracted, **kwargs):
if not create:
# Simple build, do nothing.
return

if isinstance(extracted, Iterable):
# A list of tags were passed in, use them
for tag in extracted:
self.tags.add(tag)
else:
for _ in range(3):
self.tags.add(TagFactory.create())

@factory.post_generation
def documentation_links(self, create, extracted, **kwargs):
if not create:
Expand Down Expand Up @@ -884,7 +898,7 @@ class NimbusFmlErrorDataClass:


class TagFactory(factory.django.DjangoModelFactory):
name = factory.LazyAttribute(lambda o: faker.unique.word().title())
name = factory.LazyAttribute(lambda o: slugify(faker.unique.catch_phrase()))
color = factory.LazyAttribute(lambda o: faker.hex_color())

class Meta:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
NimbusChangeLogFactory,
NimbusExperimentFactory,
NimbusFeatureConfigFactory,
TagFactory,
)
from experimenter.openidc.tests.factories import UserFactory
from experimenter.outcomes import Outcomes
Expand Down Expand Up @@ -144,6 +145,7 @@ def test_outputs_expected_schema_for_complete_experiment(self):
segment = Segments.by_application(application, mock_get_segments())[0].slug
parent_experiment = NimbusExperimentFactory.create()
subscriber = UserFactory.create()
tags = TagFactory.create()

updated_time = timezone.datetime(
year=2022, month=1, day=2, hour=0, minute=0, second=0
Expand All @@ -164,6 +166,7 @@ def test_outputs_expected_schema_for_complete_experiment(self):
segments=[segment],
subscribers=[subscriber],
parent=parent_experiment,
tags=[tags],
)
data = dict(NimbusExperimentChangeLogSerializer(experiment).data)
branches_data = [dict(b) for b in data.pop("branches")]
Expand Down Expand Up @@ -244,7 +247,7 @@ def test_outputs_expected_schema_for_complete_experiment(self):
"status": experiment.status,
"status_next": experiment.status_next,
"subscribers": [subscriber.email],
"tags": [],
"tags": [tags.name],
"takeaways_gain_amount": None,
"takeaways_metric_gain": False,
"takeaways_qbr_learning": False,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3575,7 +3575,7 @@ def test_can_archive(self, expected_can_archive, lifecycle):

def test_tag_experiment_relationship(self):
tag = Tag.objects.create(name="TestTag", color="#123456")
experiment = NimbusExperimentFactory.create()
experiment = NimbusExperimentFactory.create(tags=[])
experiment.tags.add(tag)
self.assertIn(tag, experiment.tags.all())
self.assertIn(experiment, tag.experiments.all())
Expand Down
11 changes: 0 additions & 11 deletions experimenter/experimenter/nimbus_ui/filtersets.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from experimenter.experiments.constants import NimbusConstants
from experimenter.experiments.models import NimbusExperiment, NimbusFeatureConfig, Tag
from experimenter.nimbus_ui.forms import MultiSelectWidget
from experimenter.projects.models import Project
from experimenter.targeting.constants import TargetingConstants


Expand Down Expand Up @@ -209,15 +208,6 @@ class NimbusExperimentFilter(django_filters.FilterSet):
},
),
)
projects = django_filters.ModelMultipleChoiceFilter(
queryset=Project.objects.all().order_by("slug"),
widget=IconMultiSelectWidget(
icon="fa-solid fa-person-chalkboard",
attrs={
"title": "All Projects",
},
),
)
qa_status = django_filters.MultipleChoiceFilter(
choices=NimbusExperiment.QAStatus.choices,
widget=IconMultiSelectWidget(
Expand Down Expand Up @@ -283,7 +273,6 @@ class Meta:
"languages",
"locales",
"targeting_config_slug",
"projects",
"qa_status",
"takeaways",
"owner",
Expand Down
6 changes: 1 addition & 5 deletions experimenter/experimenter/nimbus_ui/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
from experimenter.klaatu.tasks import klaatu_start_job
from experimenter.nimbus_ui.constants import NimbusUIConstants
from experimenter.outcomes import Outcomes
from experimenter.projects.models import Project
from experimenter.segments import Segments
from experimenter.targeting.constants import NimbusTargetingConfig

Expand Down Expand Up @@ -344,9 +343,7 @@ class OverviewForm(NimbusChangeLogFormMixin, forms.ModelForm):
widget=InlineRadioSelect,
coerce=lambda x: x == "True",
)
projects = forms.ModelMultipleChoiceField(
required=False, queryset=Project.objects.all(), widget=MultiSelectWidget()
)

public_description = forms.CharField(
required=False, widget=forms.Textarea(attrs={"class": "form-control", "rows": 3})
)
Expand All @@ -368,7 +365,6 @@ class Meta:
fields = [
"name",
"hypothesis",
"projects",
"public_description",
"risk_partner_related",
"risk_revenue",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,16 +144,6 @@ <h4>Overview</h4>
{% endfor %}
</td>
</tr>
<tr>
<th>Team projects</th>
<td colspan="2">
{% for project in experiment.projects.all %}
<p>{{ project }}</p>
{% empty %}
<span class="text-danger">Not set</span>
{% endfor %}
</td>
</tr>
{% include 'nimbus_experiments/subscribers_list.html' %}

</tbody>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,6 @@ <h4>Overview</h4>
</p>
</div>
</div>
<div class="row mb-3">
<div class="col">
<label for="id_projects" class="form-label">Team Projects</label>
{{ form.projects|add_class:"form-control"|add_error_class:"is-invalid" }}
{% for error in form.projects.errors %}<div class="invalid-feedback">{{ error }}</div>{% endfor %}
{% for error in validation_errors.projects %}<div class="form-text text-danger">{{ error }}</div>{% endfor %}
</div>
</div>
<div class="row mb-3">
<div class="col">
<label for="id_public_description" class="form-label">Public Description</label>
Expand Down
10 changes: 1 addition & 9 deletions experimenter/experimenter/nimbus_ui/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@
from experimenter.openidc.tests.factories import UserFactory
from experimenter.outcomes import Outcomes
from experimenter.outcomes.tests import mock_valid_outcomes
from experimenter.projects.tests.factories import ProjectFactory
from experimenter.segments import Segments
from experimenter.segments.tests.mock_segments import mock_get_segments
from experimenter.targeting.constants import NimbusTargetingConfig
Expand Down Expand Up @@ -1177,7 +1176,6 @@ def test_approve_update_rollout_form(self):

class TestOverviewForm(RequestFormTestCase):
def test_valid_form_saves(self):
project = ProjectFactory.create()
documentation_link = NimbusDocumentationLinkFactory.create()
experiment = NimbusExperimentFactory.create_with_lifecycle(
NimbusExperimentFactory.Lifecycles.CREATED,
Expand All @@ -1191,7 +1189,6 @@ def test_valid_form_saves(self):
"hypothesis": "new hypothesis",
"risk_brand": True,
"risk_message": True,
"projects": [project.id],
"public_description": "new description",
"risk_revenue": True,
"risk_partner_related": True,
Expand All @@ -1215,7 +1212,6 @@ def test_valid_form_saves(self):
self.assertEqual(experiment.hypothesis, "new hypothesis")
self.assertTrue(experiment.risk_brand)
self.assertTrue(experiment.risk_message)
self.assertEqual(list(experiment.projects.all()), [project])
self.assertEqual(experiment.public_description, "new description")
self.assertTrue(experiment.risk_revenue)
self.assertTrue(experiment.risk_partner_related)
Expand All @@ -1227,15 +1223,13 @@ def test_valid_form_saves(self):
self.assertEqual(documentation_link.link, "https://www.example.com")

def test_name_field_is_required(self):
project = ProjectFactory.create()
documentation_link = NimbusDocumentationLinkFactory.create()

form_data = {
"name": "",
"hypothesis": "new hypothesis",
"risk_brand": True,
"risk_message": True,
"projects": [project.id],
"public_description": "new description",
"risk_revenue": True,
"risk_partner_related": True,
Expand Down Expand Up @@ -1268,7 +1262,6 @@ def test_valid_form_adds_documentation_link(self):
"hypothesis": "new hypothesis",
"risk_brand": True,
"risk_message": True,
"projects": [],
"public_description": "new description",
"risk_revenue": True,
"risk_partner_related": True,
Expand Down Expand Up @@ -1301,7 +1294,6 @@ def test_valid_form_deletes_documentation_link(self):
"hypothesis": "new hypothesis",
"risk_brand": True,
"risk_message": True,
"projects": [],
"public_description": "new description",
"risk_revenue": True,
"risk_partner_related": True,
Expand Down Expand Up @@ -4144,7 +4136,7 @@ def test_form_queryset_ordered_by_name(self):
TagFactory.create(name="A Tag")
TagFactory.create(name="M Tag")

experiment = NimbusExperimentFactory.create()
experiment = NimbusExperimentFactory.create(tags=[])
form = TagAssignForm(instance=experiment)

tag_names = [tag.name for tag in form.fields["tags"].queryset]
Expand Down
Loading