From c860e2efd0c91cd96e24a11f9f64dcce2cd24a62 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 19 Jan 2018 13:11:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- access/migrations/0004_auto_20180117_1558.py | 20 +++++++ access/models/progress.py | 2 +- access/urls.py | 1 + access/views.py | 34 ++++++++--- csv/load_comments.py | 61 +++++++++++++------- csv/load_perm.py | 3 +- storage/serializers.py | 2 +- storage/views.py | 4 +- 8 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 access/migrations/0004_auto_20180117_1558.py diff --git a/access/migrations/0004_auto_20180117_1558.py b/access/migrations/0004_auto_20180117_1558.py new file mode 100644 index 0000000..1491d22 --- /dev/null +++ b/access/migrations/0004_auto_20180117_1558.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2018-01-17 15:58 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0003_auto_20180115_1953'), + ] + + operations = [ + migrations.AlterField( + model_name='progresslesson', + name='date', + field=models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания'), + ), + ] diff --git a/access/models/progress.py b/access/models/progress.py index feda799..7a86e21 100644 --- a/access/models/progress.py +++ b/access/models/progress.py @@ -28,7 +28,7 @@ class ProgressLesson(models.Model): progress = models.ForeignKey(to=Progress) lesson_token = models.UUIDField(verbose_name="Токен урока", editable=False) teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",) - date = models.DateTimeField(verbose_name='Дата зачтения задания', auto_now_add=True) + date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True) STATUSES = Choices('done', 'wait', 'fail') status = models.CharField(choices=STATUSES, default=STATUSES.wait, max_length=20) comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=[]) diff --git a/access/urls.py b/access/urls.py index d2600ec..299a4d3 100644 --- a/access/urls.py +++ b/access/urls.py @@ -13,4 +13,5 @@ urlpatterns = [ url(r'logout/$', views.LogoutView.as_view()), url(r'reset/$', views.ResetPasswordView.as_view()), url(r'progress/$', views.UpdateProgress.as_view()), + url(r'progress_dynamic/(?P[0-9A-Fa-f-]+)/$', views.CourseProgressDynamicView.as_view()), ] \ No newline at end of file diff --git a/access/views.py b/access/views.py index 067ff56..f0f7eef 100644 --- a/access/views.py +++ b/access/views.py @@ -4,6 +4,7 @@ import string from django.contrib import auth from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError from django.core.mail import send_mail from django.db.models import Q from django.shortcuts import redirect @@ -239,16 +240,16 @@ class UpdateProgress(APIView): """ На вход обязательно передаётся параметр id (id узла). """ - token = request.JSON.get('token', None) - course = request.JSON.get('slug', None) - if token is None or course is None: + lesson_token = request.JSON.get('lesson_token', None) + course_token = request.JSON.get('course_token', None) + if lesson_token is None or course_token is None: return Response('Не передан слаг курса или токен урока', status=400) try: - p = Progress.objects.get(user=request.user, course=course) + p = Progress.objects.get(user=request.user, course=course_token) try: pv = ProgressLesson.objects.get( progress=p, - vertex=token, + lesson_token=lesson_token, ) except ProgressLesson.DoesNotExist: @@ -256,9 +257,9 @@ class UpdateProgress(APIView): date=datetime.datetime.now(), teacher=p.teacher, progress=p, - vertex=token, + lesson_token=lesson_token, ) - pv.status = 2 + pv.status = ProgressLesson.STATUSES.done pv.save() return Response(ProgressLessonSerializer(pv).data, status=200) @@ -296,3 +297,22 @@ class UserGuardView(APIView): return res_204 return res_403 + + +class CourseProgressDynamicView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def get(request, token): + if request.user.is_authenticated() and request.user.is_staff: + try: + progresses = Progress.objects.filter(course_token=token) + res = {} + for i in progresses: + key = i.progresslesson_set.filter(status="done").count() + res[key] = 1 if not key in res.keys() else res[key] + 1 + return Response(res, status=200) + except ValidationError: + return Response("Bad request", status=400) + + return Response(status=403) diff --git a/csv/load_comments.py b/csv/load_comments.py index f8f83cd..0538e54 100644 --- a/csv/load_comments.py +++ b/csv/load_comments.py @@ -15,7 +15,7 @@ django.setup() from storage.models import Comment, File from courses.models import Lesson -from access.models.progress import ProgressLesson +from access.models.progress import ProgressLesson, Progress if __name__ == '__main__': csv.field_size_limit(500 * 1024 * 1024) @@ -31,28 +31,49 @@ if __name__ == '__main__': lesson_token=l.token, progress__user__email=row['student'], ) - files = [File.objects.get(id=file) for file in row['files'].split("[")[1].split("]")[0].split(',') - if not file == ''] - comment = Comment.objects.create( - text=row['text'], - email=row['owner__email'], + except ProgressLesson.DoesNotExist: + try: + pr = Progress.objects.create( + course_token=l.topic.course.token, + user=get_user_model().objects.get(email=row['student']), + teacher=get_user_model().objects.get(email=row['teacher']), + ) + except IntegrityError: + pr = Progress.objects.get( + course_token=l.topic.course.token, + user=get_user_model().objects.get(email=row['student']), + ) + + p = ProgressLesson.objects.create( + lesson_token=l.token, + teacher=get_user_model().objects.get(email=row['teacher']), + progress=pr, ) - if row['status'] == 'Одобренно': - p.status = ProgressLesson.STATUSES.done - p.date = row['date'] - elif row['status'] == 'Отклонено': - p.status = ProgressLesson.STATUSES.fail - else: - p.status = ProgressLesson.STATUSES.wait + files = [File.objects.get(id=file) for file in row['files'].split("[")[1].split("]")[0].split(',') + if not file == ''] - p.save() + comment = Comment.objects.create( + text=row['text'], + email=row['owner__email'], + ) - [comment.files.add(file) for file in files] - comment.date = row['date'] - comment.save() + if row['status'] == 'Одобренно': + p.status = ProgressLesson.STATUSES.done + p.date = row['date'] - p.comment_tokens.append(comment.token) - except ProgressLesson.DoesNotExist: - pass + elif row['status'] == 'Отклонено': + p.status = ProgressLesson.STATUSES.fail + + p.comment_tokens.append(comment.token) + p.save() + + [comment.files.add(file) for file in files] + comment.date = row['date'] + comment.save() + + for i in ProgressLesson.objects.filter(comment_tokens__isnull=False): + if len(i.comment_tokens) % 2 == 1: + i.status = ProgressLesson.STATUSES.wait + i.save() diff --git a/csv/load_perm.py b/csv/load_perm.py index feaad95..78d42cd 100644 --- a/csv/load_perm.py +++ b/csv/load_perm.py @@ -21,6 +21,7 @@ from courses.models import Lesson, Course if __name__ == '__main__': Progress.objects.all().delete() + ProgressLesson.objects.all().delete() with open('./access/progress.csv') as progress_csv: progress_reader = csv.DictReader(progress_csv) for row in progress_reader: @@ -54,5 +55,5 @@ if __name__ == '__main__': if pivot['date'] and not pivot['date'] == 'None': pv.date = datetime.strptime(pivot['date'].split('.')[0], '%Y-%m-%d %H:%M:%S') - pv.status = 2 + pv.status = ProgressLesson.STATUSES.done pv.save() diff --git a/storage/serializers.py b/storage/serializers.py index 777df1a..389c12b 100644 --- a/storage/serializers.py +++ b/storage/serializers.py @@ -21,7 +21,7 @@ class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment - exclude = ('id', 'key',) + exclude = ('id', 'token',) @staticmethod def get_files(self): diff --git a/storage/views.py b/storage/views.py index ba8f5cf..2d903aa 100644 --- a/storage/views.py +++ b/storage/views.py @@ -19,7 +19,7 @@ class FileView(APIView): for token in tokens: try: - file_list.append(FileSerializer(File.objects.get(key=token)).data) + file_list.append(FileSerializer(File.objects.get(token=token)).data) except File.DoesNotExist: file_list.append({'upload': 'error'}) @@ -40,7 +40,7 @@ class CommentView(APIView): for token in tokens: try: - comment_list.append(CommentSerializer(Comment.objects.get(key=token)).data) + comment_list.append(CommentSerializer(Comment.objects.get(token=token)).data) except Comment.DoesNotExist: comment_list.append({'upload': 'error'})