Skip to content

Commit b24193b

Browse files
Don't change slug for existing instances fixes #1129 (#1188)
1 parent 515089f commit b24193b

4 files changed

Lines changed: 67 additions & 5 deletions

File tree

app/experimenter/experiments/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def clean(self):
275275
"The size of all branches must add up to 100"
276276
]
277277

278-
unique_slugs = set([form.cleaned_data["slug"] for form in alive_forms])
278+
unique_slugs = set([form.cleaned_data["name"] for form in alive_forms])
279279

280280
if not len(unique_slugs) == len(alive_forms):
281281
for form in alive_forms:

app/experimenter/projects/forms.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ def clean_name(self):
2323
def clean(self):
2424
cleaned_data = super().clean()
2525

26-
name = cleaned_data.get("name")
27-
cleaned_data["slug"] = slugify(name)
26+
if self.instance.slug:
27+
del cleaned_data["slug"]
28+
else:
29+
name = cleaned_data.get("name")
30+
cleaned_data["slug"] = slugify(name)
2831

2932
return cleaned_data
3033

app/experimenter/projects/tests/test_forms.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,69 @@
1+
from django import forms
12
from django.test import TestCase
23

3-
from experimenter.projects.forms import ProjectForm
4+
from experimenter.projects.models import Project
5+
from experimenter.projects.forms import (
6+
ProjectForm,
7+
NameSlugFormMixin,
8+
UniqueNameSlugFormMixin,
9+
)
410
from experimenter.projects.tests.factories import ProjectFactory
511

612

13+
class TestNameSlugFormMixin(TestCase):
14+
15+
def setUp(self):
16+
17+
class TestForm(NameSlugFormMixin, forms.ModelForm):
18+
name = forms.CharField()
19+
slug = forms.CharField(required=False)
20+
21+
class Meta:
22+
model = Project
23+
fields = ("name", "slug")
24+
25+
self.Form = TestForm
26+
27+
def test_sets_slug_for_new_instance(self):
28+
form = self.Form({"name": "New Name"})
29+
self.assertTrue(form.is_valid())
30+
project = form.save()
31+
self.assertEqual(project.slug, "new-name")
32+
33+
def test_doesnt_set_slug_for_existing_instance(self):
34+
project = ProjectFactory.create(name="Old Name", slug="old-slug")
35+
form = self.Form({"name": "New Name"}, instance=project)
36+
self.assertTrue(form.is_valid())
37+
project = form.save()
38+
self.assertEqual(project.name, "New Name")
39+
self.assertEqual(project.slug, "old-slug")
40+
41+
42+
class TestUniqueNameSlugFormMixin(TestCase):
43+
44+
def setUp(self):
45+
46+
class TestForm(UniqueNameSlugFormMixin, forms.ModelForm):
47+
name = forms.CharField()
48+
slug = forms.CharField(required=False)
49+
50+
class Meta:
51+
model = Project
52+
fields = ("name", "slug")
53+
54+
self.Form = TestForm
55+
56+
def test_valid_for_no_slug_match(self):
57+
form = self.Form({"name": "New Name"})
58+
self.assertTrue(form.is_valid())
59+
60+
def test_invalid_for_existing_slug_match(self):
61+
ProjectFactory(name="Unique Existing Name", slug="existing-slug")
62+
form = self.Form({"name": "Existing Slug"})
63+
self.assertFalse(form.is_valid())
64+
self.assertIn("name", form.errors)
65+
66+
767
class TestProjectForm(TestCase):
868

969
def test_project_form_creates_project(self):

app/experimenter/projects/tests/test_views.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def test_project_update_view_updates_project(self):
5454
updated_project = Project.objects.get(id=project.id)
5555

5656
self.assertEqual(updated_project.name, project_data["name"])
57-
self.assertEqual(updated_project.slug, "new-name")
5857
self.assertRedirects(
5958
response,
6059
reverse("projects-detail", kwargs={"slug": updated_project.slug}),

0 commit comments

Comments
 (0)