From 2bc26ee02bb3957fbb33b6f3068f0f891f1fef26 Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 22 Aug 2018 13:57:19 +0500 Subject: [PATCH 01/19] =?UTF-8?q?LIL-629=20=D0=9F=D0=BE=D0=BF=D0=B0=D0=BF?= =?UTF-8?q?=20=D1=81=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BE=D0=BC=20=D0=B4?= =?UTF-8?q?=D0=BD=D0=B5=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BF=D0=BA=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/school/templates/blocks/day_pay_btn.html | 4 +- .../templates/blocks/schedule_item.html | 12 +++--- apps/school/templates/summer/promo.html | 4 -- project/templates/blocks/popup_auth.html | 12 +++--- project/templates/blocks/popup_buy.html | 2 +- web/src/js/modules/auth.js | 29 ++++++++++++--- web/src/js/modules/popup.js | 37 ++++++++++++++++--- 7 files changed, 68 insertions(+), 32 deletions(-) diff --git a/apps/school/templates/blocks/day_pay_btn.html b/apps/school/templates/blocks/day_pay_btn.html index 155b8827..f4cd2f40 100644 --- a/apps/school/templates/blocks/day_pay_btn.html +++ b/apps/school/templates/blocks/day_pay_btn.html @@ -1,7 +1,5 @@ купить diff --git a/apps/school/templates/blocks/schedule_item.html b/apps/school/templates/blocks/schedule_item.html index 7860e437..27d4fcd4 100644 --- a/apps/school/templates/blocks/schedule_item.html +++ b/apps/school/templates/blocks/schedule_item.html @@ -5,17 +5,17 @@
{{ school_schedule }}
- {% if purchased and live_lesson %} + {% if is_purchased and live_lesson %}
{{ live_lesson.date }}
{% endif %}
{{ school_schedule.start_at }} (МСК)
- {% if purchased %} - {% if school_schedule.weekday in school_schedules_purchased %} - {% if live_lesson and live_lesson.title %} - {% include './open_lesson.html' %} - {% endif %} + {% if is_purchased %} + {% if school_schedule.weekday in school_schedules_purchased and live_lesson and live_lesson.title %} + {% include './open_lesson.html' %} {% endif %} + {% else %} + {% include './day_pay_btn.html' %} {% endif %}
diff --git a/apps/school/templates/summer/promo.html b/apps/school/templates/summer/promo.html index 6995c7b9..3d52d65b 100644 --- a/apps/school/templates/summer/promo.html +++ b/apps/school/templates/summer/promo.html @@ -10,11 +10,7 @@
@@ -53,7 +53,7 @@
или
@@ -96,10 +96,10 @@
@@ -122,7 +122,7 @@
или
diff --git a/project/templates/blocks/popup_buy.html b/project/templates/blocks/popup_buy.html index 96b3b29d..d3080ec9 100644 --- a/project/templates/blocks/popup_buy.html +++ b/project/templates/blocks/popup_buy.html @@ -89,7 +89,7 @@
- ПЕРЕЙТИ К ОПЛАТЕ + ПЕРЕЙТИ К ОПЛАТЕ
diff --git a/web/src/js/modules/auth.js b/web/src/js/modules/auth.js index 07f65cda..09a9bae6 100644 --- a/web/src/js/modules/auth.js +++ b/web/src/js/modules/auth.js @@ -4,7 +4,7 @@ import isEmpty from 'validator/lib/isEmpty'; import isLength from 'validator/lib/isLength'; $(document).ready(function () { - let auth = $('.js-auth'), + let popup = $('.js-popup-auth'), type = auth.find('.js-auth-type'), tab = auth.find('.js-auth-tab'), login = auth.find('.js-auth-login'), @@ -153,7 +153,13 @@ $(document).ready(function () { }) .done(function (data) { if (data.success === true) { - location.reload(); + const nextUrl = popup.data('next-url'); + if(nextUrl){ + window.location.href = nextUrl; + } + else{ + window.location.reload(); + } } else { authButton.removeClass('loading'); } @@ -234,7 +240,13 @@ $(document).ready(function () { }) .done(function (data) { if (data.success === true) { - location.reload(); + const nextUrl = popup.data('next-url'); + if(nextUrl){ + window.location.href = nextUrl; + } + else{ + window.location.reload(); + } } else { registrationButton.removeClass('loading'); } @@ -275,7 +287,7 @@ $(document).ready(function () { if (facebookResponse) { if (facebookResponse.status === 'connected') { - login_with_facebook(facebookResponse.authResponse.accessToken); + login_with_facebook(facebookResponse.authResponse.accessToken, popup.data('next-url')); return; } } @@ -305,14 +317,19 @@ function load_facebook() { }); } -function login_with_facebook(accessToken) { +function login_with_facebook(accessToken, nextUrl) { $.ajax('/auth/facebook_login/', { method: 'POST', data: {'access_token': accessToken}, }) .done(function (data) { if (data.success === true) { - location.reload(); + if(nextUrl){ + window.location.href = nextUrl; + } + else{ + window.location.reload(); + } } }) .fail(function (xhr) { diff --git a/web/src/js/modules/popup.js b/web/src/js/modules/popup.js index a1a91d9f..425f81cd 100644 --- a/web/src/js/modules/popup.js +++ b/web/src/js/modules/popup.js @@ -31,6 +31,24 @@ $(document).ready(function () { }); is_extend = true; } + if(! window.LIL_STORE.user.id) { + const $btn = popup.find('.buy__btn'); + $btn.click(function(event) { + event.preventDefault(); + hidePopup().then(() => { + popup = $('.js-popup-auth'); + popup.data('next-url', $btn.attr('href')); + showPopup(); + }); + }); + } + } + if( data === '.js-popup-auth') { + let nextUrl = $(this).data('auth-next-url'); + if(nextUrl === 'href') { + nextUrl = $(this).attr('href'); + } + popup.data('next-url', nextUrl); } if($(this).data('day')) { @@ -70,21 +88,28 @@ $(document).ready(function () { function showPopup(){ body.addClass('no-scroll'); popup.addClass('open'); - setTimeout(function(){ - popup.addClass('visible'); - }, 100); + return new Promise((resolve) => { + setTimeout(function(){ + popup.addClass('visible'); + resolve(); + }, 100); + }); } function hidePopup(){ body.removeClass('no-scroll'); popup.removeClass('visible'); - setTimeout(function(){ - popup.removeClass('open'); - }, 300); + popup.data('next-url', null); if($('#password-reset__sent').is(':visible')) { window.location.reload(); } + return new Promise((resolve) => { + setTimeout(function(){ + popup.removeClass('open'); + resolve(); + }, 300); + }); } $(document).on('change', '[data-day]', function(){ From 58f71cb4d4f557b27b31d467c4db8dc3dac222c0 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 22 Aug 2018 12:40:33 +0300 Subject: [PATCH 02/19] Mainpage fixes --- apps/school/templates/summer/promo.html | 2 +- project/templates/blocks/about.html | 16 +--------------- project/templates/blocks/promo.html | 8 +++----- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/apps/school/templates/summer/promo.html b/apps/school/templates/summer/promo.html index 3d52d65b..6527951f 100644 --- a/apps/school/templates/summer/promo.html +++ b/apps/school/templates/summer/promo.html @@ -5,7 +5,7 @@ Lil School — первая образовательная онлайн-платформа креативного мышления для детей
- Присоединяйтесь к школе с 1 сентября + Старт школы - 1 сентрября
- +
diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index fd000cba..26fb0795 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -46,10 +46,9 @@ {% else %}
- Приглашаем вас на месяц открытых дверей в Lil School + Приглашаем вас присоединиться к онлайн-школе с 1 сентября!
- {% comment %} {% if not is_purchased and not is_purchased_future %} - Получить доступ + купить доступ от {{ min_school_price }} руб./месяц {% endif %} - {% endcomment %} - Подробнее + Подробнее
{% endif %} From 2a967311a3746e2d945604e7d1b05da269d57d71 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 22 Aug 2018 12:55:24 +0300 Subject: [PATCH 03/19] Typo fix --- apps/school/templates/summer/promo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/school/templates/summer/promo.html b/apps/school/templates/summer/promo.html index 6527951f..a07fc442 100644 --- a/apps/school/templates/summer/promo.html +++ b/apps/school/templates/summer/promo.html @@ -5,7 +5,7 @@ Lil School — первая образовательная онлайн-платформа креативного мышления для детей
- Старт школы - 1 сентрября + Старт школы - 1 сентября
diff --git a/web/src/js/modules/auth.js b/web/src/js/modules/auth.js index 09a9bae6..7df79e62 100644 --- a/web/src/js/modules/auth.js +++ b/web/src/js/modules/auth.js @@ -4,7 +4,8 @@ import isEmpty from 'validator/lib/isEmpty'; import isLength from 'validator/lib/isLength'; $(document).ready(function () { - let popup = $('.js-popup-auth'), + let auth = $('.js-auth'), + popup = $('.js-popup-auth'), type = auth.find('.js-auth-type'), tab = auth.find('.js-auth-tab'), login = auth.find('.js-auth-login'), From 89a60f00460da79299f2a275e60bb0d1a3f573a1 Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 22 Aug 2018 21:52:13 +0500 Subject: [PATCH 05/19] =?UTF-8?q?LIL-623=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=83=D1=80=D0=BE=D0=BA=20=D1=83=20=D0=BF=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user/forms.py | 2 ++ apps/user/migrations/0023_user_trial_lesson.py | 18 ++++++++++++++++++ apps/user/models.py | 1 + apps/user/templates/user/profile-settings.html | 13 ++++++++++++- apps/user/views.py | 5 +++++ project/templates/blocks/teachers.html | 17 +++++++++++------ web/src/sass/_common.sass | 7 +++++++ 7 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 apps/user/migrations/0023_user_trial_lesson.py diff --git a/apps/user/forms.py b/apps/user/forms.py index 2445d522..d20ee0ea 100644 --- a/apps/user/forms.py +++ b/apps/user/forms.py @@ -18,6 +18,7 @@ class UserEditForm(forms.ModelForm): # gender = forms.ChoiceField(choices=User.GENDER_CHOICES, required=False) gender = forms.CharField(required=False) # about = forms.CharField() + trial_lesson = forms.URLField(required=False) old_password = forms.CharField(required=False) new_password1 = forms.CharField(required=False) new_password2 = forms.CharField(required=False) @@ -41,6 +42,7 @@ class UserEditForm(forms.ModelForm): 'birthday', 'gender', 'about', + 'trial_lesson', 'old_password', 'new_password1', 'new_password2', diff --git a/apps/user/migrations/0023_user_trial_lesson.py b/apps/user/migrations/0023_user_trial_lesson.py new file mode 100644 index 00000000..33a0aab5 --- /dev/null +++ b/apps/user/migrations/0023_user_trial_lesson.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2018-08-22 12:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0022_user_instagram_hashtag'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='trial_lesson', + field=models.URLField(blank=True, default='', null=True), + ), + ] diff --git a/apps/user/models.py b/apps/user/models.py index 7391b0c8..0df7cd01 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -75,6 +75,7 @@ class User(AbstractUser): ) photo = models.ImageField('Фото', null=True, blank=True, upload_to='users') show_in_mainpage = models.BooleanField('Показывать на главной странице', default=False) + trial_lesson = models.URLField(default='', null=True, blank=True) objects = UserManager() diff --git a/apps/user/templates/user/profile-settings.html b/apps/user/templates/user/profile-settings.html index 5502c21d..90470b96 100644 --- a/apps/user/templates/user/profile-settings.html +++ b/apps/user/templates/user/profile-settings.html @@ -150,7 +150,18 @@ {% for error in form.about.errors %}
{{ error }}
{% endfor %} - + + {% if is_teacher %} +
+
Пробный урок
+
+ +
+ {% for error in form.trial_lesson.errors %} +
{{ error }}
+ {% endfor %} +
+ {% endif %}
Пароль
diff --git a/apps/user/views.py b/apps/user/views.py index 309fb0e0..a14daef6 100644 --- a/apps/user/views.py +++ b/apps/user/views.py @@ -210,6 +210,11 @@ class ProfileEditView(UpdateView): self.object = self.get_object() return super().dispatch(request, *args, **kwargs) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['is_teacher'] = self.object.role == User.TEACHER_ROLE + return context + def post(self, request, *args, **kwargs): # it's magic *-*-*-*-* if 'photo' in request.FILES: diff --git a/project/templates/blocks/teachers.html b/project/templates/blocks/teachers.html index 2b251b33..4cea46f3 100644 --- a/project/templates/blocks/teachers.html +++ b/project/templates/blocks/teachers.html @@ -17,10 +17,15 @@
- {{ teacher.get_full_name }}{% if teacher.instagram_hashtag %}, - - {{ teacher.instagram_hashtag }} - +
+ {{ teacher.get_full_name }}{% if teacher.instagram_hashtag %}, + + {{ teacher.instagram_hashtag }} + + {% endif %} +
+ {% if teacher.trial_lesson %} + ПРОБНЫЙ УРОК {% endif %}
diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 28019065..25302e55 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -1784,6 +1784,16 @@ a.grey-link +m margin: 0 5px 10px flex: 0 0 calc(33.33% - 10px) + &_promocodes &__item + text-align: center; + &__item-promocode + border: 1px solid #333; + display: inline-block; + padding: 7px 10px; + border-radius: 3px; + font-weight: bold; + letter-spacing: 2px; + text-transform: uppercase; &__pic display: block width: 100% From 2b8c9d553ebdaef7cfcf953913b054b51eb2773e Mon Sep 17 00:00:00 2001 From: gzbender Date: Fri, 24 Aug 2018 23:49:56 +0500 Subject: [PATCH 07/19] =?UTF-8?q?LIL-635=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B8=D0=BA=D0=BE=D0=BD=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D1=88=D0=BA=D0=BE=D0=BB=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/serializers/school.py | 3 ++ .../migrations/0043_auto_20180824_2132.py | 29 +++++++++++++++++++ apps/course/models.py | 6 ++-- .../migrations/0019_schoolschedule_cover.py | 20 +++++++++++++ .../migrations/0020_auto_20180824_2132.py | 29 +++++++++++++++++++ apps/school/models.py | 12 ++++++-- .../templates/blocks/schedule_item.html | 4 ++- web/src/sass/_common.sass | 1 + 8 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 apps/course/migrations/0043_auto_20180824_2132.py create mode 100644 apps/school/migrations/0019_schoolschedule_cover.py create mode 100644 apps/school/migrations/0020_auto_20180824_2132.py diff --git a/api/v1/serializers/school.py b/api/v1/serializers/school.py index 751bb6c2..a84c745e 100644 --- a/api/v1/serializers/school.py +++ b/api/v1/serializers/school.py @@ -54,6 +54,7 @@ class SchoolScheduleSerializer(serializers.ModelSerializer): 'day_discount', 'start_at', 'schoolschedule_images', + 'cover', ) read_only_fields = ( @@ -96,6 +97,7 @@ class SchoolScheduleSerializerImg(serializers.ModelSerializer): child=GalleryImageSerializer(), required=False, ) + cover = ImageObjectSerializer() class Meta: model = SchoolSchedule @@ -111,6 +113,7 @@ class SchoolScheduleSerializerImg(serializers.ModelSerializer): 'day_discount', 'start_at', 'schoolschedule_images', + 'cover', ) read_only_fields = ( diff --git a/apps/course/migrations/0043_auto_20180824_2132.py b/apps/course/migrations/0043_auto_20180824_2132.py new file mode 100644 index 00000000..9cf26b74 --- /dev/null +++ b/apps/course/migrations/0043_auto_20180824_2132.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.6 on 2018-08-24 21:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0042_like_ip'), + ] + + operations = [ + migrations.AlterField( + model_name='course', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='course_covers', to='content.ImageObject', verbose_name='Обложка курса'), + ), + migrations.AlterField( + model_name='lesson', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lesson_covers', to='content.ImageObject', verbose_name='Обложка урока'), + ), + migrations.AlterField( + model_name='material', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='material_covers', to='content.ImageObject', verbose_name='Обложка материала'), + ), + ] diff --git a/apps/course/models.py b/apps/course/models.py index dac438db..843e768e 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -65,7 +65,7 @@ class Course(BaseModel, DeactivatedMixin): ) cover = models.ForeignKey( ImageObject, related_name='course_covers', - verbose_name='Обложка курса', on_delete=models.CASCADE, + verbose_name='Обложка курса', on_delete=models.SET_NULL, null=True, blank=True, ) price = models.DecimalField( @@ -190,7 +190,7 @@ class Lesson(BaseModel, DeactivatedMixin): ) cover = models.ForeignKey( ImageObject, related_name='lesson_covers', - verbose_name='Обложка урока', on_delete=models.CASCADE, + verbose_name='Обложка урока', on_delete=models.SET_NULL, null=True, blank=True, ) created_at = models.DateTimeField(auto_now_add=True) @@ -222,7 +222,7 @@ class Material(models.Model): title = models.CharField('Название материала', max_length=100) cover = models.ForeignKey( ImageObject, related_name='material_covers', - verbose_name='Обложка материала', on_delete=models.CASCADE, + verbose_name='Обложка материала', on_delete=models.SET_NULL, null=True, blank=True, ) short_description = models.TextField('Краткое описание материала') diff --git a/apps/school/migrations/0019_schoolschedule_cover.py b/apps/school/migrations/0019_schoolschedule_cover.py new file mode 100644 index 00000000..88a3d222 --- /dev/null +++ b/apps/school/migrations/0019_schoolschedule_cover.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.6 on 2018-08-24 19:56 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0022_auto_20180815_2129'), + ('school', '0018_auto_20180629_1501'), + ] + + operations = [ + migrations.AddField( + model_name='schoolschedule', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='schoolschedule_cover', to='content.ImageObject', verbose_name='Обложка дня'), + ), + ] diff --git a/apps/school/migrations/0020_auto_20180824_2132.py b/apps/school/migrations/0020_auto_20180824_2132.py new file mode 100644 index 00000000..42188851 --- /dev/null +++ b/apps/school/migrations/0020_auto_20180824_2132.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.6 on 2018-08-24 21:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('school', '0019_schoolschedule_cover'), + ] + + operations = [ + migrations.AlterField( + model_name='livelesson', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='livelesson_covers', to='content.ImageObject', verbose_name='Обложка урока школы'), + ), + migrations.AlterField( + model_name='schoolschedule', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='schoolschedule_cover', to='content.ImageObject', verbose_name='Обложка дня'), + ), + migrations.AlterField( + model_name='schoolscheduleimage', + name='img', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='schoolschedule_images', to='content.ImageObject', verbose_name='Объект изображения'), + ), + ] diff --git a/apps/school/models.py b/apps/school/models.py index fe66564b..d1f70e68 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -38,6 +38,14 @@ class SchoolSchedule(models.Model): 'Скидка, в валюте', max_digits=8, decimal_places=2, default=0 ) start_at = models.TimeField('Начало урока', null=True) + cover = models.ForeignKey( + ImageObject, + related_name='schoolschedule_cover', + verbose_name='Обложка дня', + on_delete=models.SET_NULL, + null=True, + blank=True, + ) class Meta: ordering = ('weekday',) @@ -88,7 +96,7 @@ class SchoolScheduleImage(models.Model): ImageObject, related_name='schoolschedule_images', verbose_name='Объект изображения', - on_delete=models.CASCADE, + on_delete=models.SET_NULL, null=True, blank=True, ) @@ -111,7 +119,7 @@ class LiveLesson(BaseModel, DeactivatedMixin): ImageObject, related_name='livelesson_covers', verbose_name='Обложка урока школы', - on_delete=models.CASCADE, + on_delete=models.SET_NULL, null=True, blank=True, ) diff --git a/apps/school/templates/blocks/schedule_item.html b/apps/school/templates/blocks/schedule_item.html index 27d4fcd4..5f056047 100644 --- a/apps/school/templates/blocks/schedule_item.html +++ b/apps/school/templates/blocks/schedule_item.html @@ -32,7 +32,9 @@ {% thumbnail live_lesson.cover.image "70x70" crop="center" as im %} {% empty %} - + {% endthumbnail %} diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 25302e55..5ccc6d83 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -3880,6 +3880,7 @@ a.grey-link display: block width: 100% border-radius: 50% + object-fit: cover &__title margin-bottom: 5px font-size: 24px From 479c41d2058cf9dd4664c7fa2e54648535b67207 Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 25 Aug 2018 12:19:10 +0300 Subject: [PATCH 08/19] =?UTF-8?q?=D0=9D=D0=B5=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D1=8B=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/templates/blocks/comment.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/templates/blocks/comment.html b/project/templates/blocks/comment.html index be3234e9..d9e4822a 100644 --- a/project/templates/blocks/comment.html +++ b/project/templates/blocks/comment.html @@ -1,5 +1,5 @@ {% load static %} -{% if not node.deactivated_at %} +{% if not node.deactivated_at and node.author.is_active %}
{% if node.author.photo %} From c5e9c905bf80440ecae1afcfbc128a79396f0c3e Mon Sep 17 00:00:00 2001 From: gzbender Date: Mon, 27 Aug 2018 17:34:16 +0500 Subject: [PATCH 09/19] =?UTF-8?q?LIL-637=20=D0=90=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=A3=D1=80=D0=BE=D0=BA=20=D0=9F=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=BE=D0=BD=D0=B0=D0=B6=20=D0=BD=D0=B5=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=BE=D1=82=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/school/templates/blocks/schedule_item.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/school/templates/blocks/schedule_item.html b/apps/school/templates/blocks/schedule_item.html index 5f056047..c6be7c14 100644 --- a/apps/school/templates/blocks/schedule_item.html +++ b/apps/school/templates/blocks/schedule_item.html @@ -1,5 +1,5 @@ {% load static %} {% load thumbnail %} -
+
From eb87e295ad276d821d4b0bcf4d36e21c7d8701bc Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 28 Aug 2018 14:48:15 +0500 Subject: [PATCH 10/19] =?UTF-8?q?LIL-638=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=83=D1=80=D0=BE=D0=BA=20=D0=B2=20=D0=B4=D1=80=D1=83=D0=B3?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B0=D0=B9=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/serializers/school.py | 2 ++ api/v1/serializers/user.py | 1 + .../0021_schoolschedule_trial_lesson.py | 18 +++++++++++++ apps/school/models.py | 1 + .../templates/blocks/schedule_item.html | 3 +++ project/templates/blocks/popup_buy.html | 10 +++++++ project/templates/blocks/teachers.html | 2 +- web/package.json | 1 + web/src/js/app.js | 2 ++ web/src/js/modules/popup.js | 26 ++++++++++++++++++- web/src/sass/_common.sass | 18 ++++++++++++- 11 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 apps/school/migrations/0021_schoolschedule_trial_lesson.py diff --git a/api/v1/serializers/school.py b/api/v1/serializers/school.py index a84c745e..4f8cd318 100644 --- a/api/v1/serializers/school.py +++ b/api/v1/serializers/school.py @@ -55,6 +55,7 @@ class SchoolScheduleSerializer(serializers.ModelSerializer): 'start_at', 'schoolschedule_images', 'cover', + 'trial_lesson', ) read_only_fields = ( @@ -114,6 +115,7 @@ class SchoolScheduleSerializerImg(serializers.ModelSerializer): 'start_at', 'schoolschedule_images', 'cover', + 'trial_lesson', ) read_only_fields = ( diff --git a/api/v1/serializers/user.py b/api/v1/serializers/user.py index 888806d0..bbb5e6b5 100644 --- a/api/v1/serializers/user.py +++ b/api/v1/serializers/user.py @@ -42,6 +42,7 @@ class UserSerializer(serializers.ModelSerializer): 'photo', 'balance', 'show_in_mainpage', + 'trial_lesson', ) read_only_fields = ( diff --git a/apps/school/migrations/0021_schoolschedule_trial_lesson.py b/apps/school/migrations/0021_schoolschedule_trial_lesson.py new file mode 100644 index 00000000..293101a3 --- /dev/null +++ b/apps/school/migrations/0021_schoolschedule_trial_lesson.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2018-08-27 21:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('school', '0020_auto_20180824_2132'), + ] + + operations = [ + migrations.AddField( + model_name='schoolschedule', + name='trial_lesson', + field=models.URLField(blank=True, default=''), + ), + ] diff --git a/apps/school/models.py b/apps/school/models.py index d1f70e68..a059172f 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -46,6 +46,7 @@ class SchoolSchedule(models.Model): null=True, blank=True, ) + trial_lesson = models.URLField(default='', blank=True) class Meta: ordering = ('weekday',) diff --git a/apps/school/templates/blocks/schedule_item.html b/apps/school/templates/blocks/schedule_item.html index c6be7c14..e4774339 100644 --- a/apps/school/templates/blocks/schedule_item.html +++ b/apps/school/templates/blocks/schedule_item.html @@ -17,6 +17,9 @@ {% else %} {% include './day_pay_btn.html' %} {% endif %} + {% if school_schedule.trial_lesson %} + Пробный урок + {% endif %}
{% comment %} diff --git a/project/templates/blocks/popup_buy.html b/project/templates/blocks/popup_buy.html index d3080ec9..8f625f90 100644 --- a/project/templates/blocks/popup_buy.html +++ b/project/templates/blocks/popup_buy.html @@ -37,6 +37,11 @@ {% comment %} dont delete {% endcomment %} {{ school_schedule.title }} + + {% if school_schedule.trial_lesson %} + Пробный урок + {% endif %} + {{school_schedule.month_price}}р в мес. @@ -58,6 +63,11 @@ {% comment %} dont delete {% endcomment %} {{ school_schedule.title }} + + {% if school_schedule.trial_lesson %} + Пробный урок + {% endif %} + {{school_schedule.month_price}}р в мес. diff --git a/project/templates/blocks/teachers.html b/project/templates/blocks/teachers.html index 4cea46f3..492ca66d 100644 --- a/project/templates/blocks/teachers.html +++ b/project/templates/blocks/teachers.html @@ -25,7 +25,7 @@ {% endif %}
{% if teacher.trial_lesson %} - ПРОБНЫЙ УРОК + ПРОБНЫЙ УРОК {% endif %}
From 1cc670ba6e13662a33ea66928fd231bf68b2e0b2 Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 29 Aug 2018 13:53:45 +0500 Subject: [PATCH 13/19] LIL-638 --- web/src/js/modules/popup.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/src/js/modules/popup.js b/web/src/js/modules/popup.js index ba714c68..b3d98b21 100644 --- a/web/src/js/modules/popup.js +++ b/web/src/js/modules/popup.js @@ -4,7 +4,10 @@ var selectedWeekdays = {}; $(document).ready(function () { $(".js-video-modal").each(function(){ const $this = $(this); - const url = $this.data('video-url'); + const url = $this.data('videoUrl'); + if(! url){ + return; + } let data; let videoId; let channel; @@ -22,7 +25,8 @@ $(document).ready(function () { channel = 'vimeo'; videoId = split[split.length - 1]; } - $this.data('videoId', videoId); + $this.attr('data-video-id', videoId); + $this.attr('data-video-url', ''); $this.modalVideo({ channel }); }); From 66a0fef6bbbf0532a1987dddb1d64d44de96641e Mon Sep 17 00:00:00 2001 From: gzbender Date: Wed, 29 Aug 2018 19:10:36 +0500 Subject: [PATCH 14/19] =?UTF-8?q?LIL-642=20=D0=9D=D0=B5=20=D1=83=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B3=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20(is=5Factive=20false)=20=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=D1=80=D1=81=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/serializers/contest.py | 15 ++++++++---- api/v1/serializers/course.py | 21 +++------------- api/v1/views.py | 24 +++++++++++++++++++ apps/content/models.py | 7 ++++++ .../templates/content/contest_work.html | 2 +- apps/content/views.py | 8 ++++--- apps/school/templates/summer/promo.html | 2 +- project/templates/blocks/about.html | 2 +- project/urls.py | 2 +- web/src/components/ContestWorks.vue | 8 +++++-- web/src/components/blocks/Likes.vue | 9 ++++++- 11 files changed, 68 insertions(+), 32 deletions(-) diff --git a/api/v1/serializers/contest.py b/api/v1/serializers/contest.py index dc5b88fd..9d2e63c4 100644 --- a/api/v1/serializers/contest.py +++ b/api/v1/serializers/contest.py @@ -1,3 +1,4 @@ +from django.contrib.auth import get_user_model from rest_framework import serializers from api.v1.serializers.content import ContentSerializer, ContentCreateSerializer, ImageObjectSerializer @@ -5,6 +6,8 @@ from api.v1.serializers.mixins import DispatchContentMixin from apps.content.models import (Contest, ContestWork) +User = get_user_model() + class ContestSerializer(serializers.ModelSerializer): cover = ImageObjectSerializer() @@ -12,7 +15,8 @@ class ContestSerializer(serializers.ModelSerializer): class Meta: model = Contest - fields = '__all__' + fields = ['title', 'description', 'slug', 'cover', + 'date_start', 'date_end', 'active', 'content', 'finished'] class ContestCreateSerializer(DispatchContentMixin, serializers.ModelSerializer): @@ -52,11 +56,14 @@ class ContestWorkSerializer(serializers.ModelSerializer): 'created_at', 'likes', 'user_liked', 'img_width', 'img_height'] def get_likes(self, instance): - return instance.likes.count() + return instance.likes.filter(user__is_active=True).count() def get_user_liked(self, instance): - user = self.context['request'].user - return instance.likes.filter(user=user).exists() if user.is_authenticated else False + # FIXME + user = self.context['request'].query_params.get('current_user') + if user: + user = User.objects.get(pk=user) + return instance.likes.filter(user=user).exists() if user else False class ContestWorkCreateSerializer(serializers.ModelSerializer): diff --git a/api/v1/serializers/course.py b/api/v1/serializers/course.py index fe06ca53..4382aae4 100644 --- a/api/v1/serializers/course.py +++ b/api/v1/serializers/course.py @@ -71,14 +71,10 @@ class LikeSerializer(serializers.ModelSerializer): class LikeCreateSerializer(serializers.ModelSerializer): - OBJ_TYPE_CONTEST_WORK = 'contest_work' - - obj_type = serializers.CharField(required=True) - obj_id = serializers.IntegerField(required=True) class Meta: model = Like - fields = ['user', 'obj_type', 'obj_id'] + fields = ['user'] def create(self, validated_data): # FIXME @@ -86,20 +82,9 @@ class LikeCreateSerializer(serializers.ModelSerializer): user = validated_data.get('user') else: user = self.context['request'].user - if not user: # FIXME and user.is_authenticated): - return Like() - obj_type = validated_data.pop('obj_type') - obj_id = validated_data.pop('obj_id') client_ip, is_routable = get_client_ip(self.context['request']) - if obj_type == self.OBJ_TYPE_CONTEST_WORK: - contest_work = ContestWork.objects.get(pk=obj_id) - # FIXME in prod: fixed - if contest_work.user == user or contest_work.likes.filter(user=user).exists(): - # if contest_work.likes.filter(user=user).exists(): - return Like() - like = Like.objects.create(user=user, ip=client_ip) - contest_work.likes.add(like) - return like + like = Like.objects.create(user=user, ip=client_ip) + return like def to_representation(self, instance): return LikeSerializer(instance, context=self.context).to_representation(instance) diff --git a/api/v1/views.py b/api/v1/views.py index cfe857fb..2389a4db 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -131,6 +131,8 @@ class MaterialViewSet(ExtendedModelViewSet): class LikeViewSet(ExtendedModelViewSet): + OBJ_TYPE_CONTEST_WORK = 'contest_work' + queryset = Like.objects.select_related('user').all() serializer_class = LikeCreateSerializer serializer_class_map = { @@ -143,6 +145,28 @@ class LikeViewSet(ExtendedModelViewSet): # FIXME authentication_classes = [] + def create(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + obj_type = request.data.get('obj_type') + obj_id = request.data.get('obj_id') + user = serializer.validated_data.get('user') + if not user.is_active: # FIXME and user.is_authenticated): + return Response(status=status.HTTP_403_FORBIDDEN) + if obj_type == self.OBJ_TYPE_CONTEST_WORK: + contest_work = ContestWork.objects.get(pk=obj_id) + if contest_work.user == user: + return Response({'error': u'Нельзя голосовать за свою работу'}, status=status.HTTP_400_BAD_REQUEST) + if contest_work.likes.filter(user=user).exists(): + return Response({'error': u'Вы уже голосовали за эту работу'}, status=status.HTTP_400_BAD_REQUEST) + if contest_work.contest.finished: + return Response({'error': u'Голосование закончено'}, status=status.HTTP_400_BAD_REQUEST) + instance = serializer.save() + if obj_type == self.OBJ_TYPE_CONTEST_WORK: + contest_work.likes.add(instance) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + class CategoryViewSet(ExtendedModelViewSet): queryset = Category.objects.order_by('-id') diff --git a/apps/content/models.py b/apps/content/models.py index 197e1e7d..1fec0880 100644 --- a/apps/content/models.py +++ b/apps/content/models.py @@ -1,7 +1,10 @@ +from datetime import datetime, time from urllib.parse import urlparse +from django.conf import settings from django.db import models from django.contrib.auth import get_user_model from django.urls import reverse_lazy +from django.utils import timezone from imagekit.models import ImageSpecField from imagekit.processors import ResizeToCover @@ -167,6 +170,10 @@ class Contest(models.Model): active = models.BooleanField(default=True) # TODO? baner + @property + def finished(self): + return datetime(2018, 8, 29, 21) < timezone.now() + def save(self, *args, **kwargs): if self.active: Contest.objects.filter(active=True).update(active=False) diff --git a/apps/content/templates/content/contest_work.html b/apps/content/templates/content/contest_work.html index 5184faae..e4ade33d 100644 --- a/apps/content/templates/content/contest_work.html +++ b/apps/content/templates/content/contest_work.html @@ -35,7 +35,7 @@
diff --git a/apps/content/views.py b/apps/content/views.py index ff3a4deb..4d350cca 100644 --- a/apps/content/views.py +++ b/apps/content/views.py @@ -14,10 +14,11 @@ from apps.course.models import ContestWorkComment @method_decorator(login_required, name='dispatch') class ContestEditView(TemplateView): template_name = 'content/contest_edit.html' + query_pk_and_slug = True - def get(self, request, pk=None, lesson=None): - if pk: - self.object = get_object_or_404(Contest, pk=pk) + def get(self, request, slug=None, lesson=None): + if slug: + self.object = get_object_or_404(Contest, slug=slug) else: self.object = Contest() @@ -58,6 +59,7 @@ class ContestWorkView(DetailView): context['user_liked'] = self.object.likes.filter(user=self.request.user).exists() \ if self.request.user.is_authenticated else False + context['likes_count'] = self.object.likes.filter(user__is_active=True).count() return context diff --git a/apps/school/templates/summer/promo.html b/apps/school/templates/summer/promo.html index a07fc442..7878c9ef 100644 --- a/apps/school/templates/summer/promo.html +++ b/apps/school/templates/summer/promo.html @@ -46,7 +46,7 @@ -
12 уроков
+
7 дисциплин
В разных техниках
diff --git a/project/templates/blocks/about.html b/project/templates/blocks/about.html index c25391cd..de379799 100644 --- a/project/templates/blocks/about.html +++ b/project/templates/blocks/about.html @@ -30,7 +30,7 @@
-
12 уроков
+
7 дисциплин
В разных техниках
diff --git a/project/urls.py b/project/urls.py index 9e6f5992..60a492c4 100644 --- a/project/urls.py +++ b/project/urls.py @@ -84,7 +84,7 @@ urlpatterns = [ path('school/', include(('apps.school.urls', 'school'))), path('test', TemplateView.as_view(template_name='templates/lilcity/test.html'), name='test'), path('contest/create', ContestEditView.as_view(), name='contest_create'), - path('contest//edit', ContestEditView.as_view(), name='contest_edit'), + path('contest//edit', ContestEditView.as_view(), name='contest_edit'), path('contest//', ContestView.as_view(), name='contest'), path('contest-work//', ContestWorkView.as_view(), name='contest_work'), path('contest-work//comment', contest_work_comment, name='contest_work_comment'), diff --git a/web/src/components/ContestWorks.vue b/web/src/components/ContestWorks.vue index 18bb1fc8..c9d377b7 100644 --- a/web/src/components/ContestWorks.vue +++ b/web/src/components/ContestWorks.vue @@ -61,8 +61,12 @@ methods: { load() { this.loading = true; - api.get(`/api/v1/contest-works/?contest=${this.contestId}&page=${this.page}`) - .then((response) => { + api.get(`/api/v1/contest-works/?contest=${this.contestId}&page=${this.page}¤t_user=${this.$root.store.user.id}`, { + headers: { + 'Authorization': `Token ${this.$root.store.accessToken}`, + } + }) + .then(response => { this.loading = false; this.loaded = true; if(this.page > 1){ diff --git a/web/src/components/blocks/Likes.vue b/web/src/components/blocks/Likes.vue index d1807254..8b3ef4c8 100644 --- a/web/src/components/blocks/Likes.vue +++ b/web/src/components/blocks/Likes.vue @@ -10,6 +10,7 @@ From b5f8febba4e173e114b619e51bd319f48c6cb6d7 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 29 Aug 2018 21:59:59 +0300 Subject: [PATCH 17/19] Hide contest work upload button --- apps/content/templates/content/contest.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/content/templates/content/contest.html b/apps/content/templates/content/contest.html index f37f3886..9edbe8ec 100644 --- a/apps/content/templates/content/contest.html +++ b/apps/content/templates/content/contest.html @@ -12,7 +12,7 @@ {{ contest.description }}
- {% if not contest_work_uploaded %} + {% if not contest_work_uploaded and not contest.finished %} Загрузить свою работу @@ -34,7 +34,7 @@
Галерея
- {% if not contest_work_uploaded %} + {% if not contest_work_uploaded and not contest.finished %} Загрузить свою работу From 909d9ab0d0523fff8f49a666c86a791bf03139e4 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 29 Aug 2018 22:16:31 +0300 Subject: [PATCH 18/19] fullscreen video fix --- apps/content/templates/content/blocks/video.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/content/templates/content/blocks/video.html b/apps/content/templates/content/blocks/video.html index 72bc8f86..d9d9c47f 100644 --- a/apps/content/templates/content/blocks/video.html +++ b/apps/content/templates/content/blocks/video.html @@ -9,7 +9,7 @@ allowfullscreen> {% elif 'vimeo.com' in content.url %} {% endif %}
From 5a398418fd811b133872be9a6e884ac90aadadb4 Mon Sep 17 00:00:00 2001 From: gzbender Date: Thu, 30 Aug 2018 02:06:59 +0500 Subject: [PATCH 19/19] =?UTF-8?q?LIL-643=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BE=D0=BD=D0=BB=D0=B0=D0=B9=D0=BD-?= =?UTF-8?q?=D1=87=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/templates/lilcity/index.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 1c41b857..af7eb6c3 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -38,6 +38,21 @@ {% endcompress %} + + + +