def addContest(request, ccId): try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') try: cc = CourseClass.getById(ccId) except: raise Err(request, 'no resource') try: Contest.canAddContest(cc, u) except: raise Err(request, 'no priv') recentProblem = Problem.problemListByAuthor(u) if request.method == 'POST': form = contestForm(request.POST) pIdList = request.POST.getlist('problem_id') #pIdList = Problem.problemList(u) pTitleList = request.POST.getlist('problem_title_custom') pCnt = len(pIdList) if form.is_valid(): for i in xrange(pCnt): p = Problem.getById(pIdList[i]) if not p.canViewProblem(u): raise Err(request, 'no problem priv') pInfos = [(pIdList[i], pTitleList[i], chr(65+i)) for i in xrange(pCnt)] cTitle = form.cleaned_data['title'] cDesc = form.cleaned_data['desc'] cStartDate = form.cleaned_data['start_date'] cStartTime = form.cleaned_data['start_time'] cLength = form.cleaned_data['length'] cBoardStop = form.cleaned_data['board_stop'] cType = form.cleaned_data['contest_type'] cBoardType = form.cleaned_data['board_type'] permitLang = reduce(add, [Const.LANG_MASK[lang] for lang in form.cleaned_data['lang_limit']]) c = Contest.addContest(u, cc, cTitle, pInfos, datetime.combine(cStartDate, cStartTime), cDesc, cLength, cBoardStop, cType, cBoardType, permitLang) return redirect('Contest:show_contest', c.cid) else: problemList = [{'pid': pIdList[x], 'title': pTitleList[x], 'origTitle':Problem.getById(pIdList[x]).prob_title} for x in xrange(pCnt)] return render(request, 'newtpl/contest/addContest.html', {'cc':cc, 'form': form, 'recent_problem': recentProblem, 'problem_list': problemList, 'tpl':{'has_priv': True, 'sp': True, }}) else: form = contestForm() return render(request, 'newtpl/contest/addContest.html', {'cc':cc, 'form': form, 'recent_problem': recentProblem, 'tpl':{'has_priv': True, 'sp': True, }}) except Exception as e: messages.info(request, unicode(e)) return render(request, Err.ERROR_PAGE)
def listManageProblem(request, pageId="1"): # modified logger.info(str(request).replace("\n", "\t")) try: pageId = int(pageId) u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if u.priv == 'student': raise Err(request, 'no priv') problemList = Problem.problemManageList(u) """ tres = Problem.problemList(u) if (pageId-1)*Const.PROBLEM_PER_PAGE>=len(tres): raise Err(request, 'unknown err') res = tres[(pageId-1)*Const.PROBLEM_PER_PAGE:Const.PROBLEM_PER_PAGE] """ info = {} if u.university.isAdmin(u): info['admin'] = True return render(request, "newtpl/problem/manageProblemList.html", { 'problem_list': problemList, 'info': info, 'tpl': { 'sp': True } }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def listProblem(request, pageId="1"): # modified logger.info(str(request).replace("\n","\t")) try: pageId = int(pageId) u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') tres = Problem.problemList(u) if (pageId-1)*Const.PROBLEM_PER_PAGE>=len(tres): raise Err(request, 'unknown err') res = tres[(pageId-1)*Const.PROBLEM_PER_PAGE:pageId*Const.PROBLEM_PER_PAGE] res = tres probs = [] for p in res: all_submits = GeneralSubmission.objects.filter(problem = p) all_accepts = all_submits.filter(status = 'Accepted') submits = all_submits.count() accepts = all_accepts.count() ratio = 0 if submits == 0 else 100 * accepts / submits probs.append({'accepts': accepts, 'submits': submits, 'ratio': ratio, 'prob': p}) paginator = Paginator(probs, Const.PROBLEM_PER_PAGE) pageId = min(max(int(pageId), 1), paginator.num_pages) #return render(request,"newtpl/problem/problemList.html",{'tpl':{'sp':False}, 'problems': probs}) return render(request,"newtpl/problem/problemList.html",{'tpl':{'sp':False}, 'problems': paginator.page(pageId)}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def previewTestData(request, problem_id, case_id, mode): # mode = 0: view input mode = 1: view output logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if not problem_id: raise Err(request, 'problem illegal') try: p = Problem.getById(int(problem_id)) except: raise Err(request, 'problem illegal') if not p.canManageProblem(u): raise Err(request, 'no priv') case_id = int(case_id) if case_id >= p.data_count: # [0, data_count) raise Err(request, 'testdata illegal') mode = int(mode) if mode != 0 and mode != 1: raise Err(request, 'testdata mode illegal') data_preview = p.generateTestDataPreview(case_id, mode) return render(request, 'newtpl/problem/previewTestData.html', {'data_preview': data_preview}) except Exception as e: logger.error(str(e).replace('\n', '\t')) return render(request, Err.ERROR_PAGE)
def previewTestData(request, problem_id, case_id, mode): # mode = 0: view input mode = 1: view output logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if not problem_id: raise Err(request, 'problem illegal') try: p = Problem.getById(int(problem_id)) except: raise Err(request, 'problem illegal') if not p.canManageProblem(u): raise Err(request, 'no priv') case_id = int(case_id) if case_id >= p.data_count: # [0, data_count) raise Err(request, 'testdata illegal') mode = int(mode) if mode != 0 and mode != 1: raise Err(request, 'testdata mode illegal') data_preview = p.generateTestDataPreview(case_id, mode) return render(request, 'newtpl/problem/previewTestData.html', {'data_preview': data_preview}) except Exception as e: logger.error(str(e).replace('\n','\t')) return render(request, Err.ERROR_PAGE)
def updateContest( self, contestTitle, pInfos, startTime, contestDesc="", length=300, boardStop=300, contestType=0, boardType=0, lang_limit=0, ): self.contest_title = contestTitle self._vTitle() if self.start_time != startTime: self.start_time = startTime self._vStartTime() self.length = length self._vLength() self.board_stop = boardStop self._vBoardStop() self.contest_description = contestDesc self.contest_type = contestType self.board_type = boardType self.lang_limit = lang_limit self.save() # To be modified, URGENT try: self._vStartTime() except: return True map(lambda x: x.delete(), ContestProblem.objects.filter(contest=self)) for pInfo in pInfos: try: prob = Problem.objects.get(pid=pInfo[0]) except: raise Exception(Const.CONTEST_PROB_ERR) ## try: ## contestProb = ContestProblem.objects.get(contest=self, problem=prob) ## except: ## contestProb = ContestProblem() ## contestProb.contest = self ## contestProb.problem = prob contestProb = ContestProblem() contestProb.contest = self contestProb.problem = prob if not Problem.isLegalTitle(pInfo[1]) or len(pInfo[1]) == 0: contestProb.problem_title = contestProb.problem.prob_title else: contestProb.problem_title = pInfo[1] contestProb.problem_index = pInfo[2] contestProb.save() return True
def generalSubmissionList(request, page_id='1'): """ @view: list general submission """ try: page_id = int(page_id) u = User.getSessionUser(request.session) if not u: raise Err( request, err='not login') # fake if u.priv == 'university': has_priv = True else: has_priv = False user = u if not has_priv else None lang_list = [('gcc','GNU C'), ('g++','GNU C++'), ('java','java')] form = generalListForm( lang_list, request.GET) if form.is_valid(): if form.cleaned_data['problem_id']: try: p = Problem.getById( form.cleaned_data['problem_id']) except: raise Err( request, err='request err', log_format=( 'form invalid', 'problem_id error'), user_format=( u'输入的内容不合法', u'没有这道题!') ) else: p = None else: raise Err( request, err='example err', log_format=( 'form invalid', ''), user_format=( u'输入的内容不合法', '') ) g_subs = GeneralSubmission.generalSubmissionList( u=user, p=p, uname=form.cleaned_data['username'], language=form.cleaned_data['language'], status_selected=form.cleaned_data['status'], university=u.university) if 'rejudge' in request.GET: if has_priv: map( lambda x: GeneralSubmission.rejudgeGeneralSubmission( x), g_subs) else: raise Err( request, err = 'no priv') paginator = Paginator( g_subs, Const.STATUS_PER_PAGE) page_id = min(max(int(page_id), 1), paginator.num_pages) g_s = paginator.page(page_id) for g_s_index in g_s: g_s_index.status_color = Const.STATUS_COLOR[g_s_index.status] if g_s_index.status in Const.STATUS_COLOR else '' g_s_index.status_cn = Const.STATUS_CN[ g_s_index.status] return render(request, 'newtpl/submission/general/status.html', {'general_list': g_s, 'form':form, 'tpl':{'can_manage': True if has_priv else False}}) except Exception as e: return render(request, Err.ERROR_PAGE, { 'errmsg': unicode(e) } )
def updateContest(self, contestTitle, pInfos, startTime, contestDesc='', length=300, boardStop=300, contestType=0, boardType=0, lang_limit=0): self.contest_title = contestTitle self._vTitle() if self.start_time != startTime: self.start_time = startTime self._vStartTime() self.length = length self._vLength() self.board_stop = boardStop self._vBoardStop() self.contest_description = contestDesc self.contest_type = contestType self.board_type = boardType self.lang_limit = lang_limit self.save() # To be modified, URGENT try: self._vStartTime() except: return True map(lambda x: x.delete(), ContestProblem.objects.filter(contest=self)) for pInfo in pInfos: try: prob = Problem.objects.get(pid=pInfo[0]) except: raise Exception(Const.CONTEST_PROB_ERR) ## try: ## contestProb = ContestProblem.objects.get(contest=self, problem=prob) ## except: ## contestProb = ContestProblem() ## contestProb.contest = self ## contestProb.problem = prob contestProb = ContestProblem() contestProb.contest = self contestProb.problem = prob if not Problem.isLegalTitle(pInfo[1]) or len(pInfo[1]) == 0: contestProb.problem_title = contestProb.problem.prob_title else: contestProb.problem_title = pInfo[1] contestProb.problem_index = pInfo[2] contestProb.save() return True
def showProblemStatistics(request, pid=None): logger.info(str(request).replace("\n", "\t")) """ view used to show statistics of a problem """ try: u = User.getSessionUser(request.session) if not u: raise Err(request, err='not login') pid = int(pid) if pid else '' try: problem = Problem.getById(pid) except: raise Err( request, err='no problem', log_format=('{0}'.format(pid), ''), user_format=(u'{0}'.format(pid), u'搞错了什么吧!'), ) # if not problem.contest.course_class.canBeManaged( u): # raise Err( request, err = 'no priv') all_submissions = GeneralSubmission.generalSubmissionList(p=problem) submissions = all_submissions.filter( status='Accepted').order_by('run_time')[:20] status_list = [] for i in Const.STATUS_CN.iterkeys(): status_list.append({ 'name': Const.STATUS_CN[i], 'number': all_submissions.filter(status=i).count() }) for sub_s in submissions: sub_s.status_color = Const.STATUS_COLOR[ sub_s.status] if sub_s.status in Const.STATUS_COLOR else '' sub_s.status_cn = Const.STATUS_CN[sub_s.status] # need modification return render( request, 'newtpl/statistic/problem.html', { 'submissions': submissions, 'problem': problem, 'status_list': status_list, 'tpl': { 'sp': True } }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def addContest( cls, user, courseClass, contestTitle, pInfos, startTime, contestDesc="", length=300, boardStop=300, contestType=0, boardType=0, lang_limit=0, ): # add contest now c = Contest() c.author = user c.course_class = courseClass c.contest_title = contestTitle c._vTitle() c.start_time = startTime c._vStartTime() c.length = length c._vLength() c.board_stop = boardStop c._vBoardStop() c.contest_description = contestDesc c.contest_type = contestType c.board_type = boardType c.lang_limit = lang_limit c.save() # add problem to contest now for pInfo in pInfos: contestProb = ContestProblem() contestProb.contest = c try: contestProb.problem = Problem.objects.get(pid=pInfo[0]) except: raise Exception(Const.CONTEST_PROB_ERR) if not Problem.isLegalTitle(pInfo[1]) or len(pInfo[1]) == 0: contestProb.problem_title = contestProb.problem.prob_title else: contestProb.problem_title = pInfo[1] contestProb.problem_index = pInfo[2] contestProb.save() return c
def showProblem(request,p_id): # modified logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') p_id = int(p_id) p = Problem.getById(p_id) if not p.canViewProblem(u): raise Err(request, 'no priv') p.desc=json.loads(p.prob_desc) return render(request, "newtpl/problem/showProblem.html", { 'p':p, 'tpl':{'sp':True}}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def addContest(cls, user, courseClass, contestTitle, pInfos, startTime, contestDesc='', length=300, boardStop=300, contestType=0, boardType=0, lang_limit=0): # add contest now c = Contest() c.author = user c.course_class = courseClass c.contest_title = contestTitle c._vTitle() c.start_time = startTime c._vStartTime() c.length = length c._vLength() c.board_stop = boardStop c._vBoardStop() c.contest_description = contestDesc c.contest_type = contestType c.board_type = boardType c.lang_limit = lang_limit c.save() # add problem to contest now for pInfo in pInfos: contestProb = ContestProblem() contestProb.contest = c try: contestProb.problem = Problem.objects.get(pid=pInfo[0]) except: raise Exception(Const.CONTEST_PROB_ERR) if not Problem.isLegalTitle(pInfo[1]) or len(pInfo[1]) == 0: contestProb.problem_title = contestProb.problem.prob_title else: contestProb.problem_title = pInfo[1] contestProb.problem_index = pInfo[2] contestProb.save() return c
def listProblem(request, pageId="1"): # modified logger.info(str(request).replace("\n","\t")) try: pageId = int(pageId) u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') tres = Problem.problemList(u) if (pageId-1)*Const.PROBLEM_PER_PAGE>=len(tres): raise Err(request, 'unknown err') res = tres[(pageId-1)*Const.PROBLEM_PER_PAGE:Const.PROBLEM_PER_PAGE] return render(request,"newtpl/problem/problemList.html",{'res': res,'tpl':{'sp':True}}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def deleteProblem(request, problem_id): logger.info(str(request).replace("\n","\t")) try: user = User.getSessionUser(request.session) if not user: raise Err(request, 'not login') try: prob = Problem.getById(int(problem_id)) except: raise Err(request, 'problem illegal') if not prob.author.university.isAdmin(user): raise Err(request, 'no priv') prob.deleteProblem() messages.add_message(request, messages.SUCCESS, u'删除题目%d成功' % int(problem_id)) return redirect('Problem:manage') except Exception as e: return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def showProblem(request, p_id): # modified logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') p_id = int(p_id) p = Problem.getById(p_id) if not p.canViewProblem(u): raise Err(request, 'no priv') p.desc = json.loads(p.prob_desc) return render(request, "newtpl/problem/showProblem.html", { 'p': p, 'tpl': { 'sp': True } }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE)
def deleteProblem(request, problem_id): logger.info(str(request).replace("\n", "\t")) try: user = User.getSessionUser(request.session) if not user: raise Err(request, 'not login') try: prob = Problem.getById(int(problem_id)) except: raise Err(request, 'problem illegal') if not prob.author.university.isAdmin(user): raise Err(request, 'no priv') prob.deleteProblem() messages.add_message(request, messages.SUCCESS, u'删除题目%d成功' % int(problem_id)) return redirect('Problem:manage') except Exception as e: return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def showProblemStatistics( request, pid=None ): logger.info(str(request).replace("\n","\t")) """ view used to show statistics of a problem """ try: u = User.getSessionUser(request.session) if not u: raise Err( request, err='not login') pid = int( pid) if pid else '' try: problem = Problem.getById( pid) except: raise Err( request, err='no problem', log_format=( '{0}'.format( pid), ''), user_format=( u'{0}'.format( pid), u'搞错了什么吧!'), ) # if not problem.contest.course_class.canBeManaged( u): # raise Err( request, err = 'no priv') all_submissions = GeneralSubmission.generalSubmissionList( p=problem ) submissions = all_submissions.filter( status='Accepted').order_by('run_time')[:20] status_list = [] for i in Const.STATUS_CN.iterkeys(): status_list.append( { 'name': Const.STATUS_CN[i], 'number': all_submissions.filter( status=i).count()} ) for sub_s in submissions: sub_s.status_color = Const.STATUS_COLOR[sub_s.status] if sub_s.status in Const.STATUS_COLOR else '' sub_s.status_cn = Const.STATUS_CN[ sub_s.status] # need modification return render( request, 'newtpl/statistic/problem.html', { 'submissions': submissions, 'problem': problem, 'status_list': status_list, 'tpl': { 'sp': True } }) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE, { 'errmsg': unicode(e) } )
def listProblem(request, pageId="1"): # modified logger.info(str(request).replace("\n", "\t")) try: pageId = int(pageId) u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') tres = Problem.problemList(u) if (pageId - 1) * Const.PROBLEM_PER_PAGE >= len(tres): raise Err(request, 'unknown err') res = tres[(pageId - 1) * Const.PROBLEM_PER_PAGE:pageId * Const.PROBLEM_PER_PAGE] res = tres probs = [] for p in res: all_submits = GeneralSubmission.objects.filter(problem=p) all_accepts = all_submits.filter(status='Accepted') submits = all_submits.count() accepts = all_accepts.count() ratio = 0 if submits == 0 else 100 * accepts / submits probs.append({ 'accepts': accepts, 'submits': submits, 'ratio': ratio, 'prob': p }) paginator = Paginator(probs, Const.PROBLEM_PER_PAGE) pageId = min(max(int(pageId), 1), paginator.num_pages) #return render(request,"newtpl/problem/problemList.html",{'tpl':{'sp':False}, 'problems': probs}) return render(request, "newtpl/problem/problemList.html", { 'tpl': { 'sp': False }, 'problems': paginator.page(pageId) }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE)
def listManageProblem(request, pageId="1"): # modified logger.info(str(request).replace("\n","\t")) try: pageId = int(pageId) u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if u.priv == 'student': raise Err(request, 'no priv') problemList = Problem.problemList(u) """ tres = Problem.problemList(u) if (pageId-1)*Const.PROBLEM_PER_PAGE>=len(tres): raise Err(request, 'unknown err') res = tres[(pageId-1)*Const.PROBLEM_PER_PAGE:Const.PROBLEM_PER_PAGE] """ info = {} if u.university.isAdmin(u): info['admin'] = True return render(request,"newtpl/problem/manageProblemList.html",{'problem_list': problemList, 'info': info, 'tpl':{'sp':True}}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def updateContest(request, cId): try: u = User.getSessionUser(request.session) if not u: #raise Exception(Const.NOT_LOGGED_IN) raise Err(request, err='not login') try: c = Contest.getById(cId) except: raise Err(request, 'no resource') cc = c.course_class try: c.canBeManaged(u) except: raise Err(request, err='no priv') started = c.isStarted(5) if started: recentProblem = None else: recentProblem = Problem.problemListByAuthor(u) problemList = [{'pid': cp.problem.pid, 'title': cp.problem_title, 'origTitle':cp.problem.prob_title} for cp in c.getContestProblem()] if request.method == 'POST': POST = request.POST.copy() if started: POST['start_date'] = c.start_time.date() POST['start_time'] = c.start_time.time() POST['started'] = started form = contestForm(POST) if started: form.fields['start_date'].widget.attrs['disabled'] = True form.fields['start_time'].widget.attrs['disabled'] = True if started: pIdList = [cp['pid'] for cp in problemList] pTitleList = [cp['title'] for cp in problemList] pass else: #pIdList = Problem.problemList(u) pIdList = request.POST.getlist('problem_id') pTitleList = request.POST.getlist('problem_title_custom') pCnt = len(pIdList) if form.is_valid(): for i in xrange(pCnt): p = Problem.getById(pIdList[i]) if not p.canViewProblem(u): raise Err(request, 'no problem priv') pInfos = [(pIdList[i], pTitleList[i], chr(65+i)) for i in xrange(pCnt)] cTitle = form.cleaned_data['title'] cDesc = form.cleaned_data['desc'] cStartDate = form.cleaned_data['start_date'] cStartTime = form.cleaned_data['start_time'] cLength = form.cleaned_data['length'] cBoardStop = form.cleaned_data['board_stop'] cType = form.cleaned_data['contest_type'] cBoardType = form.cleaned_data['board_type'] permitLang = reduce(add, [Const.LANG_MASK[lang] for lang in form.cleaned_data['lang_limit']]) c.updateContest(cTitle, pInfos, datetime.combine(cStartDate, cStartTime), cDesc, cLength, cBoardStop, cType, cBoardType, permitLang) return redirect('Contest:show_contest', cId) else: problemList = [{'pid': pIdList[x], 'title': pTitleList[x], 'origTitle':Problem.getById(pIdList[x]).prob_title} for x in xrange(pCnt)] return render(request, 'newtpl/contest/updateContest.html', {'c': c, 'cc':cc, 'form': form, 'started': started, 'hehe':pCnt, 'recent_problem':recentProblem, 'problem_list': problemList, 'tpl':{'has_priv': True, 'sp': True,}}) else: form = contestForm( initial={ 'title': c.contest_title, 'desc':c.contest_description, 'start_date': c.start_time.date(), 'start_time': c.start_time.time(), 'length': c.length, 'board_stop': c.board_stop, 'contest_type': c.contest_type, 'board_type': c.board_type, 'lang_limit': c.permittedLangs(), 'started': started, } ) if started: form.fields['start_date'].widget.attrs['disabled'] = True form.fields['start_time'].widget.attrs['disabled'] = True return render(request, 'newtpl/contest/updateContest.html', {'c':c, 'cc':cc, 'form': form, 'started': started, 'recent_problem':recentProblem, 'problem_list': problemList, 'tpl':{'has_priv': True, 'sp': True, 'nav_act':'contest',}}) #return render(request, Const.ERROR_PAGE, {'errmsg': unicode(e), }) except Exception as e: messages.info(request, unicode(e)) return render(request, Const.ERROR_PAGE, {'errmsg': unicode(e), })
def addProblemSubmit(request): logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') p = request.POST if request.method == 'POST': form = addProblemForm(request.POST) if not form.is_valid(): raise Exception(u'数据输入有误') course_id = int(p['course_id']) if course_id == None: raise Exception(u'课程非法') cs = Course.getById(course_id) if not cs: raise Exception(u'课程号非法') if not Problem.canAddCourseProblem(cs, u): raise Err(request, 'no priv') prb = Problem.addProblem(u.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], p['prob_desc'], p['is_spj'], 0, p['course_id'], "") data_count = 0 case_info = "" #If file not exist, Create an empty file. open(Const.PROBLEM_DATA_PATH + str(prb.pid) + "/" + "0.in", 'a').close() open(Const.PROBLEM_DATA_PATH + str(prb.pid) + "/" + "0.out", 'a').close() if p['change_data'] == "1": dataInList = request.FILES.getlist('data_in') dataOutList = request.FILES.getlist('data_out') dataScrList = request.POST.getlist('data_scr') if len(dataInList) != len(dataOutList) or len(dataInList) != len( dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict = {} for idx, nowScr in enumerate(dataScrList): dict[str(idx)] = nowScr case_info = json.dumps(dict) data_count = len(dataInList) dict = {} dict['desc'] = p['prob_desc'] dict['input_desc'] = p['prob_input_desc'] dict['output_desc'] = p['prob_output_desc'] dict['input_sample'] = p['prob_input_sample'] dict['output_sample'] = p['prob_output_sample'] prob_desc = json.dumps(dict) prb.updateProblem(u.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], prob_desc, p['is_spj'], data_count, p['course_id'], case_info) return redirect("/problem/p/" + str(prb.pid) + "/") except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def addProblem(request, course_id): # modified logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if course_id == None: return redirect('/problem/addProblem/') try: course_id = int(course_id) cs = Course.getById(course_id) except: raise Exception(u'课程号非法') if not Problem.canAddCourseProblem(cs, u): raise Err(request, 'no priv') if request.method == 'POST': form = addProblemForm(request.POST) if form.is_valid(): prb = Problem.addProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], form.cleaned_data['prob_desc'], form.cleaned_data['is_spj'], 0, course_id, "") data_count = 0 case_info = "" if form.cleaned_data['change_data'] == "1": dataInList = request.FILES.getlist('data_in') dataOutList = request.FILES.getlist('data_out') dataScrList = request.POST.getlist('data_scr') if len(dataInList) != len(dataOutList) or len( dataInList) != len(dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict = {} for idx, nowScr in enumerate(dataScrList): dict[str(idx)] = nowScr case_info = json.dumps(dict) data_count = len(dataInList) dict = {} dict['desc'] = form.cleaned_data['prob_desc'] dict['input_desc'] = form.cleaned_data['prob_input_desc'] dict['output_desc'] = form.cleaned_data['prob_output_desc'] dict['input_sample'] = form.cleaned_data['prob_input_sample'] dict['output_sample'] = form.cleaned_data['prob_output_sample'] prob_desc = json.dumps(dict) prb.updateProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], prob_desc, form.cleaned_data['is_spj'], data_count, course_id, case_info) return redirect("/problem/p/" + str(prb.pid) + "/") else: raise Err(request, 'problem info illegal') else: form = addProblemForm() return render(request, 'newtpl/problem/modifyProblem.html', { 'form': form, 'course': cs, 'tpl': { 'sp': True } }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE)
def generalSubmissionList(request, page_id='1'): """ @view: list general submission """ try: page_id = int(page_id) u = User.getSessionUser(request.session) if not u: raise Err(request, err='not login') # fake if u.priv == 'university': has_priv = True else: has_priv = False user = u if not has_priv else None lang_list = [('gcc', 'GNU C'), ('g++', 'GNU C++'), ('java', 'java')] form = generalListForm(lang_list, request.GET) if form.is_valid(): if form.cleaned_data['problem_id']: try: p = Problem.getById(form.cleaned_data['problem_id']) except: raise Err(request, err='request err', log_format=('form invalid', 'problem_id error'), user_format=(u'输入的内容不合法', u'没有这道题!')) else: p = None else: raise Err(request, err='example err', log_format=('form invalid', ''), user_format=(u'输入的内容不合法', '')) g_subs = GeneralSubmission.generalSubmissionList( u=user, p=p, uname=form.cleaned_data['username'], language=form.cleaned_data['language'], status_selected=form.cleaned_data['status'], university=u.university) if 'rejudge' in request.GET: if has_priv: map(lambda x: GeneralSubmission.rejudgeGeneralSubmission(x), g_subs) else: raise Err(request, err='no priv') paginator = Paginator(g_subs, Const.STATUS_PER_PAGE) page_id = min(max(int(page_id), 1), paginator.num_pages) g_s = paginator.page(page_id) for g_s_index in g_s: g_s_index.status_color = Const.STATUS_COLOR[ g_s_index. status] if g_s_index.status in Const.STATUS_COLOR else '' g_s_index.status_cn = Const.STATUS_CN[g_s_index.status] return render( request, 'newtpl/submission/general/status.html', { 'general_list': g_s, 'form': form, 'tpl': { 'can_manage': True if has_priv else False } }) except Exception as e: return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def updateProblem(request, p_id): logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') try: p_id = int(p_id) p = Problem.getById(p_id) except: logger.error(str(e).replace("\n", "\t")) raise Err(request, 'unknown err') if not p.canManageProblem(u): raise Err(request, 'no priv') if request.method == 'POST': form = addProblemForm(request.POST) if form.is_valid(): data_count = p.data_count case_info = p.case_info if form.cleaned_data['change_data'] == "1": dataInList = request.FILES.getlist('data_in') dataOutList = request.FILES.getlist('data_out') dataScrList = request.POST.getlist('data_scr') if len(dataInList) != len(dataOutList) or len( dataInList) != len(dataScrList): raise Err(request, 'unknown err') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH + str( p.pid) + "/" + str(idx) + ".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH + str( p.pid) + "/" + str(idx) + ".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict = {} for idx, nowScr in enumerate(dataScrList): dict[str(idx)] = nowScr case_info = json.dumps(dict) data_count = len(dataInList) dict = {} dict['desc'] = form.cleaned_data['prob_desc'] dict['input_desc'] = form.cleaned_data['prob_input_desc'] dict['output_desc'] = form.cleaned_data['prob_output_desc'] dict['input_sample'] = form.cleaned_data['prob_input_sample'] dict['output_sample'] = form.cleaned_data['prob_output_sample'] prob_desc = json.dumps(dict) p.updateProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], prob_desc, form.cleaned_data['is_spj'], data_count, p.course_id, case_info) return redirect("/problem/p/" + str(p.pid) + "/") else: raise Err(request, 'unknown err') else: desc = json.loads(p.prob_desc) form = addProblemForm( initial={ 'prob_title': p.prob_title, 'prob_priv': p.prob_priv, 'prob_time': p.prob_time, 'prob_memory': p.prob_memory, 'prob_codelength': p.prob_codelength, 'prob_desc': desc['desc'], 'prob_input_desc': desc['input_desc'], 'prob_output_desc': desc['output_desc'], 'prob_input_sample': desc['input_sample'], 'prob_output_sample': desc['output_sample'], 'is_spj': p.is_spj, 'change_data': 0 }) cases = range(p.data_count) return render( request, 'newtpl/problem/modifyProblem.html', { 'problem': p, 'form': form, 'tpl': { 'sp': True }, 'update': True, 'cases': cases }) except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE)
def updateProblemSubmit(request, p_id): logger.info(str(request).replace("\n", "\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if not p_id: raise Exception(u'题号错误') p_id = int(p_id) ep = Problem.getById(p_id) if not ep: raise Exception(u'题号错误') if not ep.canManageProblem(u): raise Err(request, 'no priv') p = request.POST if request.method == 'POST': form = addProblemForm(request.POST) if not form.is_valid(): raise Exception(u'数据输入有误') prb = ep data_count = prb.data_count case_info = prb.case_info if p['change_data'] == "1": dataInList = request.FILES.getlist('data_in') dataOutList = request.FILES.getlist('data_out') dataScrList = request.POST.getlist('data_scr') if len(dataInList) != len(dataOutList) or len(dataInList) != len( dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH + str( prb.pid) + "/" + str(idx) + ".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict = {} for idx, nowScr in enumerate(dataScrList): dict[str(idx)] = nowScr case_info = json.dumps(dict) data_count = len(dataInList) dict = {} dict['desc'] = p['prob_desc'] dict['input_desc'] = p['prob_input_desc'] dict['output_desc'] = p['prob_output_desc'] dict['input_sample'] = p['prob_input_sample'] dict['output_sample'] = p['prob_output_sample'] prob_desc = json.dumps(dict) prb.updateProblem(prb.author.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], prob_desc, p['is_spj'], data_count, p['course_id'], case_info) return redirect("/problem/p/" + str(prb.pid) + "/") except Exception as e: logger.error(str(e).replace("\n", "\t")) return render(request, Err.ERROR_PAGE)
def addGeneralSubmission(request, problem_id=None): """ view used to add general submission """ try: if not problem_id: raise Err( request, err='request err', log_format=('problem index', 'UNDEFINED'), user_format=(u'题目序号', u'哪里去了!!'), ) problem_id = int(problem_id) try: p = Problem.getById(problem_id) except: raise Err( request, err='no problem', log_format=('{0}'.format(problem_id), ''), user_format=(u'{0}'.format(problem_id), u'啥乱七八糟的!!!'), ) u = User.getSessionUser(request.session) if not u: raise Err(request, err='not login') if not GeneralSubmission.canSubmitCode(u, p): raise Err(request, err='no priv') if request.method == 'POST': lang_list = [('gcc', 'GNU C'), ('g++', 'GNU C++'), ('java', 'JAVA')] form = addGeneralForm(lang_list, request.POST) if form.is_valid(): sub_name = str(datetime.now()) time_str = sub_name.split('.') time_str.pop() for i in ['-', ':', '.', ' ']: sub_name = sub_name.replace(i, '_') head_details = '' head_details += '/*\n' head_details += 'USER_ID: ' + str(u) + '\n' head_details += 'PROBLEM: ' + str(p.pid) + '\n' head_details += 'SUBMISSION_TIME: ' + time_str[0] + '\n' head_details += '*/\n' import os code_file_path = os.path.join( Const.SUBMISSION_TMP_PATH, "{0:010d}_{1}_{2}".format(u.uid, sub_name, 'general')) code_length = 0 if 'code_file' in request.FILES: default_storage.save(code_file_path, request.FILES['code_file']) else: if form.cleaned_data['code']: default_storage.save( code_file_path, ContentFile(head_details + form.cleaned_data['code'])) else: raise Err( request, err='request err', log_format=('code', 'no input'), user_format=(u'代码呢!', u'不写代码交什么交!!'), ) code_length = default_storage.size(code_file_path) sub_lang = form.cleaned_data['language'] if sub_lang not in map(lambda x: x[0], lang_list): raise Err( request, err='illegal language', log_format=('{0}'.format(sub_lang), 'blabla'), user_format=(u'{0}'.format(sub_lang), u'别瞎搞成不!!'), ) x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') additional = {'submit_ip': ip} GeneralSubmission.addGeneralSubmission( u, p, code_file_path, form.cleaned_data['language'], code_length) return redirect('Submission:status') # could it be okay? else: raise Exception(u'form invalid') # not POST method else: lang_list = [('gcc', 'GNU C'), ('g++', 'GNU C++'), ('java', 'JAVA')] form = addGeneralForm(lang_list) return render( request, 'newtpl/submission/general/submit.html', { 'form': form, 'tpl': { 'sp': True }, 'problem': p }, ) except Exception as e: return render( request, Err.ERROR_PAGE, { 'errmsg': unicode(e), }, )
def addGeneralSubmission(request, problem_id=None): """ view used to add general submission """ try: if not problem_id: raise Err( request, err='request err', log_format=( 'problem index', 'UNDEFINED'), user_format=( u'题目序号', u'哪里去了!!'), ) problem_id = int( problem_id) try: p = Problem.getById( problem_id) except: raise Err( request, err='no problem', log_format=( '{0}'.format( problem_id), ''), user_format=( u'{0}'.format( problem_id), u'啥乱七八糟的!!!'), ) u = User.getSessionUser( request.session) if not u: raise Err( request, err='not login') if not GeneralSubmission.canSubmitCode( u, p): raise Err( request, err = 'no priv') if request.method == 'POST': lang_list = [('gcc','GNU C'), ('g++','GNU C++'), ('java', 'JAVA')] form = addGeneralForm(lang_list, request.POST) if form.is_valid(): sub_name = str( datetime.now()) time_str = sub_name.split('.') time_str.pop() for i in ['-',':','.',' ']: sub_name = sub_name.replace(i,'_') head_details = '' head_details += '/*\n' head_details += 'USER_ID: ' + str(u) + '\n' head_details += 'PROBLEM: ' + str(p.pid) + '\n' head_details += 'SUBMISSION_TIME: ' + time_str[0] + '\n' head_details += '*/\n' import os code_file_path = os.path.join( Const.SUBMISSION_TMP_PATH, "{0:010d}_{1}_{2}".format( u.uid, sub_name, 'general')) code_length = 0 if 'code_file' in request.FILES: default_storage.save( code_file_path, request.FILES['code_file']) else: if form.cleaned_data['code']: default_storage.save( code_file_path, ContentFile( head_details + form.cleaned_data['code'])) else: raise Err( request, err='request err', log_format=( 'code', 'no input'), user_format=( u'代码呢!', u'不写代码交什么交!!'), ) code_length = default_storage.size( code_file_path) sub_lang = form.cleaned_data['language'] if sub_lang not in map( lambda x: x[0], lang_list): raise Err( request, err='illegal language', log_format=( '{0}'.format( sub_lang), 'blabla'), user_format=( u'{0}'.format( sub_lang), u'别瞎搞成不!!'), ) x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') additional = { 'submit_ip': ip} GeneralSubmission.addGeneralSubmission( u, p, code_file_path, form.cleaned_data['language'], code_length) return redirect('Submission:status') # could it be okay? else: raise Exception(u'form invalid') # not POST method else: lang_list = [('gcc','GNU C'), ('g++','GNU C++'), ('java', 'JAVA')] form = addGeneralForm(lang_list) return render( request, 'newtpl/submission/general/submit.html', { 'form': form, 'tpl': {'sp': True}, 'problem':p }, ) except Exception as e: return render( request, Err.ERROR_PAGE, { 'errmsg': unicode(e), }, )
def addProblem(request, course_id): # modified logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if course_id == None: return redirect('/problem/addProblem/') try: course_id = int(course_id) cs = Course.getById(course_id) except: raise Exception(u'课程号非法') if not Problem.canAddCourseProblem(cs, u): raise Err(request, 'no priv') if request.method == 'POST': form = addProblemForm(request.POST) if form.is_valid(): prb = Problem.addProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], form.cleaned_data['prob_desc'], form.cleaned_data['is_spj'], 0, course_id, "") data_count=0 case_info="" if form.cleaned_data['change_data'] == "1": dataInList=request.FILES.getlist('data_in') dataOutList=request.FILES.getlist('data_out') dataScrList=request.POST.getlist('data_scr') if len(dataInList)!=len(dataOutList) or len(dataInList)!=len(dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict={} for idx, nowScr in enumerate(dataScrList): dict[str(idx)]=nowScr case_info=json.dumps(dict) data_count=len(dataInList) dict={} dict['desc']=form.cleaned_data['prob_desc'] dict['input_desc']=form.cleaned_data['prob_input_desc'] dict['output_desc']=form.cleaned_data['prob_output_desc'] dict['input_sample']=form.cleaned_data['prob_input_sample'] dict['output_sample']=form.cleaned_data['prob_output_sample'] prob_desc=json.dumps(dict) prb.updateProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], prob_desc, form.cleaned_data['is_spj'], data_count, course_id, case_info) return redirect("/problem/p/"+str(prb.pid)+"/") else: raise Err(request, 'problem info illegal') else: form = addProblemForm() return render(request,'newtpl/problem/modifyProblem.html',{'form': form,'course': cs, 'tpl':{'sp':True}}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def addProblemSubmit(request): logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') p = request.POST if request.method == 'POST': form = addProblemForm(request.POST) if not form.is_valid(): raise Exception(u'数据输入有误') course_id = int(p['course_id']) if course_id == None: raise Exception(u'课程非法') cs = Course.getById(course_id) if not cs: raise Exception(u'课程号非法') if not Problem.canAddCourseProblem(cs, u): raise Err(request, 'no priv') prb = Problem.addProblem(u.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], p['prob_desc'], p['is_spj'], 0, p['course_id'], "") data_count=0 case_info="" #If file not exist, Create an empty file. open(Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+"0.in", 'a').close() open(Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+"0.out", 'a').close() if p['change_data'] == "1": dataInList=request.FILES.getlist('data_in') dataOutList=request.FILES.getlist('data_out') dataScrList=request.POST.getlist('data_scr') if len(dataInList)!=len(dataOutList) or len(dataInList)!=len(dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict={} for idx, nowScr in enumerate(dataScrList): dict[str(idx)]=nowScr case_info=json.dumps(dict) data_count=len(dataInList) dict={} dict['desc']=p['prob_desc'] dict['input_desc']=p['prob_input_desc'] dict['output_desc']=p['prob_output_desc'] dict['input_sample']=p['prob_input_sample'] dict['output_sample']=p['prob_output_sample'] prob_desc=json.dumps(dict) prb.updateProblem(u.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], prob_desc, p['is_spj'], data_count, p['course_id'], case_info) return redirect("/problem/p/"+str(prb.pid)+"/") except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE, {'errmsg': unicode(e)})
def updateProblem(request, p_id): logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') try: p_id = int(p_id) p = Problem.getById(p_id) except: logger.error(str(e).replace("\n","\t")) raise Err(request, 'unknown err') if not p.canManageProblem(u): raise Err(request, 'no priv') if request.method == 'POST': form = addProblemForm(request.POST) if form.is_valid(): data_count=p.data_count case_info=p.case_info if form.cleaned_data['change_data'] == "1": dataInList=request.FILES.getlist('data_in') dataOutList=request.FILES.getlist('data_out') dataScrList=request.POST.getlist('data_scr') if len(dataInList)!=len(dataOutList) or len(dataInList)!=len(dataScrList): raise Err(request, 'unknown err') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH+str(p.pid)+"/"+str(idx)+".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH+str(p.pid)+"/"+str(idx)+".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict={} for idx, nowScr in enumerate(dataScrList): dict[str(idx)]=nowScr case_info=json.dumps(dict) data_count=len(dataInList) dict={} dict['desc']=form.cleaned_data['prob_desc'] dict['input_desc']=form.cleaned_data['prob_input_desc'] dict['output_desc']=form.cleaned_data['prob_output_desc'] dict['input_sample']=form.cleaned_data['prob_input_sample'] dict['output_sample']=form.cleaned_data['prob_output_sample'] prob_desc=json.dumps(dict) p.updateProblem(u.uid, form.cleaned_data['prob_priv'], form.cleaned_data['prob_title'], form.cleaned_data['prob_time'], form.cleaned_data['prob_memory'], form.cleaned_data['prob_codelength'], prob_desc, form.cleaned_data['is_spj'], data_count, p.course_id, case_info) return redirect("/problem/p/"+str(p.pid)+"/") else: raise Err(request, 'unknown err') else: desc=json.loads(p.prob_desc) form = addProblemForm( initial={ 'prob_title': p.prob_title, 'prob_priv': p.prob_priv, 'prob_time': p.prob_time, 'prob_memory': p.prob_memory, 'prob_codelength': p.prob_codelength, 'prob_desc': desc['desc'], 'prob_input_desc': desc['input_desc'], 'prob_output_desc': desc['output_desc'], 'prob_input_sample': desc['input_sample'], 'prob_output_sample': desc['output_sample'], 'is_spj': p.is_spj, 'change_data': 0 } ) cases = range(p.data_count) return render(request,'newtpl/problem/modifyProblem.html',{'problem':p, 'form': form,'tpl':{'sp':True}, 'update':True, 'cases': cases}) except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def updateProblemSubmit(request, p_id): logger.info(str(request).replace("\n","\t")) try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') if not p_id: raise Exception(u'题号错误') p_id = int(p_id) ep = Problem.getById(p_id) if not ep: raise Exception(u'题号错误') if not ep.canManageProblem(u): raise Err(request, 'no priv') p = request.POST if request.method == 'POST': form = addProblemForm(request.POST) if not form.is_valid(): raise Exception(u'数据输入有误') prb = ep data_count=prb.data_count case_info=prb.case_info if p['change_data'] == "1": dataInList=request.FILES.getlist('data_in') dataOutList=request.FILES.getlist('data_out') dataScrList=request.POST.getlist('data_scr') if len(dataInList)!=len(dataOutList) or len(dataInList)!=len(dataScrList): raise Exception(u'上传文件有误') for idx, nowData in enumerate(dataInList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".in" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) for idx, nowData in enumerate(dataOutList): path = Const.PROBLEM_DATA_PATH+str(prb.pid)+"/"+str(idx)+".out" if default_storage.exists(path): default_storage.delete(path) default_storage.save(path, nowData) dict={} for idx, nowScr in enumerate(dataScrList): dict[str(idx)]=nowScr case_info=json.dumps(dict) data_count=len(dataInList) dict={} dict['desc']=p['prob_desc'] dict['input_desc']=p['prob_input_desc'] dict['output_desc']=p['prob_output_desc'] dict['input_sample']=p['prob_input_sample'] dict['output_sample']=p['prob_output_sample'] prob_desc=json.dumps(dict) prb.updateProblem(prb.author.uid, p['prob_priv'], p['prob_title'], p['prob_time'], p['prob_memory'], p['prob_codelength'], prob_desc, p['is_spj'], data_count, p['course_id'], case_info) return redirect("/problem/p/"+str(prb.pid)+"/") except Exception as e: logger.error(str(e).replace("\n","\t")) return render(request, Err.ERROR_PAGE)
def updateContest(request, cId): try: u = User.getSessionUser(request.session) if not u: #raise Exception(Const.NOT_LOGGED_IN) raise Err(request, err='not login') try: c = Contest.getById(cId) except: raise Err(request, 'no resource') cc = c.course_class try: c.canBeManaged(u) except: raise Err(request, err='no priv') started = c.isStarted(5) if started: recentProblem = None else: recentProblem = Problem.problemListByAuthor(u) problemList = [{ 'pid': cp.problem.pid, 'title': cp.problem_title, 'origTitle': cp.problem.prob_title } for cp in c.getContestProblem()] if request.method == 'POST': POST = request.POST.copy() if started: POST['start_date'] = c.start_time.date() POST['start_time'] = c.start_time.time() POST['started'] = started form = contestForm(POST) if started: form.fields['start_date'].widget.attrs['disabled'] = True form.fields['start_time'].widget.attrs['disabled'] = True if started: pIdList = [cp['pid'] for cp in problemList] pTitleList = [cp['title'] for cp in problemList] pass else: pIdList = request.POST.getlist('problem_id') pTitleList = request.POST.getlist('problem_title_custom') pCnt = len(pIdList) if form.is_valid(): for i in xrange(pCnt): p = Problem.getById(pIdList[i]) if not p.canManageProblem(u): raise Err(request, 'no problem priv') pInfos = [(pIdList[i], pTitleList[i], chr(65 + i)) for i in xrange(pCnt)] cTitle = form.cleaned_data['title'] cDesc = form.cleaned_data['desc'] cStartDate = form.cleaned_data['start_date'] cStartTime = form.cleaned_data['start_time'] cLength = form.cleaned_data['length'] cBoardStop = form.cleaned_data['board_stop'] cType = form.cleaned_data['contest_type'] cBoardType = form.cleaned_data['board_type'] permitLang = reduce(add, [ Const.LANG_MASK[lang] for lang in form.cleaned_data['lang_limit'] ]) c.updateContest(cTitle, pInfos, datetime.combine(cStartDate, cStartTime), cDesc, cLength, cBoardStop, cType, cBoardType, permitLang) return redirect('Contest:show_contest', cId) else: problemList = [{ 'pid': pIdList[x], 'title': pTitleList[x], 'origTitle': Problem.getById(pIdList[x]).prob_title } for x in xrange(pCnt)] return render( request, 'newtpl/contest/updateContest.html', { 'c': c, 'cc': cc, 'form': form, 'started': started, 'hehe': pCnt, 'recent_problem': recentProblem, 'problem_list': problemList, 'tpl': { 'has_priv': True, 'sp': True, } }) else: form = contestForm( initial={ 'title': c.contest_title, 'desc': c.contest_description, 'start_date': c.start_time.date(), 'start_time': c.start_time.time(), 'length': c.length, 'board_stop': c.board_stop, 'contest_type': c.contest_type, 'board_type': c.board_type, 'lang_limit': c.permittedLangs(), 'started': started, }) if started: form.fields['start_date'].widget.attrs['disabled'] = True form.fields['start_time'].widget.attrs['disabled'] = True return render( request, 'newtpl/contest/updateContest.html', { 'c': c, 'cc': cc, 'form': form, 'started': started, 'recent_problem': recentProblem, 'problem_list': problemList, 'tpl': { 'has_priv': True, 'sp': True, 'nav_act': 'contest', } }) #return render(request, Const.ERROR_PAGE, {'errmsg': unicode(e), }) except Exception as e: return render(request, Const.ERROR_PAGE, { 'errmsg': unicode(e), })
def addContest(request, ccId): try: u = User.getSessionUser(request.session) if not u: raise Err(request, 'not login') try: cc = CourseClass.getById(ccId) except: raise Err(request, 'no resource') try: Contest.canAddContest(cc, u) except: raise Err(request, 'no priv') recentProblem = Problem.problemListByAuthor(u) if request.method == 'POST': form = contestForm(request.POST) pIdList = request.POST.getlist('problem_id') pTitleList = request.POST.getlist('problem_title_custom') pCnt = len(pIdList) if form.is_valid(): for i in xrange(pCnt): p = Problem.getById(pIdList[i]) if not p.canManageProblem(u): raise Err(request, 'no problem priv') pInfos = [(pIdList[i], pTitleList[i], chr(65 + i)) for i in xrange(pCnt)] cTitle = form.cleaned_data['title'] cDesc = form.cleaned_data['desc'] cStartDate = form.cleaned_data['start_date'] cStartTime = form.cleaned_data['start_time'] cLength = form.cleaned_data['length'] cBoardStop = form.cleaned_data['board_stop'] cType = form.cleaned_data['contest_type'] cBoardType = form.cleaned_data['board_type'] permitLang = reduce(add, [ Const.LANG_MASK[lang] for lang in form.cleaned_data['lang_limit'] ]) c = Contest.addContest( u, cc, cTitle, pInfos, datetime.combine(cStartDate, cStartTime), cDesc, cLength, cBoardStop, cType, cBoardType, permitLang) return redirect('Contest:show_contest', c.cid) else: problemList = [{ 'pid': pIdList[x], 'title': pTitleList[x], 'origTitle': Problem.getById(pIdList[x]).prob_title } for x in xrange(pCnt)] return render( request, 'newtpl/contest/addContest.html', { 'cc': cc, 'form': form, 'recent_problem': recentProblem, 'problem_list': problemList, 'tpl': { 'has_priv': True, 'sp': True, } }) else: form = contestForm() return render( request, 'newtpl/contest/addContest.html', { 'cc': cc, 'form': form, 'recent_problem': recentProblem, 'tpl': { 'has_priv': True, 'sp': True, } }) except Exception as e: return render(request, Err.ERROR_PAGE)