From 4ddac99775845fbb195c495b5f07645949fc5019 Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 23 Jan 2019 23:08:36 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D0=BD=D0=B0=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D1=8B=20=D0=B2=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B5,=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D1=83=D1=80=D1=81=D1=8B=20=D0=BF=D0=BE=20?= =?UTF-8?q?slug=20(=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BE=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/course/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/course/models.py b/apps/course/models.py index b11156f4..b2233bd4 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -124,10 +124,11 @@ 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:] + slug = slugify(unidecode(self.title[:90])) + self.slug = slug + if self.slug: + while Course.objects.filter(slug=self.slug).exclude(id=self.id).exists(): + self.slug = slug + str(uuid4())[-4:] return super().save() From 4541acbaad5ed003a48b53e628bd42eea616d5b3 Mon Sep 17 00:00:00 2001 From: gzbender Date: Thu, 24 Jan 2019 11:38:56 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D0=BD=D0=B0=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D1=8B=20=D0=B2=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B5,=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D1=83=D1=80=D1=81=D1=8B=20=D0=BF=D0=BE=20?= =?UTF-8?q?slug=20(=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BE=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/course/models.py | 12 ++++---- web/src/components/CourseRedactor.vue | 41 +++++---------------------- web/src/js/modules/api.js | 4 +-- 3 files changed, 16 insertions(+), 41 deletions(-) diff --git a/apps/course/models.py b/apps/course/models.py index b2233bd4..0c33fd81 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -124,11 +124,13 @@ class Course(BaseModel, DeactivatedMixin): def save(self, *args, **kwargs): if not self.slug: - slug = slugify(unidecode(self.title[:90])) - self.slug = slug - if self.slug: - while Course.objects.filter(slug=self.slug).exclude(id=self.id).exists(): - self.slug = slug + str(uuid4())[-4:] + self.slug = slugify(unidecode(self.title[:90])) + 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,