views.py 4.2 KB

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