From cfaf678a0a8587debccd0f7918766ec59ca41a20 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 8 Dec 2020 12:02:52 +0800 Subject: [PATCH] =?UTF-8?q?examtest=20=E8=80=83=E8=AF=95=E6=9C=BA=E4=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- safesite/exportemp/ks.docx | Bin 22259 -> 22115 bytes safesite/models.py | 4 +- safesite/templates/examtestadd.html | 4 + safesite/templates/examtestadd2.html | 4 + safesite/templates/examtestdetail.html | 29 ++++--- safesite/views.py | 113 ++++++------------------- 6 files changed, 53 insertions(+), 101 deletions(-) diff --git a/safesite/exportemp/ks.docx b/safesite/exportemp/ks.docx index b3aed00a895a966072b94af7eec51f715661fffe..d23d2c47c65f8657c7e740e0a16116e4822643c9 100644 GIT binary patch delta 8743 zcmZ9SWl)?;*RBV586(RP-}f0v$F1Elf&ZG~}Hq5ov6(DN8b};&e&~Ou1YZ zPpv(_=P?gLRtEx(F=@Fi5Gir}CDSHN>s4yoAFoA|I(AKACVTLM;nt|L@zw~K;FE|0 zUv%L79m^;iL51p9iHz3W1(wcFY+ZL&p3*GXdG+hO-McGR-&`#GA_&^RPY?pkR=dRS zPFbz$0PNN_&pED%2+?h4$5f@fMr%G#=O$aCx_!aU*Row6<(cz3%ZyUE(b`m-6sqs_ zX(xnb2O;;29o_Z*5o`kc9PgXKS=HphBiIxMT)#b*`LUikDl$V{Xe((F;finpuy{Wf z1Q@KWJ_Mkc@ghd6!XumTBE~2qGKLC>5z+XOrhG=n;l@-{L9|uL&DuvjZ&o4M*znva zI}g)p`($@~e&=Nm2XH#-X))(zc|-1_dBl!)T3yC9f!DvI;K^K@!VcF2&sSz*l)aO3 zorq|)clKO&zFm`EXbb(lDZMg~APt_AITJ#X@g3(S2_{H9JNsCh7r_sag5$rJqIf0% zHf}qF&yqD)Wc=b97p;V0eg^CpY(v3KK$9R&nb>$rAac<%6(;K71v;lKEbD2n0MH&W zLwVSPf)e0|4sg!kBntu~OP>xf5Cx(|xYT5n0S8b@V0ZNbM>IMAtT1rF0Yu#SunnW5 zycb9dDnR+_j>c}eUe#FBSy*e#f%G1L`4A!#&qeSYP50yHZyn`r!OnKX2K5V$ql@0e z0P2D%_&Ir4MZhbPSp?GUya-JJHG@Ogt>tJXS-&~jhH0CAM>V(?mM6+g@nf}{3XBoL z%yyJ+#5s9;2ZCnl8VMA(AgYuo@!Uvr+NgW;@;h0CH4#jAspoJ+R2#6A;a%GgurL*EgKVlk&9)1zdP8)Y9zjV|WhRd^l z-k|7r9@EYITOFt&pCnfM(|QBFZkAT}lV*Efs&2NEb}_`;yFJ_>IQ$7YNLW!7!2=|^ zHu?)gOb-SPQU+caV%CfIeQF4nSdTiE-5KAQStOr`a$~FkJ<>G_i2sRvhD!ld zRx)f�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 delta 8843 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 +
+ +
diff --git a/safesite/templates/examtestadd2.html b/safesite/templates/examtestadd2.html index abba88c8..fe267371 100644 --- a/safesite/templates/examtestadd2.html +++ b/safesite/templates/examtestadd2.html @@ -41,6 +41,10 @@
+
+ +
diff --git a/safesite/templates/examtestdetail.html b/safesite/templates/examtestdetail.html index ea617e52..67c0fe3a 100644 --- a/safesite/templates/examtestdetail.html +++ b/safesite/templates/examtestdetail.html @@ -85,6 +85,9 @@ 用时(s) + + 考试次数 + 答题详情 @@ -99,18 +102,25 @@ {{$value.id}} {{$value.user__name}} {{$value.user__ubelongpart__partname}} - {{if $value.ison==0}} - 可参加 - {{else}} - 已参加 - {{/if}} + + {{if $value.testnum > 0}} + 已考 + {{else}} + 未考 + {{/if}} + + {{if $value.remainnum > 0 && state==1}} + -可考 + {{/if}} + + {{$value.score}} {{$value.starttime}} {{$value.took}} - + {{$value.testnum}} 点击查看 - {{if $value.passcode==0&&$value.ison==1&&state==1}} - + {{if $value.passcode==0&&$value.remainnum==0&&state==1}} + {{else}} {{/if}} @@ -168,12 +178,11 @@ async: false, // ajax同步使用false success: function (data) { var cjrydetail = data.cjrydetail - console.log(cjrydetail) data['yingkrs'] = cjrydetail.length //应考人数 var x = 0 var y = 0 for(var i=0;i0){ x = x +1 if(cjrydetail[i].passcode==1){ y = y +1 diff --git a/safesite/views.py b/safesite/views.py index e6119923..24758a8f 100644 --- a/safesite/views.py +++ b/safesite/views.py @@ -5018,70 +5018,6 @@ def apitool(req): if created: print(i.partname + '建立默认地图') return JsonResponse({"code":1}) - elif a == 'panjuan': - test = ExamTest.objects.get(id=req.GET.get('test')) - answers = ExamPaperDetail.objects.filter(exampaper=test.exampaper).values('id', 'question__right') - answersdict = {} - for i in answers: - answersdict['paperdetail' + str(i['id'])] = i['question__right'] - panjuanlist = ExamTestDetail.objects.filter(examtest=test) - num = 0 - for obj in panjuanlist: - tms = [] - wrongs = [] - rights = 0 - testdetail = obj.testdetail - if testdetail: - score = 0 - for i in testdetail: # 判卷 - iscore = 0 - i['question__right'] = answersdict['paperdetail'+str(i['id'])] - if i['question__type'] == 2: - if 'userchecked' in i: - if i['userchecked']: - if set(i['userchecked']) == set(i['question__right']): - iscore = i['score'] - rights = rights + 1 - else: - miniscore = i['score']/len(i['question__right']) - wrongs.append(str(i['question__id'])) - for x in i['userchecked']: - if x in i['question__right']: - iscore = iscore + miniscore - else: - iscore = 0 - break - else: - if 'userchecked' in i: - if i['userchecked']: - if i['userchecked'] == i['question__right']: - iscore = i['score'] - rights = rights + 1 - else: - wrongs.append(str(i['question__id'])) - i['iscore'] = iscore - score = score + iscore - tms.append(str(i['question__id'])) - obj.testdetail = testdetail - obj.rights = rights - score = round(score,1) - obj.score = score - obj.ison = 1 - totalscore = test.totalscore - passscore = test.passscore - if score >= passscore: - passcode = 1 - else: - passcode = 0 - obj.passcode = passcode - if tms: - obj.tms = ','+','.join(tms)+',' - if wrongs: - obj.wrongs = ','+','.join(wrongs)+',' - obj.save() - num = num + 1 - print(str(num) + obj.examtest.name + obj.user.name + '得分' + str(score)) - return JsonResponse({"code":1}) elif a == 'correct_tzzs': updateTzzs() return JsonResponse({"code":1}) @@ -6176,7 +6112,7 @@ def apiexamtest(req): if state == 'close': a = a.filter(state=0) if owner == 'yes': - ownerlist = ExamTestDetail.objects.filter(user__userid=userid, examtest__state=1,ison=0).values_list('examtest__id',flat=True) + ownerlist = ExamTestDetail.objects.filter(user__userid=userid, examtest__state=1,testnum=0).values_list('examtest__id',flat=True) a = a.filter(Q(id__in=ownerlist)|Q(ispublic=1)) a = a.order_by('-id') total = a.count() @@ -6222,8 +6158,8 @@ def apiexamtest(req): obj.passscore = data['passscore'] obj.duration = data['duration'] obj.createuser = User.objects.get(userid=userid) - if 'retest_count' in data and data['retest_count']: - obj.retest_count = data['retest_count'] + if 'testnum' in data and data['testnum']: + obj.testnum = data['testnum'] obj.save() obj.qrcode = makeqr_examtest( 'https://safeyun.ctcshe.com/miniprogram/examtest?id='+str(obj.id)) @@ -6233,7 +6169,7 @@ def apiexamtest(req): b = [] for i in ksry: uobj = User.objects.get(userid=i) - ExamTestDetail.objects.create(examtest=obj, user=uobj) + ExamTestDetail.objects.create(examtest=obj, user=uobj, remainnum = obj.testnum) b.append(uobj.openid) postdict = { 'touser': '', @@ -6319,8 +6255,8 @@ def apiexamtest(req): obj.ispublic = 1 else: obj.ispublic = 0 - if 'retest_count' in data and data['retest_count']: - obj.retest_count = data['retest_count'] + if 'testnum' in data and data['testnum']: + obj.testnum = data['testnum'] obj.save() obj.qrcode = makeqr_examtest( 'https://safeyun.ctcshe.com/miniprogram/examtest?id='+str(obj.id)) @@ -6330,7 +6266,7 @@ def apiexamtest(req): b = [] for i in ksry: uobj = User.objects.get(userid=i) - ExamTestDetail.objects.create(examtest=obj, user=uobj) + ExamTestDetail.objects.create(examtest=obj, user=uobj, remainnum = obj.testnum) b.append(uobj.openid) postdict = { 'touser': '', @@ -6379,36 +6315,36 @@ def apiexamtest(req): elif a == 'detail2': id = req.GET.get('id') a = ExamTest.objects.filter(id=id).values('id', 'num', 'name', 'starttime', 'endtime', 'duration', 'totalscore', - 'passscore', 'exampaper__total', 'createtime', 'state', 'exampaper__name', 'createuser__name', 'type', 'qrcode', 'retest_count')[0] + 'passscore', 'exampaper__total', 'createtime', 'state', 'exampaper__name', 'createuser__name', 'type', 'qrcode', 'testnum')[0] a['notinTime'] = 0 if a['starttime'] > datetime.now(): a['notinTime'] = 1 if 'endtime' in a and a['endtime'] < datetime.now(): a['notinTime'] = 1 objs = ExamTestDetail.objects.filter(examtest__id=id).order_by('-score','-took').values( - 'id', 'user__name', 'user__ubelongpart__partname', 'took', 'score', 'ison', 'passcode','starttime', 'testnum') + 'id', 'user__name', 'user__ubelongpart__partname', 'took', 'score', 'remainnum', 'passcode','starttime', 'testnum') a['cjrydetail'] = list(objs) - a['ison'] = 0 + a['remainnum'] = 0 a['testnum'] = 0 queryset = ExamTestDetail.objects.filter(examtest__id=id,user__userid=userid) if queryset.exists(): - a['ison'] = queryset[0].ison + a['remainnum'] = queryset[0].remainnum a['testnum'] = queryset[0].testnum return HttpResponse(json.dumps(a, cls=MyEncoder), content_type="application/json") elif a == 'detail': id = req.GET.get('id') a = ExamTest.objects.filter(id=id).values('id', 'num', 'name', 'starttime', 'endtime', 'duration', 'totalscore', - 'passscore', 'exampaper__total', 'createtime', 'state', 'exampaper__name', 'createuser__name', 'type', 'qrcode', 'retest_count')[0] + 'passscore', 'exampaper__total', 'createtime', 'state', 'exampaper__name', 'createuser__name', 'type', 'qrcode', 'testnum')[0] a['notinTime'] = 0 if a['starttime'] > datetime.now(): a['notinTime'] = 1 if 'endtime' in a and a['endtime'] < datetime.now(): a['notinTime'] = 1 - a['ison'] = 0 + a['remainnum'] = 0 a['testnum'] = 0 queryset = ExamTestDetail.objects.filter(examtest__id=id,user__userid=userid) if queryset.exists(): - a['ison'] = queryset[0].ison + a['remainnum'] = queryset[0].remainnum a['testnum'] = queryset[0].testnum return HttpResponse(json.dumps(a, cls=MyEncoder), content_type="application/json") elif a == 'detailtm': @@ -6427,7 +6363,7 @@ def apiexamtest(req): a = ExamTest.objects a = a.filter(usecomps__contains=','+companyid + #未关闭的考试 ',').exclude(nousecomps__contains=','+companyid+',').filter(state=1,endtime__gte=datetime.now()) - ownerlist = ExamTestDetail.objects.filter(user__userid=userid, examtest__state=1,ison=0).values_list('examtest__id',flat=True) + ownerlist = ExamTestDetail.objects.filter(user__userid=userid, examtest__state=1,testnum=0).values_list('examtest__id',flat=True) dknum = a.filter(Q(id__in=ownerlist)|Q(ispublic=1)).count() return JsonResponse({"code":1, "dknum":dknum}) @@ -6439,14 +6375,13 @@ def apiexamtestdetail(req): companyid = getcompany(userid) if a == 'dknum': a = ExamTestDetail.objects - a = a.filter(user__userid=userid, examtest__state=1, - ison=0, examtest__endtime__gte=datetime.now()) + a = a.filter(user__userid=userid, examtest__state=1, testnum=0 , examtest__endtime__gte=datetime.now()) dknum = a.count() return JsonResponse({"code": 1, "dknum": dknum}) elif a == 'listdk': a = ExamTestDetail.objects a = a.filter(user__userid=userid, examtest__state=1, - ison=0).order_by('-id') + testnum=0).order_by('-id') total = a.count() startnum, endnum = fenye(req) a = a[startnum:endnum].values('id', 'examtest__id', 'examtest__name', 'examtest__starttime', @@ -6462,23 +6397,22 @@ def apiexamtestdetail(req): return HttpResponse(transjson(total, a), content_type="application/json") elif a == 'listyk': a = ExamTestDetail.objects - a = a.filter(user__userid=userid).exclude(ison=0) + a = a.filter(user__userid=userid).exclude(testnum=0) total = a.count() startnum, endnum = fenye(req) a = a.order_by('-starttime')[startnum:endnum].values('id', 'examtest__id', 'examtest__name', 'starttime', 'examtest__passscore', - 'examtest__state', 'ison', 'examtest__duration', 'took', 'score', 'passcode') + 'examtest__state', 'testnum', 'examtest__duration', 'took', 'score', 'passcode', 'remainnum') return HttpResponse(transjson(total, a), content_type="application/json") elif a == 'handtest': data = json.loads(req.body.decode('utf-8')) testid = data['testid'] examtestobj = ExamTest.objects.get(id=testid) obj,created = ExamTestDetail.objects.get_or_create(examtest = examtestobj, user__userid=userid, - defaults={'examtest': examtestobj,'user':User.objects.get(userid=userid)}) + defaults={'examtest': examtestobj,'user':User.objects.get(userid=userid), 'remainnum':examtestobj.testnum}) starttime = data['starttime'] endtime = datetime.now() took = (endtime - datetime.strptime(starttime, '%Y-%m-%d %H:%M:%S')).total_seconds() #计算相差多少秒 testdetail = data['sheet'] - obj.ison = 1 obj.testdetail = testdetail obj.save() score = 0 @@ -6519,6 +6453,7 @@ def apiexamtestdetail(req): score = score + iscore tms.append(str(i['question__id'])) obj.testnum = obj.testnum + 1 + obj.remainnum = obj.remainnum - 1 if obj.remainnum >= 1 else 0 obj.starttime = starttime obj.endtime = endtime obj.took = took @@ -6558,7 +6493,7 @@ def apiexamtestdetail(req): a = ExamTest.objects.get(id=id) if a.createuser==user: objss = ExamTestDetail.objects.get(id=examdlid) - objss.ison=0 + objss.remainnum= objss.remainnum + 1 objss.save() return JsonResponse({"code":1,"msg":"发布成功!"}) else: @@ -6593,14 +6528,14 @@ def apiexamtestrate(req): ''' companyid = req.GET.get('companyid') alltest = ExamTest.objects.filter(usecomps__contains=','+str(companyid)+',').exclude(nousecomps__contains=','+str(companyid)+',') - allexamtestdetail = ExamTestDetail.objects.filter(examtest__in=alltest,ison=1) + allexamtestdetail = ExamTestDetail.objects.filter(examtest__in=alltest,testnum__gte=1) objs = allexamtestdetail.values('user__userid','user__name','user__headimgurl','user__ubelongpart__partname').annotate(totalscore=Sum('score'),totaltook=Sum('took'),testnum=Count('user__userid')).order_by('-totalscore','totaltook') total = objs.count() objslist = list(objs) for i in objslist: i['rate'] = objslist.index(i) + 1 i['avgscore'] = round(i['totalscore']/i['testnum'],1) - orgsCal = allexamtestdetail.filter(score__gt=0,ison__gt=0).values('user__ubelongpart__partid','user__ubelongpart__partname').annotate(totaltest=Count('user__ubelongpart__partid'),avgscore=Avg('score')).order_by('-totaltest','-avgscore') + orgsCal = allexamtestdetail.filter(score__gt=0,testnum__gte=1).values('user__ubelongpart__partid','user__ubelongpart__partname').annotate(totaltest=Count('user__ubelongpart__partid'),avgscore=Avg('score')).order_by('-totaltest','-avgscore') allattenduser = allexamtestdetail.values_list('user__userid', flat=True) orgsCallist = list(orgsCal) for i in orgsCallist: