diff --git a/taiga/projects/models.py b/taiga/projects/models.py index e1e0ea8b..8df7ac37 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -344,9 +344,11 @@ class UserStoryStatus(models.Model): return self.name def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify_uniquely_for_queryset(self.name, self.project.us_statuses) + qs = self.project.us_statuses + if self.id: + qs = qs.exclude(id=self.id) + self.slug = slugify_uniquely_for_queryset(self.name, qs) return super().save(*args, **kwargs) @@ -402,9 +404,11 @@ class TaskStatus(models.Model): return self.name def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify_uniquely_for_queryset(self.name, self.project.task_statuses) + qs = self.project.task_statuses + if self.id: + qs = qs.exclude(id=self.id) + self.slug = slugify_uniquely_for_queryset(self.name, qs) return super().save(*args, **kwargs) @@ -483,9 +487,11 @@ class IssueStatus(models.Model): return self.name def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify_uniquely_for_queryset(self.name, self.project.issue_statuses) + qs = self.project.issue_statuses + if self.id: + qs = qs.exclude(id=self.id) + self.slug = slugify_uniquely_for_queryset(self.name, qs) return super().save(*args, **kwargs) diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index f2a6c249..e268f1fe 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -26,3 +26,60 @@ def test_partially_update_project(client): client.login(project.owner) response = client.json.patch(url, json.dumps(data)) assert response.status_code == 400 + + +def test_us_status_slug_generation(client): + us_status = f.UserStoryStatusFactory(name="NEW") + assert us_status.slug == "new" + + client.login(us_status.project.owner) + + url = reverse("userstory-statuses-detail", kwargs={"pk": us_status.pk}) + + data = {"name": "new"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new" + + data = {"name": "new status"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new-status" + + +def test_task_status_slug_generation(client): + task_status = f.TaskStatusFactory(name="NEW") + assert task_status.slug == "new" + + client.login(task_status.project.owner) + + url = reverse("task-statuses-detail", kwargs={"pk": task_status.pk}) + + data = {"name": "new"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new" + + data = {"name": "new status"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new-status" + + +def test_issue_status_slug_generation(client): + issue_status = f.IssueStatusFactory(name="NEW") + assert issue_status.slug == "new" + + client.login(issue_status.project.owner) + + url = reverse("issue-statuses-detail", kwargs={"pk": issue_status.pk}) + + data = {"name": "new"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new" + + data = {"name": "new status"} + response = client.json.patch(url, json.dumps(data)) + assert response.status_code == 200 + assert response.data["slug"] == "new-status"