Esempio n. 1
0
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)
Esempio n. 2
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 3
0
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)
Esempio n. 4
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 5
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 6
0
File: models.py Progetto: YLAsce/oj
    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
Esempio n. 7
0
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) } )
Esempio n. 8
0
    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
Esempio n. 9
0
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)})
Esempio n. 10
0
File: models.py Progetto: YLAsce/oj
    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
Esempio n. 11
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 12
0
    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
Esempio n. 13
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 14
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 15
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 16
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 17
0
File: views.py Progetto: YLAsce/oj
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) } )
Esempio n. 18
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 19
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 20
0
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), })
Esempio n. 21
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 22
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 23
0
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)})
Esempio n. 24
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 25
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 26
0
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),
            },
        )
Esempio n. 27
0
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), }, )
Esempio n. 28
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 29
0
File: views.py Progetto: YLAsce/oj
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)})
Esempio n. 30
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 31
0
File: views.py Progetto: YLAsce/oj
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)
Esempio n. 32
0
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),
        })
Esempio n. 33
0
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)