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
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)
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)
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)
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')
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)
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:])
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)
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)
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()
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()
def index(self): """Handle the front-page.""" problem = DBSession.query(Problems).filter_by(uid=uid).one() return dict(page='view', problem=problem)
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'])
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)