From d8737ed8ab02a4d8201d9eb120badf8f88afd281 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Wed, 17 Jun 2026 10:05:52 +0330 Subject: [PATCH] slug generating updated --- apps/course/models/course.py | 50 +++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/apps/course/models/course.py b/apps/course/models/course.py index 40a34bd..a1c0bbf 100644 --- a/apps/course/models/course.py +++ b/apps/course/models/course.py @@ -440,11 +440,53 @@ class Course(models.Model): def save(self, *args, **kwargs): self.title = format_multilingual_field(self.title) - if not self.slug or self.slug == []: + + # Check if the title has changed (or if this is a new course) + title_changed = False + if not self.pk: + title_changed = True + else: try: - self.slug = generate_language_slugs(self.title) - except Exception: - self.slug = [] + original = self.__class__.objects.get(pk=self.pk) + title_changed = original.title != self.title + except self.__class__.DoesNotExist: + title_changed = True + + if title_changed: + # Extract the English title + english_title = "" + if isinstance(self.title, list): + for tr in self.title: + if isinstance(tr, dict) and tr.get("language_code") == "en": + english_title = tr.get("title") or tr.get("text") or tr.get("value") or "" + break + # Fallback to any non-empty title if English title isn't found + if not english_title: + for tr in self.title: + if isinstance(tr, dict): + english_title = tr.get("title") or tr.get("text") or tr.get("value") or "" + if english_title: + break + + base_slug = slugify(str(english_title or "")) + if not base_slug: + base_slug = "course" + + val = base_slug + counter = 1 + # Resolve global uniqueness collision (across other courses) + while True: + qs = self.__class__.objects.filter(slug__contains=[{"title": val}]) + if self.pk: + qs = qs.exclude(pk=self.pk) + + if qs.exists(): + val = f"{base_slug}-{counter}" + counter += 1 + else: + break + + self.slug = [{"language_code": "en", "title": val}] else: self.slug = format_multilingual_field(self.slug)