diff --git a/courses/serializers.py b/courses/serializers.py index c8034fa..3309f1e 100644 --- a/courses/serializers.py +++ b/courses/serializers.py @@ -29,6 +29,31 @@ class LessonSerializer(MiniLessonSerializer): exclude = ('id', 'topic', 'key') +class TeacherLessonSerializer(MiniLessonSerializer): + topic_sort = serializers.SerializerMethodField() + topic_title = serializers.SerializerMethodField() + course_title = serializers.SerializerMethodField() + + class Meta: + model = Lesson + fields = ('topic_sort', 'description', 'title', 'course_title', 'token', 'topic_title') + + @staticmethod + def get_topic_sort(self): + for topic_idx, topic in enumerate(self.topic.course.topic_set.all()): + if topic == self.topic: + return topic_idx + 1 + return None + + @staticmethod + def get_topic_title(self): + return self.topic.title + + @staticmethod + def get_course_title(self): + return self.topic.course.title + + class CourseInitSerializer(serializers.ModelSerializer): class Meta: diff --git a/courses/urls.py b/courses/urls.py index 9c73b53..d30f49b 100644 --- a/courses/urls.py +++ b/courses/urls.py @@ -4,6 +4,7 @@ from courses import views as views urlpatterns = [ url(r'vertex/(?P.+)/$', views.LessonDetail.as_view()), + url(r'lesson/teacher/(?P.+)/$', views.LessonInfoView.as_view()), url(r'tree/(?P.+)/$', views.TreeView.as_view()), url(r'detail/(?P.+)/$', views.CourseDetailView.as_view()), url(r'^$', views.CourseListView.as_view()), diff --git a/courses/views.py b/courses/views.py index 211eab4..3a5547b 100644 --- a/courses/views.py +++ b/courses/views.py @@ -4,7 +4,7 @@ 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 +from courses.serializers import CourseDetailSerializer, CourseTreeSerializer, LessonSerializer, TeacherLessonSerializer from progress.models import ProgressLesson @@ -45,6 +45,20 @@ class CourseDetailView(APIView): return Response(CourseDetailSerializer(Course.objects.get(slug=slug)).data, self.status_code) +class LessonInfoView(APIView): + renderer_classes = (JSONRenderer,) + status_code = 200 + + def get(self, request, token): + try: + lesson = Lesson.objects.get(token=token) + except Lesson.DoesNotExist: + return Response('Урок не найден', status=404) + if request.user.is_authenticated and request.user.out_key in lesson.topic.course.teacher_tokens: + return Response(TeacherLessonSerializer(lesson).data, self.status_code) + return Response("Пользователь не является преподователем по курсу", status=403) + + class LessonDetail(APIView): renderer_classes = (JSONRenderer,) diff --git a/progress/migrations/0007_progresslesson_last_update.py b/progress/migrations/0007_progresslesson_last_update.py new file mode 100644 index 0000000..a055a52 --- /dev/null +++ b/progress/migrations/0007_progresslesson_last_update.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2018-02-25 18:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('progress', '0006_auto_20180219_1323'), + ] + + operations = [ + migrations.AddField( + model_name='progresslesson', + name='last_update', + field=models.DateTimeField(auto_now=True, verbose_name='Дата последнего изменения'), + ), + ] diff --git a/progress/models.py b/progress/models.py index db2ecec..12a4274 100644 --- a/progress/models.py +++ b/progress/models.py @@ -57,6 +57,7 @@ class ProgressLesson(models.Model): finish_date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True) start_date = models.DateTimeField(verbose_name='Дата начала прохождения задания', auto_now_add=True) status = models.CharField(choices=STATUSES, default=STATUSES.start, max_length=20) + last_update = models.DateTimeField(verbose_name='Дата последнего изменения', auto_now=True) comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=get_empty_list) def __str__(self): diff --git a/progress/serializers.py b/progress/serializers.py index 5467b6d..e156bd3 100644 --- a/progress/serializers.py +++ b/progress/serializers.py @@ -39,7 +39,7 @@ class ProgressLessonSerializer(serializers.ModelSerializer): class Meta: model = ProgressLesson - exclude = ('id', 'progress', 'checker') + exclude = ('progress', 'checker') @staticmethod def get_teacher(self): diff --git a/progress/views.py b/progress/views.py index f161389..75382c3 100644 --- a/progress/views.py +++ b/progress/views.py @@ -23,6 +23,8 @@ class StudentWorkView(APIView): @staticmethod def get(request, teacher_token): client_status = request.GET.get('status', 'in_progress') + client_max_body = request.GET.get('max_body', 20) + last_id = request.GET.get('last_id', 0) server_status = Q(status='fail') if \ client_status == 'not_done' else Q(status='wait') if client_status == 'in_progress' else Q(status='done') if request.user.is_authenticated() and request.user.groups.filter(name__in=['teachers', 'admin']).exists(): @@ -31,7 +33,8 @@ class StudentWorkView(APIView): ~Q(progress__user__out_key=teacher_token), server_status, checker__out_key=teacher_token, - ) + id__gt=last_id + )[:client_max_body] return Response([ProgressLessonSerializer(i).data for i in progress_lessons], status=200) except ValidationError: return Response("Bad request", status=400)