grapher/student_graph.py

79 lines
3.2 KiB
Python

import numpy as np
from imgui_bundle import imgui
import random
from datatypes import *
from model import *
class StudentGraph:
def __init__(self):
super().__init__()
self.classes = None
self.students = None
self.select_class = 0
self.select_student = 0
def __call__(self):
self.classes = Class.select()
self.students = Student.select().where(Student.class_id == self.classes[self.select_class].id) if self.classes else None
# Setup Data
submissions = Submission.select().where(Submission.student_id == self.students[self.select_student].id) if self.students else None
data = np.array([submission.points/Lecture.get_by_id(submission.lecture_id).points*100 for submission in submissions], dtype=np.float32) if submissions else None
with imgui.begin("Student Graph", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE):
w, h = imgui.get_content_region_available()
if not isinstance(data, np.ndarray):
imgui.text("No Submission available for this Student")
else:
imgui.plot_histogram(
"##Data", data, overlay_text="Performance per Lecture (in %)",
scale_min=0.0, scale_max=100,
graph_size=(w, h*0.69)
)
with imgui.begin_child("Select Class", w/3, h*0.3, border=True):
if not self.classes:
imgui.text("No Class could be queried")
else:
for n, c in enumerate(self.classes, start = 1):
display = f"{n}. {c.name}"
opened, _ = imgui.selectable(display, self.select_class == n-1)
if opened:
self.select_class = n-1
self.select_student = 0
imgui.same_line()
with imgui.begin_child("Select Student", w/3, h*0.3, border=True):
if not self.students:
imgui.text("No Student in this class")
else:
for n, s in enumerate(self.students, start = 1):
display = f"{n}. {s.prename} {s.surname}"
opened, _ = imgui.selectable(display, self.select_student == n-1)
if opened:
self.select_student = n-1
imgui.same_line()
with imgui.begin_child("Student Info", w/3, h*0.3, border=True):
if not submissions:
imgui.text("No Submissions for this Student")
else:
for n, s in enumerate(submissions):
lecture = Lecture.get_by_id(s.lecture_id)
points = s.points
if points.is_integer():
points = int(points)
display = f"{n}. {lecture.title} {points}/{lecture.points}"
COLOR = COLOR_TEXT_PASSED if points > lecture.points*0.3 else COLOR_TEXT_FAILED
imgui.text_colored(display, *COLOR)