from django.utils.translation import gettext as _ from django.utils import timezone from rest_framework.response import Response from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.exceptions import NotFound from university.api.base import Endpoint from university.api.bases.exam import ExamEndpoint from university.models import Exam, Badge, OnlineExam from university.forms import ExamRegistrateForm, ExamEnrollForm class ExamListEndpoint(Endpoint): permission_classes = (AllowAny, ) def get(self, request, *args, **kwargs): exams = [{ 'id': exam.id, 'name': exam.name, 'description': exam.description, 'price': exam.price, 'registration_start': exam.registration_start.strftime('%Y-%m-%d %H:%M:%S'), 'registration_deadline': exam.registration_deadline.strftime('%Y-%m-%d %H:%M:%S'), 'venues': exam.venues, 'exam_times': exam.exam_times, 'required': exam.required_permissions_desc } for exam in Exam.objects.all()] return Response({ 'detail': _('success'), 'datas': { 'notice': '**日期:** 2020 年 9 月 26 日(暂定) \n**城市:** 北京、上海、深圳,具体考点 9 月 16 日前通知 \n**时间:** \n上午 10:00 - 11:00 PCTA \n下午 13:30 - 14:45 PCTP 理论 \nPCTP 上机考试将调整为一个季度进行一次', 'exams': exams } }) class ExamDetailEndpoint(ExamEndpoint): permission_classes = (AllowAny, ) def get(self, request, *args, **kwargs): exam = kwargs['exam'] return Response({ 'detail': _('success'), 'datas': { 'id': exam.id, 'name': exam.name, 'description': exam.description, 'price': exam.price, 'registration_start': exam.registration_start.strftime('%Y-%m-%d %H:%M:%S'), 'registration_deadline': exam.registration_deadline.strftime('%Y-%m-%d %H:%M:%S'), 'venues': exam.venues, 'exam_times': exam.exam_times, 'required': exam.required_permissions_desc } }) class RegistrationCheckEndpoint(ExamEndpoint): permission_classes = (IsAuthenticated, ) def get(self, request, *args, **kwargs): exam = kwargs['exam'] user = request.user is_permitted = True is_registrated = False required = [] missed_badges = set(exam.required_badges) \ - set(user.userbadge_set.values_list('id', flat=True)) if missed_badges: is_permitted = False required = Badge.objects.filter(id__in=missed_badges)\ .values_list('description', flat=True) if user.userexam_set.filter(exam=exam).exists(): is_registrated = True return Response({ 'detail': _('success'), 'datas': { 'is_registrated': is_registrated, 'is_permitted': is_permitted, 'required': required } }) class RegistrateEndpoint(ExamEndpoint): permission_classes = (IsAuthenticated, ) def post(self, request, *args, **kwargs): form = ExamRegistrateForm(user=request.user, exam=kwargs['exam'], data=request.data) if not form.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': form.errors, 'is_permitted': form.is_permitted, 'required': form.required }, status=400) form.save() return Response({ 'detail': _('success') }) class ExamPCTAEnrollEndpoint(Endpoint): permission_classes = (IsAuthenticated, ) def convert_args(self, request, exam_flag, *args, **kwargs): if exam_flag not in ['PCTA', 'PCTP']: raise NotFound kwargs['exam_flag'] = exam_flag return (args, kwargs) def get(self, request, exam_flag, *args, **kwargs): available_sessions = [] now = timezone.now() for exam in OnlineExam.objects.filter( flag=exam_flag, registration_deadline__gt=now): exam_start_at = timezone.localtime(exam.start_at) exam_end_at = timezone.localtime(exam.end_at) available_sessions.append({ 'display': '{} ~ {}'.format( exam_start_at.strftime('%Y年%m月%d日 %H:%M'), exam_end_at.strftime('%H:%M')), 'start_at': exam_start_at.strftime('%Y-%m-%d %H:%M:%S%z'), 'end_at': exam_end_at.strftime('%Y-%m-%d %H:%M:%S%z'), 'exam_id': exam.id }) return Response({ 'detail': _('success'), 'data': { 'available_sessions': available_sessions } }) def post(self, request, exam_flag, *args, **kwargs): form = ExamEnrollForm( exam_flag=exam_flag, user=request.user, data=request.data) if not form.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': form.errors, }, status=400) form.save() return Response({ 'detail': _('success') })