From 08b4a28e6e341a594c20ace0f656b25cb092fe96 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 23 Mar 2018 13:46:22 +0300 Subject: [PATCH] finance logging --- courses/serializers.py | 14 ++++++- courses/urls.py | 2 + courses/views.py | 92 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 96 insertions(+), 12 deletions(-) diff --git a/courses/serializers.py b/courses/serializers.py index 359386b..b7010dc 100644 --- a/courses/serializers.py +++ b/courses/serializers.py @@ -1,6 +1,8 @@ from rest_framework import serializers +from django.conf import settings from courses.models import Course, Lesson, Topic +import os class TopicSerializer(serializers.ModelSerializer): @@ -19,11 +21,12 @@ class MiniLessonSerializer(serializers.ModelSerializer): class Meta: model = Lesson - fields = ('title', 'free', 'token', 'is_hm') + fields = ('title', 'free', 'token', 'is_hm', 'sort') class LessonSerializer(MiniLessonSerializer): course_slug = serializers.SerializerMethodField() + materials = serializers.SerializerMethodField() class Meta: model = Lesson @@ -33,6 +36,15 @@ class LessonSerializer(MiniLessonSerializer): def get_course_slug(self): return self.topic.course.slug + @staticmethod + def get_materials(self): + try: + prefix = 'course/%s/%s/%s' % (self.topic.course.token, self.topic.id, self.token) + name_list = os.listdir('%s/%s/' % (settings.MEDIA_ROOT, prefix)) + return ["%s%s/%s" % (settings.MEDIA_URL, prefix, i) for i in name_list] + except FileNotFoundError: + return [] + class TeacherLessonSerializer(MiniLessonSerializer): topic_sort = serializers.SerializerMethodField() diff --git a/courses/urls.py b/courses/urls.py index 3c78dbf..c2f8309 100644 --- a/courses/urls.py +++ b/courses/urls.py @@ -3,6 +3,8 @@ from django.conf.urls import url from courses import views as views urlpatterns = [ + url(r'lesson/update/$', views.UpdateLessonView.as_view()), + url(r'lesson/delete/(?P.+)/$', views.DeleteLessonView.as_view()), url(r'lesson/teacher/(?P.+)/$', views.LessonInfoView.as_view()), url(r'lesson/(?P.+)/$', views.LessonDetail.as_view()), url(r'tree/(?P.+)/$', views.TreeView.as_view()), diff --git a/courses/views.py b/courses/views.py index 0b7f74e..75437c0 100644 --- a/courses/views.py +++ b/courses/views.py @@ -1,19 +1,16 @@ -from django.db.models import F from jwt import DecodeError from courses.models import Course, Lesson, Topic from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from rest_framework.views import APIView -from django.contrib.auth import get_user_model -from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer, \ - TopicSerializer +from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer import jwt from courses.tasks import add_lesson from lms import settings -import json + class TreeView(APIView): renderer_classes = (JSONRenderer,) @@ -66,12 +63,84 @@ class DeleteTopicView(APIView): @staticmethod def delete(request, topic_id): + if request.user and request.user.is_staff: + try: + t = Topic.objects.get(id=topic_id) + except Topic.DoesNotExist: + return Response("Темы не существует", status=404) + t.delete() + return Response(CourseTreeSerializer(t.course).data, status=200) + + +class DeleteLessonView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def delete(request, lesson_token): + if request.user and request.user.is_staff: + try: + l = Lesson.objects.get(token=lesson_token) + except Lesson.DoesNotExist: + return Response("Темы не существует", status=404) + l.delete() + return Response(CourseTreeSerializer(l.topic.course).data, status=200) + + +class UpdateLessonView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def post(request): + lesson_token = request.JSON.get('token', None) + sort = request.JSON.get('sort', None) + topic_id = request.JSON.get('topic', None) + title = request.JSON.get('title', None) + description = request.JSON.get('description', None) + video = request.JSON.get('video', None) + free = request.JSON.get('free', None) + is_hm = request.JSON.get('is_hm', None) + + if topic_id is None: + return Response("topic не передан", status=400) + + if sort is None: + return Response("sort не передан", status=400) + try: - t = Topic.objects.get(id=topic_id) + topic = Topic.objects.get(id=topic_id) except Topic.DoesNotExist: - return Response("Темы не существует", status=404) - t.delete() - return Response(CourseTreeSerializer(t.course).data, status=200) + return Response("Тема не найдена", status=404) + + if lesson_token is None: + if title is None: + return Response("Название урока не переданно", status=400) + for lesson in reversed(topic.lesson_set.filter(sort__gte=sort)): + lesson.sort = lesson.sort + 1 + lesson.save() + l = Lesson.objects.create( + title=title, + topic=topic, + sort=sort, + ) + else: + try: + l = Lesson.objects.get(token=lesson_token) + except Lesson.DoesNotExist: + return Response("Урок не найден", status=404) + + l.title = l.title if title is None else title + l.video = l.video if video is None else video + l.free = l.free if free is None else free + l.is_hm = l.is_hm if is_hm is None else is_hm + l.description = l.description if description is None else description + if not l.sort == sort: + for lesson in reversed(topic.lesson_set.filter(sort__gte=sort)): + lesson.sort = lesson.sort + 1 + lesson.save() + l.sort = sort + l.save() + + return Response(CourseTreeSerializer(topic.course).data, status=200) class UpdateTopicView(APIView): @@ -99,7 +168,7 @@ class UpdateTopicView(APIView): if topic_id: t = Topic.objects.get(id=topic_id) if not t.sort == sort: - for topic in reversed(): + for topic in reversed(course.topic_set.filter(sort__gte=sort)): topic.sort = topic.sort + 1 topic.save() t.sort = sort @@ -161,7 +230,8 @@ class LessonDetail(APIView): course = lesson.topic.course if payload is None: - if not lesson.free: + if not (lesson.free or request.user.is_authenticated and + (request.user.groups.filter(name__in=['supports']).exists() or request.user.is_superuser)): return Response("Bad token", status=400) else: