LIL-559, LiveLessonComment and etc

remotes/origin/hotfix/LIL-661
gzbender 8 years ago
parent b93beb3d5d
commit 9c8090916d
  1. 33
      api/v1/serializers/course.py
  2. 25
      api/v1/views.py
  3. 30
      apps/course/migrations/0044_livelessoncomment.py
  4. 14
      apps/course/models.py
  5. 1
      project/templates/blocks/lil_store_js.html
  6. 8
      web/src/components/CommentForm.vue
  7. 4
      web/src/components/Comments.vue
  8. 12
      web/src/sass/_common.sass

@ -10,7 +10,7 @@ from apps.course.models import (
Comment, CourseComment, LessonComment, Comment, CourseComment, LessonComment,
Material, Lesson, Material, Lesson,
Like, Like,
) LiveLessonComment)
from .content import ( from .content import (
ImageObjectSerializer, ContentSerializer, ContentCreateSerializer, ImageObjectSerializer, ContentSerializer, ContentCreateSerializer,
GallerySerializer, GalleryImageSerializer, GallerySerializer, GalleryImageSerializer,
@ -343,6 +343,8 @@ class CommentSerializer(serializers.ModelSerializer):
return CourseCommentSerializer(instance, context=self.context).to_representation(instance) return CourseCommentSerializer(instance, context=self.context).to_representation(instance)
elif isinstance(instance, LessonComment): elif isinstance(instance, LessonComment):
return LessonCommentSerializer(instance, context=self.context).to_representation(instance) return LessonCommentSerializer(instance, context=self.context).to_representation(instance)
elif isinstance(instance, LiveLessonComment):
return LiveLessonCommentSerializer(instance, context=self.context).to_representation(instance)
class CourseCommentSerializer(serializers.ModelSerializer): class CourseCommentSerializer(serializers.ModelSerializer):
@ -377,10 +379,24 @@ class LessonCommentSerializer(serializers.ModelSerializer):
) )
class CommentCreateSerializer(serializers.ModelSerializer): class LiveLessonCommentSerializer(serializers.ModelSerializer):
OBJ_TYPE_COURSE = 'course' author = UserSerializer()
OBJ_TYPE_LESSON = 'lesson' children = CommentSerializer(many=True)
class Meta:
model = LiveLessonComment
fields = CommentSerializer.Meta.fields + (
'live_lesson',
'children',
)
read_only_fields = CommentSerializer.Meta.read_only_fields + (
'children',
)
class CommentCreateSerializer(serializers.ModelSerializer):
obj_type = serializers.CharField(required=True) obj_type = serializers.CharField(required=True)
obj_id = serializers.IntegerField(required=True) obj_id = serializers.IntegerField(required=True)
@ -408,15 +424,20 @@ class CommentCreateSerializer(serializers.ModelSerializer):
def create(self, validated_data): def create(self, validated_data):
obj_type = validated_data.pop('obj_type', None) obj_type = validated_data.pop('obj_type', None)
obj_id = validated_data.pop('obj_id', None) obj_id = validated_data.pop('obj_id', None)
if obj_type == self.OBJ_TYPE_COURSE: if obj_type == Comment.OBJ_TYPE_COURSE:
validated_data['course_id'] = obj_id validated_data['course_id'] = obj_id
return CourseCommentSerializer().create(validated_data) return CourseCommentSerializer().create(validated_data)
elif obj_type == self.OBJ_TYPE_LESSON: elif obj_type == Comment.OBJ_TYPE_LESSON:
validated_data['lesson_id'] = obj_id validated_data['lesson_id'] = obj_id
return LessonCommentSerializer().create(validated_data) return LessonCommentSerializer().create(validated_data)
elif obj_type == Comment.OBJ_TYPE_LIVE_LESSON:
validated_data['live_lesson_id'] = obj_id
return LiveLessonCommentSerializer().create(validated_data)
def to_representation(self, instance): def to_representation(self, instance):
if isinstance(instance, CourseComment): if isinstance(instance, CourseComment):
return CourseCommentSerializer(instance, context=self.context).to_representation(instance) return CourseCommentSerializer(instance, context=self.context).to_representation(instance)
elif isinstance(instance, LessonComment): elif isinstance(instance, LessonComment):
return LessonCommentSerializer(instance, context=self.context).to_representation(instance) return LessonCommentSerializer(instance, context=self.context).to_representation(instance)
elif isinstance(instance, LiveLessonComment):
return LiveLessonCommentSerializer(instance, context=self.context).to_representation(instance)

@ -15,7 +15,7 @@ from .serializers.course import (
MaterialSerializer, MaterialCreateSerializer, MaterialSerializer, MaterialCreateSerializer,
LessonSerializer, LessonCreateSerializer, LessonSerializer, LessonCreateSerializer,
LikeCreateSerializer, CourseCommentSerializer, LessonCommentSerializer, LikeCreateSerializer, CourseCommentSerializer, LessonCommentSerializer,
) LiveLessonCommentSerializer)
from .serializers.content import ( from .serializers.content import (
BanerSerializer, BanerSerializer,
ImageSerializer, ImageCreateSerializer, ImageSerializer, ImageCreateSerializer,
@ -55,7 +55,7 @@ from apps.course.models import (
Comment, CourseComment, LessonComment, Comment, CourseComment, LessonComment,
Material, Lesson, Material, Lesson,
Like, Like,
) LiveLessonComment)
from apps.config.models import Config from apps.config.models import Config
from apps.content.models import ( from apps.content.models import (
Baner, Image, Text, ImageText, Video, Baner, Image, Text, ImageText, Video,
@ -449,8 +449,6 @@ class CommentViewSet(ExtendedModelViewSet):
class ObjectCommentsViewSet(ExtendedModelViewSet): class ObjectCommentsViewSet(ExtendedModelViewSet):
OBJ_TYPE_COURSE = 'course'
OBJ_TYPE_LESSON = 'lesson'
queryset = Comment.objects.all() queryset = Comment.objects.all()
serializer_class = CommentCreateSerializer serializer_class = CommentCreateSerializer
permission_classes = (IsAuthorObjectOrAdmin,) permission_classes = (IsAuthorObjectOrAdmin,)
@ -461,10 +459,12 @@ class ObjectCommentsViewSet(ExtendedModelViewSet):
obj_type = self.request.query_params.get('obj_type') obj_type = self.request.query_params.get('obj_type')
obj_id = self.request.query_params.get('obj_id') obj_id = self.request.query_params.get('obj_id')
is_deactivated = self.request.query_params.get('is_deactivated') is_deactivated = self.request.query_params.get('is_deactivated')
if obj_type == self.OBJ_TYPE_COURSE: if obj_type == Comment.OBJ_TYPE_COURSE:
queryset = CourseComment.objects.filter(course=obj_id) queryset = CourseComment.objects.filter(course=obj_id)
elif obj_type == self.OBJ_TYPE_LESSON: elif obj_type == Comment.OBJ_TYPE_LESSON:
queryset = LessonComment.objects.filter(lesson=obj_id) queryset = LessonComment.objects.filter(lesson=obj_id)
elif obj_type == Comment.OBJ_TYPE_LIVE_LESSON:
queryset = LiveLessonComment.objects.filter(live_lesson=obj_id)
if is_deactivated == '0': if is_deactivated == '0':
queryset = queryset.filter(level=0) queryset = queryset.filter(level=0)
elif is_deactivated == '1': elif is_deactivated == '1':
@ -478,10 +478,12 @@ class ObjectCommentsViewSet(ExtendedModelViewSet):
return CommentCreateSerializer return CommentCreateSerializer
obj_type = self.request.query_params.get('obj_type') obj_type = self.request.query_params.get('obj_type')
serializer_class = CommentSerializer serializer_class = CommentSerializer
if obj_type == self.OBJ_TYPE_COURSE: if obj_type == Comment.OBJ_TYPE_COURSE:
serializer_class = CourseCommentSerializer serializer_class = CourseCommentSerializer
elif obj_type == self.OBJ_TYPE_LESSON: elif obj_type == Comment.OBJ_TYPE_LESSON:
serializer_class = LessonCommentSerializer serializer_class = LessonCommentSerializer
elif obj_type == Comment.OBJ_TYPE_LIVE_LESSON:
serializer_class = LiveLessonCommentSerializer
return serializer_class return serializer_class
def perform_create(self, serializer): def perform_create(self, serializer):
@ -497,11 +499,14 @@ class ObjectCommentsViewSet(ExtendedModelViewSet):
obj_type = None obj_type = None
obj_id = None obj_id = None
if isinstance(instance, LessonComment): if isinstance(instance, LessonComment):
obj_type = self.OBJ_TYPE_LESSON obj_type = Comment.OBJ_TYPE_LESSON
obj_id = instance.lesson_id obj_id = instance.lesson_id
elif isinstance(instance, CourseComment): elif isinstance(instance, CourseComment):
obj_type = self.OBJ_TYPE_COURSE obj_type = Comment.OBJ_TYPE_COURSE
obj_id = instance.course_id obj_id = instance.course_id
elif isinstance(instance, LiveLessonComment):
obj_type = Comment.OBJ_TYPE_LIVE_LESSON
obj_id = instance.live_lesson_id
serializer = self.get_serializer(instance) serializer = self.get_serializer(instance)
try: try:
pusher().trigger(f'comments_{obj_type}_{obj_id}', 'delete', serializer.data) pusher().trigger(f'comments_{obj_type}_{obj_id}', 'delete', serializer.data)

@ -0,0 +1,30 @@
# Generated by Django 2.0.6 on 2018-09-19 15:41
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('school', '0021_schoolschedule_trial_lesson'),
('course', '0043_auto_20180824_2132'),
]
operations = [
migrations.CreateModel(
name='LiveLessonComment',
fields=[
('comment_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='course.Comment')),
('live_lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='school.LiveLesson')),
],
options={
'verbose_name': 'Комментарий урока школы',
'verbose_name_plural': 'Комментарии уроков школы',
'ordering': ('tree_id', 'lft'),
'abstract': False,
'base_manager_name': 'objects',
},
bases=('course.comment',),
),
]

@ -10,6 +10,7 @@ from django.urls import reverse_lazy
from django.conf import settings from django.conf import settings
from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey
from apps.school.models import LiveLesson
from project.mixins import BaseModel, DeactivatedMixin from project.mixins import BaseModel, DeactivatedMixin
from apps.content.models import ImageObject, Gallery, Video, ContestWork from apps.content.models import ImageObject, Gallery, Video, ContestWork
@ -240,6 +241,9 @@ class Material(models.Model):
class Comment(PolymorphicMPTTModel, DeactivatedMixin): class Comment(PolymorphicMPTTModel, DeactivatedMixin):
OBJ_TYPE_COURSE = 'course'
OBJ_TYPE_LESSON = 'lesson'
OBJ_TYPE_LIVE_LESSON = 'live-lesson'
content = models.TextField('Текст комментария', default='') content = models.TextField('Текст комментария', default='')
author = models.ForeignKey(User, on_delete=models.CASCADE) author = models.ForeignKey(User, on_delete=models.CASCADE)
parent = PolymorphicTreeForeignKey( parent = PolymorphicTreeForeignKey(
@ -284,5 +288,15 @@ class LessonComment(Comment):
verbose_name_plural = 'Комментарии уроков' verbose_name_plural = 'Комментарии уроков'
class LiveLessonComment(Comment):
live_lesson = models.ForeignKey(
LiveLesson, on_delete=models.CASCADE, related_name='comments'
)
class Meta(Comment.Meta):
verbose_name = 'Комментарий урока школы'
verbose_name_plural = 'Комментарии уроков школы'
class ContestWorkComment(Comment): class ContestWorkComment(Comment):
contest_work = models.ForeignKey(ContestWork, on_delete=models.CASCADE, related_name='comments') contest_work = models.ForeignKey(ContestWork, on_delete=models.CASCADE, related_name='comments')

@ -1,6 +1,7 @@
{% load static %} {% load static %}
<script> <script>
window.LIL_STORE = { window.LIL_STORE = {
pusherKey: '{{ settings.PUSHER_KEY }}',
staticUrl: '{% static "" %}', staticUrl: '{% static "" %}',
accessToken: '{{ request.user.auth_token }}', accessToken: '{{ request.user.auth_token }}',
isMobile: {{ request.user_agent.is_mobile|yesno:"true,false" }}, isMobile: {{ request.user_agent.is_mobile|yesno:"true,false" }},

@ -1,11 +1,12 @@
<template> <template>
<div class="questions__form" :class="{'questions__item_reply': controller.$data.replyTo}"> <div class="questions__form" :class="{'questions__item_reply': controller.$data.replyTo}">
<div class="questions__form-loader loading-loader"></div>
<div class="questions__ava ava"> <div class="questions__ava ava">
<img class="ava__pic" :src="$root.store.user.photo || $root.store.defaultUserPhoto"> <img class="ava__pic" :src="$root.store.user.photo || $root.store.defaultUserPhoto">
</div> </div>
<div class="questions__wrap"> <div class="questions__wrap">
<div class="questions__field"> <div class="questions__field">
<textarea v-model="content" class="questions__textarea" <textarea v-model="content" class="questions__textarea" @keyup.enter.exact="addOnEnter"
:placeholder="controller.$data.replyTo ? 'Ответьте на комментарий' : 'Задайте автору курса интересующие вас вопросы'"></textarea> :placeholder="controller.$data.replyTo ? 'Ответьте на комментарий' : 'Задайте автору курса интересующие вас вопросы'"></textarea>
</div> </div>
<div class="questions__form-foot"> <div class="questions__form-foot">
@ -38,6 +39,11 @@
} }
}, },
methods: { methods: {
addOnEnter() {
if(this.controller.isChat) {
this.add();
}
},
add() { add() {
this.controller.add(this.content); this.controller.add(this.content);
this.content = ''; this.content = '';

@ -1,5 +1,5 @@
<template> <template>
<div :class="{'questions--chat': isChat}"> <div :class="{'questions--chat': isChat, 'questions--loading': loading}">
<div v-show="nodes.length" class="questions__items"> <div v-show="nodes.length" class="questions__items">
<ul v-for="(node, index) in nodes" :key="index"> <ul v-for="(node, index) in nodes" :key="index">
<li> <li>
@ -101,7 +101,7 @@
// Enable pusher logging - don't include this in production // Enable pusher logging - don't include this in production
Pusher.logToConsole = true; Pusher.logToConsole = true;
let pusher = new Pusher('d9bfd3aaf6ed22bdcc0d', { let pusher = new Pusher(this.$root.store.pusherKey, {
cluster: 'eu', cluster: 'eu',
encrypted: true encrypted: true
}); });

@ -2811,9 +2811,12 @@ a.grey-link
&__item &__item
display: flex display: flex
&__form &__form
position: relative;
margin-top: 20px margin-top: 20px
padding-bottom: 20px padding-bottom: 20px
border-bottom: 1px solid $border border-bottom: 1px solid $border
&__form-loader
display: none;
&__form-foot &__form-foot
text-align: center; text-align: center;
&__item &__item
@ -2904,6 +2907,9 @@ a.grey-link
&__content &__content
font-size: 24px; font-size: 24px;
color: #d40700; color: #d40700;
&--chat
margin-top: 15px;
&--chat &__items &--chat &__items
background: white; background: white;
border: 1px solid #ccc; border: 1px solid #ccc;
@ -2942,6 +2948,12 @@ a.grey-link
&--chat &__form-foot &--chat &__form-foot
display: flex; display: flex;
&--loading &__form-loader
display: block
&--loading &__form &__ava, &--loading &__form &__wrap
opacity: 0.4
.share .share
&__title &__title
margin-bottom: 45px margin-bottom: 45px

Loading…
Cancel
Save