views.py 4.9 KB

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