diff options
-rw-r--r-- | server/prolog_session.py | 41 | ||||
-rw-r--r-- | wsgi_server.py | 16 |
2 files changed, 38 insertions, 19 deletions
diff --git a/server/prolog_session.py b/server/prolog_session.py index ee8dba3..c1cc8f9 100644 --- a/server/prolog_session.py +++ b/server/prolog_session.py @@ -4,6 +4,7 @@ import operator import threading import prolog.engine import db +from db.models import CodeqUser, Problem from . import problems __all__ = ['PrologSession'] @@ -88,32 +89,34 @@ class PrologSession(object): prolog.engine.stop(self._engine_id) self._engine_id = None + def test(self, user_id, problem_id, program): + language, problem_group, problem = Problem.identifier(problem_id) + problem_module = problems.load_problem(language, problem_group, problem, 'common') + + solved_problems = [p for p in CodeqUser.solved_problems(user_id, language) + if p != (problem_group, problem)] + other_solutions = problems.solutions_for_problems(language, solved_problems) + code = program + '\n' + other_solutions + + try: + n_correct, n_all = problem_module.test(code) + return ['Passed {} / {} tests.'.format(n_correct, n_all)] + except AttributeError as ex: + return ['No test is defined for this problem'] + def run_for_user(self, user_id, problem_id, program, query): """A "shorthand" method to start a Prolog session, load correct solutions of all user's solved problems and the given program, and ask a query. """ - conn = db.get_connection() - try: - cur = conn.cursor() - try: - cur.execute('select l.id, l.identifier, g.identifier, p.identifier from problem p inner join problem_group g on g.id = p.problem_group_id inner join language l on l.id = p.language_id where p.id = %s', (problem_id,)) - row = cur.fetchone() - language_id = row[0] - language = row[1] - problem_group = row[2] - problem = row[3] - cur.execute('select g.identifier, p.identifier from solution s inner join problem p on p.id = s.problem_id inner join problem_group g on g.id = p.problem_group_id where s.codeq_user_id = %s and s.done = True and s.problem_id != %s and p.language_id = %s', (user_id, problem_id, language_id)) - solved_problems = cur.fetchall() - finally: - cur.close() - finally: - conn.commit() - db.return_connection(conn) + language, problem_group, problem = Problem.identifier(problem_id) + problem_module = problems.load_problem(language, problem_group, problem, 'common') + solved_problems = [p for p in CodeqUser.solved_problems(user_id, language) + if p != (problem_group, problem)] other_solutions = problems.solutions_for_problems(language, solved_problems) - problem_module = problems.load_problem(language, problem_group, problem, 'common') problem_facts = problems.get_facts(language, problem_module) or '' - code = other_solutions + problem_facts + program + code = program + '\n' + other_solutions + '\n' + problem_facts + messages, status, have_more = self.run(code) if status == 'ok': more_messages, status, have_more = self.query(query) diff --git a/wsgi_server.py b/wsgi_server.py index 76489db..1624772 100644 --- a/wsgi_server.py +++ b/wsgi_server.py @@ -147,6 +147,19 @@ class Query(CodeqService): session.update_solution(problem_id, trace, program) return result +class Test(CodeqService): + def process(self, js, session): + problem_id = js.get('problem_id') + program = js.get('program') + if problem_id is None: + return {'code': 1, 'message': 'Problem ID not given'} + if program is None: + return {'code': 2, 'message': 'No program specified'} + + prolog = session.get_prolog() + messages = prolog.test(session.get_uid(), problem_id, program) + return {'code': 0, 'message': 'ok', 'terminal': {'messages': messages}} + class GetProblem(CodeqService): def process(self, js, session): language = js.get('language') @@ -173,6 +186,9 @@ api.add_route('/activity', activity) query = Query() api.add_route('/query', query) +test = Test() +api.add_route('/test', test) + get_problem = GetProblem() api.add_route('/get_problem', get_problem) |