diff --git a/taiga/export_import/serializers/serializers.py b/taiga/export_import/serializers/serializers.py index 8e03181f..e4b297c9 100644 --- a/taiga/export_import/serializers/serializers.py +++ b/taiga/export_import/serializers/serializers.py @@ -62,7 +62,6 @@ class UserStoryStatusExportSerializer(RelatedExportSerializer): class UserStoryDueDateExportSerializer(RelatedExportSerializer): name = Field() - slug = Field() order = Field() by_default = Field() color = Field() @@ -87,7 +86,6 @@ class TaskStatusExportSerializer(RelatedExportSerializer): class TaskDueDateExportSerializer(RelatedExportSerializer): name = Field() - slug = Field() order = Field() by_default = Field() color = Field() @@ -104,7 +102,6 @@ class IssueStatusExportSerializer(RelatedExportSerializer): class IssueDueDateExportSerializer(RelatedExportSerializer): name = Field() - slug = Field() order = Field() by_default = Field() color = Field() diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 8d36ed25..0efb9911 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -626,7 +626,6 @@ class UserStoryDueDateViewSet(BlockedByProjectMixin, ModelCrudViewSet): for us_duedate in project_template.us_duedates: models.UserStoryDueDate.objects.create( name=us_duedate["name"], - slug=us_duedate["slug"], by_default=us_duedate["by_default"], color=us_duedate["color"], days_to_due=us_duedate["days_to_due"], @@ -703,7 +702,6 @@ class TaskDueDateViewSet(BlockedByProjectMixin, ModelCrudViewSet): for task_duedate in project_template.task_duedates: models.TaskDueDate.objects.create( name=task_duedate["name"], - slug=task_duedate["slug"], by_default=task_duedate["by_default"], color=task_duedate["color"], days_to_due=task_duedate["days_to_due"], @@ -844,7 +842,6 @@ class IssueDueDateViewSet(BlockedByProjectMixin, ModelCrudViewSet): for issue_duedate in project_template.issue_duedates: models.IssueDueDate.objects.create( name=issue_duedate["name"], - slug=issue_duedate["slug"], by_default=issue_duedate["by_default"], color=issue_duedate["color"], days_to_due=issue_duedate["days_to_due"], diff --git a/taiga/projects/fixtures/initial_project_templates.json b/taiga/projects/fixtures/initial_project_templates.json index 6fd7c842..2cc1156f 100644 --- a/taiga/projects/fixtures/initial_project_templates.json +++ b/taiga/projects/fixtures/initial_project_templates.json @@ -21,7 +21,6 @@ "points": "?", "priority": "Normal", "us_status": "New", - "us_duedate": "Default", "issue_type": "Bug", "epic_status": "New", "severity": "Normal", @@ -123,7 +122,6 @@ ], "us_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -131,7 +129,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -139,7 +136,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, @@ -248,7 +244,6 @@ ], "task_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -256,7 +251,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -264,7 +258,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, @@ -342,7 +335,6 @@ ], "issue_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -350,7 +342,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -358,7 +349,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, @@ -773,7 +763,6 @@ ], "us_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -781,7 +770,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -789,7 +777,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, @@ -898,7 +885,6 @@ ], "task_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -906,7 +892,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -914,7 +899,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, @@ -992,7 +976,6 @@ ], "issue_duedates": [ { - "slug": "default", "name": "Default", "order": 1, "by_default": true, @@ -1000,7 +983,6 @@ "days_to_due": null }, { - "slug": "due-soon", "name": "Due soon", "order": 2, "by_default": false, @@ -1008,7 +990,6 @@ "days_to_due": 14 }, { - "slug": "past-due", "name": "Past due", "order": 3, "by_default": false, diff --git a/taiga/projects/migrations/0060_auto_20180614_0721.py b/taiga/projects/migrations/0060_auto_20180614_1338.py similarity index 89% rename from taiga/projects/migrations/0060_auto_20180614_0721.py rename to taiga/projects/migrations/0060_auto_20180614_1338.py index d93f6dbe..1ea9bf8f 100644 --- a/taiga/projects/migrations/0060_auto_20180614_0721.py +++ b/taiga/projects/migrations/0060_auto_20180614_1338.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2018-06-14 07:21 +# Generated by Django 1.11.2 on 2018-06-14 13:38 from __future__ import unicode_literals import django.core.serializers.json @@ -20,7 +20,6 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='name')), - ('slug', models.SlugField(blank=True, max_length=255, verbose_name='slug')), ('order', models.IntegerField(default=10, verbose_name='order')), ('by_default', models.BooleanField(default=False, verbose_name='by default')), ('color', models.CharField(default='#999999', max_length=20, verbose_name='color')), @@ -38,7 +37,6 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='name')), - ('slug', models.SlugField(blank=True, max_length=255, verbose_name='slug')), ('order', models.IntegerField(default=10, verbose_name='order')), ('by_default', models.BooleanField(default=False, verbose_name='by default')), ('color', models.CharField(default='#999999', max_length=20, verbose_name='color')), @@ -56,7 +54,6 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, verbose_name='name')), - ('slug', models.SlugField(blank=True, max_length=255, verbose_name='slug')), ('order', models.IntegerField(default=10, verbose_name='order')), ('by_default', models.BooleanField(default=False, verbose_name='by default')), ('color', models.CharField(default='#999999', max_length=20, verbose_name='color')), @@ -84,16 +81,20 @@ class Migration(migrations.Migration): name='us_duedates', field=taiga.base.db.models.fields.json.JSONField(blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True, verbose_name='us duedates'), ), + migrations.AlterUniqueTogether( + name='issuestatus', + unique_together=set([('project', 'name')]), + ), migrations.AlterUniqueTogether( name='userstoryduedate', - unique_together=set([('project', 'slug'), ('project', 'name')]), + unique_together=set([('project', 'name')]), ), migrations.AlterUniqueTogether( name='taskduedate', - unique_together=set([('project', 'slug'), ('project', 'name')]), + unique_together=set([('project', 'name')]), ), migrations.AlterUniqueTogether( name='issueduedate', - unique_together=set([('project', 'slug'), ('project', 'name')]), + unique_together=set([('project', 'name')]), ), ] diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 66e606bf..9db260df 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -608,8 +608,6 @@ class Points(models.Model): class UserStoryDueDate(models.Model): name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name")) - slug = models.SlugField(max_length=255, null=False, blank=True, - verbose_name=_("slug")) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order")) by_default = models.BooleanField(default=False, null=False, blank=True, @@ -625,19 +623,11 @@ class UserStoryDueDate(models.Model): verbose_name = "user story due date" verbose_name_plural = "user story due dates" ordering = ["project", "order", "name"] - unique_together = (("project", "name"), ("project", "slug")) + unique_together = ("project", "name") def __str__(self): return self.name - def save(self, *args, **kwargs): - qs = self.project.us_duedates - if self.id: - qs = qs.exclude(id=self.id) - - self.slug = slugify_uniquely_for_queryset(self.name, qs) - return super().save(*args, **kwargs) - # Tasks common models class TaskStatus(models.Model): @@ -675,8 +665,6 @@ class TaskStatus(models.Model): class TaskDueDate(models.Model): name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name")) - slug = models.SlugField(max_length=255, null=False, blank=True, - verbose_name=_("slug")) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order")) by_default = models.BooleanField(default=False, null=False, blank=True, @@ -692,19 +680,11 @@ class TaskDueDate(models.Model): verbose_name = "task due date" verbose_name_plural = "task due dates" ordering = ["project", "order", "name"] - unique_together = (("project", "name"), ("project", "slug")) + unique_together = (("project", "name")) def __str__(self): return self.name - def save(self, *args, **kwargs): - qs = self.project.task_duedates - if self.id: - qs = qs.exclude(id=self.id) - - self.slug = slugify_uniquely_for_queryset(self.name, qs) - return super().save(*args, **kwargs) - # Issue common Models @@ -803,8 +783,6 @@ class IssueType(models.Model): class IssueDueDate(models.Model): name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name")) - slug = models.SlugField(max_length=255, null=False, blank=True, - verbose_name=_("slug")) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order")) by_default = models.BooleanField(default=False, null=False, blank=True, @@ -820,19 +798,11 @@ class IssueDueDate(models.Model): verbose_name = "issue due date" verbose_name_plural = "issue due dates" ordering = ["project", "order", "name"] - unique_together = (("project", "name"), ("project", "slug")) + unique_together = ("project", "name") def __str__(self): return self.name - def save(self, *args, **kwargs): - qs = self.project.issue_duedates - if self.id: - qs = qs.exclude(id=self.id) - - self.slug = slugify_uniquely_for_queryset(self.name, qs) - return super().save(*args, **kwargs) - class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): name = models.CharField(max_length=250, null=False, blank=False, @@ -958,7 +928,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for us_duedate in project.us_duedates.all(): self.us_duedates.append({ "name": us_duedate.name, - "slug": us_duedate.slug, "by_default": us_duedate.by_default, "color": us_duedate.color, "days_to_due": us_duedate.days_to_due, @@ -987,7 +956,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for task_duedate in project.task_duedates.all(): self.task_duedates.append({ "name": task_duedate.name, - "slug": task_duedate.slug, "by_default": task_duedate.by_default, "color": task_duedate.color, "days_to_due": task_duedate.days_to_due, @@ -1016,7 +984,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for issue_duedate in project.issue_duedates.all(): self.issue_duedates.append({ "name": issue_duedate.name, - "slug": issue_duedate.slug, "by_default": issue_duedate.by_default, "color": issue_duedate.color, "days_to_due": issue_duedate.days_to_due, @@ -1137,7 +1104,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for us_duedate in self.us_duedates: UserStoryDueDate.objects.create( name=us_duedate["name"], - slug=us_duedate["slug"], by_default=us_duedate["by_default"], color=us_duedate["color"], days_to_due=us_duedate["days_to_due"], @@ -1166,7 +1132,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for task_duedate in self.task_duedates: TaskDueDate.objects.create( name=task_duedate["name"], - slug=task_duedate["slug"], by_default=task_duedate["by_default"], color=task_duedate["color"], days_to_due=task_duedate["days_to_due"], @@ -1195,7 +1160,6 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model): for issue_duedate in self.issue_duedates: IssueDueDate.objects.create( name=issue_duedate["name"], - slug=issue_duedate["slug"], by_default=issue_duedate["by_default"], color=issue_duedate["color"], days_to_due=issue_duedate["days_to_due"], diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 373c1b3b..4d138e71 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -40,7 +40,6 @@ from .notifications.choices import NotifyLevel class BaseDueDateSerializer(serializers.LightSerializer): id = Field() name = I18NField() - slug = Field() order = Field() by_default = Field() days_to_due = Field() diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index bac49ebf..75f900ac 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -2296,7 +2296,6 @@ def test_create_us_default_due_dates(client): us_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2320,7 +2319,6 @@ def test_create_us_default_due_dates(client): def test_prevent_create_us_default_due_dates_when_already_exists(client): us_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2344,7 +2342,6 @@ def test_prevent_create_us_default_due_dates_when_already_exists(client): def test_prevent_delete_us_default_due_dates(client): us_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2370,7 +2367,6 @@ def test_create_task_default_due_dates(client): task_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2394,7 +2390,6 @@ def test_create_task_default_due_dates(client): def test_prevent_create_task_default_due_dates_when_already_exists(client): task_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2418,7 +2413,6 @@ def test_prevent_create_task_default_due_dates_when_already_exists(client): def test_prevent_delete_task_default_due_dates(client): task_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2444,7 +2438,6 @@ def test_create_issue_default_due_dates(client): issue_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2468,7 +2461,6 @@ def test_create_issue_default_due_dates(client): def test_prevent_create_issue_default_due_dates_when_already_exists(client): issue_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None, @@ -2492,7 +2484,6 @@ def test_prevent_create_issue_default_due_dates_when_already_exists(client): def test_prevent_delete_issue_default_due_dates(client): issue_duedates = [{ "name": 'Default', - "slug": 'default', "by_default": True, 'color': '#0000', 'days_to_due': None,