From 33fac4b43ab402ab9ab8986ea4e6bd060d1acba6 Mon Sep 17 00:00:00 2001 From: Anler Hp Date: Fri, 25 Jul 2014 14:19:37 +0200 Subject: [PATCH] Auto generate slug for projects --- taiga/base/utils/sequence.py | 6 ++++++ taiga/projects/models.py | 10 +++++++++- taiga/projects/serializers.py | 11 ----------- tests/integration/test_projects.py | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/taiga/base/utils/sequence.py b/taiga/base/utils/sequence.py index c3d6ff5e..bdec27b6 100644 --- a/taiga/base/utils/sequence.py +++ b/taiga/base/utils/sequence.py @@ -23,3 +23,9 @@ def first(iterable): def next(data:list): return data[1:] + +def arithmetic_progression(step=1, start=1): + i = start + while True: + yield i + i += step diff --git a/taiga/projects/models.py b/taiga/projects/models.py index c9c60589..0ccd51ca 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -35,6 +35,7 @@ from taiga.base.tags import TaggedMixin from taiga.users.models import Role from taiga.base.utils.slug import slugify_uniquely from taiga.base.utils.dicts import dict_sum +from taiga.base.utils.sequence import arithmetic_progression from . import choices @@ -181,7 +182,14 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): def save(self, *args, **kwargs): if not self.slug: - self.slug = slugify_uniquely(self.name, self.__class__) + base_slug = slugify_uniquely(self.name, self.__class__) + slug = base_slug + for i in arithmetic_progression(): + if not type(self).objects.filter(slug=slug).exists() or i > 100: + break + slug = "{}-{}".format(base_slug, i) + self.slug = slug + if not self.videoconferences: self.videoconferences_salt = None diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index e20e4aaa..8ec0f860 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -145,17 +145,6 @@ class ProjectSerializer(serializers.ModelSerializer): # The "stars_count" attribute is attached in the get_queryset of the viewset. return getattr(obj, "stars_count", 0) - def validate_slug(self, attrs, source): - if self.object: - project_with_slug = models.Project.objects.filter(slug=attrs[source]).exclude(pk=self.object.pk) - else: - project_with_slug = models.Project.objects.filter(slug=attrs[source]) - - if source == "slug" and project_with_slug.exists(): - raise serializers.ValidationError(_("Slug duplicated for the project")) - - return attrs - class ProjectDetailSerializer(ProjectSerializer): roles = serializers.SerializerMethodField("get_list_of_roles") diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index 20150312..60dd6518 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -12,7 +12,7 @@ def test_api_create_project(client): f.ProjectTemplateFactory.create(slug=settings.DEFAULT_PROJECT_TEMPLATE) user = f.UserFactory.create() url = reverse("projects-list") - data = {"name": "project name", "slug": "project-slug", "description": "project description"} + data = {"name": "project name", "description": "project description"} client.login(user) response = client.json.post(url, data)