summaryrefslogtreecommitdiff
path: root/server/handlers.py
diff options
context:
space:
mode:
authorAleš Smodiš <aless@guru.si>2015-10-04 19:43:09 +0200
committerAleš Smodiš <aless@guru.si>2015-10-04 19:43:09 +0200
commit361f8245079b625560449324faf111ed6fcf3b1b (patch)
treea484991b6e3456545d6d5437a17201ab0a8e7b8a /server/handlers.py
parent8c61a1980c973c649a2d9b3b9da67f2a680f4139 (diff)
Unification of language session implementations. Added load_problem and end_problem actions so handlers get appropriately created and destroyed upon loading and unloading the problem solving screen.
Diffstat (limited to 'server/handlers.py')
-rw-r--r--server/handlers.py73
1 files changed, 44 insertions, 29 deletions
diff --git a/server/handlers.py b/server/handlers.py
index 6720cae..99b021f 100644
--- a/server/handlers.py
+++ b/server/handlers.py
@@ -99,9 +99,13 @@ class Query(CodeqService):
else:
session = request.session
trace = js.get('trace')
- prolog = session.get_prolog()
program = None
- if step == 'run':
+ prolog = session.current_language_session()
+ if prolog is None:
+ result = {'code': 6, 'message': 'No language session is active'}
+ elif not isinstance(prolog, server.prolog_session.PrologSession):
+ result = {'code': 7, 'message': 'The currently active session is not Prolog'}
+ elif step == 'run':
program = js.get('program')
query = js.get('query')
if program is None:
@@ -115,7 +119,7 @@ class Query(CodeqService):
messages, status, have_more = prolog.step()
result = {'code': 0, 'message': 'ok', 'terminal': {'messages': messages, 'status': status, 'have_more': have_more}}
elif step == 'end':
- messages, status, have_more = prolog.end()
+ messages, status, have_more = prolog.destroy()
result = {'code': 0, 'message': 'ok', 'terminal': {'messages': messages, 'status': status, 'have_more': have_more}}
else:
result = {'code': 5, 'message': 'Unknown prolog step: {0}'.format(step)}
@@ -128,10 +132,12 @@ class Query(CodeqService):
class PythonExec(CodeqService):
def process(self, request):
program = request.data.get('program')
+ python = request.session.current_language_session()
if program is None:
request.reply({'code': 1, 'message': 'No program specified'})
+ elif not isinstance(python, server.python_session.PythonSession):
+ request.reply({'code': 2, 'message': 'The currently active session is not Python'})
else:
- python = request.session.get_python()
python.exec(program)
request.reply({'code': 0, 'message': 'ok'})
@@ -139,19 +145,24 @@ class PythonExec(CodeqService):
# Send an interrupt to the Python interpreter.
class PythonStop(CodeqService):
def process(self, request):
- python = request.session.get_python()
- python.stop()
- request.reply({'code': 0, 'message': 'ok'})
+ python = request.session.current_language_session()
+ if not isinstance(python, server.python_session.PythonSession):
+ request.reply({'code': 2, 'message': 'The currently active session is not Python'})
+ else:
+ python.stop()
+ request.reply({'code': 0, 'message': 'ok'})
# Push stdin to the Python interpreter.
class PythonPush(CodeqService):
def process(self, request):
text = request.data.get('text')
+ python = request.session.current_language_session()
if text is None:
request.reply({'code': 1, 'message': 'No input specified'})
+ elif not isinstance(python, server.python_session.PythonSession):
+ request.reply({'code': 2, 'message': 'The currently active session is not Python'})
else:
- python = request.session.get_python()
python.push(text)
request.reply({'code': 0, 'message': 'ok'})
@@ -159,7 +170,7 @@ class PythonPush(CodeqService):
class Hint(CodeqService):
def process(self, request):
js = request.data
- language = js.get('language')
+ language = js.get('language') # TODO: remove
problem_id = js.get('problem_id')
program = js.get('program')
@@ -169,16 +180,9 @@ class Hint(CodeqService):
request.reply({'code': 2, 'message': 'No program specified'})
else:
session = request.session
- lang_session = None
- if language == 'prolog':
- lang_session = session.get_prolog()
- elif language == 'python':
- lang_session = session.get_python()
- elif language == 'robot':
- lang_session = session.get_robot()
-
+ lang_session = session.current_language_session()
if lang_session is None:
- request.reply({'code': 3, 'message': 'Unknown language specified'})
+ request.reply({'code': 3, 'message': 'No active session exists'})
else:
hints = lang_session.hint(session.get_sid(), problem_id, program)
request.reply({'code': 0, 'message': 'ok', 'hints': hints})
@@ -187,7 +191,7 @@ class Hint(CodeqService):
class Test(CodeqService):
def process(self, request):
js = request.data
- language = js.get('language')
+ language = js.get('language') # TODO: remove
problem_id = js.get('problem_id')
program = js.get('program')
@@ -197,16 +201,9 @@ class Test(CodeqService):
request.reply({'code': 2, 'message': 'No program specified'})
else:
session = request.session
- lang_session = None
- if language == 'prolog':
- lang_session = session.get_prolog()
- elif language == 'python':
- lang_session = session.get_python()
- elif language == 'robot':
- lang_session = session.get_robot()
-
+ lang_session = session.current_language_session()
if lang_session is None:
- request.reply({'code': 3, 'message': 'Unknown language specified'})
+ request.reply({'code': 3, 'message': 'No active session exists'})
else:
hints = lang_session.test(session.get_sid(), problem_id, program)
request.reply({'code': 0, 'message': 'ok', 'hints': hints})
@@ -227,6 +224,22 @@ class GetProblem(CodeqService):
else:
request.reply({'code': 0, 'message': 'ok', 'data': request.session.get_problem_data(language, problem_group, problem)})
+class LoadProblem(CodeqService):
+ def process(self, request):
+ problem_id = request.data.get('problem_id')
+ if problem_id is None:
+ request.reply({'code': 1, 'message': 'There is no active session'})
+ else:
+ session = request.session.load_language_session(problem_id)
+ if session is None:
+ request.reply({'code': 2, 'message': 'The session failed to load'})
+ else:
+ request.reply({'code': 0, 'message': 'OK'})
+
+class EndProblem(CodeqService):
+ def process(self, request):
+ request.session.end_language_session()
+ request.end()
# maps actions to their handlers
incoming_handlers = {
@@ -241,7 +254,9 @@ incoming_handlers = {
'python_stop': PythonStop(),
'hint': Hint(),
'settings': Settings(),
- 'test': Test()
+ 'test': Test(),
+ 'load_problem': LoadProblem(),
+ 'end_problem': EndProblem()
}