Merge branch 'feature/courses' into dev

remotes/origin/hasaccess
Ivlev Denis 8 years ago
commit 9fc83089b7
  1. 28
      apps/course/admin.py
  2. 29
      apps/course/migrations/0006_lesson.py
  3. 17
      apps/course/migrations/0007_auto_20180129_1433.py
  4. 25
      apps/course/migrations/0008_auto_20180129_1436.py
  5. 39
      apps/course/migrations/0009_auto_20180129_1458.py
  6. 18
      apps/course/migrations/0010_auto_20180129_1501.py
  7. 28
      apps/course/migrations/0011_auto_20180129_1527.py
  8. 35
      apps/course/migrations/0012_comment.py
  9. 17
      apps/course/migrations/0013_auto_20180129_1715.py
  10. 70
      apps/course/migrations/0014_auto_20180129_1726.py
  11. 135
      apps/course/migrations/0015_auto_20180129_1733.py
  12. 24
      apps/course/migrations/0016_auto_20180129_1756.py
  13. 105
      apps/course/models.py
  14. 108
      apps/course/templates/course/course.html
  15. 1
      project/settings.py
  16. 1
      requirements.txt

@ -1,6 +1,7 @@
from django.contrib import admin
from mptt.admin import MPTTModelAdmin, DraggableMPTTAdmin
from .models import Course, Category
from .models import Course, Category, Lesson, Material, CourseComment, LessonComment
@admin.register(Course)
@ -20,3 +21,28 @@ class CourseAdmin(admin.ModelAdmin):
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
pass
@admin.register(Lesson)
class LessonAdmin(admin.ModelAdmin):
list_display = (
'title',
'course',
)
@admin.register(Material)
class MaterialAdmin(admin.ModelAdmin):
list_display = (
'title',
)
@admin.register(CourseComment)
class CourseCommentAdmin(DraggableMPTTAdmin):
pass
@admin.register(LessonComment)
class LessonCommentAdmin(DraggableMPTTAdmin):
pass

@ -0,0 +1,29 @@
# Generated by Django 2.0.1 on 2018-01-29 14:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('course', '0005_course_from_author'),
]
operations = [
migrations.CreateModel(
name='Lesson',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='Название урока')),
('short_description', models.TextField(verbose_name='Краткое описание курса')),
('cover', models.ImageField(upload_to='lessons', verbose_name='Фон урока')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='course.Course')),
],
options={
'verbose_name': 'Урок',
'verbose_name_plural': 'Уроки',
'ordering': ('-title',),
},
),
]

@ -0,0 +1,17 @@
# Generated by Django 2.0.1 on 2018-01-29 14:33
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('course', '0006_lesson'),
]
operations = [
migrations.AlterModelOptions(
name='lesson',
options={'ordering': ('title',), 'verbose_name': 'Урок', 'verbose_name_plural': 'Уроки'},
),
]

@ -0,0 +1,25 @@
# Generated by Django 2.0.1 on 2018-01-29 14:36
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('course', '0007_auto_20180129_1433'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='lesson',
name='update_at',
field=models.DateTimeField(auto_now=True),
),
]

@ -0,0 +1,39 @@
# Generated by Django 2.0.1 on 2018-01-29 14:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0008_auto_20180129_1436'),
]
operations = [
migrations.CreateModel(
name='Material',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='Название материала')),
('cover', models.ImageField(upload_to='lessons', verbose_name='Фон материала')),
('short_description', models.TextField(verbose_name='Краткое описание материала')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
],
options={
'verbose_name': 'Материал',
'verbose_name_plural': 'Материалы',
'ordering': ('title',),
},
),
migrations.AlterField(
model_name='lesson',
name='short_description',
field=models.TextField(verbose_name='Краткое описание урока'),
),
migrations.AddField(
model_name='course',
name='materials',
field=models.ManyToManyField(to='course.Material'),
),
]

@ -0,0 +1,18 @@
# Generated by Django 2.0.1 on 2018-01-29 15:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0009_auto_20180129_1458'),
]
operations = [
migrations.AlterField(
model_name='material',
name='cover',
field=models.ImageField(upload_to='materials', verbose_name='Фон материала'),
),
]

@ -0,0 +1,28 @@
# Generated by Django 2.0.1 on 2018-01-29 15:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('course', '0010_auto_20180129_1501'),
]
operations = [
migrations.AlterField(
model_name='course',
name='from_author',
field=models.TextField(blank=True, default='', null=True, verbose_name='От автора'),
),
migrations.AlterField(
model_name='course',
name='likes',
field=models.ManyToManyField(blank=True, to='course.Like'),
),
migrations.AlterField(
model_name='course',
name='materials',
field=models.ManyToManyField(blank=True, to='course.Material'),
),
]

@ -0,0 +1,35 @@
# Generated by Django 2.0.1 on 2018-01-29 17:09
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('course', '0011_auto_20180129_1527'),
]
operations = [
migrations.CreateModel(
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(default='', verbose_name='Текст комментария')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.Comment')),
],
options={
'abstract': False,
},
),
]

@ -0,0 +1,17 @@
# Generated by Django 2.0.1 on 2018-01-29 17:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('course', '0012_comment'),
]
operations = [
migrations.AlterModelOptions(
name='comment',
options={'verbose_name': 'Комментарий', 'verbose_name_plural': 'Комментарии'},
),
]

@ -0,0 +1,70 @@
# Generated by Django 2.0.1 on 2018-01-29 17:26
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('course', '0013_auto_20180129_1715'),
]
operations = [
migrations.CreateModel(
name='CourseComment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(default='', verbose_name='Текст комментария')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Course')),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.CourseComment')),
],
options={
'verbose_name': 'Комментарий',
'verbose_name_plural': 'Комментарии',
'abstract': False,
},
),
migrations.CreateModel(
name='LessonComment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(default='', verbose_name='Текст комментария')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Lesson')),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.LessonComment')),
],
options={
'verbose_name': 'Комментарий',
'verbose_name_plural': 'Комментарии',
'abstract': False,
},
),
migrations.RemoveField(
model_name='comment',
name='author',
),
migrations.RemoveField(
model_name='comment',
name='parent',
),
migrations.DeleteModel(
name='Comment',
),
]

@ -0,0 +1,135 @@
# Generated by Django 2.0.1 on 2018-01-29 17:33
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('course', '0014_auto_20180129_1726'),
]
operations = [
migrations.CreateModel(
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(default='', verbose_name='Текст комментария')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.Comment')),
],
options={
'abstract': False,
},
),
migrations.AlterModelOptions(
name='coursecomment',
options={'verbose_name': 'Комментарий курса', 'verbose_name_plural': 'Комментарии курсов'},
),
migrations.AlterModelOptions(
name='lessoncomment',
options={'verbose_name': 'Комментарий урока', 'verbose_name_plural': 'Комментарии уроков'},
),
migrations.RemoveField(
model_name='coursecomment',
name='author',
),
migrations.RemoveField(
model_name='coursecomment',
name='content',
),
migrations.RemoveField(
model_name='coursecomment',
name='created_at',
),
migrations.RemoveField(
model_name='coursecomment',
name='id',
),
migrations.RemoveField(
model_name='coursecomment',
name='level',
),
migrations.RemoveField(
model_name='coursecomment',
name='lft',
),
migrations.RemoveField(
model_name='coursecomment',
name='parent',
),
migrations.RemoveField(
model_name='coursecomment',
name='rght',
),
migrations.RemoveField(
model_name='coursecomment',
name='tree_id',
),
migrations.RemoveField(
model_name='coursecomment',
name='update_at',
),
migrations.RemoveField(
model_name='lessoncomment',
name='author',
),
migrations.RemoveField(
model_name='lessoncomment',
name='content',
),
migrations.RemoveField(
model_name='lessoncomment',
name='created_at',
),
migrations.RemoveField(
model_name='lessoncomment',
name='id',
),
migrations.RemoveField(
model_name='lessoncomment',
name='level',
),
migrations.RemoveField(
model_name='lessoncomment',
name='lft',
),
migrations.RemoveField(
model_name='lessoncomment',
name='parent',
),
migrations.RemoveField(
model_name='lessoncomment',
name='rght',
),
migrations.RemoveField(
model_name='lessoncomment',
name='tree_id',
),
migrations.RemoveField(
model_name='lessoncomment',
name='update_at',
),
migrations.AddField(
model_name='coursecomment',
name='comment_ptr',
field=models.OneToOneField(auto_created=True, default=0, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='course.Comment'),
preserve_default=False,
),
migrations.AddField(
model_name='lessoncomment',
name='comment_ptr',
field=models.OneToOneField(auto_created=True, default=0, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='course.Comment'),
preserve_default=False,
),
]

@ -0,0 +1,24 @@
# Generated by Django 2.0.1 on 2018-01-29 17:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('course', '0015_auto_20180129_1733'),
]
operations = [
migrations.AlterField(
model_name='coursecomment',
name='course',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='course.Course'),
),
migrations.AlterField(
model_name='lessoncomment',
name='lesson',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='course.Lesson'),
),
]

@ -3,6 +3,8 @@ from django.db import models
from django.utils import timezone
from django.contrib.auth import get_user_model
from mptt.models import MPTTModel, TreeForeignKey
from .manager import CategoryQuerySet
User = get_user_model()
@ -22,19 +24,20 @@ class Course(models.Model):
(2, 'Archived'),
)
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
title = models.CharField("Название курса", max_length=100)
short_description = models.TextField("Краткое описание курса")
from_author = models.TextField("От автора", default='')
cover = models.ImageField("Фон курса", upload_to='courses')
price = models.DecimalField("Цена курса", help_text="Если цены нету, то курс бесплатный", max_digits=10, decimal_places=2, null=True, blank=True)
title = models.CharField('Название курса', max_length=100)
short_description = models.TextField('Краткое описание курса')
from_author = models.TextField('От автора', default='', null=True, blank=True)
cover = models.ImageField('Фон курса', upload_to='courses')
price = models.DecimalField('Цена курса', help_text='Если цены нету, то курс бесплатный', max_digits=10, decimal_places=2, null=True, blank=True)
is_infinite = models.BooleanField(default=False)
deferred_start_at = models.DateTimeField("Отложенный запуск курса", help_text="Заполнить если курс отложенный", null=True, blank=True)
category = models.ForeignKey("Category", on_delete=models.PROTECT)
duration = models.IntegerField("Продолжительность курса", default=0)
deferred_start_at = models.DateTimeField('Отложенный запуск курса', help_text='Заполнить если курс отложенный', null=True, blank=True)
category = models.ForeignKey('Category', on_delete=models.PROTECT)
duration = models.IntegerField('Продолжительность курса', default=0)
is_featured = models.BooleanField(default=False)
url = models.URLField('Ссылка', default='')
status = models.PositiveSmallIntegerField('Статус', default=0, choices=STATUS_CHOICES)
likes = models.ManyToManyField(Like)
likes = models.ManyToManyField(Like, blank=True)
materials = models.ManyToManyField('Material', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
@ -62,18 +65,92 @@ class Course(models.Model):
return True
return False
def __str__(self):
return str(self.id) + ' ' + self.title
class Meta:
verbose_name = "Курс"
verbose_name_plural = "Курсы"
verbose_name = 'Курс'
verbose_name_plural = 'Курсы'
ordering = ['-created_at']
class Category(models.Model):
title = models.CharField("Название категории", max_length=100)
title = models.CharField('Название категории', max_length=100)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
class Lesson(models.Model):
title = models.CharField('Название урока', max_length=100)
short_description = models.TextField('Краткое описание урока')
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='lessons')
cover = models.ImageField('Фон урока', upload_to='lessons')
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
verbose_name = "Категория"
verbose_name_plural = "Категории"
verbose_name = 'Урок'
verbose_name_plural = 'Уроки'
ordering = ('title',)
class Material(models.Model):
title = models.CharField('Название материала', max_length=100)
cover = models.ImageField('Фон материала', upload_to='materials')
short_description = models.TextField('Краткое описание материала')
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Материал'
verbose_name_plural = 'Материалы'
ordering = ('title',)
class Comment(MPTTModel):
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.PROTECT)
author = models.ForeignKey(User, on_delete=models.PROTECT)
content = models.TextField('Текст комментария', default='')
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
@property
def created_at_humanize(self):
return arrow.get(self.created_at).humanize(locale='ru')
def __str__(self):
return self.content
class MPTTMeta:
order_insertion_by = ['created_at']
abstract = True
class CourseComment(Comment):
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='comments')
class Meta:
verbose_name = 'Комментарий курса'
verbose_name_plural = 'Комментарии курсов'
class LessonComment(Comment):
lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='comments')
class Meta:
verbose_name = 'Комментарий урока'
verbose_name_plural = 'Комментарии уроков'

@ -1,5 +1,6 @@
{% extends "templates/lilcity/index.html" %}
{% load static %}
{% load mptt_tags %}
{% block content %}
<div class="section section_border">
@ -36,7 +37,7 @@
<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 class="meta__title">{{ course.duration }}</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>
@ -50,7 +51,7 @@
<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 class="meta__title">{{ course.lessons.count }}</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>
@ -91,52 +92,19 @@
<div class="lessons">
<div class="lessons__title title">Содержание курса</div>
<div class="lessons__list">
{% for lesson in course.lessons.all %}
<div class="lessons__item">
<div class="lessons__subtitle subtitle">1 УРОК</div>
<div class="lessons__subtitle subtitle">{{ lesson.title }}</div>
<div class="lessons__row">
{% if lesson.cover %}
<div class="lessons__preview"><img class="lessons__pic" src="{{ lesson.cover.url }}"></div>
{% else %}
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
<div class="lessons__content">Выбираем сюжет, с которым мы будем работать на курсе и главного героя вашей истории. С этим героем мы будем работать на протяжении всего курса.</div>
{% endif %}
<div class="lessons__content">{{ lesson.short_description | safe }}</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>
{% endfor %}
</div>
<div class="lessons__load load"><button class="load__btn btn">еще</button></div>
</div>
@ -146,20 +114,19 @@
<div class="section__center center center_sm">
<div class="title">Материалы, которые понадобятся</div>
<div class="materials">
{% for material in course.materials.all %}
<div class="materials__item">
{% if material.cover %}
<div class="materials__preview"><img class="materials__pic" src="{{ material.cover.url }}"></div>
{% else %}
<div class="materials__preview"><img class="materials__pic" src="{% static 'img/pic-3.jpg' %}"></div>
{% endif %}
<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 class="materials__title">{{ material.title }}</div>
<div class="materials__content">{{ material.short_description }}</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
@ -210,7 +177,7 @@
<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 class="meta__title">{{ course.duration }}</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>
@ -225,6 +192,7 @@
</div>
<div class="section section_gray">
<div class="section__center center center_sm">
<div class="title">Задавайте вопросы:</div>
<div class="questions">
<div class="questions__form">
@ -233,17 +201,29 @@
<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>
{% recursetree course.comments.all %}
<!-- Node template -->
<div class="questions__item {% if node.is_leaf_node %}questions__item_reply{% endif %}">
{% if node.author.photo %}
<div class="questions__ava ava"><img class="ava__pic" src="{{ node.author.photo.url }}"></div>
{% else %}
<div class="questions__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
{% endif %}
<div class="questions__wrap">
<div class="questions__details">
<div class="questions__head"><span class="questions__author">{{ node.author.get_full_name }}</span><span class="questions__date">{{ node.created_at_humanize }}</span></div>
<div class="questions__content">{{ node.content }}</div>
</div>
<div class="questions__foot"><button class="questions__action">ОТВЕТИТЬ</button></div>
</div>
<div class="questions__foot"><button class="questions__action">ОТВЕТИТЬ</button></div>
</div>
</div>
<div class="questions__item questions__item_reply">
<!-- End Node template -->
{% if not node.is_leaf_node %}
{{ children }}
{% endif %}
{% endrecursetree %}
<!-- <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">
@ -252,7 +232,7 @@
</div>
<div class="questions__foot"><button class="questions__action">ОТВЕТИТЬ</button></div>
</div>
</div>
</div> -->
</div>
</div>
</div>

@ -40,6 +40,7 @@ INSTALLED_APPS = [
'anymail',
'active_link',
'django_filters',
'mptt',
] + [
'apps.auth.apps',
'apps.user',

@ -9,3 +9,4 @@ Pillow==5.0.0
django-active-link==0.1.2
arrow==0.12.1
django-filter==2.0.0.dev1
django-mptt==0.9.0

Loading…
Cancel
Save