Merge branch 'feature/LIL-670' into 'master'

Feature/lil 670

See merge request lilcity/backend!157
remotes/origin/hotfix/LIL-691
cfwme 7 years ago
commit e4bcf19ce0
  1. 5
      api/v1/views.py
  2. 26
      apps/content/templates/content/blocks/video.html
  3. 37
      apps/course/templates/course/course.html
  4. 28
      apps/course/templates/course/course_only_lessons.html
  5. 4
      apps/course/templates/course/lesson.html
  6. 7
      project/templates/blocks/lil_store_js.html
  7. 13
      web/src/components/Comment.vue
  8. 2
      web/src/components/Comments.vue
  9. 3
      web/src/js/modules/api.js
  10. 25
      web/src/sass/_common.sass

@ -3,7 +3,7 @@ from datetime import datetime
from django.contrib.auth import get_user_model
from rest_framework import status, views, viewsets, generics
from rest_framework.decorators import detail_route, list_route, action
from rest_framework.decorators import detail_route, list_route, action, permission_classes, authentication_classes
from rest_framework.response import Response
from . import ExtendedModelViewSet
@ -453,7 +453,6 @@ class CommentViewSet(ExtendedModelViewSet):
class ObjectCommentsViewSet(ExtendedModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentCreateSerializer
permission_classes = (IsAuthorObjectOrAdmin,)
ordering_fields = ('update_at', )
def get_queryset(self):
@ -497,6 +496,7 @@ class ObjectCommentsViewSet(ExtendedModelViewSet):
except Exception as e:
print(e)
@permission_classes((IsAuthorObjectOrAdmin,))
def perform_destroy(self, instance):
obj_type = None
obj_id = None
@ -516,6 +516,7 @@ class ObjectCommentsViewSet(ExtendedModelViewSet):
print(e)
instance.delete()
@authentication_classes([])
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()).filter(parent__isnull=True)
serializer = self.get_serializer(queryset, many=True)

@ -15,29 +15,3 @@
</div>
</div>
</div>
<style>
@media only screen and (max-width: 639px) {
iframe {
width: 100%;
height: 240px;
}
.iframe__container {
text-align: center;
width: 100%;
padding-bottom: 56.25%;
margin-bottom: -56.25%;
}
}
@media only screen and (min-width: 640px) {
.iframe__container {
text-align: center;
}
iframe {
width: 640px;
height: 360px;
}
}
</style>

@ -70,7 +70,7 @@
</a>
</div>
<div class="course__title title">{{ course.title }}</div>
<div class="course__content">{{ course.short_description | linebreaks }}</div>
<div class="course__content">{{ course.short_description | safe | linebreaks }}</div>
<a href="{% url 'user' course.author.id %}">
<div class="course__user user">
{% if course.author.photo %}
@ -270,7 +270,7 @@
</a>
</div>
<div class="course__title title">{{ course.title }}</div>
<div class="course__content">{{ course.short_description | linebreaks }}</div>
<div class="course__content">{{ course.short_description | safe | linebreaks }}</div>
<a href="{% url 'user' course.author.id %}">
<div class="course__user user user_white">
{% if course.author.photo %}
@ -340,38 +340,7 @@
<div class="section__center center center_sm">
<div class="title">Задавайте вопросы:</div>
<div class="questions">
{% if request.user.is_authenticated %}
<form class="questions__form" method="post" action="{% url 'coursecomment' course_id=course.id %}">
<input type="hidden" name="reply_id">
<div class="questions__ava ava">
<img
class="ava__pic"
{% if request.user.photo %}
src="{{ request.user.photo.url }}"
{% else %}
src="{% static 'img/user_default.jpg' %}"
{% endif %}
>
</div>
<div class="questions__wrap">
<div class="questions__reply-info">В ответ на
<a href="" class="questions__reply-anchor">этот комментарий</a>.
<a href="#" class="questions__reply-cancel grey-link">Отменить</a>
</div>
<div class="questions__field">
<textarea class="questions__textarea" placeholder="Спросите автора курса интересующие вас вопросы"></textarea>
</div>
<button class="questions__btn btn btn_light">ОТПРАВИТЬ</button>
</div>
</form>
{% else %}
<div>Только зарегистрированные пользователи могут оставлять комментарии.</div>
{% endif %}
<div class="questions__list">
{% include "templates/blocks/comments.html" with object=course %}
</div>
</div>
<comments obj-type="course" obj-id="{{ course.id }}"></comments>
</div>
</div>
<div class="section">

@ -68,7 +68,7 @@
</a>
</div>
<div class="course__title title">{{ course.title }}</div>
<div class="course__content">{{ course.short_description }}</div>
<div class="course__content">{{ course.short_description | safe | linebreaks }}</div>
<a href="{% url 'user' course.author.id %}">
<div class="course__user user">
{% if course.author.photo %}
@ -204,31 +204,7 @@
<div class="section section_gray">
<div class="section__center center center_sm">
<div class="title">Задавайте вопросы:</div>
<div class="questions">
{% if user.is_authenticated %}
<form class="questions__form" method="post" action="{% url 'coursecomment' course_id=course.id %}">
<input type="hidden" name="reply_id">
<div class="questions__ava ava">
<img class="ava__pic" src="{% static 'img/user_default.jpg' %}">
</div>
<div class="questions__wrap">
<div class="questions__reply-info">В ответ на
<a href="" class="questions__reply-anchor">этот комментарий</a>.
<a href="#" class="questions__reply-cancel grey-link">Отменить</a>
</div>
<div class="questions__field">
<textarea class="questions__textarea" placeholder="Задайте автору курса интересующие вас вопросы"></textarea>
</div>
<button class="questions__btn btn btn_light">ОТПРАВИТЬ</button>
</div>
</form>
{% else %}
<div>Только зарегистрированные пользователи могут оставлять комментарии.</div>
{% endif %}
<div class="questions__list">
{% include "templates/blocks/comments.html" with object=course %}
</div>
</div>
<comments obj-type="course" obj-id="{{ course.id }}"></comments>
</div>
</div>
<div class="section">

@ -117,9 +117,7 @@
<div class="section section_gray">
<div class="section__center center center_sm">
<div class="title">Задавайте вопросы:</div>
<div class="questions" id="comments_block">
<comments obj-type="lesson" obj-id="{{ lesson.id }}"></comments>
</div>
<comments obj-type="lesson" obj-id="{{ lesson.id }}"></comments>
</div>
</div>
<div class="section">

@ -2,6 +2,12 @@
{% load setting from settings %}
<script>
window.LIL_STORE = {
roles: {
USER_ROLE: 0,
AUTHOR_ROLE: 1,
TEACHER_ROLE: 2,
ADMIN_ROLE: 3,
},
pusherKey: '{% setting "PUSHER_KEY" %}',
staticUrl: '{% static "" %}',
accessToken: '{{ request.user.auth_token }}',
@ -9,6 +15,7 @@
defaultUserPhoto: "{% static 'img/user_default.jpg' %}",
user: {
id: '{{ request.user.id|default:'' }}',
role: +'{{ request.user.role }}',
photo: '{% if request.user.photo %}{{ request.user.photo.url }}{% else %}{% static 'img/user_default.jpg' %}{% endif %}',
},
components: {}

@ -23,9 +23,16 @@
<span v-if="! isHeart">{{ comment.content }}</span>
</div>
</div>
<div class="questions__foot" v-if="! controller.isChat">
<button @click="controller.reply(comment)" v-if="$root.store.user.id" class="questions__action question__reply-button">ОТВЕТИТЬ</button>
<button @click="controller.remove(comment)" v-if="$root.store.user.id == comment.author.id" class="questions__action question__reply-button">УДАЛИТЬ</button>
<div class="questions__foot">
<button @click="controller.reply(comment)" v-if="$root.store.user.id && ! controller.isChat" class="questions__action question__reply-button">ОТВЕТИТЬ</button>
<button @click="controller.remove(comment)"
v-if="$root.store.user.id == comment.author.id || $root.store.user.role == $root.store.roles.ADMIN_ROLE"
class="questions__action question__reply-button">
<span v-if="! controller.isChat">УДАЛИТЬ</span>
<span v-if="controller.isChat">
<svg class="icon questions__delete-icon"><use xlink:href="/static/img/sprite.svg#icon-delete"></use></svg>
</span>
</button>
</div>
</div>
</div>

@ -1,5 +1,5 @@
<template>
<div :class="{'questions--chat': isChat, 'questions--loading': loading}">
<div class="questions" :class="{'questions--chat': isChat, 'questions--loading': loading}">
<div v-show="nodes.length" class="questions__items">
<ul v-for="(node, index) in nodes" :key="index">
<li>

@ -459,9 +459,6 @@ export const api = {
obj_id: objId,
obj_type: objType,
ordering: ordering || '',
},
headers: {
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
}
});
},

@ -2872,6 +2872,7 @@ a.grey-link
margin-left: 0
&__details
margin-bottom: 5px
flex: 1
&__head,
&__action
+fb
@ -2903,6 +2904,12 @@ a.grey-link
fill: $gray
width: 20px
height: 20px
&__delete-icon
fill: #C8C8C8
width: 17px
height: 17px
:hover
fill: #000000
&--heart
&__content
font-size: 24px
@ -4189,6 +4196,24 @@ a
max-width: 100%;
max-height: 60%;
@media only screen and (max-width: 639px)
.content-block__video iframe
width: 100%;
height: 240px;
.content-block__video.iframe__container
text-align: center;
width: 100%;
padding-bottom: 56.25%;
margin-bottom: -56.25%;
@media only screen and (min-width: 640px)
.content-block__video.iframe__container
text-align: center;
iframe
width: 640px;
height: 360px;
.banner
height: 140px

Loading…
Cancel
Save