|
|
|
@ -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) |
|
|
|
|
|
|
|
|