From a609141dd4dc579e89468c94297d532af664af47 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 27 Mar 2018 20:23:57 +0300 Subject: [PATCH] finance logging --- access/serializers.py | 23 ++++- access/urls.py | 1 - .../migrations/0009_progress_is_freeze.py | 20 +++++ progress/models.py | 1 + progress/serializers.py | 17 ++++ progress/urls.py | 3 + progress/views.py | 84 ++++++++++++++----- 7 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 progress/migrations/0009_progress_is_freeze.py diff --git a/access/serializers.py b/access/serializers.py index 2aea54b..f4bb455 100644 --- a/access/serializers.py +++ b/access/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from access.models.other import Account from achievements.serialers import DiplomaSerializer, AchievementsSerializer -from progress.serializers import SecureProgressSerializer +from progress.serializers import SecureProgressSerializer, SupportProgressSerializer class AccountSerializer(serializers.ModelSerializer): @@ -48,7 +48,7 @@ class UserSelfSerializer(serializers.ModelSerializer): @staticmethod def get_progresses(self): - return [SecureProgressSerializer(i).data for i in self.progress_set.all()] + return [SecureProgressSerializer(i).data for i in self.progress_set.filter(is_freeze=False)] class UserProfileSerializer(serializers.ModelSerializer): @@ -101,3 +101,22 @@ class UserSearchSerializer(serializers.ModelSerializer): @staticmethod def get_last_request(self): return self.useractivity.last_request + + +class UserProgressSearchSerializer(serializers.ModelSerializer): + phone = serializers.SerializerMethodField() + progresses = serializers.SerializerMethodField() + + class Meta: + model = get_user_model() + fields = ('out_key', 'email', 'first_name', + 'last_name', 'phone', 'progresses') + + @staticmethod + def get_phone(self): + return None if self.account.phone is None else self.account.phone.raw_input + + @staticmethod + def get_progresses(self): + return [SupportProgressSerializer(i).data for i in self.progress_set.all()] + diff --git a/access/urls.py b/access/urls.py index 4198a6a..d445565 100644 --- a/access/urls.py +++ b/access/urls.py @@ -10,7 +10,6 @@ urlpatterns = [ url(r'detail/(?P[0-9A-Fa-f-]+)/$', views.DetailUserView.as_view()), url(r'detail/$', views.DetailUserView.as_view()), url(r'info/(?P[0-9A-Fa-f-]+)/$', views.MinUserView.as_view()), - url(r'guard/(?P[0-9]{1,99})/(?P.+)/$', progress.views.UserGuardView.as_view()), url(r'find/$', views.FindUserView.as_view()), url(r'registration/$', views.RegistrationView.as_view()), url(r'change_password/$', views.ChangePasswordView.as_view()), diff --git a/progress/migrations/0009_progress_is_freeze.py b/progress/migrations/0009_progress_is_freeze.py new file mode 100644 index 0000000..9b96892 --- /dev/null +++ b/progress/migrations/0009_progress_is_freeze.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2018-03-27 13:29 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('progress', '0008_auto_20180227_1803'), + ] + + operations = [ + migrations.AddField( + model_name='progress', + name='is_freeze', + field=models.BooleanField(default=False, verbose_name='Прохождение было преостановленно'), + ), + ] diff --git a/progress/models.py b/progress/models.py index 2a6e5dc..918ce8d 100644 --- a/progress/models.py +++ b/progress/models.py @@ -12,6 +12,7 @@ class Progress(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') course_token = models.UUIDField(verbose_name="Токен курса", editable=False) is_finish = models.BooleanField(verbose_name="Окончен ли курс", default=False) + is_freeze = models.BooleanField(verbose_name="Прохождение было преостановленно", default=False) only_watch = models.BooleanField(verbose_name="Только просмотр", default=False) def progress_status(self, sorted_token_list): diff --git a/progress/serializers.py b/progress/serializers.py index c2570e9..83d1ce6 100644 --- a/progress/serializers.py +++ b/progress/serializers.py @@ -17,6 +17,23 @@ class ProgressSerializer(serializers.ModelSerializer): return [ProgressLessonSerializer(i).data for i in self.progresslesson_set.all()] +class SupportProgressSerializer(serializers.ModelSerializer): + teacher_email = serializers.SerializerMethodField() + mod = serializers.SerializerMethodField() + + class Meta: + model = Progress + fields = ('id', 'course_token', 'mod', 'teacher_email', "is_freeze") + + @staticmethod + def get_teacher_email(self): + return self.teacher.email + + @staticmethod + def get_mod(self): + return "Без дз" if self.only_watch else "Стандарт" + + class SecureProgressSerializer(serializers.ModelSerializer): jwt_token = serializers.SerializerMethodField() diff --git a/progress/urls.py b/progress/urls.py index 44b7bd1..eeb675f 100644 --- a/progress/urls.py +++ b/progress/urls.py @@ -5,6 +5,9 @@ from progress import views urlpatterns = [ url(r'students/(?P[0-9A-Fa-f-]+)/$', views.StudentWorkView.as_view()), url(r'student/$', views.StudentUpdateProgress.as_view()), + url(r'find/$', views.FindProgressView.as_view()), + url(r'freeze/$', views.FreezeProgressView.as_view()), + url(r'change_teacher/$', views.ChangeTeacherView.as_view()), url(r'teacher/$', views.TeacherUpdateProgress.as_view()), url(r'set-progress/$', views.SetProgress.as_view()), url(r'get_hw_pay/$', views.get_teachers_pay), diff --git a/progress/views.py b/progress/views.py index 01513e8..35f680d 100644 --- a/progress/views.py +++ b/progress/views.py @@ -12,6 +12,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from django.db.models import Q +from access.serializers import UserProgressSearchSerializer from courses.models import Course from progress.models import ProgressLesson, Progress from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer, \ @@ -201,6 +202,13 @@ class StudentUpdateProgress(APIView): not pv.progress.progresslesson_set.filter(status=ProgressLesson.STATUSES.wait).exists(): pv.status = ProgressLesson.STATUSES.wait pv.comment_tokens.append(comment) + msg = EmailMessage( + 'Студент оставил комментарий', + '''Студент "%s" оставил вам комментарий.''' % request.user.get_full_name(), + 'robo@skillbox.ru', + [pv.cheker.email], + ) + msg.send() elif comment is None: return Response("Не преложен комментарий", status=400) @@ -248,36 +256,74 @@ class UploadCourseProgressUserView(APIView): return Response(status=403) -class UserGuardView(APIView): +class FindProgressView(APIView): + renderer_classes = (JSONRenderer,) + permission_classes = (IsAuthenticated,) + + @staticmethod + def get(request): + if not request.user.is_staff: + return Response("Только сотрудники персонала могут запрашивать инфо по прогрессу", status=403) + key = request.GET.get('key', None) + count = int(request.GET.get('count', '10')) + if key: + res = get_user_model().objects.filter( + Q(id__contains=key) | Q(email__contains=key.lower()) | Q(first_name__contains=key) | + Q(last_name__contains=key) | Q(account__phone__contains=key) + ) + + else: + res = get_user_model().objects.all() + + res = res[:(count if len(res) > count else len(res))] + return Response([UserProgressSearchSerializer(i).data for i in res], status=200) + + +class FreezeProgressView(APIView): renderer_classes = (JSONRenderer,) permission_classes = (IsAuthenticated,) @staticmethod - def get(request, pk, page): + def post(request): + if not request.user.is_staff: + return Response("Только сотрудники персонала могут вносить изменение в прогресс", status=403) + key = request.JSON.get('id', None) + is_freeze = request.JSON.get('is_freeze', False) + try: - user = get_user_model().objects.get(out_key=pk) - except get_user_model().DoesNotExist: - return Response("User doesn't exist", status=404) + p = Progress.objects.get(id=key) + p.is_freeze = is_freeze + p.save() + except Progress.DoesNotExist: + return Response("не найден прогресс по заданному id", status=404) - is_i = request.user == user - res_403 = Response('Permission denied', status=403) - res_204 = Response(status=204) + return Response(status=204) - if is_i and not request.user.groups.filter(name='teachers').exists() and page == 'homeworks': - return res_403 - if is_i and not \ - request.user.groups.filter(name__in=['students', 'managers', 'lead_managers']).exists() \ - and page == 'payment': - return res_403 +class ChangeTeacherView(APIView): + renderer_classes = (JSONRenderer,) + permission_classes = (IsAuthenticated,) - if is_i: - return res_204 + @staticmethod + def post(request): + if not request.user.is_staff: + return Response("Только сотрудники персонала могут вносить изменение в прогресс", status=403) + key = request.JSON.get('id', None) + teacher_email = request.JSON.get('teacher_email', False) - if page == 'profile' and (request.user.is_superuser or request.user.is_staff): - return res_204 + try: + p = Progress.objects.get(id=key) + try: + teacher = get_user_model().objects.get(email=teacher_email.lower()) + except get_user_model().DoesNotExist: + return Response("Нет пользователя c таким email", status=404) + p.teacher = teacher + p.progresslesson_set.filter(status=ProgressLesson.STATUSES.wait).update(checker=teacher) + p.save() + except Progress.DoesNotExist: + return Response("не найден прогресс по заданному id", status=404) - return res_403 + return Response(status=204) class SetProgress(APIView):