Exemple #1
0
    def get_code(self, user_id, problem_id, attempt):
        
        submit = DBSession.query(Submits).filter(Submits.user_id==user_id). \
                 filter(Submits.problem_id==problem_id).filter(Submits.attempt==attempt).one()
        problem = DBSession.query(Problems).filter_by(uid=problem_id).one()

        
        localpath = "devcon/public/files/%s/serie_%d" % (submit.user_name, problem.serie)
        path = os.path.join(os.getcwd(), localpath)

        file = open(os.path.join(path, submit.submit_filename), 'r')
        
        response.headers['Content-Type'] = "text/html"
		
        data = file.readlines()
        data = "".join(data[-500:])
        
        phplexer = get_lexer_by_name("php", stripall=True)
        formatter = HtmlFormatter(linenos=True, cssclass="source")

        data = highlight(data, phplexer, formatter)
        file.close()
        
        data = '<style>'+ HtmlFormatter().get_style_defs('.highlight') +'</style>' + '<div class="highlight">'+data+'</div>'
        return data
Exemple #2
0
    def getList(self, _dc, page, start, limit, sort, group):
        serie = DBSession.query(Series).filter_by(current=1)
        try:
            serie = serie.one()
            serie_num = serie.uid
            title = serie.title
        except:
            serie_num = 0
            title = 'There is not a active contest'
            
        query = """SELECT submits.*, problems.points as problem_points, count(submits.user_name) as num
FROM submits 
INNER JOIN tg_user on submits.user_id=tg_user.user_id
INNER JOIN problems on submits.problem_id=problems.uid
WHERE submits.result='accepted'
AND problems.serie=""" + str(serie_num) +  """
GROUP BY submits.problem_id, submits.user_name
ORDER BY num"""

        #return str(query);
        rs = DBSession.execute(query)
        rows = rs.fetchall()
        
        
        data = []
        for r in rows:
            data.append({'user_id':r.user_id, 'username':r.user_name, 'problem_id': r.problem_id, 'problem_title': r.problem_title, 'result': r.result, 'datetime': r.datetime, 'attempt': r.attempt})
        
        return dict(rows=data)
Exemple #3
0
 def list(self):
     # getting the current serie of contest
     serie = DBSession.query(Series).filter_by(current=1)
     
     try:
         uid = serie.one().uid
         title = serie.one().title
     except:
         uid = 0
         title = 'There is not a active contest'
     
     data = DBSession.query(Problems). \
            filter(or_(Problems.serie.like(uid), Problems.serie.like(0))). \
            order_by(Problems.uid)
     
     return dict(page='list', grid=problems_grid, data=data, request=request, title=title)
Exemple #4
0
 def view(self, uid):
     serie = DBSession.query(Series).filter_by(current=1)
     try:
         serie = serie.one()
         serie_num = serie.uid
         title = serie.title
         if serie.status == 'open':
             can_submit = 1
         else:
             can_submit = 0
     except:
         serie_num = 0
         can_submit = 0
         title = 'There is not a active contest'
     
     problem = DBSession.query(Problems).filter_by(uid=uid).one()
     
     return dict(page='view', problem=problem, can_submit=can_submit)
Exemple #5
0
    def createNew(self, **kw):
        problem = Problems()
        problem.code = kw['code']
        problem.title = kw['title']
        problem.text = kw['text']
        problem.input = kw['input']
        problem.output = kw['output']
        problem.sample_input = kw['sample_input']
        problem.sample_ouput = kw['sample_output']
        problem.topic = kw['topic']
        problem.serie = kw['serie']
        problem.points = kw['points']
        problem.lang = 'en'
        problem.date = datetime.datetime.today().isoformat()

        DBSession.add(problem)

        flash(_('Problem Saved for serie: ' + str(kw['serie'])))
        redirect('/problems/list_adm')
Exemple #6
0
    def upload_io_save(self, uid, **kw):
        # getting problem data
        problem = DBSession.query(Problems).filter_by(uid=uid).one()

        # getting the current serie of contest
        serie = DBSession.query(Series).filter_by(current=1)
        try:
            serie_num = serie.one().uid
        except:
            serie_num = 0

        """ saving the file """
        in_file = request.POST['in_file']
        out_file = request.POST['out_file']
        in_name = "%s_%s.in" % (problem.code.lower(), serie_num)
        out_name = "%s_%s.out" % (problem.code.lower(), serie_num)

        input_path = os.path.join(os.getcwd(), 'devcon/public/files/inputs')
        output_path = os.path.join(os.getcwd(), 'devcon/public/files/outputs')
       
        #is dir??
        if not os.path.isdir(input_path):
            os.mkdir(input_path)
        if not os.path.isdir(output_path):
            os.mkdir(output_path)

        input_path = os.path.join(input_path, in_name)
        output_path = os.path.join(output_path, out_name)
        
        permanent_in_file = open(input_path, 'w')
        permanent_out_file = open(output_path, 'w')

        shutil.copyfileobj(in_file.file, permanent_in_file)
        shutil.copyfileobj(out_file.file, permanent_out_file)
        
        in_file.file.close()
        out_file.file.close()
        
        os.chmod(input_path, stat.S_IRWXU)
        os.chmod(output_path, stat.S_IRWXU)

        flash(_('Files uploaded: ' + input_path + '\n' + output_path))
        redirect('/problems/list_adm')
Exemple #7
0
    def submits_list(self, **kw):

        # getting the current serie of contest
        serie = DBSession.query(Series).filter_by(current=1)
        try:
            serie_num = serie.one().uid
            title = serie.one().title
        except:
            serie_num = 0
            title = 'There is not a active contest'

        data = DBSession.query(Submits).filter_by(serie=serie_num)
        
        ordering = kw.get('ordercol')
        if ordering and ordering[0] == '+':
            data = data.order_by(asc(ordering[1:]))
        elif ordering and ordering[0] == '-':
            data = data.order_by(desc(ordering[1:]))
        else:
            data = data.order_by(desc(Submits.datetime))
        
        return dict(page='submits_list', grid=submits_grid, data=data, request=request, title=title)
Exemple #8
0
    def getInput(self, uid):
        problem = DBSession.query(Problems).filter_by(uid=uid).one()
        path = os.path.join(os.getcwd(), 'devcon/public/files/inputs')
        input_filename = "%s_%s.in" % (problem.code.lower(), problem.serie)
        file = open(os.path.join(path, input_filename), 'r')
        
        response.headers['Content-Type'] = "text/plain"
        response.headers['Content-Length'] = os.path.getsize(os.path.join(path, input_filename))
        response.headers['Content-Disposition'] = 'attachment; filename="'+input_filename+'"'

        data = file.readlines()
        file.close()
        
        return "".join(data[-500:])
Exemple #9
0
 def setUp(self):
     """Prepare model test fixture."""
     try:
         new_attrs = {}
         new_attrs.update(self.attrs)
         new_attrs.update(self.do_get_dependencies())
         self.obj = self.klass(**new_attrs)
         DBSession.add(self.obj)
         DBSession.flush()
         return self.obj
     except:
         DBSession.rollback()
         raise
Exemple #10
0
 def index(self):
     # getting the current serie of contest
     serie = DBSession.query(Series).filter_by(current=1)
     try:
         serie = serie.one()
         serie_num = serie.uid
         title = serie.title
     except:
         serie_num = 0
         title = 'There is not a active contest'
     
     if serie_num == 0:
         flash(_('There is not a active contest serie'), 'warning')
         jsfilename = ''
     else:
         if serie.status == 'finished':
             jsfilename = 'results.list'
         else:
             flash(_('The content '+title+' is active yet'), 'warning')
             jsfilename = ''
    
     return dict(jsfilename=jsfilename, page='results_list', title=title)
Exemple #11
0
 def test_query_obj(self):
     """Model objects can be queried"""
     obj = DBSession.query(self.klass).one()
     for key, value in self.attrs.iteritems():
         assert_equals(getattr(obj, key), value)
Exemple #12
0
 def tearDown(self):
     """Finish model test fixture."""
     DBSession.rollback()
Exemple #13
0
 def submit(self, **kw):
     tmpl_context.form = create_submit_form
     problem = DBSession.query(Problems).filter_by(uid=kw['uid']).one()
     return dict(problem=problem.title, value=kw)
Exemple #14
0
    def save(self, **kw):
        if kw['file_source'] != '':
            # getting problem data
            problem = DBSession.query(Problems).filter_by(uid=kw['uid']).one()

            # getting attempt number
            q =  DBSession.query(Submits).filter(Submits.user_id==request.identity['user'].user_id). \
                 filter(Submits.problem_id==problem.uid).order_by(desc(Submits.attempt))
            if q.count() > 0:
                attempt_nro = q[0].attempt + 1
            else:
                attempt_nro = 1

            # getting the current serie of contest
            serie = DBSession.query(Series).filter_by(current=1)
            try:
                serie_num = serie.one().uid
                title = serie.one().title
            except:
                serie_num = 0
                title = 'There is not a active contest'

            
            """ saving the file """
            file = request.POST['file_source']
            asset_dirname = os.path.join(os.getcwd(), 'devcon/public/files')
            
            #real path to store the file by user
            user_dir = os.path.join(asset_dirname, request.identity['user'].user_name)
            user_serie_dir = os.path.join(user_dir, 'serie_' + str(serie_num))
            
            #is dir??
            if not os.path.isdir(user_dir):
                os.mkdir(user_dir)
            if not os.path.isdir(user_serie_dir):
                os.mkdir(user_serie_dir)
               
            uploaded_filename = file.filename
            
            submit_filename = "%s_%d_%d.php" % (file.filename.lstrip(os.sep).replace('.php', ''), problem.serie, attempt_nro)
            filepath = os.path.join(user_serie_dir, submit_filename)
            
            permanent_file = open(filepath, 'w')
            shutil.copyfileobj(file.file, permanent_file)
            filesize = "%d Kb" % ((os.path.getsize(filepath)/1024))
            
            file.file.close()
            #this_file = self.request.params["file"].filename 
            permanent_file.close()
            os.chmod(filepath, stat.S_IRWXU)

            """ saving on db """
            
            filename = "%s_%d" % (problem.code.lower(), problem.serie)
            inputfile_path = os.path.join(os.getcwd(), 'devcon/public/files/inputs', filename + '.in')
            output_filename = filename + '.out' 
            gen_output_filename = "%s_%d.out" % (filename, attempt_nro) 
            outputfile_path = os.path.join(os.getcwd(), 'devcon/public/files/outputs', output_filename)
            tmp_filepath = os.path.join(user_serie_dir, gen_output_filename)
            
            cmd = "php -f %s < %s > %s" % (filepath, inputfile_path, tmp_filepath)

            excution_res = os.system(cmd)
            os.chmod(tmp_filepath, stat.S_IRWXU)

            # verify if the file was generated
            if excution_res == 0:
                if os.path.isfile(tmp_filepath):
                    test_lines = open(tmp_filepath).readlines()
                    correct_lines = open(outputfile_path).readlines()
                    
                    failed = 0
                    len_diff = len(test_lines) - len(correct_lines)

                    if len_diff != 0:
                        result = 'wrong answer'
                        failed = 1
                    else:
                        for test, correct in zip(test_lines, correct_lines):
                            if test != correct:
                                result = 'wrong answer'
                                failed = 1
                                break
                    
                    if failed == 0:
                        ok = 1
                    else:
                        ok = 0
                else:
                    ok = 0
                    result = 'compilation output missing'

            else:
                ok = 0
                result = 'compilation error'
                
            if ok == 1:
                result = 'accepted'

            
            _submit = Submits()
            _submit.user_id = request.identity['user'].user_id
            _submit.problem_id = problem.uid
            _submit.user_name = request.identity['user'].user_name
            _submit.problem_title = problem.title
            _submit.datetime = datetime.datetime.today().isoformat()
            _submit.filename = uploaded_filename
            _submit.output_filename = gen_output_filename
            _submit.submit_filename = submit_filename
            _submit.attempt = attempt_nro
            _submit.result = result
            _submit.comments = kw['Comments']
            _submit.serie = serie_num
            _submit.accepted = ok

            DBSession.add(_submit)
            
            if ok == 1:
                flash('Congratulations, your solution was accepted')
            else:
                flash('Sorry, someting was wrong', 'error')
            
            redirect('/problems/submits_list')
            #return dict(filename=filename, filesize=filesize, problem=problem)
        else:
            flash(_('The file is required'), 'warning')
            redirect('/problems/submit?uid=' + kw['uid'])
Exemple #15
0
 def by_user_name(cls, username):
     """Return the user object whose user name is ``username``."""
     return DBSession.query(cls).filter_by(user_name=username).first()
Exemple #16
0
 def by_email_address(cls, email):
     """Return the user object whose email address is ``email``."""
     return DBSession.query(cls).filter_by(email_address=email).first()
Exemple #17
0
 def index(self):
     """Handle the front-page."""
     problem = DBSession.query(Problems).filter_by(uid=uid).one()
     return dict(page='view', problem=problem)