# 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.
from typing import Optional, Awaitable
from grader_labextension.services.request import RequestService
from jupyter_server.base.handlers import APIHandler
import os
from tornado.httpclient import HTTPClient, HTTPClientError
from traitlets.config.configurable import SingletonConfigurable
from traitlets.traitlets import Unicode
# test_token: ebce9dfa2a694fb9bb06883bd8bb6012
[docs]class HandlerConfig(SingletonConfigurable):
hub_api_url = Unicode(os.environ.get("JUPYTERHUB_API_URL"), help="The url of the hubs api.").tag(config=True)
hub_api_token = Unicode(os.environ.get("JUPYTERHUB_API_TOKEN"), help="The authorization token to access the hub api").tag(config=True)
hub_user = Unicode(os.environ.get("JUPYTERHUB_USER"), help="The user name in jupyter hub.").tag(config=True)
service_base_url = Unicode(
os.environ.get("GRADER_BASE_URL", "/services/grader"),
help="Base URL to use for each request to the grader service",
).tag(config=True)
[docs]class ExtensionBaseHandler(APIHandler):
"""
BaseHandler for all server-extension handler
"""
[docs] def data_received(self, chunk: bytes) -> Optional[Awaitable[None]]:
pass
request_service = RequestService()
http_client = HTTPClient()
# base_url = "/services/grader"
def __init__(self, *args, **kwargs):
super().__init__(*args, *kwargs)
self.root_dir = os.path.expanduser(self.settings["server_root_dir"])
@property
def service_base_url(self):
return HandlerConfig.instance().service_base_url
@property
def grader_authentication_header(self):
"""Returns the authentication header
:return: authentication header
:rtype: dict
"""
return dict(Authorization="Token " + HandlerConfig.instance().hub_api_token)
[docs] async def get_lecture(self, lecture_id) -> dict:
try:
lecture = await self.request_service.request(
"GET",
f"{self.service_base_url}/lectures/{lecture_id}",
header=self.grader_authentication_header,
)
return lecture
except HTTPClientError as e:
self.set_status(e.code)
self.write_error(e.code)
return
[docs] async def get_assignment(self, lecture_id, assignment_id):
try:
assignment = await self.request_service.request(
"GET",
f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}",
header=self.grader_authentication_header,
)
return assignment
except HTTPClientError as e:
self.set_status(e.code)
self.write_error(e.code)
return