# coding=utf-8 import json from django.db import transaction from rest_framework.decorators import action from utils.permission import IsAdministrator from utils import response_error, response_ok from utils.custom_modelviewset import CustomModelViewSet from apps.system.models import SysLog from apps.examination.exampaper.models import ExamPaper from apps.examination.exampaper.serializers import ExamPaperSerializer from apps.examination.exam.models import Exam, ExamLog from apps.examination.exam.filters import ExamFilter from apps.examination.exam.serializers import ExamSerializer class ExamViewSet(CustomModelViewSet): permission_classes = [IsAdministrator, ] queryset = Exam.objects.filter(delete=False) serializer_class = ExamSerializer def filter_queryset(self, queryset): f = ExamFilter(self.request.GET, queryset=queryset) return f.qs def perform_create(self, serializer): super(ExamViewSet, self).perform_create(serializer) instance = serializer.instance validated_data = serializer.validated_data SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加考试[%s],id=%d' % (instance.name, instance.id), validated_data) def perform_update(self, serializer): super(ExamViewSet, self).perform_update(serializer) instance = serializer.instance validated_data = serializer.validated_data SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改考试[%s],id=%d' % (instance.name, instance.id), validated_data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() instance.delete = True instance.save() SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除考试[%s],id=%d' % (instance.name, instance.id)) return response_ok() @action(methods=['post'], detail=True) def add_examinee(self, request, pk): user_ids = json.loads(request.POST.get('user_ids')) with transaction.atomic(): exam = Exam.getById(pk) exam.change_examinee(user_ids) exam.save() SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'添加考生,id=%d' % exam.id, request.POST.get('users')) return response_ok() @action(methods=['post'], detail=True) def allocation_fixed_exampaper(self, request, pk): exampaper_id = json.loads(request.POST.get('exampaper_id')) with transaction.atomic(): exam = Exam.getById(pk) exampaper = ExamPaper.getById(exampaper_id) exam.allocation_exampaper(Exam.FIXED, exampaper) exam.save() SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'分配固定试卷,id=%d' % exam.id, request.POST.get('exampaper_id')) return response_ok() @action(methods=['post'], detail=True) def allocation_random_exampaper(self, request, pk): data = request.data with transaction.atomic(): exam = Exam.getById(pk) data['name'] = exam.name data['type'] = ExamPaper.RANDOM data['passline'] = 0 exampaper_serializer = ExamPaperSerializer(data=data, context={'request': request}) exampaper_serializer.is_valid(raise_exception=True) exampaper = exampaper_serializer.save() exampaper.generate_passline() exampaper.save() exam.allocation_exampaper(Exam.RANDOM, exampaper) exam.save() data['id'] = exampaper.id SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'分配随机试卷,id=%d' % exam.id, data) return response_ok() @action(methods=['get'], detail=True) def examinee(self, request, pk): result = [] rows = ExamLog.objects.filter(exam_id=pk, delete=False).values('user_id', 'user__username', 'user__department__name') for row in rows: item = { 'id':row['user_id'], 'username': row['user__username'], 'department_name': row['user__department__name'], } result.append(item) return response_ok(result)