Source code for pykubegrader.tokens.generator
import sys
import panel as pn
import requests
from panel.pane import Markdown
from panel.widgets import Button, Select, TextInput
from requests.auth import HTTPBasicAuth
from ..utils import api_base_url, student_pw, student_user
pn.extension()
[docs]
class TokenGenerator:
def __init__(self) -> None:
if not student_user or not student_pw:
raise RuntimeError("API credentials not found in environment variables")
self.username = student_user
self.password = student_pw
self.students: list[str] = self.fetch_options("students", key="email")
self.assignments: list[str] = self.fetch_options("assignments", key="title")
# Empty lists are falsy
if not self.students or not self.assignments:
raise RuntimeError("No students found, or no assignments")
self.stud_select = Select(name="Student email", options=self.students)
self.assn_select = Select(name="Assignment name", options=self.assignments)
self.token_input = TextInput(name="Desired token value")
self.submit_btn = Button(name="Submit", button_type="primary")
self.status_msg = Markdown("")
self.submit_btn.on_click(self.request_token)
[docs]
def fetch_options(self, endpoint: str, key: str) -> list[str]:
try:
response = requests.get(
url=f"{api_base_url}/{endpoint}",
auth=HTTPBasicAuth(self.username, self.password),
)
response.raise_for_status()
return sorted([item[key] for item in response.json()])
except requests.exceptions.RequestException as e:
print(f"Error fetching {endpoint}: {e}", file=sys.stderr)
return []
[docs]
def request_token(self, _) -> None:
payload = {
"student_id": self.stud_select.value,
"assignment": self.assn_select.value,
"value": self.token_input.value,
}
try:
response = requests.post(
url=f"{api_base_url}/tokens",
auth=HTTPBasicAuth(self.username, self.password),
json=payload,
)
response.raise_for_status()
self.status_msg.object = "✅ Token generated successfully!"
except requests.exceptions.RequestException as e:
self.status_msg.object = f"❌ Submission failed: {e}"
[docs]
def show(self) -> pn.Column:
return pn.Column(
"# Generate Scoped Token",
self.stud_select,
self.assn_select,
self.token_input,
self.submit_btn,
self.status_msg,
)