Ejemplo n.º 1
0
def test_manage(request):
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown method ' + request.method}
    # GET method means getting test problems
    if request.method == 'GET':
        # TODO: send the test generated back to student
        paperid = request.GET.get('paperid')
        db = Paper.objects.get(pid=paperid)
        paper_pro = json.loads(db.prolist)
        test = ph.Paper2Test(paper_pro)
        ###
        subcount = TestRecord.objects.filter(paperid=paperid).count()
        test_info = json.dumps(claPaper(db.pid, db.pname, db.teaname,
                                        db.penabled, 'notused', 'notused',
                                        str(subcount)),
                               default=lambda o: o.__dict__,
                               sort_keys=True)
        test_info = json.loads(test_info)
        #print(test)
        ret = {'code': 200, 'info': 'ok', 'test': test, 'test_info': test_info}

    # POST method means submitting answers
    elif request.method == 'POST':
        postjson = jh.post2json(request)
        #print(postjson)
        # given postjson and get the new json with only answer, id, type, point
        answers = ph.ExtractAnswers(postjson['test'])
        #print(answers)
        answers = json.dumps(answers)
        stuname = request.session['login_name']
        paperid = postjson['paperid']
        if TestRecord.objects.filter(Q(stuid=stuname)
                                     & Q(paperid=paperid)).count() > 0:
            ret = {
                'code': 403,
                'info': 'already exists',
                'stu': stuname,
                'pname': postjson['pname']
            }
        else:
            db = TestRecord(paperid=paperid,
                            stuid=stuname,
                            submit_time=time.strftime(
                                '%Y-%m-%d %H:%M:%S',
                                time.localtime(time.time())),
                            answers=answers,
                            keguan_grade=-1,
                            keguan_detail='',
                            zhuguan_grade=-1,
                            zhuguan_detail='',
                            total_score=-1)
            db.save()
            ret = {
                'code': 200,
                'info': 'ok',
                'stu': stuname,
                'pname': postjson['pname']
            }

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 2
0
def judge_manage(request):
    ret = {'code': 200, 'info': 'ok'}
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    if action == 'getans':
        ret = {'code': 200, 'info': 'ok'}
        # build the list of all students' answers
        retlist = []
        db = TestRecord.objects.filter(paperid=paperid)
        for var in db:
            retlist.append(
                claRecord(var.paperid, var.stuid, var.submit_time, var.answers,
                          var.keguan_grade, var.keguan_detail,
                          var.zhuguan_grade, var.zhuguan_detail,
                          var.total_score, 'no'))
        jsonarr = json.dumps(retlist,
                             default=lambda o: o.__dict__,
                             sort_keys=True)
        loadarr = json.loads(jsonarr)
        ret = {'code': 200, 'info': 'ok', 'anslist': loadarr}
        ###

    elif action == 'delans':
        # delete the specified answer sheet from records
        stuname = postjson['stuname']
        TestRecord.objects.filter(Q(stuid=stuname)
                                  & Q(paperid=paperid)).delete()
        ret = {'code': 200, 'info': 'ok'}
        ###

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 3
0
def judge_keguan(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action ' + action}

    if action == 'judge_keguan':
        # take out each submit and compare with normal answer
        # then save the result into the model.
        print("paperId is" + paperid)
        paper = Paper.objects.get(pid=paperid)
        answerlist = TestRecord.objects.filter(Q(paperid=paperid) & Q(confirmed='no'))
        for var in answerlist:
            # print(var.answers)
            score = ph.JudgeKeguan(json.loads(var.answers), json.loads(paper.prolist))
            # print(score)
            record = TestRecord.objects.get(Q(stuid=var.stuid) & Q(paperid=paperid) & Q(confirmed='no'))
            record.keguan_grade = json.dumps(score['score'])
            record.keguan_detail = json.dumps(score['detail'])
            record.save()
            pass
        ret = {'code': 200, 'info': 'ok'}
        ###
        pass

    elif action == 'clean_keguan':
        answerlist = TestRecord.objects.filter(Q(paperid=paperid)
                                               & Q(confirmed='no')).update(keguan_grade=-1, keguan_detail="")
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 4
0
def modify_pro (request):
    postjson = jh.post2json(request)
    storeid = postjson['storeid']
    print("storeid",storeid)
    store = Teststore.objects.filter(storeid=storeid)
    prolist = json.loads(store[0].prolist)

    type = postjson['modify_type']
    degree = postjson['modify_degree']

    truelist = []
    dlist = {'简单':1,'中等':2,'困难':3}
    tlist = {'主观题':'zhuguan','客观题':'keguan'}

    for pro in prolist['question_list']:
        if pro['degree'] == dlist[degree] and pro['type'] == tlist[type] :
            truelist.append(pro.copy())

    ranlist = list(range(0,len(truelist)))
    print(len(truelist))
    random.shuffle(ranlist)
    retlist = [truelist[ranlist[0]],truelist[ranlist[1]],truelist[ranlist[2]]]
    dlist = ['','简单', '中等', '困难']
    for pro in retlist:
        pro['degree']=dlist[pro['degree']]
    ret = {'code': 200, 'prolist': retlist}
    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 5
0
def modify_paper_prolist(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    ret = {'code': 404, 'info': 'unknown action ' + action}
    ph = PaperHelper()
    sh = StoreHelper()

    if action == 'addpro':
        # add problem given in POST packet to paper
        paperid = postjson['paperid']
        problem = postjson['problem']
        # fetch original problem list from database
        paperdb = Paper.objects.get(pid=paperid)
        original_prolist = json.loads(paperdb.prolist)
        ph.AddPro(original_prolist, problem["problem"], problem["ptype"], problem["point"],
                  problem["right"], problem["wrong1"], problem["wrong2"], problem["wrong3"])
        paperdb.prolist = json.dumps(original_prolist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok'}

    elif action == 'add_from_store':
        # add problem given in POST packet to paper
        paperid = postjson['paperid']
        problem = postjson['problem']
        store = postjson['storeid']
        newpro = postjson['newpro']
        # fetch original problem list from database
        paperdb = Paper.objects.get(pid=paperid)
        storedb = Teststore.objects.get(storeid=store)
        original_prolist = json.loads(paperdb.prolist)
        storeprolist = json.loads(storedb.prolist)
        question = sh.GetPro(storeprolist, problem)
        ph.AddPro(original_prolist, question["problem"], question["type"], newpro["point"],
                  question["right"], question["wrong1"], question["wrong2"], question["wrong3"])
        paperdb.prolist = json.dumps(original_prolist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok'}

    elif action == 'delpro':
        # delete problem given in POST packet from paper
        paperid = postjson['paperid']
        problem = postjson['problem']
        paperdb = Paper.objects.get(pid=paperid)
        original_prolist = json.loads(paperdb.prolist)
        ph.DelPro(original_prolist, problem)
        paperdb.prolist = json.dumps(original_prolist)
        paperdb.save()
        ret = {'code': 200, 'paper': 'ok'}

    elif action == 'delall':
        paperid = postjson['paperid']
        paperdb = Paper.objects.get(pid=paperid)
        paperdb.prolist = json.dumps(ph.CreateProList())
        paperdb.save()
        ret = {'code': 200, 'paper': 'ok'}

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 6
0
def judge_zhuguan(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action ' + action}

    if action == 'getans':
        stuid = postjson['stuid']
        student = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid))
        zhuguan = ph.GetZhuguan(json.loads(student.answers))
        judge = {}
        has_judge = 0
        if student.zhuguan_grade != -1:
            judge = student.zhuguan_detail
            judge = json.loads(judge)
            has_judge = 1
        # print(zhuguan)
        ret = {'code': 200, 'count': zhuguan['count'], 'list': zhuguan['zhuguan_list'],
               'has_judge': has_judge, 'judge': judge, 'confirmed': student.confirmed}
        pass

    elif action == 'submit':
        stuid = postjson['stuid']
        record = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid) & Q(confirmed='no'))
        record.zhuguan_grade = json.dumps(postjson['score'])
        record.zhuguan_detail = json.dumps(postjson['detail'])
        record.save()
        ret = {'code': 200, 'info': 'ok'}
        pass

    elif action == 'clean_zhuguan':
        answerlist = TestRecord.objects.filter(Q(paperid=paperid)
                                               & Q(confirmed='no')).update(zhuguan_grade=-1, zhuguan_detail="")
        ret = {'code': 200, 'info': 'ok'}
        pass

    elif action == 'getpro':
        paper = Paper.objects.get(pid=paperid)
        pro = ph.GetProb(json.loads(paper.prolist)['question_list'], postjson['proid'])
        ret = {'code': 200, 'problem': pro['problem'], 'right': pro['right']}
        pass

    elif action == 'nextid':
        records = TestRecord.objects.filter(Q(paperid=paperid) & Q(zhuguan_grade=-1) & Q(confirmed='no'))
        if records.count() == 0:
            ret = {'code': 201, 'info': 'no next student is found'}
        else:
            ret = {'code': 200, 'nextid': records[0].stuid}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 7
0
def judge_manage(request):
    ret = {'code': 200, 'info': 'ok'}
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    if action == 'getans':
        ret = {'code': 200, 'info': 'ok'}
        # build the list of all students' answers
        retlist = []
        illulist = [0, 0, 0, 0, 0]
        db = TestRecord.objects.filter(paperid=paperid)
        for var in db:
            retlist.append(claRecord(var.paperid, var.stuid, var.submit_time, var.answers,
                                     var.keguan_grade, var.keguan_detail, var.zhuguan_grade, var.zhuguan_detail,
                                     var.total_score, var.confirmed))
            print(var.total_score)
            if not var.confirmed == "yes":
                continue
            if (var.total_score < 60):
                illulist[0] += 1
            elif var.total_score >= 90:
                illulist[4] += 1
            else:
                illulist[int((var.total_score - 50) / 10)] += 1
        print(illulist)
        jsonarr = json.dumps(retlist, default=lambda o: o.__dict__, sort_keys=True)
        loadarr = json.loads(jsonarr)
        ret = {'code': 200, 'info': 'ok', 'anslist': loadarr, 'illulist': illulist}
        ###

    elif action == 'delans':
        # delete the specified answer sheet from records
        stuname = postjson['stuname']
        TestRecord.objects.filter(Q(stuid=stuname) & Q(paperid=paperid) & Q(confirmed='no')).delete()
        ret = {'code': 200, 'info': 'ok'}
        ###

    elif action == 'submit':
        records = TestRecord.objects.filter(Q(paperid=paperid) & Q(confirmed='no'))
        for var in records:
            record = TestRecord.objects.get(Q(stuid=var.stuid) & Q(paperid=paperid) & Q(confirmed='no'))
            record.confirmed = 'yes'
            record.total_score = record.keguan_grade + record.zhuguan_grade
            record.save()
            pass
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 8
0
def auto_save(request):
    ret = {'code': 403, 'info': 'denied method ' + request.method}
    ph = PaperHelper()

    if request.method == 'POST':
        # acquire paperid from form
        postjson = jh.post2json(request)
        print(postjson)
        paperid = postjson['paperid']
        storeid = postjson['storeid']
        print(paperid)
        paperdb = Paper.objects.get(pid=paperid)
        original_prolist = json.loads(paperdb.prolist)
        prolist = postjson['prolist']



        for pro in prolist:
            if pro['valid'] == 'false':
                continue
            problem = pro['problem']
            ptype = pro['type']
            if ptype == '主观题':
                ptype = 'zhuguan'
            else:
                ptype = 'keguan'
            point = pro['point']
            right = pro['right']
            wrong1 = pro['wrong1']
            wrong2 = pro['wrong2']
            wrong3 = pro['wrong3']
            ph.AddPro(original_prolist, problem, ptype, point, right, wrong1, wrong2, wrong3)
            paperdb.prolist = json.dumps(original_prolist)

        paperdb.save()
        '''
    paperdb = Paper.objects.get(pid = paperid)
    original_prolist = json.loads(paperdb.prolist)
    ph.AddPro(original_prolist, problem["problem"], problem["ptype"], problem["point"],
     problem["right"], problem["wrong1"], problem["wrong2"], problem["wrong3"])
    paperdb.prolist = json.dumps(original_prolist)
    paperdb.save()
    '''

        # delete file after used
        ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 9
0
def store_manage(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    subject = postjson['subject']
    ret = {'code': 404, 'info': 'unknown action ' + action}
    sh = StoreHelper()
    print(action,subject)
    if action == 'search':
        paper_db = Teststore.objects.filter(subject=subject)
        if  paper_db.exists():
            ret = {'code': 200, 'info': 'success' + action, 'storeid': paper_db.values("storeid")[0]['storeid']}
    if action == 'get':
        list = Teststore.objects.filter(subject=subject).values("prolist")[0]
        ret = {'code': 200, 'list': list}
    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 10
0
def modify_paper_stulist(request):
    postjson = jh.post2json(request)
    paperid = postjson['paperid']
    action = postjson['action']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action' + action}
    # TODO(LOW): verify paperid whether existing
    ###
    print(paperid)
    paperdb = Paper.objects.get(pid=paperid)
    if (action == 'addstu'):
        stulist = postjson['stulist']
        stuarray = stulist.split(';')
        original_stulist = json.loads(paperdb.stulist)
        count = 0
        for var in stuarray:
            # TODO(LOW): verify var(stuid) whether existing
            #
            result = UserList.objects.filter(username=var)
            if not result.exists():
                continue

            if (var == ''):
                continue
            ph.AddStu(original_stulist, var)
            count += 1
        paperdb.stulist = json.dumps(original_stulist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'count': count}

    elif (action == 'delstu'):
        stu_to_del = postjson['stu_to_del']
        original_stulist = json.loads(paperdb.stulist)
        ph.DelStu(original_stulist, stu_to_del)
        paperdb.stulist = json.dumps(original_stulist)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'deleted': stu_to_del}

    elif (action == 'cleanstu'):
        original_stulist = json.loads(paperdb.stulist)
        gradelist = json.loads(paperdb.stulist)
        count = original_stulist['count']
        empty_list = ph.CreateStuList()
        paperdb.stulist = json.dumps(empty_list)
        paperdb.save()
        ret = {'code': 200, 'info': 'ok', 'count': count}

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 11
0
def manage_paper(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    ret = {'code': 404, 'info': 'unknown action ' + action}
    ph = PaperHelper()

    if action == 'create':
        # TODO(LOW): verify if the specified paper name is used
        ###
        # get paper name and initialize the new paper with a time id
        database = Paper(pid=time.strftime('%Y%m%d%H%M%S',
                                           time.localtime(time.time())),
                         pname=postjson['papername'],
                         teaname=request.session['login_name'],
                         penabled='no',
                         stulist=json.dumps(ph.CreateStuList()),
                         prolist=json.dumps(ph.CreateProList()))
        database.save()
        ret = {'code': 200, 'info': 'ok', 'papername': postjson['papername']}

    elif action == 'delete':
        # get the paper id and delete it from database
        Paper.objects.filter(pid=postjson['paperid']).delete()
        ###
        ret = {'code': 200, 'info': 'ok', 'paperid': postjson['paperid']}

    elif action == 'enable':
        # turn the status of paper to yes
        paperdb = Paper.objects.get(pid=postjson['paperid'])
        paperdb.penabled = 'yes'
        paperdb.save()
        ###
        ret = {'code': 200, 'info': 'ok', 'paperid': postjson['paperid']}
    elif action == 'disable':
        # turn the status of paper to no
        paperdb = Paper.objects.get(pid=postjson['paperid'])
        paperdb.penabled = 'no'
        paperdb.save()
        ###
        ret = {'code': 200, 'info': 'ok', 'paperid': postjson['paperid']}

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 12
0
def judge_zhuguan(request):
    postjson = jh.post2json(request)
    action = postjson['action']
    paperid = postjson['paperid']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action ' + action}

    if action == 'getans':
        stuid = postjson['stuid']
        student = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid))
        zhuguan = ph.GetZhuguan(json.loads(student.answers))
        #print(zhuguan)
        ret = {
            'code': 200,
            'count': zhuguan['count'],
            'list': zhuguan['zhuguan_list']
        }
        pass

    elif action == 'submit':
        stuid = postjson['stuid']
        record = TestRecord.objects.get(Q(stuid=stuid) & Q(paperid=paperid))
        record.zhuguan_grade = json.dumps(postjson['zhuguan_score'])
        record.zhuguan_detail = json.dumps(postjson['zhuguan_detail'])
        record.save()
        ret = {'code': 200, 'info': 'ok'}
        pass

    elif action == 'clean_zhuguan':
        answerlist = TestRecord.objects.filter(paperid=paperid)
        for var in answerlist:
            #print(var.answers)
            record = TestRecord.objects.get(
                Q(stuid=var.stuid) & Q(paperid=paperid))
            record.zhuguan_grade = -1
            record.zhuguan_detail = ""
            record.save()
            ret = {'code': 200, 'info': 'ok'}
        pass

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 13
0
def auto_paper(request):
    postjson = jh.post2json(request)
    storeid = postjson['storeid']
    print("storeid",storeid)

    klist=[0,int(postjson['ks']),int(postjson['km']),int(postjson['kh'])]
    zlist=[0,int(postjson['zs']),int(postjson['zm']),int(postjson['zh'])]
    kpoint = int(postjson['kp'])
    zpoint = int(postjson['zp'])

    print(klist)
    store = Teststore.objects.filter(storeid=storeid)
    prolist = json.loads(store[0].prolist)
    sorted(prolist['question_list'], key=lambda x: x['lastTime'], reverse=False)
    retlist = []
    for pro in prolist['question_list']:
        vol = int(pro['degree'])
        if pro['type'] == 'keguan':
            if klist[vol]>0:
                klist[vol] -=1
                pro['point']  = kpoint
                pro['valid'] = 'true'
                retlist.append(pro.copy())
        else:
            if zlist[vol]>0:
                zlist[vol] -=1
                pro['point'] = zpoint
                pro['valid'] = 'true'
                retlist.append(pro.copy())
    dlist = ['','简单', '中等', '困难']
    sorted(retlist, key=lambda x: x['type'], reverse=False)
    for pro in retlist:
        pro['degree']=dlist[pro['degree']]
    ret = {'code': 200, 'prolist': retlist}

    return HttpResponse(json.dumps(ret), content_type="application/json")
Ejemplo n.º 14
0
def paper_export(request):
    postjson = jh.post2json(request)
    paperid = postjson['paperid']
    action = postjson['action']
    ph = PaperHelper()
    ret = {'code': 404, 'info': 'unknown action' + action}
    # TODO(LOW): verify paperid whether existing
    ###
    db = TestRecord.objects.filter(paperid=paperid)

    # 创建一个workbook 设置编码
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建一个worksheet
    worksheet = workbook.add_sheet('成绩单')
    # 设置宽度和格式
    worksheet.col(0).width = 3200
    worksheet.col(1).width = 3200
    worksheet.col(2).width = 3200
    worksheet.col(3).width = 3200
    alignment = xlwt.Alignment()  # Create Alignment
    alignment.horz = xlwt.Alignment.HORZ_CENTER  # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
    alignment.vert = xlwt.Alignment.VERT_CENTER  # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
    style = xlwt.XFStyle()  # Create Style
    style.alignment = alignment  # Add Alignment to Style
    pattern = xlwt.Pattern()  # Create the Pattern
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN  # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
    pattern.pattern_fore_colour = 5  # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...

    # 写入excel
    # 参数对应 行, 列, 值
    worksheet.write(0, 0, '学号', style)
    worksheet.write(0, 1, '姓名', style)
    worksheet.write(0, 2, '客观题', style)
    worksheet.write(0, 3, '主观题', style)
    worksheet.write(0, 4, '总分', style)
    max = 0
    min = 1000000
    summary = 0
    row = 1
    for var in db:
        if var.confirmed == "yes":
            infoName = UserInfo.objects.filter(username=var.stuid).values("name")[0]["name"]

            worksheet.write(row, 0, var.stuid, style)
            worksheet.write(row, 1, infoName, style)
            worksheet.write(row, 2, var.keguan_grade, style)
            worksheet.write(row, 3, var.zhuguan_grade, style)
            worksheet.write(row, 4, var.total_score, style)
            row += 1
            summary += var.total_score
            if var.total_score > max:
                max = var.total_score
            if var.total_score < min:
                min = var.total_score

    style.pattern = pattern  # Add Pattern to Style
    worksheet.write(row + 2, 0, '平均分', style)
    worksheet.write(row + 3, 0, '最高分', style)
    worksheet.write(row + 4, 0, '最低分', style)
    worksheet.write(row + 2, 1, summary / (row - 1), style)
    worksheet.write(row + 3, 1, max, style)
    worksheet.write(row + 4, 1, min, style)

    # 保存
    workbook.save('files/试卷成绩单.xls')

    ret = {'code': 200, 'info': 'ok'}
    return HttpResponse(json.dumps(ret), content_type="application/json")