Merge branch 'dev' into 'master'

Dev

See merge request lilcity/backend!44
remotes/origin/hasaccess
Vitaly Baev 8 years ago
commit 08c2eb5fa9
  1. 2
      apps/notification/templates/notification/email/_base.html
  2. 2
      apps/payment/templates/payment/payment_success.html
  3. 23
      apps/payment/views.py
  4. 60
      apps/school/fixtures/school_schedules.json
  5. 14
      apps/school/templates/blocks/promo.html
  6. 4
      apps/school/templates/blocks/schedule.html
  7. 5
      apps/school/templates/school/school.html
  8. 15
      apps/school/templates/school/summer_school.html
  9. 78
      apps/school/templates/summer/_schedule_purchased_item.html
  10. 26
      apps/school/templates/summer/about.html
  11. 44
      apps/school/templates/summer/advantages.html
  12. 7
      apps/school/templates/summer/day_pay_btn.html
  13. 21
      apps/school/templates/summer/last_courses.html
  14. 12
      apps/school/templates/summer/online.html
  15. 4
      apps/school/templates/summer/open_lesson.html
  16. 9
      apps/school/templates/summer/prolong_btn.html
  17. 67
      apps/school/templates/summer/promo.html
  18. 69
      apps/school/templates/summer/schedule_purchased.html
  19. 3
      apps/school/urls.py
  20. 85
      apps/school/views.py
  21. 4
      apps/user/templates/user/become-author.html
  22. 45
      apps/user/templates/user/profile.html
  23. 32
      apps/user/views.py
  24. 46
      project/templates/blocks/about.html
  25. 10
      project/templates/blocks/advantages.html
  26. 72
      project/templates/blocks/arts.html
  27. 9
      project/templates/blocks/footer.html
  28. 2
      project/templates/blocks/gallery.html
  29. 9
      project/templates/blocks/header.html
  30. 4
      project/templates/blocks/live.html
  31. 36
      project/templates/blocks/popup_subscribe.html
  32. 41
      project/templates/blocks/promo.html
  33. 13
      project/templates/blocks/teachers.html
  34. 1
      project/templates/lilcity/index.html
  35. 12
      project/templates/lilcity/subscribe_success.html
  36. 4
      project/templates/lilcity/terms.html
  37. 1
      project/urls.py
  38. 16
      project/views.py
  39. 10
      web/src/components/CourseRedactor.vue
  40. 2
      web/src/email/index.html
  41. 14
      web/src/sass/_common.sass
  42. 2
      web/src/templates/partials/_footer.pug

@ -22,7 +22,7 @@
</a> </a>
</td> </td>
<td style="padding:30px 50px 30px 10px;vertical-align:middle;text-align:right"> <td style="padding:30px 50px 30px 10px;vertical-align:middle;text-align:right">
<div style="display:inline-block;width:220px;font-size:18px;line-height:1.22">Первая онлайн-школа креативного мышления Lil City School</div> <div style="display:inline-block;width:220px;font-size:18px;line-height:1.22">Первая онлайн-школа креативного мышления Lil School</div>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -5,7 +5,7 @@
{% if school %} {% if school %}
<div class="done__title title">Вы успешно приобрели доступ к урокам онлайн-школы!</div> <div class="done__title title">Вы успешно приобрели доступ к урокам онлайн-школы!</div>
<div class="done__foot"> <div class="done__foot">
<a class="done__btn btn btn_md btn_stroke" href="{% url 'school:school' %}">ПЕРЕЙТИ К ШКОЛЕ</a> <a class="done__btn btn btn_md btn_stroke" href="{% url 'school:summer-school' %}">ПЕРЕЙТИ К ШКОЛЕ</a>
</div> </div>
{% else %} {% else %}
<div class="done__title title">Вы успешно приобрели курс!</div> <div class="done__title title">Вы успешно приобрели курс!</div>

@ -5,6 +5,9 @@ import logging
from datetime import timedelta from datetime import timedelta
from urllib.parse import urlsplit from urllib.parse import urlsplit
import datetime
import calendar
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import HttpResponse from django.http import HttpResponse
@ -95,12 +98,12 @@ class SchoolBuyView(TemplateView):
add_days = 'add_days' in request.GET add_days = 'add_days' in request.GET
if not weekdays: if not weekdays:
messages.error(request, 'Выберите несколько дней недели.') messages.error(request, 'Выберите несколько дней недели.')
return redirect('school:school') return redirect('school:summer-school')
try: try:
weekdays = [int(weekday) for weekday in weekdays] weekdays = [int(weekday) for weekday in weekdays]
except ValueError: except ValueError:
messages.error(request, 'Ошибка выбора дней недели.') messages.error(request, 'Ошибка выбора дней недели.')
return redirect('school:school') return redirect('school:summer-school')
if add_days: if add_days:
_school_payment = SchoolPayment.objects.get( _school_payment = SchoolPayment.objects.get(
user=request.user, user=request.user,
@ -117,7 +120,7 @@ class SchoolBuyView(TemplateView):
) )
if school_payment.amount <= 0: if school_payment.amount <= 0:
messages.error(request, 'Выбранные дни отсутствуют в оставшемся периоде подписки') messages.error(request, 'Выбранные дни отсутствуют в оставшемся периоде подписки')
return redirect(reverse_lazy('school:school')) return redirect(reverse_lazy('school:summer-school'))
else: else:
school_payment = SchoolPayment.objects.create( school_payment = SchoolPayment.objects.create(
user=request.user, user=request.user,
@ -148,6 +151,13 @@ class SchoolBuyView(TemplateView):
@method_decorator(csrf_exempt, name='dispatch') @method_decorator(csrf_exempt, name='dispatch')
class PaymentwallCallbackView(View): class PaymentwallCallbackView(View):
def add_months(self, sourcedate, months):
month = sourcedate.month - 1 + months
year = sourcedate.year + month // 12
month = month % 12 + 1
day = min(sourcedate.day, calendar.monthrange(year, month)[1])
return datetime.date(year, month, day)
def get_request_ip(self): def get_request_ip(self):
x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR') x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for: if x_forwarded_for:
@ -201,14 +211,15 @@ class PaymentwallCallbackView(View):
).last() ).last()
if school_payment: if school_payment:
if payment.add_days: if payment.add_days:
date_start = now() date_start = self.add_months(sourcedate=now().replace(hour=0, minute=0, day=1), months=1)
date_end = school_payment.date_end date_end = school_payment.date_end
else: else:
date_start = arrow.get(school_payment.date_end).shift(days=1).datetime date_start = arrow.get(school_payment.date_end).shift(days=1).datetime
date_end = arrow.get(date_start).shift(months=1).datetime date_end = arrow.get(date_start).shift(months=1).datetime
else: else:
date_start = now() date_start = self.add_months(sourcedate=now().replace(hour=0, minute=0, day=1), months=1)
date_end = arrow.get(date_start).shift(months=1).datetime date__end = arrow.get(date_start).shift(months=1) - datetime.timedelta(minutes=1)
date_end = date__end.datetime
payment.date_start = date_start payment.date_start = date_start
payment.date_end = date_end payment.date_end = date_end
if product_type_name == 'course': if product_type_name == 'course':

@ -14,21 +14,6 @@
"start_at": "17:00:00" "start_at": "17:00:00"
} }
}, },
{
"model": "school.schoolschedule",
"pk": 2,
"fields": {
"weekday": 2,
"title": "Живопись",
"short_description": "Однажды он затеял скандал на торговой площади ради леденца, вокруг собралась толпа, и полицейские...",
"description": "Позднее в возрасте 5 лет на его могиле родители сказали Сальвадору, что он — реинкарнация своего старшего брата.",
"materials": "В детстве Дали был сообразительным, но заносчивым и неуправляемым ребёнком.",
"age": 0,
"month_price": "500.00",
"day_discount": "0.00",
"start_at": "17:00:00"
}
},
{ {
"model": "school.schoolschedule", "model": "school.schoolschedule",
"pk": 3, "pk": 3,
@ -44,21 +29,6 @@
"start_at": "17:00:00" "start_at": "17:00:00"
} }
}, },
{
"model": "school.schoolschedule",
"pk": 4,
"fields": {
"weekday": 4,
"title": "Моторика",
"short_description": "Многочисленные комплексы[какие?] и фобии, например, страх перед",
"description": "Многочисленные комплексы[какие?] и фобии, например, страх перед кузнечиками[9], мешали ему включиться в обычную школьную жизнь, завести с детьми обычные связи дружбы и симпатии.",
"materials": "Но, как и любой человек, испытывая сенсорный голод, он искал эмоциональный контакт с детьми любыми способами, стараясь вжиться в их коллектив если не в роли товарища, то в любой другой роли, а точнее той единственной, на которую был способен, — в роли эпатажного и непослушного ребёнка, странного, чудаковатого, всегда поступающего вопреки чужим мнениям.",
"age": 0,
"month_price": "500.00",
"day_discount": "0.00",
"start_at": "17:00:00"
}
},
{ {
"model": "school.schoolschedule", "model": "school.schoolschedule",
"pk": 5, "pk": 5,
@ -73,35 +43,5 @@
"day_discount": "0.00", "day_discount": "0.00",
"start_at": "17:00:00" "start_at": "17:00:00"
} }
},
{
"model": "school.schoolschedule",
"pk": 6,
"fields": {
"weekday": 6,
"title": "Анимация",
"short_description": "Проигрывая в школьных азартных играх, он вёл себя так",
"description": "Обучаться изобразительному искусству Дали начал в муниципальной художественной школе. С 1914 по 1918 год воспитывался в Академии братьев ордена маристов в Фигерасе.",
"materials": "Одним из друзей детства был будущий футболист ФК «Барселона» Хосеп Самитьер. В 1916 году, с семьей Рамона Пишó, отправился на каникулы в город Кадакéс, где познакомился с современным искусством.",
"age": 0,
"month_price": "500.00",
"day_discount": "0.00",
"start_at": "17:00:00"
}
},
{
"model": "school.schoolschedule",
"pk": 7,
"fields": {
"weekday": 7,
"title": "Персонаж",
"short_description": "Проигрывая в школьных азартных играх, он вёл себя так",
"description": "После прихода к власти Каудильо Фрáнко в 1936 году Дали ссорится с сюрреалистами, стоящими на левых позициях, и его исключают из группы.",
"materials": "В ответ Дали: «Сюрреализм — это я».",
"age": 0,
"month_price": "500.00",
"day_discount": "0.00",
"start_at": "17:00:00"
}
} }
] ]

@ -2,17 +2,13 @@
<div class="main main_default" style="background-image: url({% static 'img/bg-2.jpg' %});"> <div class="main main_default" style="background-image: url({% static 'img/bg-2.jpg' %});">
<div class="main__center center"> <div class="main__center center">
<div class="main__title"> <div class="main__title">
<span class="main__bold">Lil City School</span> — первая образовательная онлайн-платформа креативного мышления для детей</div> <span class="main__bold">Lil School</span> — первая образовательная онлайн-платформа креативного мышления для детей</div>
<div class="main__actions"> <div class="main__actions">
<a <a
{% if not user.is_authenticated %} data-popup=".js-popup-subscribe"
data-popup=".js-popup-auth" class="main__btn btn"
{% else %} href="#"
data-popup=".js-popup-buy" >Оставить заявку</a>
{% endif %}
class="main__btn btn"
href="#"
>купить доступ от {{ min_school_price }} руб./месяц</a>
</div> </div>
<div class="main__school school school_main"> <div class="main__school school school_main">
<div class="school__col"> <div class="school__col">

@ -19,7 +19,7 @@
</div> </div>
<div class="timing__buy"> <div class="timing__buy">
<div class="timing__time">{{ school_schedule.start_at }} (МСК)</div> <div class="timing__time">{{ school_schedule.start_at }} (МСК)</div>
{% include './pay_btn.html' %} <!--{% include './pay_btn.html' %}-->
</div> </div>
</div> </div>
<div class="timing__cell"> <div class="timing__cell">
@ -77,7 +77,7 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="timing__foot"> <div class="timing__foot">
{% include './pay_btn.html' %} <!--{% include './pay_btn.html' %}-->
<a target="_blank" class="timing__print" href="{% url 'school:school_schedules-print' %}">Распечатать расписание <a target="_blank" class="timing__print" href="{% url 'school:school_schedules-print' %}">Распечатать расписание
<span class="bold">чтобы не забыть</span> <span class="bold">чтобы не забыть</span>
<svg class="icon icon-print"> <svg class="icon icon-print">

@ -1,15 +1,10 @@
{% extends "templates/lilcity/index.html" %} {% load static %} {% extends "templates/lilcity/index.html" %} {% load static %}
{% block title %}Онлайн-школа LilCity{% endblock title%} {% block title %}Онлайн-школа LilCity{% endblock title%}
{% block content %} {% block content %}
{% if not is_purchased %}
{% include "../blocks/promo.html" %} {% include "../blocks/promo.html" %}
{% include "../blocks/about.html" %} {% include "../blocks/about.html" %}
{% include "../blocks/advantages.html" %} {% include "../blocks/advantages.html" %}
{% include "../blocks/online.html" %} {% include "../blocks/online.html" %}
{% include "../blocks/schedule.html" %}
{% include "templates/blocks/game.html" %} {% include "templates/blocks/game.html" %}
{% include "templates/blocks/partners.html" %} {% include "templates/blocks/partners.html" %}
{% else %}
{% include "../blocks/schedule_purchased.html" %}
{% endif %}
{% endblock %} {% endblock %}

@ -0,0 +1,15 @@
{% extends "templates/lilcity/index.html" %} {% load static %}
{% block title %}Онлайн-школа LilCity{% endblock title%}
{% block content %}
{% if not is_purchased %}
{% include "../summer/promo.html" %}
{% include "../summer/about.html" %}
{% include "../summer/advantages.html" %}
{% include "../summer/online.html" %}
{% include "../blocks/schedule.html" %}
{% include "templates/blocks/game.html" %}
{% include "templates/blocks/partners.html" %}
{% else %}
{% include "../summer/schedule_purchased.html" %}
{% endif %}
{% endblock %}

@ -0,0 +1,78 @@
{% load static %} {% load thumbnail %}
<div class="timing__item{% if school_schedule.weekday > 5 %} timing__item_bg{% endif %} js-timing-item js-timing-toggle{% if not school_schedule.weekday in school_schedules_purchased %} disable{% endif %}">
<div class="timing__cell">
<div class="timing__info">
<div class="timing__day{% if school_schedule.is_online %} active{% endif %}">
{{ school_schedule }}
</div>
{% if live_lesson %}
<div class="timing__date">{{ live_lesson.date }}</div>
{% endif %}
</div>
<div class="timing__buy">
<div class="timing__time">{{ school_schedule.start_at }} (МСК)</div>
{% if school_schedule.weekday in school_schedules_purchased %}
{% if live_lesson and school_schedule.is_online or live_lesson and is_previous and live_lesson in live_lessons %}
{% include './open_lesson.html' %}
{% endif %}
{% else %}
{% include './day_pay_btn.html' %}
{% endif %}
</div>
{% comment %}
<!-- это нужно чтобы в попапе продления школы всегда знать какие дни выбраны(куплены) -->
{% endcomment %}
{% if school_schedule.weekday in school_schedules_purchased %}
<span style="display: none;" data-purchased="{{ school_schedule.weekday }}"></span>
{% endif %}
</div>
<div class="timing__cell">
<div class="timing__preview">
{% thumbnail live_lesson.cover.image "70x70" crop="center" as im %}
<img class="timing__pic" src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
{% empty %}
<img class="timing__pic" src="{% static 'img/no_cover.png' %}" width="70px" height="70px" />
{% endthumbnail %}
</div>
</div>
<div class="timing__cell">
<div class="timing__title">{{ school_schedule.title }}{% if live_lesson %},
<span class="bold">{{ live_lesson.title }}</span>
{% endif %}
</div>
<div class="timing__content">
{% if live_lesson %}
{{ live_lesson.short_description }}
{% else %}
{{ school_schedule.description }}
{% endif %}
</div>
<div class="timing__more">
<div class="timing__head">Материалы</div>
<div class="timing__row">
<div class="timing__text">
{{ school_schedule.materials }}
</div>
</div>
{% if school_schedule.schoolschedule_images.exists %}
<div class="timing__head">Результаты прошлых уроков</div>
<div class="timing__works gallery">
{% for image in school_schedule.schoolschedule_images.all %}
{% thumbnail image.img.image "48x48" crop="center" as im %}
<a class="timing__work" href="{{ image.img.image.url }}">
<img class="timing__pic" src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"/>
</a>
{% endthumbnail %}
{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="timing__cell">
<button class="timing__toggle">
<svg class="icon icon-arrow-down">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-arrow-down"></use>
</svg>
</button>
</div>
</div>

@ -0,0 +1,26 @@
{% load static %}
<div class="section" id="about">
<div class="section__center center">
<div class="title title_center">О школе</div>
<div class="about">
<div class="about__ava ava">
<img class="ava__pic" src="{% static 'img/user.jpg' %}">
</div>
<div class="about__wrap">
<div class="about__content">
<p>С раннего возраста мы стремимся развить в детях креативность, умение думать и&nbsp;анализировать, работать в смешанных
техниках и всевозможными материалами. Каждый урок интересный и уникальный.</p>
<p>Для раскрытия творческого потенциала создаем благоприятные условия которые вдохновляют к развитию. Наша школа создает
необходимую среду, в которой маленькое семечко способностей и желания рисовать вырастет в могучее дерево безграничного
потенциала.
</p>
<p>Наши ученики становятся осознанными, уверенными и творческими личностями.</p>
<p>Они способны решать сложные задачи благодаря воображению.</p>
</div>
<div class="about__ceo">- Sasha Kru, CEO и основатель
<a href='#'>Lil.City</a>
</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,44 @@
{% load static %}
<div class="section section_benefits" id="advantages">
<div class="section__center center">
<div class="title title_center">Преимущества</div>
<div class="benefits benefits_colors">
<div class="benefits__item">
<div class="benefits__preview">
<svg class="icon icon-thumb">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-thumb"></use>
</svg>
</div>
<div class="benefits__title">Доступность</div>
<div class="benefits__content">Учитесь, не выходя из дома. С жизнью в городах, времени для образования остается не много.</div>
</div>
<div class="benefits__item">
<div class="benefits__preview">
<svg class="icon icon-wallet">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-wallet"></use>
</svg>
</div>
<div class="benefits__title">Стоимость</div>
<div class="benefits__content">Онлайн-образование дешевле и эффективнее. Вы сами выбираете сколько платить.</div>
</div>
<div class="benefits__item">
<div class="benefits__preview">
<svg class="icon icon-location">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-location"></use>
</svg>
</div>
<div class="benefits__title">Свобода перемещений</div>
<div class="benefits__content">С онлайн-образованием не нужно тратить свое время на что-то кроме образования.</div>
</div>
<div class="benefits__item">
<div class="benefits__preview">
<svg class="icon icon-searching">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-searching"></use>
</svg>
</div>
<div class="benefits__title">Выбор преподавателя</div>
<div class="benefits__content">Личные аккаунты Инстаграм также доступны, чтобы узнать о творчестве, мыслях и интересах.</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,7 @@
<a
{% if not user.is_authenticated %}
data-popup=".js-popup-auth"
{% endif %}
class="timing__btn btn"
href="{% url 'school-checkout' %}?weekdays={{ school_schedule.weekday }}&add_days=true"
>купить</a>

@ -0,0 +1,21 @@
{% load static %} {% if course_items %}
<div class="section section_courses">
<div class="section__center center">
<div class="text">
<p>Хотите ещё? :)
<br>Для Вас у нас есть дополнительные видео-курсы на самые душещипательные темы.</p>
</div>
<div class="head">
<div class="head__title title title_center">Видео-курсы</div>
</div>
<div class="courses">
<div class="courses__list">
{% include "course/course_items.html" %}
</div>
<div class="courses__load load">
<a class="load__btn btn" href="{% url 'courses' %}">Узнать подробнее</a>
</div>
</div>
</div>
</div>
{% endif %}

@ -0,0 +1,12 @@
{% load static %}
<a class="online" target="_blank" href="https://www.youtube.com/watch?v=PhZ8qQbIej0" style="background-image: url({% static 'img/video-1.jpg' %});">
<div class="online__center center">
<div class="online__type">ПРЯМОЙ ЭФИР</div>
<div class="online__title">В 17.00 (по Мск) </div>
<div class="online__text text">Понедельник, среда, пятница.</div>
<div class="online__action">
<svg class="icon icon-play">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use>
</svg>СМОТРЕТЬ ПРИМЕР ЭФИРА</div>
</div>
</a>

@ -0,0 +1,4 @@
<a
class="timing__btn btn btn_light"
href="{% url 'school:lesson-detail' live_lesson.id %}"
>смотреть урок</a>

@ -0,0 +1,9 @@
<a
{% if not user.is_authenticated %}
data-popup=".js-popup-auth"
{% else %}
data-popup=".js-popup-buy"
{% endif %}
class="casing__btn btn{% if pink %} btn_pink{% endif %}"
href="#"
>продлить</a>

@ -0,0 +1,67 @@
{% load static %}
<div class="main main_default" style="background-image: url({% static 'img/bg-2.jpg' %});">
<div class="main__center center">
<div class="main__title">
<span class="main__bold">Lil School</span> — первая образовательная онлайн-платформа креативного мышления для детей
</div>
<div class="main__subtitle">
Присоединяйтесь в Рисовальный лагерь
</div>
<div class="main__actions">
<a
{% if not is_purchased_future %}
{% if not user.is_authenticated %}
data-popup=".js-popup-auth"
{% else %}
data-popup=".js-popup-buy"
{% endif %}
{% endif %}
class="main__btn btn"
href="#"
>
{% if not is_purchased and not is_purchased_future %}Получить доступ{% endif %}
{% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %}
{% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате{% endif %}
</a>
</div>
<div class="main__school school school_main">
<div class="school__col">
<div class="school__preview">
<svg class="icon icon-online">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-online"></use>
</svg>
</div>
<div class="school__title">Прямой эфир</div>
<div class="school__text">Понедельник, среда, пятница</div>
</div>
<div class="school__col">
<div class="school__preview">
<svg class="icon icon-everyday">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-everyday"></use>
</svg>
</div>
<div class="school__title">В&nbsp;17:00</div>
<div class="school__text">По московскому времени</div>
</div>
<div class="school__col">
<div class="school__preview">
<svg class="icon icon-subjects">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-subjects"></use>
</svg>
</div>
<div class="school__title">12 уроков</div>
<div class="school__text">В разных техниках</div>
</div>
<div class="school__col">
<div class="school__preview">
<svg class="icon icon-view">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-view"></use>
</svg>
</div>
<div class="school__title">Запись эфира</div>
<div class="school__text">Хранится 7 дней</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,69 @@
{% load static %} {% load thumbnail %}
<div class="section" id="schedule">
<div class="section__center center">
{% include 'templates/blocks/messages.html' %}
<div class="casing">
<div class="casing__col">
<div class="casing__subscribe">
{% if is_purchased %}
<div class="casing__msg">Подписка истекает
<span class="bold">{{ subscription_ends }}</span>
</div>
{% include './prolong_btn.html' %}
{% else %}
<div class="casing__msg">Подписка
<span class="bold">истекла</span>
</div>
{% include './prolong_btn.html' with pink=True %}
{% endif %}
</div>
</div>
<div class="casing__col">
{% if not profile %}
<div class="casing__head">
{% if is_previous %}
<div class="casing__title title">Запись уроков</div>
{% else %}
<div class="casing__title title">Новые уроки</div>
{% endif %}
<label class="casing__switcher switcher">
<span class="switcher__wrap">
<a href="{% url 'school:summer-school' %}?is_previous=true" class="switcher__item{% if is_previous %} active{% endif %}">запись уроков</a>
<a href="{% url 'school:summer-school' %}" class="switcher__item{% if not is_previous %} active{% endif %}">новые уроки</a>
</span>
</label>
</div>
{% endif %}
<div class="casing__timing timing js-timing">
<div class="timing__week">
{% if is_previous and not live_lessons_exists %}
Записей уроков пока нет
{% else %}
{% for school_schedule in school_schedules %}
{% if is_previous %}
{% if school_schedule.previous_live_lesson in live_lessons %}
{% include './_schedule_purchased_item.html' with school_schedule=school_schedule live_lesson=school_schedule.previous_live_lesson %}
{% endif %}
{% else %}
{% include './_schedule_purchased_item.html' with school_schedule=school_schedule live_lesson=school_schedule.current_live_lesson %}
{% endif %}
{% endfor %}
{% endif %}
</div>
<div class="timing__week">
{% comment %} previous week schedules {% endcomment %}
</div>
<div class="timing__foot">
<a target="_blank" class="timing__print" href="{% url 'school:school_schedules-print' %}">Распечатать расписание
<span class="bold">чтобы не забыть</span>
<svg class="icon icon-print">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-print"></use>
</svg>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% include './last_courses.html' %}

@ -3,11 +3,12 @@ from django.urls import path, include
from .views import ( from .views import (
LiveLessonsView, LiveLessonEditView, LiveLessonsView, LiveLessonEditView,
LiveLessonsDetailView, SchoolView, LiveLessonsDetailView, SchoolView,
SchoolSchedulesPrintView, SchoolSchedulesPrintView, SummerSchoolView,
) )
urlpatterns = [ urlpatterns = [
path('', SchoolView.as_view(), name='school'), path('', SchoolView.as_view(), name='school'),
path('summer', SummerSchoolView.as_view(), name='summer-school'),
path('schedules/print', SchoolSchedulesPrintView.as_view(), name='school_schedules-print'), path('schedules/print', SchoolSchedulesPrintView.as_view(), name='school_schedules-print'),
path('lessons/', LiveLessonsView.as_view(), name='lessons'), path('lessons/', LiveLessonsView.as_view(), name='lessons'),
path('lessons/create', LiveLessonEditView.as_view(), name='lessons-create'), path('lessons/create', LiveLessonEditView.as_view(), name='lessons-create'),

@ -161,15 +161,92 @@ class SchoolView(TemplateView):
'course_items': Course.objects.filter(status=Course.PUBLISHED)[:6], 'course_items': Course.objects.filter(status=Course.PUBLISHED)[:6],
'is_purchased': school_payment_exists, 'is_purchased': school_payment_exists,
'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'], 'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'],
'school_schedules': SchoolSchedule.objects.annotate( 'school_schedules': SchoolSchedule.objects.all(),
calk=F('weekday') - now().isoweekday(),
weight=(7 + F('calk') % 7) % 7,
).order_by('weight'),
'school_schedules_purchased': school_schedules_purchased, 'school_schedules_purchased': school_schedules_purchased,
'subscription_ends': school_payment.filter(add_days=False).first().date_end if school_payment_exists else None, 'subscription_ends': school_payment.filter(add_days=False).first().date_end if school_payment_exists else None,
}) })
return context return context
class SummerSchoolView(TemplateView):
template_name = 'school/summer_school.html'
def get_context_data(self):
context = super().get_context_data()
is_previous = 'is_previous' in self.request.GET
date_now = now().date()
now_time = now()
try:
school_schedule = SchoolSchedule.objects.get(weekday=now_time.isoweekday())
except SchoolSchedule.DoesNotExist:
online = False
else:
end_at = datetime.combine(now_time.today(), school_schedule.start_at)
online = (
school_schedule.start_at <= now_time.time() and
(end_at + timedelta(hours=2)).time() >= now_time.time() and
school_schedule.current_live_lesson()
)
if self.request.user.is_authenticated:
school_payment = SchoolPayment.objects.filter(
user=self.request.user,
status__in=[
Pingback.PINGBACK_TYPE_REGULAR,
Pingback.PINGBACK_TYPE_GOODWILL,
Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED,
],
date_start__lte=date_now,
date_end__gte=date_now
)
school_payment_exists = school_payment.exists()
school_payment_future = SchoolPayment.objects.filter(
user=self.request.user,
status__in=[
Pingback.PINGBACK_TYPE_REGULAR,
Pingback.PINGBACK_TYPE_GOODWILL,
Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED,
],
date_start__gte=date_now,
date_end__gte=date_now
)
school_payment_exists_future = school_payment_future.exists()
school_purchased_future = school_payment_future.last()
school_schedules_purchased = school_payment.annotate(
joined_weekdays=Func(F('weekdays'), function='unnest',)
).values_list('joined_weekdays', flat=True).distinct()
else:
school_payment_exists = False
school_payment_exists_future = False
school_purchased_future = False
school_schedules_purchased = []
if school_payment_exists and is_previous:
live_lessons = LiveLesson.objects.filter(
date__gte=school_payment.last().date_start,
date__range=[(now_time - timedelta(days=8)).date(), (now_time - timedelta(days=1)).date()],
deactivated_at__isnull=True,
)
live_lessons_exists = live_lessons.exists()
else:
live_lessons = None
live_lessons_exists = False
context.update({
'online': online,
'live_lessons': live_lessons,
'live_lessons_exists': live_lessons_exists,
'is_previous': is_previous,
'course_items': Course.objects.filter(status=Course.PUBLISHED)[:6],
'is_purchased': school_payment_exists,
'is_purchased_future': school_payment_exists_future,
'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'],
'school_schedules': SchoolSchedule.objects.all(),
'school_schedules_purchased': school_schedules_purchased,
'school_purchased_future': school_purchased_future,
'subscription_ends': school_payment.filter(add_days=False).first().date_end if school_payment_exists else None,
})
return context
class SchoolSchedulesPrintView(TemplateView): class SchoolSchedulesPrintView(TemplateView):
template_name = 'school/schedules_print.html' template_name = 'school/schedules_print.html'

@ -44,9 +44,9 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="form__field field{% if form.facebook.errors %} error{% endif %}"> <div class="form__field field{% if form.facebook.errors %} error{% endif %}">
<div class="field__label">FACEBOOK</div> <div class="field__label">Ссылка на портфолио</div>
<div class="field__wrap"> <div class="field__wrap">
<input name='facebook' class="field__input" type="text" placeholder="https://facebook.com/lilcitycompany" value="{% if form.facebook.value %}{{ form.facebook.value }}{% endif %}"> <input name='facebook' class="field__input" type="text" placeholder="https://yoursite.com" value="{% if form.facebook.value %}{{ form.facebook.value }}{% endif %}">
</div> </div>
{% for error in form.facebook.errors %} {% for error in form.facebook.errors %}
<div class="field__error">{{ error }}</div> <div class="field__error">{{ error }}</div>

@ -2,7 +2,9 @@
<div class="section"> <div class="section">
<div class="section__center center"> <div class="section__center center">
<div class="profile"> <div class="profile">
{% if not guest %}
<a class="profile__btn profile__btn_edit btn" href="{% url 'user-edit-profile' user.id %}">Редактировать</a> <a class="profile__btn profile__btn_edit btn" href="{% url 'user-edit-profile' user.id %}">Редактировать</a>
{% endif %}
<div class="profile__ava ava"> <div class="profile__ava ava">
{% thumbnail user.photo "120x120" crop="center" as im %} {% thumbnail user.photo "120x120" crop="center" as im %}
<img class="ava__pic" src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" /> <img class="ava__pic" src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />
@ -59,6 +61,8 @@
</div> </div>
</div> </div>
</div> </div>
{% if not guest %}
<div class="section section_pink-light section_tabs"> <div class="section section_pink-light section_tabs">
<div class="section__center center"> <div class="section__center center">
<div class="tabs js-tabs"> <div class="tabs js-tabs">
@ -75,25 +79,33 @@
</div> </div>
<div class="tabs__container"> <div class="tabs__container">
<div class="tabs__item js-tabs-item"> <div class="tabs__item js-tabs-item">
{% if is_purchased %} {% if is_purchased_future %}
{% include "blocks/schedule_purchased.html" %} <div class="center center_xs">
<div class="done">
<div class="done__title title">Ваша подписка начинается {{school_purchased_future.date_start}}</div>
</div>
</div>
{% else %} {% else %}
<div class="center center_xs"> {% if is_purchased %}
<div class="done"> {% include "blocks/schedule_purchased.html" %}
<div class="done__title title">Вы не подписаны на школу!</div> {% else %}
<div class="done__foot"> <div class="center center_xs">
<a <div class="done">
{% if not user.is_authenticated %} <div class="done__title title">Вы не подписаны на школу!</div>
data-popup=".js-popup-auth" <div class="done__foot">
{% else %} <a
data-popup=".js-popup-buy" {% if not user.is_authenticated %}
{% endif %} data-popup=".js-popup-auth"
href="#" {% else %}
class="done__btn btn btn_md btn_stroke" data-popup=".js-popup-buy"
>Купить подписку</a> {% endif %}
href="#"
class="done__btn btn btn_md btn_stroke"
>Купить подписку</a>
</div>
</div> </div>
</div> </div>
</div> {% endif %}
{% endif %} {% endif %}
</div> </div>
<div class="tabs__item js-tabs-item"> <div class="tabs__item js-tabs-item">
@ -138,4 +150,5 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% endblock content %} {% endblock content %}

@ -43,14 +43,22 @@ def resend_email_verify(request):
return redirect('user-edit-profile', request.user.id) return redirect('user-edit-profile', request.user.id)
@method_decorator(login_required, name='dispatch')
class UserView(DetailView): class UserView(DetailView):
model = User model = User
template_name = 'user/profile.html' template_name = 'user/profile.html'
def get_context_data(self, object): def get_context_data(self, object):
context = super().get_context_data() context = super().get_context_data()
context['simple_user'] = self.request.user.role == User.USER_ROLE if not self.request.user.is_anonymous:
context['simple_user'] = self.request.user.role == User.USER_ROLE
context['guest'] = self.request.user.id != self.object.id and self.request.user.role <= User.USER_ROLE
else:
context['simple_user'] = True
context['guest'] = True
if context['guest'] and self.object.role <= User.USER_ROLE:
raise Http404()
context['published'] = Course.objects.filter( context['published'] = Course.objects.filter(
author=self.object, author=self.object,
) )
@ -85,12 +93,18 @@ class UserView(DetailView):
context['subscription_ends'] = school_payment.last().date_end context['subscription_ends'] = school_payment.last().date_end
context['school_schedules'] = SchoolSchedule.objects.filter( context['school_schedules'] = SchoolSchedule.objects.filter(
weekday__in=school_schedules_purchased if school_payment.exists() else [], weekday__in=school_schedules_purchased if school_payment.exists() else [],
).annotate( ).all()
calk=F('weekday') - now().isoweekday(),
weight=(7 + F('calk') % 7) % 7,
).order_by('weight')
context['all_school_schedules'] = SchoolSchedule.objects.all() context['all_school_schedules'] = SchoolSchedule.objects.all()
school_payment_future = SchoolPayment.objects.filter(
user=self.request.user,
date_start__gte=now(),
date_end__gte=now()
)
context['is_purchased_future'] = school_payment_future.exists()
context['school_purchased_future'] = school_payment_future.last()
return context return context
@ -103,6 +117,10 @@ class SubscribeView(View):
return redirect(refferer) return redirect(refferer)
email = request.POST.get('email', None) email = request.POST.get('email', None)
if email: if email:
if EmailSubscription.objects.filter(email=email).exists():
messages.error(request, 'Вы уже подписаны!')
return redirect(refferer)
email_subscription = EmailSubscription.objects.create( email_subscription = EmailSubscription.objects.create(
email=email, email=email,
) )
@ -110,7 +128,7 @@ class SubscribeView(View):
SubscriptionCategory.objects.filter(auto_add=True) SubscriptionCategory.objects.filter(auto_add=True)
) )
messages.info(request, 'Вы подписаны на новости.') messages.info(request, 'Вы подписаны на новости.')
return redirect(refferer) return redirect('subscribe-success')
else: else:
messages.error(request, 'Введите адрес электронной почты.') messages.error(request, 'Введите адрес электронной почты.')
return redirect(refferer) return redirect(refferer)

@ -13,7 +13,7 @@
</svg> </svg>
</div> </div>
<div class="school__title">Прямой эфир</div> <div class="school__title">Прямой эфир</div>
<div class="school__text">С понедельника по&nbsp;пятницу кроме выходных</div> <div class="school__text">Понедельник, среда, пятница</div>
</div> </div>
<div class="school__col"> <div class="school__col">
<div class="school__preview"> <div class="school__preview">
@ -21,7 +21,7 @@
<use xlink:href="{% static 'img/sprite.svg' %}#icon-everyday"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-everyday"></use>
</svg> </svg>
</div> </div>
<div class="school__title">Ежедневно в 17:00</div> <div class="school__title">В 17:00</div>
<div class="school__text">По московскому времени</div> <div class="school__text">По московскому времени</div>
</div> </div>
<div class="school__col"> <div class="school__col">
@ -30,8 +30,8 @@
<use xlink:href="{% static 'img/sprite.svg' %}#icon-subjects"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-subjects"></use>
</svg> </svg>
</div> </div>
<div class="school__title">7 предметов</div> <div class="school__title">12 уроков</div>
<div class="school__text">на каждый день</div> <div class="school__text">В разных техниках</div>
</div> </div>
<div class="school__col"> <div class="school__col">
<div class="school__preview"> <div class="school__preview">
@ -39,32 +39,26 @@
<use xlink:href="{% static 'img/sprite.svg' %}#icon-view"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-view"></use>
</svg> </svg>
</div> </div>
<div class="school__title">Посмотреть</div> <div class="school__title">Запись эфира</div>
<div class="school__text">пропущенные дни</div> <div class="school__text">Хранится 7 дней</div>
</div> </div>
</div> </div>
<div class="letsgo"> <div class="letsgo">
{% if is_purchased %}
<a <a
{% if not user.is_authenticated %} {% if not is_purchased_future %}
data-popup=".js-popup-auth" {% if not user.is_authenticated %}
{% else %} data-popup=".js-popup-auth"
data-popup=".js-popup-buy" {% else %}
{% endif %} data-popup=".js-popup-buy"
class="main__btn btn" {% endif %}
href="#" {% endif %}
>ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате</a> class="main__btn btn"
{% else %} href="#"
<a >
{% if not user.is_authenticated %} {% if not is_purchased and not is_purchased_future %}купить доступ от {{ min_school_price }} руб./месяц{% endif %}
data-popup=".js-popup-auth" {% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %}
{% else %} {% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате{% endif %}
data-popup=".js-popup-buy" </a>
{% endif %}
class="main__btn btn"
href="#"
>купить доступ от {{ min_school_price }} руб./месяц</a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

@ -10,7 +10,7 @@
</svg> </svg>
</div> </div>
<div class="benefits__title">Доступность</div> <div class="benefits__title">Доступность</div>
<div class="benefits__content">Учитесь, не выходя из&nbsp;дома</div> <div class="benefits__content">Учитесь, не выходя из дома. С жизнью в городах, времени для образования остается не много.</div>
</div> </div>
<div class="benefits__item"> <div class="benefits__item">
<div class="benefits__preview"> <div class="benefits__preview">
@ -19,7 +19,7 @@
</svg> </svg>
</div> </div>
<div class="benefits__title">Стоимость</div> <div class="benefits__title">Стоимость</div>
<div class="benefits__content">Онлайн-образование дешевле</div> <div class="benefits__content">Онлайн-образование дешевле и эффективнее. Вы сами выбираете сколько платить.</div>
</div> </div>
<div class="benefits__item"> <div class="benefits__item">
<div class="benefits__preview"> <div class="benefits__preview">
@ -28,7 +28,7 @@
</svg> </svg>
</div> </div>
<div class="benefits__title">Свобода перемещений</div> <div class="benefits__title">Свобода перемещений</div>
<div class="benefits__content">Доступность до проф. уроков без пробок, сборов и&nbsp;лишней потери времени</div> <div class="benefits__content">С онлайн-образованием не нужно тратить свое время на что-то кроме образования.</div>
</div> </div>
<div class="benefits__item"> <div class="benefits__item">
<div class="benefits__preview"> <div class="benefits__preview">
@ -36,8 +36,8 @@
<use xlink:href="{% static 'img/sprite.svg' %}#icon-searching"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-searching"></use>
</svg> </svg>
</div> </div>
<div class="benefits__title">Выбор преподавателя </div> <div class="benefits__title">Выбор преподавателя</div>
<div class="benefits__content">Описание элемента</div> <div class="benefits__content">Личные аккаунты Инстаграм также доступны, чтобы узнать о творчестве, мыслях и интересах.</div>
</div> </div>
</div> </div>
</div> </div>

@ -1,37 +1,37 @@
{% load static %} {% load static %}
<div class="section section_arts"> <!--<div class="section section_arts">-->
<div class="section__center"> <!--<div class="section__center">-->
<div class="arts"> <!--<div class="arts">-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art01.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art01.png' %});">-->
<div class="arts__title">Персонаж</div> <!--<div class="arts__title">Персонаж</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art02.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art02.png' %});">-->
<div class="arts__title">Развитие креативного мышления</div> <!--<div class="arts__title">Развитие креативного мышления</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art03.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art03.png' %});">-->
<div class="arts__title">Акварельная живопись</div> <!--<div class="arts__title">Акварельная живопись</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art04.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art04.png' %});">-->
<div class="arts__title">Пластилиновая живопись</div> <!--<div class="arts__title">Пластилиновая живопись</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art05.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art05.png' %});">-->
<div class="arts__title">История искусств</div> <!--<div class="arts__title">История искусств</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
<div class="arts__col"> <!--<div class="arts__col">-->
<div class="arts__item" style="background-image: url({% static 'img/art06.png' %});"> <!--<div class="arts__item" style="background-image: url({% static 'img/art06.png' %});">-->
<div class="arts__title">Коллаж</div> <!--<div class="arts__title">Коллаж</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
</div> <!--</div>-->
</div> <!--</div>-->

@ -4,7 +4,7 @@
<div class="footer__row footer__row_first"> <div class="footer__row footer__row_first">
<div class="footer__col footer__col_md"> <div class="footer__col footer__col_md">
<a class="footer__logo logo" href="/"></a> <a class="footer__logo logo" href="/"></a>
<div class="footer__content">Первая онлайн-школа креативного мышления Lil City School</div> <div class="footer__content">Первая онлайн-школа креативного мышления Lil School</div>
</div> </div>
<div class="footer__col"> <div class="footer__col">
<div class="footer__title">КОМПАНИЯ</div> <div class="footer__title">КОМПАНИЯ</div>
@ -19,6 +19,7 @@
<div class="footer__col"> <div class="footer__col">
<div class="footer__title">Программы</div> <div class="footer__title">Программы</div>
<nav class="footer__nav"> <nav class="footer__nav">
<a class="footer__link" href="{% url 'school:summer-school' %}">Лагерь</a>
<a class="footer__link" href="{% url 'school:school' %}">Онлайн-школа</a> <a class="footer__link" href="{% url 'school:school' %}">Онлайн-школа</a>
<a class="footer__link" href="{% url 'courses' %}">Онлайн-курсы</a> <a class="footer__link" href="{% url 'courses' %}">Онлайн-курсы</a>
<a class="footer__link" href="{% url 'author_request' %}">Стать автором</a> <a class="footer__link" href="{% url 'author_request' %}">Стать автором</a>
@ -42,12 +43,12 @@
ПОДПИСАТЬСЯ ПОДПИСАТЬСЯ
</a> </a>
<div class="subscribe__content"> <div class="subscribe__content">
Подпишитесь на наш канал в Telegram, чтобы получать от нас важные новости о школе, новых курсах и бонусах от Lil City. Подпишитесь на наш канал в Telegram чтобы получать от нас важные новости о школе, новых курсах и бонусах от Lil City.
</div> </div>
</div> </div>
</div> </div>
<div class="footer__row footer__row_second"> <div class="footer__row footer__row_second">
<div class="footer__col footer__col_md"> <div class="footer__col footer__col_md" style="flex: 0 0 23%;">
<div class="footer__socials socials"> <div class="footer__socials socials">
<a target="_blank" class="socials__item" href="{{ config.SERVICE_INSTAGRAM_URL }}"> <a target="_blank" class="socials__item" href="{{ config.SERVICE_INSTAGRAM_URL }}">
<svg class="icon icon-instagram"> <svg class="icon icon-instagram">
@ -71,7 +72,7 @@
</a> </a>
</div> </div>
</div> </div>
<div class="footer__col footer__col_lg"> <div class="footer__col footer__col_lg" style="flex: 0 0 77%;">
<div class="footer__group"> <div class="footer__group">
<div class="footer__copyright">{% now 'Y' %} © Lil City, UAB.</div> <div class="footer__copyright">{% now 'Y' %} © Lil City, UAB.</div>
<div class="footer__links"> <div class="footer__links">

@ -5,7 +5,7 @@
<div class="title title_center">Галерея</div> <div class="title title_center">Галерея</div>
</a> </a>
<div class="text"> <div class="text">
<p>Тысячи шедевров уже созданы благодаря Lil City School. Более 10000 работ можно <p>Тысячи шедевров уже созданы благодаря Lil School. Более 10000 работ можно
<a target="_blank" href='{{ config.SERVICE_INSTAGRAM_URL }}'>увидеть</a> в Инстаграм</p> <a target="_blank" href='{{ config.SERVICE_INSTAGRAM_URL }}'>увидеть</a> в Инстаграм</p>
<img class="text__curve text__curve_three" src="{% static 'img/curve-3.svg' %}"> <img class="text__curve text__curve_three" src="{% static 'img/curve-3.svg' %}">
</div> </div>

@ -25,10 +25,17 @@
</form> </form>
</div> </div>
<nav class="header__nav"> <nav class="header__nav">
<div class="header__group">
<a class="header__section {% active_link 'school:summer-school' %}" href="{% url 'school:summer-school' %}">
ЛАГЕРЬ {% if online or livelesson.is_online %}
<div class="header__dot"></div>
{% endif %}
</a>
</div>
<div class="header__group"> <div class="header__group">
<a class="header__section {% active_link 'school:school' %}" href="{% url 'school:school' %}"> <a class="header__section {% active_link 'school:school' %}" href="{% url 'school:school' %}">
ОНЛАЙН-ШКОЛА {% if online or livelesson.is_online %} ОНЛАЙН-ШКОЛА {% if online or livelesson.is_online %}
<div class="header__dot"></div> <!--<div class="header__dot"></div>-->
{% endif %} {% endif %}
</a> </a>
</div> </div>

@ -2,8 +2,8 @@
<a class="online" target="_blank" href="https://www.youtube.com/watch?v=PhZ8qQbIej0" style="background-image: url({% static 'img/video-1.jpg' %});"> <a class="online" target="_blank" href="https://www.youtube.com/watch?v=PhZ8qQbIej0" style="background-image: url({% static 'img/video-1.jpg' %});">
<div class="online__center center"> <div class="online__center center">
<div class="online__type">ПРЯМОЙ ЭФИР</div> <div class="online__type">ПРЯМОЙ ЭФИР</div>
<div class="online__title">Каждый день в 17.00 (по Мск) </div> <div class="online__title">В 17.00 (по Мск) </div>
<div class="online__text text">Кроме выходных. Запись эфира доступна в&nbsp;течение 24-х&nbsp;часов.</div> <div class="online__text text">Понедельник, среда, пятница.</div>
<div class="online__action"> <div class="online__action">
<svg class="icon icon-play"> <svg class="icon icon-play">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use>

@ -0,0 +1,36 @@
{% load static %}
<div class="popup js-popup-subscribe">
<div class="popup__wrap js-popup-wrap">
<button class="popup__close js-popup-close">
<svg class="icon icon-close">
<use xlink:href={% static "img/sprite.svg" %}#icon-close></use>
</svg>
</button>
<div class="popup__body">
<div class="auth js-auth" style="padding:20px 20px 25px;">
<div class="auth__login js-auth-login">
<div class="auth__body">
<form id="learner-auth-form" method="post" action="{% url 'subscribe' %}">
{% csrf_token %}
<div class="auth__tab js-auth-tab" style="display: block;">
<div class="auth__enter js-auth-enter">
<div id="learner-auth-field__username" class="auth__field field learner-auth-form__field">
<div class="field__label">ПОЧТА</div>
<div class="field__wrap"><input id="learner-auth-form__email" class="field__input" type="email"
name="email"
placeholder="name@website.com" tabindex="1"></div>
<div id="learner-auth-field-error__username"
class="field__error learner-auth-form__field-error"></div>
</div>
<div class="auth__foot">
<button id="learner-auth__button" class="auth__btn btn btn_light" tabindex="3">Подписаться</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

@ -9,30 +9,29 @@
> >
<div class="main__center center"> <div class="main__center center">
<div class="main__title"> <div class="main__title">
<span class="main__bold">Lil City School</span> — первая образовательная онлайн-платформа креативного мышления для детей</div> <span class="main__bold">Lil School</span> — первая образовательная онлайн-платформа креативного мышления для детей
</div>
<div class="main__subtitle">
Присоединяйтесь в Рисовальный лагерь
</div>
<div class="main__actions"> <div class="main__actions">
{% if is_purchased %}
<a
{% if not user.is_authenticated %}
data-popup=".js-popup-auth"
{% else %}
data-popup=".js-popup-buy"
{% endif %}
class="main__btn btn"
href="#"
>ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате</a>
{% else %}
<a <a
{% if not user.is_authenticated %} {% if not is_purchased_future %}
data-popup=".js-popup-auth" {% if not user.is_authenticated %}
{% else %} data-popup=".js-popup-auth"
data-popup=".js-popup-buy" {% else %}
data-popup=".js-popup-buy"
{% endif %}
{% endif %} {% endif %}
class="main__btn btn" class="main__btn btn"
href="#" href="#"
>купить доступ от {{ min_school_price }} руб./месяц</a> >
{% endif %} {% if not is_purchased and not is_purchased_future %}Получить доступ{% endif %}
<a class="main__btn btn btn_white" href="{% url 'school:school' %}">подробнее</a> {% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %}
{% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате{% endif %}
</a>
<a class="main__btn btn btn_white" href="{% url 'school:summer-school' %}">О лагере</a>
</div> </div>
</div> </div>
</div> </div>

@ -4,7 +4,7 @@
<div class="section__center center center_md"> <div class="section__center center center_md">
<div class="title title_center">Преподаватели</div> <div class="title title_center">Преподаватели</div>
<div class="text"> <div class="text">
<p>Преподаватели Lil City School имеют большой опыт, поэтому с первых минут детям будет интересно с нами.</p> <p>Преподаватели Lil School имеют большой опыт, поэтому с первых минут детям будет интересно с нами.</p>
<img class="text__curve text__curve_three" src="{% static 'img/curve-3.svg' %}"> <img class="text__curve text__curve_three" src="{% static 'img/curve-3.svg' %}">
</div> </div>
<div class="teachers"> <div class="teachers">
@ -16,10 +16,11 @@
<img class="ava__pic" src="{% static 'img/user_default.jpg' %}"> {% endif %} <img class="ava__pic" src="{% static 'img/user_default.jpg' %}"> {% endif %}
</div> </div>
<div class="teachers__wrap"> <div class="teachers__wrap">
<div class="teachers__title">{{ teacher.get_full_name }}{% if teacher.instagram_hashtag %}, <div class="teachers__title">
<a href='https://www.instagram.com/explore/tags/{{ teacher.instagram_hashtag }}/' target="_blank"> <a href="{% url 'user' teacher.id %}">{{ teacher.get_full_name }}</a>{% if teacher.instagram_hashtag %},
#{{ teacher.instagram_hashtag }} <a href='https://www.instagram.com/explore/tags/{{ teacher.instagram_hashtag }}/' target="_blank">
</a> {{ teacher.instagram_hashtag }}
</a>
{% endif %} {% endif %}
</div> </div>
<div class="teachers__social"> <div class="teachers__social">
@ -64,6 +65,6 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="text text_mb0">Если хотите к нам в команду, то отправьте нам заявку</div> <div class="text text_mb0">Если хотите к нам в команду, то <a href="{% url 'author_request' %}">отправьте</a> нам заявку</div>
</div> </div>
</div> </div>

@ -65,6 +65,7 @@
{% include "templates/blocks/popup_auth.html" %} {% include "templates/blocks/popup_auth.html" %}
{% include "templates/blocks/popup_buy.html" %} {% include "templates/blocks/popup_buy.html" %}
{% include "templates/blocks/popup_course_lock.html" %} {% include "templates/blocks/popup_course_lock.html" %}
{% include "templates/blocks/popup_subscribe.html" %}
</div> </div>
<script type="text/javascript" src={% static "app.js" %}></script> <script type="text/javascript" src={% static "app.js" %}></script>
<script> <script>

@ -0,0 +1,12 @@
{% extends "templates/lilcity/index.html" %} {% load static %} {% block content %}
<div class="section">
<div class="section__center center center_xs">
<div class="done">
<div class="done__title title">Вы успешно оставили заявку на школу!</div>
<div class="done__foot">
<a class="done__btn btn btn_md btn_stroke" href="/">ПЕРЕЙТИ К ГЛАВНОЙ</a>
</div>
</div>
</div>
</div>
{% endblock content %}

@ -27,7 +27,7 @@
<p style="font-size: 12px; line-height: 15px;">You acknowledge and agree that Lil City, UAB shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof. Lil City, UAB does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services.</p> <p style="font-size: 12px; line-height: 15px;">You acknowledge and agree that Lil City, UAB shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof. Lil City, UAB does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services.</p>
<p style="font-size: 12px; line-height: 15px;">Third-Party Services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to such third parties' terms and conditions.</p> <p style="font-size: 12px; line-height: 15px;">Third-Party Services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to such third parties' terms and conditions.</p>
<p style="font-size: 12px; line-height: 15px;">Privacy Policy</p> <p style="font-size: 12px; line-height: 15px;">Privacy Policy</p>
<p style="font-size: 12px; line-height: 15px;">Lil City, UAB has the right to use any materials/images created by the user using the Company's products (Lil World, Lil City School and others) to promote the services/products of the Company without informing the author of the artwork.</p> <p style="font-size: 12px; line-height: 15px;">Lil City, UAB has the right to use any materials/images created by the user using the Company's products (Lil World, Lil School and others) to promote the services/products of the Company without informing the author of the artwork.</p>
<p style="font-size: 12px; line-height: 15px;">Lil City, UAB collects, stores, maintains, and shares information about you in accordance with its Privacy Policy, which is available at http://privacy.lil.city. By accepting this Agreement, you acknowledge that you hereby agree and consent to the terms and conditions of our Privacy Policy.</p> <p style="font-size: 12px; line-height: 15px;">Lil City, UAB collects, stores, maintains, and shares information about you in accordance with its Privacy Policy, which is available at http://privacy.lil.city. By accepting this Agreement, you acknowledge that you hereby agree and consent to the terms and conditions of our Privacy Policy.</p>
<p style="font-size: 13px; line-height: 17px; padding-top: 24px; font-weight: bold;">Term and Termination</p> <p style="font-size: 13px; line-height: 17px; padding-top: 24px; font-weight: bold;">Term and Termination</p>
<p style="font-size: 12px; line-height: 15px;">This Agreement shall remain in effect until terminated by you or Lil City, UAB.</p> <p style="font-size: 12px; line-height: 15px;">This Agreement shall remain in effect until terminated by you or Lil City, UAB.</p>
@ -71,7 +71,7 @@
<p style="font-size: 12px; line-height: 15px;">Обновления к применению</p> <p style="font-size: 12px; line-height: 15px;">Обновления к применению</p>
<p style="font-size: 12px; line-height: 15px;">Lil City, UAB может время от времени вносить улучшения или усовершенствования в возможности / функциональность Продуктов, которые может включать в себя патчи, исправления ошибок, обновления, обновления и другие модификации ( "Обновление").</p> <p style="font-size: 12px; line-height: 15px;">Lil City, UAB может время от времени вносить улучшения или усовершенствования в возможности / функциональность Продуктов, которые может включать в себя патчи, исправления ошибок, обновления, обновления и другие модификации ( "Обновление").</p>
<p style="font-size: 12px; line-height: 15px;">Обновления могут изменять или удалять определенные функции и / или функциональные возможности применения. Вы согласны с тем, что Lil City, UAB не имеет никаких обязательств (I), предоставлять какие-либо обновления, или (II) продолжать предоставлять или включить какие-либо особые характеристики и / или функциональные возможности применения к вам.</p> <p style="font-size: 12px; line-height: 15px;">Обновления могут изменять или удалять определенные функции и / или функциональные возможности применения. Вы согласны с тем, что Lil City, UAB не имеет никаких обязательств (I), предоставлять какие-либо обновления, или (II) продолжать предоставлять или включить какие-либо особые характеристики и / или функциональные возможности применения к вам.</p>
<p style="font-size: 12px; line-height: 15px;">Lil City, UAB имеет право использовать любые материалы/изображения созданные пользователем при помощи или благодаря продуктам Компании (Lil World, Lil City School и других) для рекламы услуг/продуктов Компании без предупреждения пользователя/автора произведения.</p> <p style="font-size: 12px; line-height: 15px;">Lil City, UAB имеет право использовать любые материалы/изображения созданные пользователем при помощи или благодаря продуктам Компании (Lil World, Lil School и других) для рекламы услуг/продуктов Компании без предупреждения пользователя/автора произведения.</p>
<p style="font-size: 12px; line-height: 15px;">Вы также соглашаетесь с тем, что все обновления будут (я) считается, являются неотъемлемой частью Заявки, и (II) в соответствии с условиями настоящего Соглашения.</p> <p style="font-size: 12px; line-height: 15px;">Вы также соглашаетесь с тем, что все обновления будут (я) считается, являются неотъемлемой частью Заявки, и (II) в соответствии с условиями настоящего Соглашения.</p>
<p style="font-size: 13px; line-height: 17px; padding-top: 24px; font-weight: bold;">Услуги сторонних организаций</p> <p style="font-size: 13px; line-height: 17px; padding-top: 24px; font-weight: bold;">Услуги сторонних организаций</p>
<p style="font-size: 12px; line-height: 15px;">Приложение может отображать, включать в себя или предоставлять контент сторонних производителей (в том числе данные, информацию, приложения и другие продукты услуг) или предоставлять ссылки на сторонние веб-сайты или услуги ( "Услуги сторонних организаций").</p> <p style="font-size: 12px; line-height: 15px;">Приложение может отображать, включать в себя или предоставлять контент сторонних производителей (в том числе данные, информацию, приложения и другие продукты услуг) или предоставлять ссылки на сторонние веб-сайты или услуги ( "Услуги сторонних организаций").</p>

@ -73,6 +73,7 @@ urlpatterns = [
path('user/<int:pk>/payments', PaymentHistoryView.as_view(), name='user-edit-payments'), path('user/<int:pk>/payments', PaymentHistoryView.as_view(), name='user-edit-payments'),
path('user/resend-email-verify', resend_email_verify, name='resend-email-verify'), path('user/resend-email-verify', resend_email_verify, name='resend-email-verify'),
path('subscribe', SubscribeView.as_view(), name='subscribe'), path('subscribe', SubscribeView.as_view(), name='subscribe'),
path('subscribe/success', TemplateView.as_view(template_name='templates/lilcity/subscribe_success.html'), name='subscribe-success'),
path('privacy', TemplateView.as_view(template_name='templates/lilcity/privacy_policy.html'), name='privacy'), path('privacy', TemplateView.as_view(template_name='templates/lilcity/privacy_policy.html'), name='privacy'),
path('terms', TemplateView.as_view(template_name='templates/lilcity/terms.html'), name='terms'), path('terms', TemplateView.as_view(template_name='templates/lilcity/terms.html'), name='terms'),
path('refund-policy', TemplateView.as_view(template_name='templates/lilcity/refund_policy.html'), name='refund_policy'), path('refund-policy', TemplateView.as_view(template_name='templates/lilcity/refund_policy.html'), name='refund_policy'),

@ -44,8 +44,20 @@ class IndexView(TemplateView):
school_payment_exists = school_payment.exists() school_payment_exists = school_payment.exists()
school_schedules_purchased = school_payment.values_list('weekdays', flat=True) school_schedules_purchased = school_payment.values_list('weekdays', flat=True)
school_schedules_purchased = school_schedules_purchased[0] if school_schedules_purchased else [] school_schedules_purchased = school_schedules_purchased[0] if school_schedules_purchased else []
school_payment_future = SchoolPayment.objects.filter(
user=self.request.user,
date_start__gte=date_now,
date_end__gte=date_now
)
school_payment_exists_future = school_payment_future.exists()
school_purchased_future = school_payment_future.last()
else: else:
school_payment_exists = False school_payment_exists = False
school_payment_exists_future = False
school_purchased_future = False
school_schedules_purchased = [] school_schedules_purchased = []
context.update({ context.update({
@ -58,6 +70,10 @@ class IndexView(TemplateView):
'teachers': User.objects.filter(role=User.TEACHER_ROLE, show_in_mainpage=True), 'teachers': User.objects.filter(role=User.TEACHER_ROLE, show_in_mainpage=True),
'subscription_ends': school_payment.filter(add_days=False).first().date_end if school_payment_exists else None, 'subscription_ends': school_payment.filter(add_days=False).first().date_end if school_payment_exists else None,
'subscription_ends_humanize': school_payment.filter(add_days=False).first().date_end_humanize if school_payment_exists else None, 'subscription_ends_humanize': school_payment.filter(add_days=False).first().date_end_humanize if school_payment_exists else None,
'school_purchased_future': school_purchased_future,
'is_purchased_future': school_payment_exists_future,
}) })
return context return context

@ -948,10 +948,12 @@
console.log('data', i, now.getDay(), weekday, now, moment(now).format("D MMM")); console.log('data', i, now.getDay(), weekday, now, moment(now).format("D MMM"));
options.push({ if(schedule[weekday]) {
title: `${schedule[weekday]} (${this.weekdays[weekday]}, ${moment(now).format("D MMM")})`, options.push({
value: moment(now).format('YYYY-MM-DD') title: `${schedule[weekday]} (${this.weekdays[weekday]}, ${moment(now).format("D MMM")})`,
}); value: moment(now).format('YYYY-MM-DD')
});
}
} }
console.log('options',options); console.log('options',options);

@ -22,7 +22,7 @@
</a> </a>
</td> </td>
<td style="padding:30px 50px 30px 10px;vertical-align:middle;text-align:right"> <td style="padding:30px 50px 30px 10px;vertical-align:middle;text-align:right">
<div style="display:inline-block;width:220px;font-size:18px;line-height:1.22">Первая онлайн-школа креативного мышления Lil City School</div> <div style="display:inline-block;width:220px;font-size:18px;line-height:1.22">Первая онлайн-школа креативного мышления Lil School</div>
</td> </td>
</tr> </tr>
</tbody> </tbody>

@ -741,7 +741,7 @@ a.btn
&_default &__center &_default &__center
margin-bottom: 0 margin-bottom: 0
&_default &__title &_default &__title
margin-bottom: 55px margin-bottom: 25px
+f +f
font-size: 40px font-size: 40px
+t +t
@ -751,6 +751,16 @@ a.btn
+m +m
margin-bottom: 30px margin-bottom: 30px
font-size: 20px font-size: 20px
&__subtitle
margin-bottom: 25px
+f
font-size: 20px
+t
margin-bottom: 40px
font-size: 20px
+m
margin-bottom: 30px
font-size: 15px
a[name] a[name]
.title .title
@ -946,7 +956,7 @@ a[name]
+t +t
padding: 80px 0 40px padding: 80px 0 40px
&_video &_video
padding: 0 0 70px padding: 70px 0 70px
.ava .ava
display: block display: block

@ -3,7 +3,7 @@ footer.footer
.footer__row.footer__row_first .footer__row.footer__row_first
.footer__col.footer__col_md .footer__col.footer__col_md
a.footer__logo.logo(href='#') a.footer__logo.logo(href='#')
.footer__content Первая онлайн-школа креативного мышления Lil City School .footer__content Первая онлайн-школа креативного мышления Lil School
.footer__col .footer__col
.footer__title КОМПАНИЯ .footer__title КОМПАНИЯ
nav.footer__nav nav.footer__nav

Loading…
Cancel
Save