# Copyright (c) 2022, TU Wien
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
import json
from grader_labextension.registry import register_handler
from grader_labextension.handlers.base_handler import ExtensionBaseHandler
import tornado
from tornado import web
from grader_labextension.services.request import RequestService
from tornado.httpclient import HTTPError
[docs]@register_handler(path=r"\/lectures\/?")
class LectureBaseHandler(ExtensionBaseHandler):
"""
Tornado Handler class for http requests to /lectures.
"""
[docs] @web.authenticated
async def get(self):
"""Sends a GET-request to the grader service and returns the autorized lectures
"""
query_params = RequestService.get_query_string({
"complete": self.get_argument("complete", None)
})
try:
response = await self.request_service.request(
"GET",
f"{self.service_base_url}/lectures{query_params}",
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write(json.dumps(response))
[docs] @web.authenticated
async def post(self):
"""Sends a POST-request to the grader service to create a lecture
"""
data = tornado.escape.json_decode(self.request.body)
try:
response = await self.request_service.request(
"POST",
f"{self.service_base_url}/lectures",
body=data,
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write(json.dumps(response))
[docs]@register_handler(path=r"\/lectures\/(?P<lecture_id>\d*)\/?")
class LectureObjectHandler(ExtensionBaseHandler):
"""
Tornado Handler class for http requests to /lectures/{lecture_id}.
"""
[docs] @web.authenticated
async def put(self, lecture_id: int):
"""Sends a PUT-request to the grader service to update a lecture
:param lecture_id: id of the lecture
:type lecture_id: int
"""
data = tornado.escape.json_decode(self.request.body)
try:
response_data: dict = await self.request_service.request(
"PUT",
f"{self.service_base_url}/lectures/{lecture_id}",
body=data,
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write(json.dumps(response_data))
[docs] @web.authenticated
async def get(self, lecture_id: int):
"""Sends a GET-request to the grader service and returns the lecture
:param lecture_id: id of the lecture
:type lecture_id: int
"""
try:
response_data: dict = await self.request_service.request(
"GET",
f"{self.service_base_url}/lectures/{lecture_id}",
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write(json.dumps(response_data))
[docs] @web.authenticated
async def delete(self, lecture_id: int):
"""Sends a DELETE-request to the grader service to delete a lecture
:param lecture_id: id of the lecture
:type lecture_id: int
"""
try:
await self.request_service.request(
"DELETE",
f"{self.service_base_url}/lectures/{lecture_id}",
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write("OK")
[docs]@register_handler(
path=r"\/lectures\/(?P<lecture_id>\d*)\/users\/?"
)
class LectureStudentsHandler(ExtensionBaseHandler):
"""
Tornado Handler class for http requests to /lectures/{lecture_id}/users.
"""
[docs] async def get(self, lecture_id: int):
"""
Sends a GET request to the grader service and returns attendants of lecture
:param lecture_id: id of the lecture
:return: attendants of lecture
"""
try:
response = await self.request_service.request(
method="GET",
endpoint=f"{self.service_base_url}/lectures/{lecture_id}/users/",
header=self.grader_authentication_header,
)
except HTTPError as e:
self.set_status(e.code)
self.write_error(e.code)
return
self.write(json.dumps(response))