Merge remote-tracking branch 'origin/dev' into dev

remotes/origin/hasaccess
Vitaly Baev 8 years ago
commit bf8aeec8eb
  1. 18
      apps/course/migrations/0005_course_from_author.py
  2. 1
      apps/course/models.py
  3. 12
      apps/course/templates/course/_items.html
  4. 270
      apps/course/templates/course/course.html
  5. 8
      apps/course/views.py
  6. 3
      project/urls.py

@ -0,0 +1,18 @@
# Generated by Django 2.0.1 on 2018-01-29 09:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0004_auto_20180128_1311'),
]
operations = [
migrations.AddField(
model_name='course',
name='from_author',
field=models.TextField(default='', verbose_name='От автора'),
),
]

@ -24,6 +24,7 @@ class Course(models.Model):
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
title = models.CharField("Название курса", max_length=100) title = models.CharField("Название курса", max_length=100)
short_description = models.TextField("Краткое описание курса") short_description = models.TextField("Краткое описание курса")
from_author = models.TextField("От автора", default='')
cover = models.ImageField("Фон курса", upload_to='courses') cover = models.ImageField("Фон курса", upload_to='courses')
price = models.DecimalField("Цена курса", help_text="Если цены нету, то курс бесплатный", max_digits=10, decimal_places=2, null=True, blank=True) price = models.DecimalField("Цена курса", help_text="Если цены нету, то курс бесплатный", max_digits=10, decimal_places=2, null=True, blank=True)
is_infinite = models.BooleanField(default=False) is_infinite = models.BooleanField(default=False)

@ -1,6 +1,6 @@
{% load static %} {% load static %}
<div class="courses__item" data-course data-course-id={{ course.id }} data-likes-count={{ course.likes.count }} {% if course.is_deferred_start %}data-future-course data-future-course-time={{ course.deferred_start_at.timestamp }}{% endif %}> <div class="courses__item" data-course data-course-id={{ course.id }} data-likes-count={{ course.likes.count }} {% if course.is_deferred_start %}data-future-course data-future-course-time={{ course.deferred_start_at.timestamp }}{% endif %}>
<a class="courses__preview" href="#"> <a class="courses__preview" href="{% url 'course' course.id %}">
<img class="courses__pic" src="{{ course.cover.url }}" /> <img class="courses__pic" src="{{ course.cover.url }}" />
<div class="courses__view">Подробнее</div> <div class="courses__view">Подробнее</div>
{% if course.is_featured %} {% if course.is_featured %}
@ -24,25 +24,25 @@
<div class="courses__user user"> <div class="courses__user user">
{% if course.author.photo %} {% if course.author.photo %}
<div class="user__ava ava"> <div class="user__ava ava">
<img class="ava__pic" src={{ course.author.photo.url }}/> <img class="ava__pic" src="{{ course.author.photo.url }}"/>
</div> </div>
{% else %} {% else %}
<div class="user__ava ava"> <div class="user__ava ava">
<img class="ava__pic" src={% static "img/user.jpg" %}/> <img class="ava__pic" src="{% static 'img/user.jpg' %}"/>
</div> </div>
{% endif %} {% endif %}
<div class="user__info"> <div class="user__info">
<div class="user__name">{{ course.author.first_name }} {{ course.author.last_name }}</div> <div class="user__name">{{ course.author.get_full_name }}</div>
<div class="user__meta"> <div class="user__meta">
<div class="user__date">{{ course.created_at_humanize }}</div> <div class="user__date">{{ course.created_at_humanize }}</div>
<a class="user__likes likes" data-course-likes data-course-likes-count="{{ course.likes.count }}" data-course-id="{{ course.id }}" href="#"> <a class="user__likes likes" data-course-likes data-course-likes-count="{{ course.likes.count }}" data-course-id="{{ course.id }}" href="#">
<div class="likes__counter">{{ course.likes.count }}</div> <div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon"> <div class="likes__icon">
<svg class="icon icon-like"> <svg class="icon icon-like">
<use xlink:href="{% get_static_prefix %}img/sprite.svg#icon-like-bold"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-like"></use>
</svg> </svg>
<svg class="icon icon-like-fill"> <svg class="icon icon-like-fill">
<use xlink:href="{% get_static_prefix %}img/sprite.svg#icon-like-fill-bold"></use> <use xlink:href="{% static 'img/sprite.svg' %}#icon-like-fill"></use>
</svg> </svg>
</div> </div>
</a> </a>

@ -0,0 +1,270 @@
{% extends "templates/lilcity/index.html" %}
{% load static %}
{% block content %}
<div class="section section_border">
<div class="section__center center center_sm">
<div class="go">
<a class="go__item" href="#">
<div class="go__arrow"><svg class="icon icon-arrow-left"><use xlink:href="{% static 'img/sprite.svg' %}#icon-arrow-left"></use></svg></div>
<div class="go__title">Вернуться</div>
</a><button class="go__btn btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button></div>
<div class="course" data-course data-course-id={{ course.id }} data-likes-count={{ course.likes.count }} {% if course.is_deferred_start %}data-future-course data-future-course-time={{ course.deferred_start_at.timestamp }}{% endif %}>
<div class="course__head">
<div class="course__theme theme theme_green">{{ course.category.title | upper }}</div>
<a class="course__likes likes" href="#">
<div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon"><svg class="icon icon-like-bold"><use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use></svg><svg class="icon icon-like-fill-bold"><use xlink:href="img/sprite.svg#icon-like-fill-bold"></use></svg></div>
</a>
</div>
<div class="course__title title">{{ course.title }}</div>
<div class="course__content">{{ course.short_description }}</div>
<div class="course__user user">
{% if course.author.photo %}
<div class="user__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
{% else %}
<div class="user__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
{% endif %}
<div class="user__info">
<div class="user__name">{{ course.author.get_full_name }}</div>
<div class="user__meta">
<div class="user__date">{{ course.created_at_humanize }}</div>
</div>
</div>
</div>
<div class="course__metas">
<div class="course__meta meta">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-time"><use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use></svg></div>
<div class="meta__title">12 часов</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-date"><use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use></svg></div>
<div class="meta__title">15 ноября</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-money"><use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use></svg></div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}$</div>
</div>
</div>
<div class="course__meta meta">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-showcase"><use xlink:href="{% static 'img/sprite.svg' %}#icon-showcase"></use></svg></div>
<div class="meta__title">5 уроков</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-video"><use xlink:href="{% static 'img/sprite.svg' %}#icon-video"></use></svg></div>
<div class="meta__title">12 видео</div>
</div>
</div>
</div>
<div class="course__actions"><button class="course__action btn btn_lg btn_stroke">Описание курса</button><button class="course__action btn btn_lg btn_gray">УРОКИ<svg class="icon icon-lock"><use xlink:href="{% static 'img/sprite.svg' %}#icon-lock"></use></svg></button></div><a class="course__video video"
href="#"><img class="video__pic" src="{% static 'img/video-1.jpg' %}"><svg class="icon icon-play"><use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use></svg></a>
<div class="course__share share share_sm">
<div class="share__title">Поделиться курсом</div>
<div class="share__list"><a class="share__item" href="#"><svg class="icon icon-share-facebook"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-twitter"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use></svg></a>
<a
class="share__item" href="#"><svg class="icon icon-share-google"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-pinterest"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use></svg></a></div>
</div>
</div>
{% if course.from_author %}
<div class="author">
<div class="author__title title">От автора</div>
<div class="author__row">
{% if course.author.photo %}
<div class="author__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
{% else %}
<div class="author__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
{% endif %}
<div class="author__wrap">
<div class="author__hi">Привет всем!</div>
<div class="author__content">
{{ course.from_author }}
</div><a class="author__name" href="#">{{ course.author.get_full_name }}</a></div>
</div>
</div>
</div>
{% endif %}
</div>
<div class="section">
<div class="section__center center center_sm">
<div class="lessons">
<div class="lessons__title title">Содержание курса</div>
<div class="lessons__list">
<div class="lessons__item">
<div class="lessons__subtitle subtitle">1 УРОК</div>
<div class="lessons__row">
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">Выбираем сюжет, с которым мы будем работать на курсе и главного героя вашей истории. С этим героем мы будем работать на протяжении всего курса.</div>
</div>
</div>
<div class="lessons__item">
<div class="lessons__subtitle subtitle">2 УРОК</div>
<div class="lessons__row">
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">
<p>Выделяем основные черты внешности и характера вашего персонажа. Вам нужно будет ответить на несколько ключевых вопросов:</p><br>
<p>– Кто он и как он выглядит?</p>
<p>– Где и в какое время он живет?</p>
<p>– Какой его характерный признак?</p>
</div>
</div>
</div>
<div class="lessons__item">
<div class="lessons__subtitle subtitle">1 УРОК</div>
<div class="lessons__row">
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">
<p>Собираем материал и экспериментируем с образом героя, используя полученный список характерных особенностей персонажа. По каждому признаку нужно будет собрать «референсы». Рисуем элементы образа в своем стиле.</p>
<p>Собираем из них нашего персонажа. Выбираем самые удачные элементы, объединяем их в одном наброске.</p>
</div>
</div>
</div>
<div class="lessons__item">
<div class="lessons__subtitle subtitle">1 УРОК</div>
<div class="lessons__row">
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">
<p>Попробуем оживить персонажа. Выбираем 5 характерных действий для вашего героя и того сюжета, в котором он принимает участие, рисуем эскизы вашего персонажа в разных характерных для него позах и движении.</p>
<p>Выделяем 5 характерных эмоций для героя, над которым работаем. По эмоциям подбираем референсы и стилизуем их в своем стиле.</p>
</div>
</div>
</div>
<div class="lessons__item">
<div class="lessons__subtitle subtitle">1 УРОК</div>
<div class="lessons__row">
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">Адаптируем вашего героя в соответствии с целевой аудиторией. Рассматриваем, как люди разных возрастов по разному воспринимают образы, героев и их эмоции. Выделяем 3 основные группы — дети, подростки и взрослые люди.</div>
</div>
</div>
</div>
<div class="lessons__load load"><button class="load__btn btn">еще</button></div>
</div>
</div>
</div>
<div class="section">
<div class="section__center center center_sm">
<div class="title">Материалы, которые понадобятся</div>
<div class="materials">
<div class="materials__item">
<div class="materials__preview"><img class="materials__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="materials__wrap">
<div class="materials__title">Бумага акварельная</div>
<div class="materials__content">Этот курс поможет детям узнать о том как из простых форм создавать веселый и харизматичных персонажей.</div>
</div>
</div>
<div class="materials__item">
<div class="materials__preview"><img class="materials__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="materials__wrap">
<div class="materials__title">Бумага акварельная</div>
<div class="materials__content">Этот курс поможет детям узнать о том как из простых форм создавать веселый и харизматичных персонажей.</div>
</div>
</div>
</div>
</div>
</div>
<div class="section section_gradient">
<div class="section__center center center_sm">
<div class="title">Галерея итогов обучения</div>
<div class="examples">
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
</div>
</div>
</div>
<div class="course course_promo" style="background-image: url({% static 'img/video-1.jpg' %});">
<div class="course__center center center_sm">
<div class="course__head">
<div class="course__theme theme theme_green">ПЕРСОНАЖИ</div>
<a class="course__likes likes" href="#">
<div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon"><svg class="icon icon-like-bold"><use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use></svg><svg class="icon icon-like-fill-bold"><use xlink:href="img/sprite.svg#icon-like-fill-bold"></use></svg></div>
</a>
</div>
<div class="course__title title">Как просто научиться рисовать простых персонажей.</div>
<div class="course__content">Этот курс поможет детям узнать о том как из простых форм создавать веселый и харизматичных персонажей.</div>
<div class="course__user user user_white">
{% if course.author.photo %}
<div class="user__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
{% else %}
<div class="user__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
{% endif %}
<div class="user__info">
<div class="user__name">{{ course.author.get_full_name }}</div>
<div class="user__meta">
<div class="user__date">{{ course.created_at_humanize }}</div>
</div>
</div>
</div>
<div class="course__info">
<div class="course__meta meta meta_white">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-time"><use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use></svg></div>
<div class="meta__title">12 часов</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-date"><use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use></svg></div>
<div class="meta__title">15 ноября</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-money"><use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use></svg></div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}$</div>
</div>
</div><button class="course__buy btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button></div>
</div>
</div>
<div class="section section_gray">
<div class="section__center center center_sm">
<div class="title">Задавайте вопросы:</div>
<div class="questions">
<div class="questions__form">
<div class="questions__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="questions__wrap">
<div class="questions__field"><textarea class="questions__textarea" placeholder="Спросите автора курса интересующие вас вопросы"></textarea></div><button class="questions__btn btn btn_light">ОТПРАВИТЬ</button></div>
</div>
<div class="questions__list">
<div class="questions__item">
<div class="questions__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="questions__wrap">
<div class="questions__details">
<div class="questions__head"><span class="questions__author">Богиня Недалекая</span><span class="questions__date">16 Сен, 16:52</span></div>
<div class="questions__content">А можно ли заниматься если у меня нет интернета и компьютера. Можно ли запустить видео на моей микроволновке?</div>
</div>
<div class="questions__foot"><button class="questions__action">ОТВЕТИТЬ</button></div>
</div>
</div>
<div class="questions__item questions__item_reply">
<div class="questions__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="questions__wrap">
<div class="questions__details">
<div class="questions__head"><span class="questions__author">Богиня Недалекая</span><span class="questions__date">16 Сен, 16:52</span></div>
<div class="questions__content">А можно ли заниматься если у меня нет интернета и компьютера. Можно ли запустить видео на моей микроволновке?</div>
</div>
<div class="questions__foot"><button class="questions__action">ОТВЕТИТЬ</button></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section__center center center_sm">
<div class="share">
<div class="share__title">Поделиться курсом</div>
<div class="share__list"><a class="share__item" href="#"><svg class="icon icon-share-facebook"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-twitter"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use></svg></a>
<a
class="share__item" href="#"><svg class="icon icon-share-google"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-pinterest"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use></svg></a></div>
</div>
</div>
</div>
{% endblock content %}

@ -1,7 +1,7 @@
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import JsonResponse from django.http import JsonResponse
from django.template import loader from django.template import loader
from django.views.generic import View, ListView from django.views.generic import View, DetailView, ListView
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from .models import Course, Like from .models import Course, Like
@ -37,6 +37,12 @@ def likes(request, course_id):
}) })
class CourseView(DetailView):
model = Course
context_object_name = 'course'
template_name = 'course/course.html'
class CoursesView(ListView): class CoursesView(ListView):
model = Course model = Course
context_object_name = 'course_items' context_object_name = 'course_items'

@ -18,12 +18,13 @@ from django.urls import path, include
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.conf import settings from django.conf import settings
from apps.course.views import CoursesView, likes from apps.course.views import CoursesView, likes, CourseView
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('auth/', include(('apps.auth.urls', 'lilcity'))), path('auth/', include(('apps.auth.urls', 'lilcity'))),
path('courses/', CoursesView.as_view(), name='courses'), path('courses/', CoursesView.as_view(), name='courses'),
path('course/<int:pk>/', CourseView.as_view(), name='course'),
path('course/<int:course_id>/like', likes, name='likes'), path('course/<int:course_id>/like', likes, name='likes'),
path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'), path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'),
] ]

Loading…
Cancel
Save