Merge branch 'feature/courses' into dev

remotes/origin/hasaccess
Ivlev Denis 8 years ago
commit a87e471b18
  1. 29
      apps/course/migrations/0017_auto_20180130_0810.py
  2. 3
      apps/course/models.py
  3. 25
      apps/course/templates/course/blocks/comment.html
  4. 29
      apps/course/templates/course/blocks/comments.html
  5. 2
      apps/course/templates/course/course.html
  6. 131
      apps/course/templates/course/lesson.html
  7. 63
      apps/course/views.py
  8. 4
      project/urls.py

@ -0,0 +1,29 @@
# Generated by Django 2.0.1 on 2018-01-30 08:10
from django.db import migrations
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('course', '0016_auto_20180129_1756'),
]
operations = [
migrations.RemoveField(
model_name='comment',
name='parent',
),
migrations.AddField(
model_name='coursecomment',
name='parent',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.CourseComment'),
),
migrations.AddField(
model_name='lessoncomment',
name='parent',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='children', to='course.LessonComment'),
),
]

@ -121,7 +121,6 @@ class Material(models.Model):
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='')
@ -141,6 +140,7 @@ class Comment(MPTTModel):
class CourseComment(Comment):
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.PROTECT)
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='comments')
class Meta:
@ -149,6 +149,7 @@ class CourseComment(Comment):
class LessonComment(Comment):
parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.PROTECT)
lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='comments')
class Meta:

@ -0,0 +1,25 @@
{% load static %}
<div class="questions__item {% if node.is_child_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>

@ -1,30 +1,5 @@
{% load static %}
{% load mptt_tags %}
{% recursetree course.comments.all %}
<!-- Node template -->
<div class="questions__item {% if node.is_child_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>
<!-- End Node template -->
{% recursetree object.comments.all %}
{% include './comment.html' %}
{{ children }} {% endrecursetree %}

@ -201,7 +201,7 @@
<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">
{% include "./blocks/comments.html" with course=course %}
{% include "./blocks/comments.html" with object=course %}
</div>
</div>
</div>

@ -0,0 +1,131 @@
{% extends "templates/lilcity/index.html" %}
{% load static %}
{% block title %}{{ lesson.title }} - {{ block.super }}{% endblock title %}
{% block content %}
<div class="section">
<div class="section__center center center_sm">
<div class="go">
<a class="go__item" href="{% url 'course' lesson.course.id %}">
<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">Вернуться к&nbsp;списку уроков</div>
</a>
<a class="go__item" href="#">
<div class="go__title">Перейти к&nbsp;следующему уроку</div>
<div class="go__arrow">
<svg class="icon icon-arrow-right">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-arrow-right"></use>
</svg>
</div>
</a>
</div>
<div class="lesson">
<div class="lesson__subtitle subtitle">{{ lesson.title }}</div>
<div class="lesson__content">{{ lesson.short_description }}</div>
<a class="lesson__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>
</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="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">
{% include "./blocks/comments.html" with object=lesson %}
</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,10 +1,10 @@
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.template import loader
from django.views.generic import View, DetailView, ListView
from django.template import loader, Context, Template
from django.views.generic import View, CreateView, DetailView, ListView
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from .models import Course, Like
from .models import Course, Like, Lesson, CourseComment, LessonComment
from .filters import CourseFilter
@ -18,7 +18,7 @@ def likes(request, course_id):
return JsonResponse({
'success': False,
'errors': ['Course with id f{cource_id} not found']
})
}, status=400)
else:
course_user_likes = course.likes.filter(user=request.user)
if course_user_likes.exists():
@ -37,6 +37,55 @@ def likes(request, course_id):
})
@login_required
@csrf_exempt
@require_http_methods(['POST'])
def coursecomment(request, course_id):
try:
course = Course.objects.get(id=course_id)
except Course.DoesNotExist:
return JsonResponse({
'success': False,
'errors': ['Course with id f{cource_id} not found']
}, status=400)
else:
reply_to = request.POST.get('reply_id', None)
comment = request.POST.get('comment', '')
if not comment:
return JsonResponse({
'success': False,
'errors': ['Comment can not be empty']
}, status=400)
if not reply_to:
coursecomment = CourseComment.objects.create(
author=request.user,
content=comment,
course=course,
)
else:
try:
_coursecomment = CourseComment.objects.get(id=reply_to)
except CourseComment.DoesNotExist:
return JsonResponse({
'success': False,
'errors': ['CourseComment with id f{reply_to} not found']
}, status=400)
else:
coursecomment = CourseComment.objects.create(
author=request.user,
content=comment,
course=course,
parrent=_coursecomment,
)
ctx = {'node': coursecomment}
html = loader.render_to_string('course/blocks/comment.html', ctx)
return JsonResponse({
'success': True,
'comment': html,
})
class CourseView(DetailView):
model = Course
context_object_name = 'course'
@ -81,3 +130,9 @@ class CoursesView(ListView):
if self.request.is_ajax():
return 'course/course_items.html'
return 'course/courses.html'
class LessonView(DetailView):
model = Lesson
context_object_name = 'lesson'
template_name = 'course/lesson.html'

@ -18,7 +18,7 @@ from django.urls import path, include
from django.views.generic import TemplateView
from django.conf import settings
from apps.course.views import CoursesView, likes, CourseView
from apps.course.views import CoursesView, likes, coursecomment, CourseView, LessonView
urlpatterns = [
path('admin/', admin.site.urls),
@ -26,6 +26,8 @@ urlpatterns = [
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>/comment', coursecomment, name='coursecomment'),
path('lesson/<int:pk>/', LessonView.as_view(), name='lesson'),
path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'),
]

Loading…
Cancel
Save