From 47816201fb3f98b6f7b5519316b19781a5f0b7c3 Mon Sep 17 00:00:00 2001
From: Jared Kerim
Date: Wed, 13 Mar 2019 10:20:09 -0400
Subject: [PATCH] Add experiment owner fixes #558
---
app/experimenter/experiments/constants.py | 8 ++++++++
app/experimenter/experiments/forms.py | 8 +++++++-
.../0030_experiment_engineering_owner.py | 16 ++++++++++++++++
app/experimenter/experiments/models.py | 1 +
app/experimenter/experiments/tests/factories.py | 1 +
app/experimenter/experiments/tests/test_forms.py | 4 ++++
.../templates/experiments/section_overview.html | 5 ++++-
7 files changed, 41 insertions(+), 2 deletions(-)
create mode 100644 app/experimenter/experiments/migrations/0030_experiment_engineering_owner.py
diff --git a/app/experimenter/experiments/constants.py b/app/experimenter/experiments/constants.py
index 0e11a46e61..b3e2c1bc74 100644
--- a/app/experimenter/experiments/constants.py
+++ b/app/experimenter/experiments/constants.py
@@ -463,6 +463,14 @@ class ExperimentConstants(object):
we will improve [retention/page views/performance/satisfaction]
"""
+ ENGINEERING_OWNER_HELP_TEXT = """
+
+ The Engineering Owner is the person responsible for the engineering
+ that implements the feature or change being tested by the experiment,
+ and is the primary point of contact for any inquiries related to it.
+
+ """
+
ANALYSIS_OWNER_HELP_TEXT = """
The Data Science Owner is the person responsible for designing and
diff --git a/app/experimenter/experiments/forms.py b/app/experimenter/experiments/forms.py
index 91cfd6fec3..bf5d450933 100644
--- a/app/experimenter/experiments/forms.py
+++ b/app/experimenter/experiments/forms.py
@@ -90,7 +90,7 @@ class ExperimentOverviewForm(
)
owner = forms.ModelChoiceField(
required=True,
- label="Owner",
+ label="Experiment Owner",
help_text=Experiment.OWNER_HELP_TEXT,
queryset=get_user_model().objects.all().order_by("email"),
# This one forces the widget to not include a blank
@@ -98,6 +98,11 @@ class ExperimentOverviewForm(
# is nullable.
empty_label=None,
)
+ engineering_owner = forms.CharField(
+ required=False,
+ label="Engineering Owner",
+ help_text=Experiment.ENGINEERING_OWNER_HELP_TEXT,
+ )
name = forms.CharField(label="Name", help_text=Experiment.NAME_HELP_TEXT)
slug = forms.CharField(required=False, widget=forms.HiddenInput())
short_description = forms.CharField(
@@ -146,6 +151,7 @@ class Meta:
fields = [
"type",
"owner",
+ "engineering_owner",
"name",
"slug",
"short_description",
diff --git a/app/experimenter/experiments/migrations/0030_experiment_engineering_owner.py b/app/experimenter/experiments/migrations/0030_experiment_engineering_owner.py
new file mode 100644
index 0000000000..06f933e1d9
--- /dev/null
+++ b/app/experimenter/experiments/migrations/0030_experiment_engineering_owner.py
@@ -0,0 +1,16 @@
+# Generated by Django 2.1.7 on 2019-03-13 14:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [("experiments", "0029_auto_20190206_2028")]
+
+ operations = [
+ migrations.AddField(
+ model_name="experiment",
+ name="engineering_owner",
+ field=models.CharField(blank=True, max_length=255, null=True),
+ )
+ ]
diff --git a/app/experimenter/experiments/models.py b/app/experimenter/experiments/models.py
index dc3a56c066..1823ff4d6f 100644
--- a/app/experimenter/experiments/models.py
+++ b/app/experimenter/experiments/models.py
@@ -107,6 +107,7 @@ class Experiment(ExperimentConstants, models.Model):
default=ExperimentConstants.ANALYSIS_DEFAULT, blank=True, null=True
)
analysis_owner = models.CharField(max_length=255, blank=True, null=True)
+ engineering_owner = models.CharField(max_length=255, blank=True, null=True)
total_users = models.PositiveIntegerField(default=0)
enrollment_dashboard_url = models.URLField(blank=True, null=True)
diff --git a/app/experimenter/experiments/tests/factories.py b/app/experimenter/experiments/tests/factories.py
index fd67a30ce2..c89a6d1dfd 100644
--- a/app/experimenter/experiments/tests/factories.py
+++ b/app/experimenter/experiments/tests/factories.py
@@ -26,6 +26,7 @@ class ExperimentFactory(
):
type = Experiment.TYPE_PREF
owner = factory.SubFactory(UserFactory)
+ engineering_owner = factory.LazyAttribute(lambda o: faker.name())
project = factory.SubFactory(ProjectFactory)
name = factory.LazyAttribute(lambda o: faker.catch_phrase())
slug = factory.LazyAttribute(lambda o: "{}_".format(slugify(o.name)))
diff --git a/app/experimenter/experiments/tests/test_forms.py b/app/experimenter/experiments/tests/test_forms.py
index 8955d607b6..0b1e953c5a 100644
--- a/app/experimenter/experiments/tests/test_forms.py
+++ b/app/experimenter/experiments/tests/test_forms.py
@@ -181,6 +181,7 @@ def setUp(self):
self.data = {
"type": Experiment.TYPE_PREF,
"owner": self.user.id,
+ "engineering_owner": "Lisa the Engineer",
"name": "A new experiment!",
"short_description": "Let us learn new things",
"data_science_bugzilla_url": "https://bugzilla.mozilla.org/123/",
@@ -197,6 +198,9 @@ def test_form_creates_experiment(self):
experiment = form.save()
self.assertEqual(experiment.owner, self.user)
+ self.assertEqual(
+ experiment.engineering_owner, self.data["engineering_owner"]
+ )
self.assertEqual(experiment.status, experiment.STATUS_DRAFT)
self.assertEqual(experiment.name, self.data["name"])
self.assertEqual(experiment.slug, "a-new-experiment")
diff --git a/app/experimenter/templates/experiments/section_overview.html b/app/experimenter/templates/experiments/section_overview.html
index 8e09996899..cdef015b31 100644
--- a/app/experimenter/templates/experiments/section_overview.html
+++ b/app/experimenter/templates/experiments/section_overview.html
@@ -5,7 +5,10 @@
{% endblock %}
{% block section_content %}
- Owner: {{ experiment.owner }}
+ Experiment Owner: {{ experiment.owner }}
+ {% if experiment.engineering_owner %}
+ Engineering Owner: {{ experiment.engineering_owner }}
+ {% endif %}
{{ experiment.short_description|urlize|linebreaks }}
{{ experiment.related_work|urlize|linebreaks }}
{% endblock %}