diff --git a/api/v1/serializers/config.py b/api/v1/serializers/config.py index 9298a024..54fe2b8f 100644 --- a/api/v1/serializers/config.py +++ b/api/v1/serializers/config.py @@ -30,6 +30,8 @@ class ConfigSerializer(serializers.ModelSerializer): NUMBER_OF_STUDENTS = serializers.IntegerField() NUMBER_OF_COUNTRIES = serializers.IntegerField() NUMBER_OF_CITIES = serializers.IntegerField() + FREE_LESSONS_VIDEO_URL = serializers.CharField(required=False) + FREE_LESSONS_VIDEO_PREVIEW_IMG = serializers.SerializerMethodField() class Meta: model = Config @@ -56,6 +58,8 @@ class ConfigSerializer(serializers.ModelSerializer): 'NUMBER_OF_STUDENTS', 'NUMBER_OF_COUNTRIES', 'NUMBER_OF_CITIES', + 'FREE_LESSONS_VIDEO_URL', + 'FREE_LESSONS_VIDEO_PREVIEW_IMG', ) def get_SCHOOL_LOGO_IMAGE(self, config): diff --git a/apps/config/migrations/0015_auto_20190716_2040.py b/apps/config/migrations/0015_auto_20190716_2040.py new file mode 100644 index 00000000..6f930631 --- /dev/null +++ b/apps/config/migrations/0015_auto_20190716_2040.py @@ -0,0 +1,23 @@ +# Generated by Django 2.0.7 on 2019-07-16 20:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('config', '0014_auto_20190605_1338'), + ] + + operations = [ + migrations.AddField( + model_name='config', + name='FREE_LESSONS_VIDEO_PREVIEW_IMG', + field=models.ImageField(blank=True, null=True, upload_to=''), + ), + migrations.AddField( + model_name='config', + name='FREE_LESSONS_VIDEO_URL', + field=models.URLField(blank=True, default='', max_length=126), + ), + ] diff --git a/apps/config/models.py b/apps/config/models.py index daf9bc0e..8de428ba 100644 --- a/apps/config/models.py +++ b/apps/config/models.py @@ -26,6 +26,8 @@ class Config(models.Model): NUMBER_OF_STUDENTS = models.IntegerField(default=17000) NUMBER_OF_COUNTRIES = models.IntegerField(default=81) NUMBER_OF_CITIES = models.IntegerField(default=107) + FREE_LESSONS_VIDEO_URL = models.URLField(max_length=126, default='', blank=True) + FREE_LESSONS_VIDEO_PREVIEW_IMG = models.ImageField(null=True, blank=True) def save(self, *args, **kwargs): self.pk = 1 @@ -63,5 +65,7 @@ class Config(models.Model): 'NUMBER_OF_STUDENTS': '', 'NUMBER_OF_COUNTRIES': '', 'NUMBER_OF_CITIES': '', + 'FREE_LESSONS_VIDEO_URL': '', + 'FREE_LESSONS_VIDEO_PREVIEW_IMG': '', } return obj diff --git a/apps/school/templates/school/free_lessons.html b/apps/school/templates/school/free_lessons.html new file mode 100644 index 00000000..57a6e0b0 --- /dev/null +++ b/apps/school/templates/school/free_lessons.html @@ -0,0 +1,89 @@ +{% extends "templates/lilcity/index.html" %} {% load static %} +{% block title %}Месяц открытых дверей в LilCity{% endblock title%} +{% block ogimage %}http://{{request.META.HTTP_HOST}}{% static 'img/og_camp.jpg' %}{% endblock %} +{% block ogsite-name %}Первая образовательная онлайн-платформа креативного мышления для детей{% endblock ogsite-name %} + +{% block content %} +
+
+
+ Месяц открытых дверей! +
+
+
+ +
+
+ +
Приглашай друзей и получай лилики. + Пригласить
+
+
+ +
+
+
Бесплатно в кругосветку с Lil School!
+
+

Друзья, в августе мы приглашаем вас в путешествие!
+ В тур под названием «Кругосветка с Lil School» по программе «всё включено».

+ +

Творчество, креатив и потрясающие идеи!
+В августе 4 раза в неделю наши преподаватели БЕСПЛАТНО приглашают вас посетить одну из стран нашего многообразного Мира!

+ +

Когда?
+Со 2 по 19 августа.

+ +

Где?
+Здесь на этой странице будут уроки.

+ +

Стоимость?
+БЕСПЛАТНО!

+ +

Это всё?
+Конечно, НЕТ!
+Мы и наши партнёры приготовили для вас призы! После каждого занятия наши друзья - спонсоры будут выбирать одну работу урока и дарить автору подарок!
+А мы? А мы в конце месяца подарим... та - та - та - там! iPad!

+ +

Что делать?
+Регистрируйтесь на платформе, если не делали этого ранее. Готовьте материалы, хорошее настроение, устройство с доступом в Интернет и занимайтесь в своё удовольствие. +Выкладывайте работы у себя в аккаунте, в конце августа мы разыграем iPad!

+ +

Ну что, кто с нами в кругосветку?

+
+
+
+{% endblock %} + +{% block foot %} + {% include "templates/blocks/popup_ref_link.html" %} + + + + +{% endblock foot %} diff --git a/apps/school/urls.py b/apps/school/urls.py index e37768b0..49f4b42c 100644 --- a/apps/school/urls.py +++ b/apps/school/urls.py @@ -4,7 +4,7 @@ from .views import ( LiveLessonsView, LiveLessonEditView, LiveLessonsDetailView, SchoolView, SchoolSchedulesPrintView, DrawingCampView, - DrawingCampLessonsView) + DrawingCampLessonsView, FreeLessonsView) urlpatterns = [ path('', SchoolView.as_view(), name='school'), @@ -18,4 +18,5 @@ urlpatterns = [ path('camp/lessons//edit', LiveLessonEditView.as_view(), name='camp-lessons-edit', kwargs={'is_camp': True}), re_path(r'^camp/(?P\d+\-\d+\-\d+)', LiveLessonsDetailView.as_view(), name='camp-lesson-detail', kwargs={'is_camp': True}), + path('free/', FreeLessonsView.as_view(), name='free-lessons'), ] diff --git a/apps/school/views.py b/apps/school/views.py index ccbd16ab..bd32cb7b 100644 --- a/apps/school/views.py +++ b/apps/school/views.py @@ -375,3 +375,7 @@ class DrawingCampView(TemplateView): 'prolong_date_start': subscription_ends + timedelta(days=1) if subscription_ends else None, }) return context + + +class FreeLessonsView(TemplateView): + template_name = 'school/free_lessons.html' diff --git a/apps/user/models.py b/apps/user/models.py index 0e910b99..d24edf15 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -1,10 +1,12 @@ from json import dumps +import short_url from django.db.models import Q from django.utils.functional import cached_property from rest_framework.authtoken.models import Token from phonenumber_field.modelfields import PhoneNumberField +from django.conf import settings from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver @@ -110,6 +112,12 @@ class User(AbstractUser): def url(self): return reverse('user', args=[self.slug or self.id]) + @property + def ref_url(self): + return 'https://%s%s?referrer=%s' % ( + settings.MAIN_HOST, reverse('index'), short_url.encode_url(self.id) + ) if self.id else '' + def serialized(self): user_data = serializers.user.UserSerializer(instance=self).data user_data = dumps(user_data, ensure_ascii=False) diff --git a/apps/user/views.py b/apps/user/views.py index f43a13f5..a04e0b8a 100644 --- a/apps/user/views.py +++ b/apps/user/views.py @@ -4,7 +4,6 @@ from uuid import uuid4 from os.path import splitext from datetime import timedelta from paymentwall import Pingback -import short_url from django.conf import settings from django.contrib.auth import login @@ -376,9 +375,7 @@ class BonusHistoryView(TemplateView): context['bonuses'] = request.user.bonuses.filter( Q(payment__isnull=False, payment__status__in=Payment.PW_PAID_STATUSES) | Q(is_service=True), ) - context['referrer_url'] = 'https://%s%s?referrer=%s' % ( - settings.MAIN_HOST, reverse('index'), short_url.encode_url(request.user.id) - ) + context['referrer_url'] = request.user.ref_url context['share_text'] = '%s приглашает вас и ваших детей в первую онлайн школу креативного мышления Lil School. ' \ 'Занимайтесь с ребёнком творчеством, не выходя из дома. ' \ 'Перейдите по ссылке и получите скидку %d%% на первую покупку' \ diff --git a/project/templates/blocks/header.html b/project/templates/blocks/header.html index d88e6839..aafdf0e3 100644 --- a/project/templates/blocks/header.html +++ b/project/templates/blocks/header.html @@ -33,11 +33,16 @@ --> + + + + + + +
diff --git a/project/templates/blocks/popup_ref_link.html b/project/templates/blocks/popup_ref_link.html new file mode 100644 index 00000000..f7178209 --- /dev/null +++ b/project/templates/blocks/popup_ref_link.html @@ -0,0 +1,27 @@ +{% load static %} + + diff --git a/web/src/js/modules/popup.js b/web/src/js/modules/popup.js index 39e63c04..2ea82a0e 100644 --- a/web/src/js/modules/popup.js +++ b/web/src/js/modules/popup.js @@ -281,12 +281,18 @@ $(document).ready(function () { if( data === '.js-popup-auth') { showDef.then(() => { - const login = auth.find('.js-auth-login'); - const pass = auth.find('.js-auth-pass'); + const login = popup.find('.js-auth-login'); + const pass = popup.find('.js-auth-pass'); pass.css('display', 'none'); login.css('display', 'block'); }); } + + if(data === '.js-popup-ref-link') { + showDef.then(() => { + $('#referrer-url').select(); + }); + } }); $('.js-popup-close').on('click', function(e){ @@ -378,7 +384,7 @@ $(document).ready(function () { setTimeout(function(){ popup.addClass('visible'); resolve(); - $(document).trigger('popup-opened', popup); + $(document).trigger('popup-opened', [popup]); }, 100); }); } @@ -395,7 +401,7 @@ $(document).ready(function () { setTimeout(function(){ popup.removeClass('open'); resolve(); - $(document).trigger('popup-closed', popup); + $(document).trigger('popup-closed', [popup]); }, 300); }); } diff --git a/web/src/js/pages/free-lessons.js b/web/src/js/pages/free-lessons.js new file mode 100644 index 00000000..70be5af4 --- /dev/null +++ b/web/src/js/pages/free-lessons.js @@ -0,0 +1,16 @@ +import $ from 'jquery'; +import ClipboardJS from 'clipboard'; +import {showNotification} from '../modules/notification'; + +$(document).ready(function () { + $(document).on('popup-opened', (e, popup) => { + $('#referrer-url').select(); + }); + const clipboard = new ClipboardJS('#copy-referrer-url-btn'); + clipboard.on('success', e => { + showNotification('success', 'Ссылка скопирована'); + }); + $('#referrer-url').click(function(){ + $(this).select(); + }); +}); diff --git a/web/webpack.config.js b/web/webpack.config.js index 6d5a0acb..afdec32d 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -15,6 +15,7 @@ module.exports = { contestEdit: "./src/js/pages/contest-edit.js", profile: "./src/js/pages/profile.js", liveLesson: "./src/js/pages/live-lesson.js", + freeLessons: "./src/js/pages/free-lessons.js", userGalleryEdit: "./src/js/pages/user-gallery-edit.js", mixpanel: "./src/js/third_party/mixpanel-2-latest.js", sprite: glob('./src/icons/*.svg'),