views.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # coding=utf-8
  2. import json
  3. from django.utils import timezone
  4. from django.db import transaction
  5. from rest_framework.viewsets import ReadOnlyModelViewSet
  6. from rest_framework.decorators import action
  7. from utils.permission import IsAdministrator
  8. from utils import response_error, response_ok
  9. from utils.custom_modelviewset import CustomModelViewSet
  10. from utils.exceptions import CustomError
  11. from apps.system.models import SysLog
  12. from apps.examination.exampaper.models import ExamPaper
  13. from apps.examination.exampaper.serializers import ExamPaperSerializer
  14. from apps.examination.exam.models import Exam, ExamLog, ExamAnswerLog
  15. from apps.examination.exam.filters import ExamFilter, FormalExamLogFilter
  16. from apps.examination.exam.serializers import ExamSerializer, FormalExamLogSerializer
  17. class ExamViewSet(CustomModelViewSet):
  18. permission_classes = [IsAdministrator, ]
  19. queryset = Exam.objects.filter(delete=False)
  20. serializer_class = ExamSerializer
  21. def filter_queryset(self, queryset):
  22. f = ExamFilter(self.request.GET, queryset=queryset)
  23. return f.qs
  24. def perform_create(self, serializer):
  25. super(ExamViewSet, self).perform_create(serializer)
  26. instance = serializer.instance
  27. validated_data = serializer.validated_data
  28. SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加考试[%s],id=%d' % (instance.name, instance.id), validated_data)
  29. def perform_update(self, serializer):
  30. super(ExamViewSet, self).perform_update(serializer)
  31. instance = serializer.instance
  32. validated_data = serializer.validated_data
  33. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改考试[%s],id=%d' % (instance.name, instance.id), validated_data)
  34. def destroy(self, request, *args, **kwargs):
  35. with transaction.atomic():
  36. instance = self.get_object()
  37. instance.delete = True
  38. instance.save()
  39. SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除考试[%s],id=%d' % (instance.name, instance.id))
  40. return response_ok()
  41. @action(methods=['post'], detail=True)
  42. def add_examinee(self, request, pk):
  43. user_ids = json.loads(request.POST.get('user_ids'))
  44. with transaction.atomic():
  45. exam = Exam.getById(pk)
  46. if timezone.now() > exam.exam_time:
  47. raise CustomError(u'考试已经开始,禁止修改!')
  48. exam.change_examinee(user_ids)
  49. exam.save()
  50. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'添加参考人员,id=%d' % exam.id, request.POST.get('user_ids'))
  51. return response_ok()
  52. @action(methods=['post'], detail=True)
  53. def allocation_fixed_exampaper(self, request, pk):
  54. exampaper_id = request.POST.get('exampaper_id')
  55. with transaction.atomic():
  56. exam = Exam.getById(pk)
  57. if timezone.now() > exam.exam_time:
  58. raise CustomError(u'考试已经开始,禁止修改!')
  59. exampaper = ExamPaper.getById(exampaper_id)
  60. exam.allocation_exampaper(Exam.FIXED, exampaper)
  61. exam.save()
  62. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'分配固定试卷,id=%d' % exam.id, request.POST.get('exampaper_id'))
  63. return response_ok()
  64. @action(methods=['post'], detail=True)
  65. def allocation_random_exampaper(self, request, pk):
  66. data = request.data.copy()
  67. with transaction.atomic():
  68. exam = Exam.getById(pk)
  69. if timezone.now() > exam.exam_time:
  70. raise CustomError(u'考试已经开始,禁止修改!')
  71. data['name'] = exam.name
  72. data['type'] = ExamPaper.RANDOM
  73. data['passline'] = 0
  74. exampaper_serializer = ExamPaperSerializer(data=data, context={'request': request})
  75. exampaper_serializer.is_valid(raise_exception=True)
  76. exampaper = exampaper_serializer.save()
  77. exampaper.generate_passline()
  78. exampaper.save()
  79. exam.allocation_exampaper(Exam.RANDOM, exampaper)
  80. exam.save()
  81. data['id'] = exampaper.id
  82. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'分配随机试卷,id=%d' % exam.id, data)
  83. return response_ok()
  84. @action(methods=['get'], detail=True)
  85. def examinee(self, request, pk):
  86. result = []
  87. rows = ExamLog.objects.filter(exam_id=pk, delete=False).values('user_id', 'user__username','user__name', 'user__department__name')
  88. for row in rows:
  89. item = {
  90. 'id':row['user_id'],
  91. 'username': row['user__username'],
  92. 'name': row['user__name'],
  93. 'department_text': row['user__department__name'],
  94. }
  95. result.append(item)
  96. return response_ok(result)
  97. class ExamLogViewSet(ReadOnlyModelViewSet):
  98. permission_classes = [IsAdministrator, ]
  99. queryset = ExamLog.objects.filter(type=ExamLog.FORMAL, delete=False)
  100. serializer_class = FormalExamLogSerializer
  101. def filter_queryset(self, queryset):
  102. f = FormalExamLogFilter(self.request.GET, queryset=queryset)
  103. return f.qs
  104. @action(methods=['get'], detail=True)
  105. def answer_log(self, request, pk):
  106. rows = ExamAnswerLog.objects.filter(main_id=pk).order_by('detail__order').values_list('status', flat=True)
  107. return response_ok(list(rows))
  108. @action(methods=['get'], detail=False)
  109. def export(self, request):
  110. queryset = self.filter_queryset(self.queryset)
  111. serializer = self.get_serializer(queryset, many=True)
  112. return response_ok(serializer.data)