liu tao 3 роки тому
батько
коміт
4cf0dd52cb

+ 63 - 3
apps/api/admin/exam/views.py

@@ -1,13 +1,16 @@
 # coding=utf-8
 
+import json
 from django.db import transaction
-from rest_framework.views import APIView
+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.exam.models import Exam
+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
 
@@ -38,4 +41,61 @@ class ExamViewSet(CustomModelViewSet):
             instance.delete = True
             instance.save()
             SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除考试[%s],id=%d' % (instance.name, instance.id))
-        return response_ok()
+        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()
+            SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'分配随机试卷,id=%d' % exam.id, request.POST.get('exampaper_id'))
+        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)

+ 48 - 1
apps/examination/exam/models.py

@@ -4,6 +4,8 @@ from django.db import models
 from django.utils import timezone
 from django.conf import settings
 
+from utils.exceptions import CustomError
+
 from apps.foundation.models import Subject
 from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
 from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
@@ -37,6 +39,50 @@ class Exam(models.Model):
         verbose_name = u"考试管理"
         default_permissions = ()
 
+    @staticmethod
+    def getById(id):
+        instance = Exam.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的考试')
+        return instance
+
+    def allocation_exampaper(self, type, exampaper_instance):
+        self.type = type
+        self.subject_id = exampaper_instance.subject_id
+        self.exampaper = exampaper_instance
+
+        ExamLog.objects.filter(exam=self, delete=False).update(exampaper_id=exampaper_instance.id)
+
+    def change_examtime(self):
+        ExamLog.objects.filter(exam=self, delete=False).update(exam_time=self.exam_time)
+
+    def change_examinee(self, new_user_ids):
+        old_user_ids = ExamLog.objects.filter(exam=self, delete=False).values_list('user_id', flat=True)
+        user_adds = [val for val in new_user_ids if val not in old_user_ids]
+        user_deletes = [val for val in old_user_ids if val not in new_user_ids]
+        if user_deletes:
+            self._remove_examinee(user_deletes)
+        if user_adds:
+            self._add_examinee(user_adds)
+        self.examinee_count = ExamLog.objects.filter(exam=self, delete=False).count()
+
+    def _remove_examinee(self, user_ids):
+        ExamLog.objects.filter(exam=self, user_id__in=user_ids).update(delete=True)
+
+    def _add_examinee(self, user_ids):
+        data = []
+        for user_id in user_ids:
+            item = ExamLog(
+                type=ExamLog.FORMAL,
+                exam=self,
+                exampaper=self.exampaper,
+                user_id=user_id,
+                exam_time=self.exam_time
+            )
+            data.append(item)
+
+        ExamLog.objects.bulk_create(data)
+
 class ExamLog(models.Model):
     MOCK = 1
     FORMAL = 2
@@ -48,7 +94,7 @@ class ExamLog(models.Model):
 
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
     exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
-    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
+    exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", null=True, blank=True, on_delete=models.PROTECT)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'参加人员', on_delete=models.PROTECT)
 
     scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
@@ -65,6 +111,7 @@ class ExamLog(models.Model):
     multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
     fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
     judgment_answer_count = models.IntegerField(verbose_name=u'判断题答对数', default=0, editable=False)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
 
     class Meta:
         db_table = "exam_log"

+ 2 - 0
apps/examination/exam/serializers.py

@@ -22,4 +22,6 @@ class ExamSerializer(serializers.ModelSerializer):
         if instance.delete:
             raise CustomError(u'考试[%s]已经被删除,禁止操作' % instance.name)
         instance = super(ExamSerializer, self).update(instance, validated_data)
+        instance.change_examtime()
+        instance.save()
         return instance

+ 10 - 0
apps/examination/exampaper/models.py

@@ -67,6 +67,16 @@ class ExamPaper(models.Model):
         verbose_name = u"试卷管理"
         default_permissions = ()
 
+    @staticmethod
+    def getById(id):
+        instance = ExamPaper.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的试卷')
+        return instance
+
+    def generate_passline(self):
+        self.passline = int(self.question_total_scores * 0.6)
+
     def clear_detail(self):
         ExamPaperDetail.objects.filter(main=self).update(delete=True)