def post(self, task_id):
''' Endpoint for submitting code '''
parser = reqparse.RequestParser()
parser.add_argument('language', required=True)
parser.add_argument('code', required=True)
args = parser.parse_args()
task = manager.get_task(task_id)
if task_id is None or task is None: # no task exists with the stated id
return redirect('/?message=%s' % 'task does not exist.')
test_cases = task.get('test_cases', None)
# get user id
if 'token' not in session:
try:
session.pop('username')
except KeyError: pass
return redirect('/?message=%s' % 'no auth token supplied.')
if session['token'] not in tokens:
try:
session.pop('username')
except KeyError: pass
session.pop('token')
return redirect('/?message=%s' % 'invalid token supplied.')
user = db.session.query(User).filter(User.email==tokens[session['token']]).first()
# verify response using same input
result = docker_verify(args.code, args.language, test_cases)
if result is None:
return redirect('/?task=%d&message=%s' % (task_id, 'language is not supported'))
if all(result):
if(len(args.code) < best_answer[task_id][args.language]):
best_answer[task_id][args.language] = len(args.code)
max_points = int(task.get('points', None))
points = max_points * best_answer[task_id][args.language]/len(args.code)
# look for better answer from same user
prev_answer = db.session.query(Answer).filter((Answer.user_id==user.id) & (Answer.task_id==task_id) & (Answer.points>points)).first()
if prev_answer is None:
answer = Answer(
user_id=user.id,
task_id=task_id,
length=len(args.code),
points=points,
language=args.language
)
db.session.add(answer)
user.points = sum([answer.points for answer in user.answers])
db.session.commit()
return redirect('/?task=%d&message=%s' % (task_id, 'answer judged correct.'))
return redirect('/?task=%d&message=%s' % (task_id, 'answer judged incorrect.'))
rest_api.py 文件源码
python
阅读 29
收藏 0
点赞 0
评论 0
评论列表
文章目录