From 5180d7ea3d08e6accdea9a077b518ca940ea36ec Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 10 May 2018 17:45:49 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=92=D1=8B=D1=81=D1=82=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BA=20=D0=BA=D1=83=D1=80=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- courses/models.py | 9 +++++++++ courses/views.py | 31 ++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/courses/models.py b/courses/models.py index 9cdfdf8..251dcf0 100755 --- a/courses/models.py +++ b/courses/models.py @@ -25,6 +25,10 @@ COURSE_DIRECTION = ( ) +def content_file_name(instance, filename): + return '/'.join(['course', instance.topic.course.token, instance.topic.id, instance.token, filename]) + + class Lesson(models.Model): token = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False) key = models.UUIDField( @@ -33,6 +37,11 @@ class Lesson(models.Model): title = models.CharField(verbose_name='Название', max_length=255) description = models.TextField(verbose_name='Описание', blank=True, null=True) video = models.TextField(verbose_name='Код видео', blank=True, null=True) + materials = ArrayField( + models.FileField(verbose_name="Материал к уроку", upload_to=content_file_name), + verbose_name="Материалы к уроку", + default=get_empty_list, + ) material_tokens = ArrayField( models.UUIDField(verbose_name="Токен материала", editable=False), default=get_empty_list, diff --git a/courses/views.py b/courses/views.py index ee75638..ba75264 100644 --- a/courses/views.py +++ b/courses/views.py @@ -1,7 +1,8 @@ from jwt import DecodeError +from rest_framework.parsers import MultiPartParser from courses.models import Course, Lesson, Topic -from rest_framework.renderers import JSONRenderer +from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer from rest_framework.response import Response from rest_framework.views import APIView @@ -87,18 +88,26 @@ class DeleteLessonView(APIView): class UpdateLessonView(APIView): - renderer_classes = (JSONRenderer,) + renderer_classes = (JSONRenderer, BrowsableAPIRenderer) + parser_classes = (MultiPartParser,) @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) + def bool_transformer(val): + if val == 'false': + return False + if val == 'true': + return True + return val + + def post(self, request): + lesson_token = request.POST.get('token', None) + sort = request.POST.get('sort', None) + topic_id = request.POST.get('topic', None) + title = request.POST.get('title', None) + description = request.POST.get('description', None) + video = request.POST.get('video', None) + free = self.bool_transformer(request.POST.get('free', None)) + is_hm = self.bool_transformer(request.POST.get('is_hm', None)) if topic_id is None: return Response("topic не передан", status=400) From bdafdd5f4c2cdbed0e398e2ccb0209744fba4b61 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 10 May 2018 19:26:07 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=92=D1=8B=D1=81=D1=82=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BA=20=D0=BA=D1=83=D1=80=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- courses/migrations/0007_lesson_materials.py | 23 +++++++++++++++++++++ courses/models.py | 6 +++--- courses/views.py | 18 +++++++++++++++- finance/views.py | 2 +- 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 courses/migrations/0007_lesson_materials.py diff --git a/courses/migrations/0007_lesson_materials.py b/courses/migrations/0007_lesson_materials.py new file mode 100644 index 0000000..26cf547 --- /dev/null +++ b/courses/migrations/0007_lesson_materials.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2018-05-10 17:46 +from __future__ import unicode_literals + +import courses.models +import django.contrib.postgres.fields +from django.db import migrations, models +import lms.tools + + +class Migration(migrations.Migration): + + dependencies = [ + ('courses', '0006_auto_20180323_1743'), + ] + + operations = [ + migrations.AddField( + model_name='lesson', + name='materials', + field=django.contrib.postgres.fields.ArrayField(base_field=models.FileField(upload_to=courses.models.upload_material, verbose_name='Материал к уроку'), default=lms.tools.get_empty_list, size=None, verbose_name='Материалы к уроку'), + ), + ] diff --git a/courses/models.py b/courses/models.py index 251dcf0..bec647d 100755 --- a/courses/models.py +++ b/courses/models.py @@ -25,8 +25,8 @@ COURSE_DIRECTION = ( ) -def content_file_name(instance, filename): - return '/'.join(['course', instance.topic.course.token, instance.topic.id, instance.token, filename]) +def upload_material(instance, filename): + return '/'.join(['materials', str(instance.topic.course.token), str(instance.topic.id), str(instance.token), filename]) class Lesson(models.Model): @@ -38,7 +38,7 @@ class Lesson(models.Model): description = models.TextField(verbose_name='Описание', blank=True, null=True) video = models.TextField(verbose_name='Код видео', blank=True, null=True) materials = ArrayField( - models.FileField(verbose_name="Материал к уроку", upload_to=content_file_name), + models.FileField(verbose_name="Материал к уроку", upload_to=upload_material), verbose_name="Материалы к уроку", default=get_empty_list, ) diff --git a/courses/views.py b/courses/views.py index ba75264..d217f5c 100644 --- a/courses/views.py +++ b/courses/views.py @@ -1,10 +1,15 @@ +import base64 + +import os from jwt import DecodeError from rest_framework.parsers import MultiPartParser -from courses.models import Course, Lesson, Topic +from courses.models import Course, Lesson, Topic, upload_material from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer from rest_framework.response import Response from rest_framework.views import APIView +from django.core.files.storage import default_storage +from django.core.files.base import ContentFile from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer import jwt @@ -106,6 +111,7 @@ class UpdateLessonView(APIView): title = request.POST.get('title', None) description = request.POST.get('description', None) video = request.POST.get('video', None) + materials_url = request.POST.get('materials_url', '') free = self.bool_transformer(request.POST.get('free', None)) is_hm = self.bool_transformer(request.POST.get('is_hm', None)) @@ -147,6 +153,16 @@ class UpdateLessonView(APIView): lesson.sort = lesson.sort + 1 lesson.save() l.sort = sort + + materials = list(l.materials) + if not materials_url == '': + materials = base64.b64decode(materials_url).decode("utf-8").split(',') + for key in request.FILES: + f = request.FILES[key] + path = default_storage.save(upload_material(l, f.name), ContentFile(f.read())) + materials.append(path) + + l.materials = materials l.save() return Response(CourseTreeSerializer(topic.course).data, status=200) diff --git a/finance/views.py b/finance/views.py index 780114e..2ee2551 100644 --- a/finance/views.py +++ b/finance/views.py @@ -357,7 +357,7 @@ def get_invoices(request): file_name = file_name + "__from_%s" % date_from if date_from else file_name file_name = file_name + "__to_%s" % date_to if date_to else file_name - invoices = Invoice.objects.filter(method="Y", status="F") + invoices = Invoice.objects.filter(status="F") invoices = invoices.filter(yandex_pay__performed_datetime__lt=date_to) if date_to else invoices invoices = invoices.filter(yandex_pay__performed_datetime__gte=date_from) if date_from else invoices