From b0a22fc55e0e697cb9e7b7e54ae66b9a33d63c5a Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 21 Dec 2017 13:34:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=B6=D1=83=D1=80?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D1=8B=20(=D1=82=D0=B5=D0=BC,=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=BE=D0=B2,=20=D0=BA=D1=83=D1=80=D1=81=D0=BE?= =?UTF-8?q?=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- access/migrations/0007_progress_course.py | 21 +++++++++ access/migrations/0008_auto_20171220_1325.py | 20 +++++++++ access/models/other.py | 1 + access/serializers.py | 39 +++++++---------- api_v1/urls.py | 1 + course_service/courses/serializers.py | 10 ++++- course_service/courses/urls.py | 2 +- course_service/courses/views.py | 11 ++--- csv/load_perm.py | 5 ++- storage/serializers.py | 17 +++++++- storage/urls.py | 4 +- storage/views.py | 45 ++++++++++++++------ 12 files changed, 126 insertions(+), 50 deletions(-) create mode 100644 access/migrations/0007_progress_course.py create mode 100644 access/migrations/0008_auto_20171220_1325.py diff --git a/access/migrations/0007_progress_course.py b/access/migrations/0007_progress_course.py new file mode 100644 index 0000000..2ce063c --- /dev/null +++ b/access/migrations/0007_progress_course.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-12-20 13:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0006_auto_20171220_1228'), + ] + + operations = [ + migrations.AddField( + model_name='progress', + name='course', + field=models.CharField(default='', max_length=15, verbose_name='Токен курса'), + preserve_default=False, + ), + ] diff --git a/access/migrations/0008_auto_20171220_1325.py b/access/migrations/0008_auto_20171220_1325.py new file mode 100644 index 0000000..c0c1628 --- /dev/null +++ b/access/migrations/0008_auto_20171220_1325.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-12-20 13:25 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0007_progress_course'), + ] + + operations = [ + migrations.AlterField( + model_name='progress', + name='course', + field=models.CharField(max_length=127, verbose_name='Слаг курса'), + ), + ] diff --git a/access/models/other.py b/access/models/other.py index a86c2f9..d586dc7 100644 --- a/access/models/other.py +++ b/access/models/other.py @@ -48,6 +48,7 @@ class Progress(models.Model): related_name='teacher_progress') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') route = models.CharField(max_length=15, verbose_name='Токен прохождения', blank=True, null=True) + course = models.CharField(max_length=127, verbose_name='Слаг курса') def __str__(self): return '%s' % (self.user.email,) diff --git a/access/serializers.py b/access/serializers.py index 5750f43..4924d53 100644 --- a/access/serializers.py +++ b/access/serializers.py @@ -1,41 +1,32 @@ from django.contrib.auth import get_user_model from rest_framework import serializers -from access.models.other import Account, Progress +from access.models.other import Account, Progress, PivotProgressVertex from achievements.serialers import DiplomaSerializer, AchievementsSerializer -from course_service.courses.serializers import MiniVertexSerializer, CourseInitSerializer -class ProgressSerializer(serializers.ModelSerializer): - max = serializers.SerializerMethodField() - number = serializers.SerializerMethodField() - in_progress = serializers.SerializerMethodField() - course = serializers.SerializerMethodField() +class PivotProgressSerializer(serializers.ModelSerializer): + status = serializers.SerializerMethodField() class Meta: - model = Progress - fields = ('in_progress', 'number', 'max', 'progress_list', 'course') + model = PivotProgressVertex + exclude = ('id',) @staticmethod - def get_max(self): - return self.course.get_vertexes('topic').count() + def get_status(self): + return self.get_status_display() - @staticmethod - def get_course(self): - return CourseInitSerializer(self.course).data - @staticmethod - def get_in_progress(self): - if self.is_finish(): - return [] - else: - return [MiniVertexSerializer(i).data for i in self.get_objects_in_progress()] +class ProgressSerializer(serializers.ModelSerializer): + vertexes = serializers.SerializerMethodField() + + class Meta: + model = Progress + fields = ('route', 'vertexes', 'course') @staticmethod - def get_number(self): - if self.is_finish(): - return self.course.get_vertexes('topic').count() - return self.progress_list.filter(content_type__model="topic").count() + def get_vertexes(self): + return [PivotProgressSerializer(i).data for i in self.pivotprogressvertex_set.all()] class AccountSerializer(serializers.ModelSerializer): diff --git a/api_v1/urls.py b/api_v1/urls.py index eb9c384..3ec2478 100644 --- a/api_v1/urls.py +++ b/api_v1/urls.py @@ -5,4 +5,5 @@ urlpatterns = [ url(r'users/', include('access.urls')), url(r'library/', include('library.urls')), url(r'finance/', include('finance.urls')), + url(r'storage/', include('storage.urls')), ] \ No newline at end of file diff --git a/course_service/courses/serializers.py b/course_service/courses/serializers.py index 833a21b..fb8cda2 100644 --- a/course_service/courses/serializers.py +++ b/course_service/courses/serializers.py @@ -20,13 +20,19 @@ class MiniVertexSerializer(serializers.ModelSerializer): class Meta: model = Vertex - fields = ('id', 'title', 'free') + fields = ('title', 'free', 'token') class VertexSerializer(MiniVertexSerializer): + valid_type = serializers.SerializerMethodField() + class Meta: model = Vertex - fields = '__all__' + exclude = ('id', 'topic', 'free') + + @staticmethod + def get_valid_type(self): + return self.get_valid_type_display() class CourseInitSerializer(serializers.ModelSerializer): diff --git a/course_service/courses/urls.py b/course_service/courses/urls.py index 247daf7..efeb1b0 100644 --- a/course_service/courses/urls.py +++ b/course_service/courses/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import url from course_service.courses import views as views urlpatterns = [ - url(r'vertex/([0-9]{1,99})/$', views.VertexDetail.as_view()), + url(r'vertex/(?P.+)/$', views.VertexDetail.as_view()), url(r'tree/(?P.+)/$', views.TreeView.as_view()), url(r'^$', views.CourseListView.as_view()), ] \ No newline at end of file diff --git a/course_service/courses/views.py b/course_service/courses/views.py index 821b231..033fa63 100644 --- a/course_service/courses/views.py +++ b/course_service/courses/views.py @@ -36,19 +36,20 @@ class VertexDetail(APIView): renderer_classes = (JSONRenderer,) @staticmethod - def get(request, pk): + def get(request, token): status = int(request.GET.get('status', '200')) try: - vertex = Vertex.objects.get(id=pk) + vertex = Vertex.objects.get(token=token) except Vertex.DoesNotExist: return Response("Vertex doesn't exist", status=404) - if not vertex.check_vertex(request.user): - return Response("permission denied", status=403) + # if not vertex.check_vertex(request.user): + # return Response("permission denied", status=403) + # TODO: Доделать систему прав на курс res = VertexSerializer(vertex).data - progress = vertex.course.progress_set.filter(user=request.user) + # progress = vertex.course.progress_set.filter(user=request.user) # try: # if progress.exists(): # next_vertex = vertex.get_next(progress[0].get_template()) diff --git a/csv/load_perm.py b/csv/load_perm.py index dadbf86..c53136c 100644 --- a/csv/load_perm.py +++ b/csv/load_perm.py @@ -21,7 +21,8 @@ if __name__ == '__main__': with open('./access/progress.csv') as progress_csv: progress_reader = csv.DictReader(progress_csv) for row in progress_reader: - route = Course.objects.get(id=row['course']).route.out_key + course = Course.objects.get(id=row['course']) + route = course.route.out_key api = OutApiRoute list_vertex = OutApiRoute.get_route_matrix(route)[0] @@ -33,11 +34,13 @@ if __name__ == '__main__': try: p = Progress.objects.get( + course=course.slug, user=user, teacher=get_user_model().objects.get(id=row['teacher']), ) except Progress.DoesNotExist: p = Progress.objects.create( + course=course.slug, user=user, teacher=get_user_model().objects.get(id=row['teacher']), ) diff --git a/storage/serializers.py b/storage/serializers.py index 3a31087..777df1a 100644 --- a/storage/serializers.py +++ b/storage/serializers.py @@ -4,14 +4,29 @@ from storage.models import File, Comment class FileSerializer(serializers.ModelSerializer): + upload = serializers.SerializerMethodField() class Meta: model = File - fields = ('original', 'name',) + fields = ('original', 'name', 'upload') + + @staticmethod + def get_upload(self): + return 'ok' class CommentSerializer(serializers.ModelSerializer): + files = serializers.SerializerMethodField() + upload = serializers.SerializerMethodField() class Meta: model = Comment exclude = ('id', 'key',) + + @staticmethod + def get_files(self): + return [FileSerializer(i).data for i in self.files.all()] + + @staticmethod + def get_upload(self): + return 'ok' diff --git a/storage/urls.py b/storage/urls.py index f0dda03..b404e53 100755 --- a/storage/urls.py +++ b/storage/urls.py @@ -2,6 +2,6 @@ from django.conf.urls import url from storage import views urlpatterns = [ - url(r'bills/(?P.+)/$', views.FileDetailView.as_view()), - url(r'bills/(?P.+)/$', views.CommentDetailView.as_view()), + url(r'files/$', views.FileView.as_view()), + url(r'comments/$', views.CommentView.as_view()), ] diff --git a/storage/views.py b/storage/views.py index f74e887..ba8f5cf 100644 --- a/storage/views.py +++ b/storage/views.py @@ -6,25 +6,42 @@ from storage.models import File, Comment from storage.serializers import FileSerializer, CommentSerializer -class FileDetailView(APIView): +class FileView(APIView): renderer_classes = (JSONRenderer,) - status_code = 200 @staticmethod - def get(request, pk): - try: - return Response(FileSerializer(File.objects.get(key=pk)).data, status=200) - except File.DoesNotExist: - return Response("File not found", status=404) + def get(request): + tokens = request.GET.getlist('tokens', None) + if not tokens: + return Response("Attribute tokens not set", status=400) + file_list = [] -class CommentDetailView(APIView): + for token in tokens: + try: + file_list.append(FileSerializer(File.objects.get(key=token)).data) + except File.DoesNotExist: + file_list.append({'upload': 'error'}) + + return Response(file_list, status=200) + + +class CommentView(APIView): renderer_classes = (JSONRenderer,) - status_code = 200 @staticmethod - def get(request, pk): - try: - return Response(CommentSerializer(Comment.objects.get(key=pk)).data, status=200) - except Comment.DoesNotExist: - return Response("Comment not found", status=404) \ No newline at end of file + def get(request): + tokens = request.GET.getlist('tokens', None) + + if not tokens: + return Response("Attribute tokens not set", status=400) + + comment_list = [] + + for token in tokens: + try: + comment_list.append(CommentSerializer(Comment.objects.get(key=token)).data) + except Comment.DoesNotExist: + comment_list.append({'upload': 'error'}) + + return Response(comment_list, status=200) \ No newline at end of file