예제 #1
0
def Submit(problemid,req,contest_id=0):
	if not modules.Is_Loggedin():
		flash('请先登录','error')
		return modules.Page_Back()

	code = req['code']
	if len(code) < 10:
		flash('这么短真的没问题?','error')
		return modules.Page_Back()

	username = request.cookies['username']
	last_submit_time = modules.Get_Session('last_submit_time',username)
	now_time = datetime.datetime.now()

	if last_submit_time != None:
		seconds = (now_time-last_submit_time).seconds
		if seconds < submit_delay_time:
			flash('请在 %ss 后提交'%(submit_delay_time-seconds),'error')
			return modules.Page_Back()
	modules.Set_Session('last_submit_time',username,now_time)

	maxid_result = db.Fetchone("SELECT MAX(id) FROM records;")[0]
	runid = 1 if maxid_result == None else int(maxid_result) + 1
	nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
	db.Execute("INSERT INTO records VALUES(%s,%s,%s,%s,0,0,'','{\"subtasks\":[]}',0,0,'',%s,%s,%s);",(runid,problemid,code,'cpp',username,contest_id,nowtime))

	r=redis.Redis(host='localhost',port=6379,decode_responses=True)
	r.rpush('intoj-waiting',str(runid))

	return redirect('/record/%d'%runid)
예제 #2
0
def Submissions_My(contest_id):
    try:
        page = int(request.args['page'])
    except:
        page = 1

    if not modules.Is_Loggedin():
        flash(r'请先登录', 'error')
        return modules.Page_Back()

    contest = db.Read_Contest(contest_id)
    if contest == None:
        flash(r'不存在的比赛', 'error')
        return modules.Page_Back()

    limitations = request.args.to_dict()
    limitations['contest_id'] = contest_id
    limitations['username'] = modules.Current_User()
    submissions = db.Read_Submissions(limitations)
    status_show, total_page = modules.Page_Split(submissions, page,
                                                 status_per_page,
                                                 lambda status: True)
    return render_template('status.html',
                           statuslist=status_show,
                           total_page=total_page,
                           current_page=page,
                           contest=contest,
                           contest_id=contest_id,
                           my=True)
예제 #3
0
def Get(id):
    record = db.Read_Record(id)
    if record == None:
        flash(r'### 提交记录R%d没找着! \n 可能是因为编号不对.' % id, 'error')
        return redirect('/status')

    if record[12]:
        end_time = datetime.datetime.strptime(
            db.Read_Contest(record[12])[4], '%Y-%m-%d %H:%M:%S')
        now_time = datetime.datetime.now()
        if now_time < end_time:
            if request.cookies['username'] != record[
                    11] and not modules.Current_User_Privilege(3):
                flash(r'这是比赛时的提交, 您无权查看', 'error')
                return modules.Page_Back()
    elif not db.Read_Problem(
            record[1])[9] and not modules.Current_User_Privilege(
                2) and record[11] != modules.Current_User():
        flash(r'该题目尚未公开, 您无权查看', 'error')
        return modules.Page_Back()

    result = json.loads(record[7])
    subtasks = result['subtasks']
    contest = db.Read_Contest(record[12]) if record[12] else None
    return render_template('record.html',
                           record=record,
                           subtasks=subtasks,
                           contest=contest)
예제 #4
0
def Contestadd(req):
    id = 1
    count = int(db.Fetchone('SELECT COUNT(*) FROM contests')[0])
    if count > 0:
        id = int(db.Fetchone('SELECT MAX(id) FROM contests')[0]) + 1

    req_problems = req['problems'].split(',')
    problems = []
    for problem in req_problems:
        if db.Read_Problem(problem) == None:
            flash(r'题目#%s不存在' % problem, 'error')
            return modules.Page_Back()
        problems.append({'id': int(problem)})

    try:
        begin_time = datetime.datetime.strptime(req['begin_time'], date_format)
        end_time = datetime.datetime.strptime(req['end_time'], date_format)
    except:
        flash(r'日期格式不对. 应为 yyyy-mm-dd HH:MM:SS', 'error')
        return modules.Page_Back()

    db.Execute('INSERT INTO contests VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
               (id, req['title'], req['subtitle'], req['begin_time'],
                req['end_time'], req['description'], '{"type":"oi-intoj"}',
                request.cookies['username'], json.dumps(problems), ''))
    flash('添加成功', 'ok')
    return redirect('/contest/%d' % id)
예제 #5
0
def Run(origin_id):
    if not modules.Current_User_Privilege(2):
        flash(r'无此权限', 'error')
        return modules.Page_Back()
    problem = db.Read_Problem(origin_id)
    if problem == None:
        flash(r'### 题目 P%d 没找着! \n 可能是因为编号不对.' % origin_id, 'error')
        return modules.Page_Back()

    if request.method == 'GET':
        return render_template("problemedit.html", problem=problem)
    else:
        return Change(origin_id, request.form)
예제 #6
0
def Run(problem_id):
    problem = db.Read_Problem(problem_id)
    if problem == None:
        flash(r'### 题目 P%d 没找着! \n 可能是因为编号不对.' % problem_id, 'error')
        return modules.Page_Back()
    if not problem[9] and not modules.Current_User_Privilege(2):
        flash(r'无此权限', 'error')
        return modules.Page_Back()

    if request.method == 'GET':
        return render_template('problem.html', problem=problem)
    else:
        return newsubmit.Submit(problem_id, request.form)
예제 #7
0
def Is_Exist(contest_id, problem_id):
    contest = db.Read_Contest(contest_id)
    if contest == None:
        flash('不存在的比赛', 'error')
        return 0, modules.Page_Back()
    begin_time = datetime.datetime.strptime(contest[3], '%Y-%m-%d %H:%M:%S')
    if begin_time > datetime.datetime.now():
        flash('比赛还未开始', 'error')
        return 0, modules.Page_Back()
    problem = db.Read_Problem(problem_id)
    if problem == None:
        flash('题目 P%d 没找着!' % problem_id, 'error')
        return 0, modules.Page_Back()
    return 1, (problem, contest)
예제 #8
0
def Submissions_All(contest_id):
    try:
        page = int(request.args['page'])
    except:
        page = 1

    contest = db.Read_Contest(contest_id)
    if contest == None:
        flash(r'不存在的比赛', 'error')
        return modules.Page_Back()

    limitations = request.args.to_dict()
    limitations['contest_id'] = contest_id
    submissions = db.Read_Submissions(limitations)

    status_show, total_page = modules.Page_Split(submissions, page,
                                                 status_per_page,
                                                 lambda status: True)

    return render_template('status.html',
                           statuslist=status_show,
                           total_page=total_page,
                           current_page=page,
                           contest=contest,
                           contest_id=contest_id,
                           my=False)
예제 #9
0
def Run(username):
    user = db.Read_User_Byname(username)
    if user == None:
        flash('用户 %s 不存在' % username, 'error')
        return modules.Page_Back()

    status_cnt = User_Statistic(username)
    return render_template('userhome.html', user=user, status_cnt=status_cnt)
예제 #10
0
def Run(record_id):
    if request.method == 'GET':
        return Get(record_id)
    else:
        if not modules.Current_User_Privilege(2):
            flash(r'无此权限', 'error')
            return modules.Page_Back()
        return newsubmit.Rejudge(record_id)
예제 #11
0
def Run(username):
    if username != request.cookies.get(
            'username') and not modules.Current_User_Privilege(
                'is_user_manager'):
        flash(r'没有权限', 'error')
        return modules.Page_Back()
    userdata = db.Read_User_Byname(username)
    if userdata == None:
        flash(r'用户 %s 不存在' % username, 'error')
        return modules.Page_Back()

    if request.method == 'GET':
        return render_template('useredit.html', user=userdata)
    else:
        Useredit(username, request.form)
        flash('修改成功', 'ok')
        return redirect('/user/%s' % username)
예제 #12
0
def Run():
    if not modules.Current_User_Privilege(2):
        flash(r'无此权限', 'error')
        return modules.Page_Back()

    if request.method == 'GET':
        return render_template("problemadd.html")
    else:
        return Submit(request.form)
예제 #13
0
def Run(username):
	user = db.Read_User_Byname(username)
	if user == None:
		flash('用户 %s 不存在'%username,'error')
		return modules.Page_Back()

	status_cnt = User_Statistic(username)
	zishengs = db.Read_Zisheng({'username':username})
	return render_template('userhome.html',user=user,status_cnt=status_cnt,zishengs=zishengs,top=1000)
예제 #14
0
def Run():
    if not modules.Current_User_Privilege(3):
        flash(r'无此权限', 'error')
        return modules.Page_Back()

    if request.method == 'GET':
        current_date = datetime.datetime.now().strftime(date_format)
        return render_template("contestadd.html", current_date=current_date)
    else:
        return Contestadd(request.form)
예제 #15
0
def Submit(contest_id, problem_id, req):
    is_exist, ret = Is_Exist(contest_id, problem_id)
    if not is_exist: return ret

    contest = ret[1]
    end_time = datetime.datetime.strptime(contest[4], '%Y-%m-%d %H:%M:%S')
    if end_time < datetime.datetime.now():
        flash('比赛已经结束', 'error')
        return modules.Page_Back()

    return newsubmit.Submit(problem_id, req, contest_id)
예제 #16
0
def Run(id):
    contest = db.Read_Contest(id)
    if contest == None:
        flash('不存在的比赛', 'error')
        return modules.Page_Back()
    problem_list = json.loads(contest[8])
    problems = [db.Read_Problem(problem['id']) for problem in problem_list]
    rule_name = json.loads(contest[6])['type']
    return render_template('contest.html',
                           contest=contest,
                           problems=problems,
                           rule_name=rule_name)
예제 #17
0
def Run(contest_id,problem_id):
	if not modules.Is_Loggedin():
		flash('请先登录','error')
		return modules.Page_Back()

	is_exist,ret = Is_Exist(contest_id,problem_id)
	if not is_exist: return ret

	if request.method == 'GET':
		return render_template('contest_problem.html',problem=ret[0],contest=ret[1])
	else:
		return Submit(contest_id,problem_id,request.form)
예제 #18
0
def Run(contest_id):
    contest = db.Read_Contest(contest_id)
    if contest == None:
        flash('不存在的比赛', 'error')
        return modules.Page_Back()

    problems = json.loads(contest[8])
    problems = list(map(lambda x: db.Read_Problem(x['id']), problems))
    # print(problems)
    problems.sort(key=lambda x: x[0])

    ranklist = db.Read_Contest_Ranklist(contest_id)
    if ranklist == None:
        return render_template('contest_ranklist.html',
                               contest=contest,
                               ranklist=None)

    def Loadjson(x):
        x = list(x)
        if x[3] == '':
            x[3] = {'score': 0, 'submit_cnt': 0}
            return x
        x[3] = json.loads(x[3])
        score = submit_cnt = 0
        for problem_id_str, results in x[3].items():
            problem_id = int(problem_id_str)
            score += results['score']
            submit_cnt += results['submit_cnt']
        x[3]['score'] = score
        x[3]['submit_cnt'] = submit_cnt
        return x

    ranklist = list(map(Loadjson, ranklist))
    ranklist.sort(key=lambda x: (-x[3]['score'], x[3]['submit_cnt']))

    length = len(ranklist)
    for i in range(length):
        if i != 0 and ranklist[i][3]['score'] == ranklist[
                i -
                1][3]['score'] and ranklist[i][3]['submit_cnt'] == ranklist[
                    i - 1][3]['submit_cnt']:
            ranklist[i][3]['rank'] = ranklist[i - 1][3]['rank']
        else:
            ranklist[i][3]['rank'] = i + 1
    return render_template('contest_ranklist.html',
                           contest=contest,
                           ranklist=ranklist,
                           problems=problems,
                           full_score=len(problems) * 100)
예제 #19
0
def Change(origin_id, req):
    id = req['id']
    if req['id'] == '': id = origin_id
    else:
        if int(req['id']) < 0:
            flash(r'编号不可以为负', 'error')
            return modules.Page_Back()
        count = int(
            db.Fetchone('SELECT COUNT(*) FROM problems WHERE id=%s',
                        req['id'])[0])
        if count > 0:
            flash(r'题目编号 %s 已经有过了.' % req['id'], 'error')
            modules.Page_Back()

    is_public = 1 if req.get('is_public') == 'on' else 0
    db.Execute(
        "UPDATE problems SET `id`=%s,`title`=%s,`description`=%s,`input_format`=%s,`output_format`=%s,\
			`example`=%s,`limit_and_hint`=%s,`time_limit`=%s,`memory_limit`=%s,`is_public`=%s\
			 WHERE id=%s;",
        (id, req['title'], req['description'], req['input_format'],
         req['output_format'], req['example'], req['limit_and_hint'],
         req['time_limit'], req['memory_limit'], is_public, origin_id))

    return redirect('/problem/%s' % id)
예제 #20
0
def Run(problem_id):
	if not modules.Current_User_Privilege(2):
		flash(r'无此权限','error')
		return modules.Page_Back()
	db.Execute("DELETE FROM problems WHERE id=%s",problem_id)
	return redirect('/problemlist')