diff --git a/apps/course/models.py b/apps/course/models.py index b11156f4..0c33fd81 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -125,9 +125,12 @@ class Course(BaseModel, DeactivatedMixin): def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(unidecode(self.title[:90])) - - if Course.objects.filter(slug=self.slug).exclude(id=self.id).exists(): - self.slug += str(uuid4())[-3:] + if self.slug: + if self.slug.isdigit(): + self.slug = 'course%s' % self.slug + slug = self.slug + while Course.objects.filter(slug__iexact=self.slug).exclude(id=self.id).exists(): + self.slug = '%s_%s' % (slug, str(uuid4())[-4:]) return super().save() diff --git a/web/src/components/CourseRedactor.vue b/web/src/components/CourseRedactor.vue index c16a0a4b..b705382b 100644 --- a/web/src/components/CourseRedactor.vue +++ b/web/src/components/CourseRedactor.vue @@ -45,7 +45,7 @@
ССЫЛКА
- +
{{ courseFullUrl }}
@@ -273,6 +273,7 @@ price: null, old_price: null, age: 0, + slug: '', url: '', coverImage: '', kit__body: null, @@ -473,8 +474,8 @@ }, onCourseNameInput() { this.$v.course.title.$touch(); - if (!this.slugChanged) { - this.course.url = slugify(this.course.title); + if (!this.slugChanged && !this.$v.course.status) { + this.course.slug = slugify(this.course.title); } }, removeLesson(lessonIndex) { @@ -741,24 +742,6 @@ } }, saveCourseDraft: function (newValue, oldValue) { - //console.log('saveCourseDraft'); - // if (!oldValue.id) { - // return; - // } - - - // if(this.live) { - // if(!this.course.date || this.course.short_description == '' || this.course.title == '') { - // //console.log('live valiedation error'); - // return; - // } - // } else { - // if(this.course.short_description == '' || this.course.title == '') { - // //console.log('course validation error'); - // return; - // } - // } - if (this.savingDebounceTimeout) { clearTimeout(this.savingDebounceTimeout); } @@ -771,13 +754,14 @@ this.courseSaving = true; this.changeSavingStatus(); const courseObject = this.course; - courseObject.url = (courseObject.url) ? slugify(courseObject.url):courseObject.url; + courseObject.slug = courseObject.slug && slugify(courseObject.slug); api.saveCourse(courseObject, this.accessToken) .then((response) => { this.courseSaving = false; this.changeSavingStatus(true); this.courseSyncHook = true; const courseData = api.convertCourseJson(response.data); + this.course.slug = courseData.slug; if (this.course.coverImage) { courseData.coverImage = this.course.coverImage; } @@ -804,19 +788,11 @@ }) } }); - if (courseData.url) { - this.slugChanged = true; - } if(courseData.id) { this.course.id = courseData.id; } - /*if(this.live && courseData.date) { - this.course.date = _.find(this.scheduleOptions, function(item){ - return item.value == courseData.date; - }); - }*/ this.$nextTick(() => { this.courseSyncHook = false; }); @@ -1029,10 +1005,7 @@ } }, courseFullUrl() { - if (!this.course.url) { - return `https://lil.city/course/${this.course.id}`; - } - let suffix = this.course.url ? this.course.url : 'ваша_ссылка'; + let suffix = this.course.slug || this.course.id || 'ваша_ссылка'; return `https://lil.city/course/${suffix}`; }, }, diff --git a/web/src/js/modules/api.js b/web/src/js/modules/api.js index ed60c229..929696fd 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.slug, date: (courseObject.date) ? courseObject.date.value:null, stream: courseObject.stream, cover: courseObject.coverImageId ? courseObject.coverImageId : null, @@ -194,7 +194,7 @@ export const api = { time: deferredTime, duration: courseJSON.duration, is_featured: courseJSON.is_featured, - url: courseJSON.slug, + slug: courseJSON.slug, stream: courseJSON.stream, coverImageId: courseJSON.cover && courseJSON.cover.id ? courseJSON.cover.id : null, coverImage: courseJSON.cover && courseJSON.cover.image ? courseJSON.cover.image : null,