From 2165c4fc0fea71e089ca0d4b6569feb61244d67b Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 15 Jan 2019 17:47:41 +0300 Subject: [PATCH] LIL-712 --- apps/course/models.py | 2 +- apps/course/views.py | 26 ++++++++++++++++++++++++++ web/src/components/CourseRedactor.vue | 2 +- web/src/js/modules/api.js | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/apps/course/models.py b/apps/course/models.py index 42a1dd81..23b5acfa 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -136,7 +136,7 @@ class Course(BaseModel, DeactivatedMixin): return self.get_absolute_url() def get_absolute_url(self): - return reverse_lazy('course', args=[self.slug or self.id]) + return reverse_lazy('course', args=[self.slug.lower() if self.slug else self.id]) @property def is_free(self): diff --git a/apps/course/views.py b/apps/course/views.py index 07ca6bad..5e625c42 100644 --- a/apps/course/views.py +++ b/apps/course/views.py @@ -200,6 +200,32 @@ class CourseView(DetailView): # ((self.object.status != Course.PUBLISHED and request.user.role != User.ADMIN_ROLE) or # (self.object.status != Course.PUBLISHED and request.user.role != User.AUTHOR_ROLE and self.object.author != request.user)): + def get_object(self, queryset=None): + if queryset is None: + queryset = self.get_queryset() + + pk = self.kwargs.get(self.pk_url_kwarg) + slug = self.kwargs.get(self.slug_url_kwarg) + if pk is not None: + queryset = queryset.filter(pk=pk) + + if slug is not None and (pk is None or self.query_pk_and_slug): + slug_field = self.get_slug_field() + queryset = queryset.filter(**{'%s__iexact' % slug_field: slug}) + + if pk is None and slug is None: + raise AttributeError("Generic detail view %s must be called with " + "either an object pk or a slug." + % self.__class__.__name__) + + try: + # Get the single item from the filtered queryset + obj = queryset.get() + except queryset.model.DoesNotExist: + raise Http404(_("No %(verbose_name)s found matching the query") % + {'verbose_name': queryset.model._meta.verbose_name}) + return obj + def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) if self.request.user.is_authenticated: diff --git a/web/src/components/CourseRedactor.vue b/web/src/components/CourseRedactor.vue index eaec96d4..eff51320 100644 --- a/web/src/components/CourseRedactor.vue +++ b/web/src/components/CourseRedactor.vue @@ -474,7 +474,7 @@ onCourseNameInput() { this.$v.course.title.$touch(); if (!this.slugChanged) { - this.course.url = slugify(this.course.title); + this.course.url = (slugify(this.course.title) || '').toLowerCase(); } }, removeLesson(lessonIndex) { diff --git a/web/src/js/modules/api.js b/web/src/js/modules/api.js index ed60c229..919588bd 100644 --- a/web/src/js/modules/api.js +++ b/web/src/js/modules/api.js @@ -113,7 +113,7 @@ export const api = { deferred_start_at: deferredStart, duration: courseObject.duration || 0, is_featured: courseObject.is_featured, - slug: courseObject.url, + slug: (courseObject.url || '').toLowerCase(), date: (courseObject.date) ? courseObject.date.value:null, stream: courseObject.stream, cover: courseObject.coverImageId ? courseObject.coverImageId : null,