79 lines
3.2 KiB
Python
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)
|