262 lines
11 KiB
Python
262 lines
11 KiB
Python
|
from imgui_bundle import imgui, imgui_ctx, ImVec2
|
||
|
from model import *
|
||
|
import random
|
||
|
|
||
|
class DatabaseEditor:
|
||
|
def __init__(self):
|
||
|
super().__init__()
|
||
|
self.add_name = str()
|
||
|
self.select_class = 0
|
||
|
self.select_lecture = 0
|
||
|
self.select_student = 0
|
||
|
self.select_submission = 0
|
||
|
|
||
|
self.class_name = str()
|
||
|
self.add_class_name = str()
|
||
|
|
||
|
self.student_prename = str()
|
||
|
self.student_surname = str()
|
||
|
self.student_sex = False
|
||
|
self.add_student_prename = str()
|
||
|
self.add_student_surname = str()
|
||
|
self.add_student_sex = False
|
||
|
|
||
|
self.lecture_title = str()
|
||
|
self.lecture_points = 0
|
||
|
self.add_lecture_title = str()
|
||
|
self.add_lecture_points = 0
|
||
|
|
||
|
self.submission_points = 0.0
|
||
|
self.add_submission_lecture = 0
|
||
|
self.add_submission_points = 0.0
|
||
|
|
||
|
def content_list(self, content: list, selector: int, id: str, height: int) -> int:
|
||
|
w = imgui.get_window_size().x
|
||
|
with imgui_ctx.begin_child(str(id), ImVec2(w*0.3, height)):
|
||
|
for n, c in enumerate(content, start = 1):
|
||
|
_, clicked = imgui.selectable(f"{n}. {c}", selector == n-1)
|
||
|
if clicked:
|
||
|
selector = n-1
|
||
|
return selector
|
||
|
|
||
|
def class_editor(self):
|
||
|
w, h = imgui.get_window_size()
|
||
|
classes = Class.select()
|
||
|
content = [f"{c.name}" for c in classes]
|
||
|
self.select_class = self.content_list(content, self.select_class, "class_content", h*0.15)
|
||
|
imgui.same_line()
|
||
|
|
||
|
with imgui_ctx.begin_child("Class", ImVec2(w*0.25, h*0.15)):
|
||
|
imgui.text("Edit Class")
|
||
|
_, self.class_name = imgui.input_text_with_hint("##class_edit1", content[self.select_class], self.class_name)
|
||
|
|
||
|
if imgui.button("Update"):
|
||
|
id = classes[self.select_class].id
|
||
|
Class.update(name=self.class_name).where(Class.id == id).execute()
|
||
|
|
||
|
imgui.same_line()
|
||
|
|
||
|
if imgui.button("Delete"):
|
||
|
id = classes[self.select_class].id
|
||
|
students = Student.select().where(Student.class_id == id)
|
||
|
for student in students:
|
||
|
Submission.delete().where(Submission.student_id == student.id).execute()
|
||
|
Student.delete().where(Student.class_id == id).execute()
|
||
|
Lecture.delete().where(Lecture.class_id == id).execute()
|
||
|
Class.delete().where(Class.id == id).execute()
|
||
|
|
||
|
|
||
|
imgui.separator()
|
||
|
|
||
|
imgui.text("Add Class")
|
||
|
_, self.add_class_name = imgui.input_text_with_hint("##class_edit2", "Class Name", self.add_class_name)
|
||
|
|
||
|
if imgui.button("Add"):
|
||
|
Class.create(name=self.add_class_name)
|
||
|
|
||
|
return classes[self.select_class].id
|
||
|
|
||
|
def student_editor(self, class_id: int):
|
||
|
w, h = imgui.get_window_size()
|
||
|
students = Student.select().where(Student.class_id == class_id)
|
||
|
content = [f"{s.prename} {s.surname}" for s in students]
|
||
|
self.select_student = self.content_list(content, self.select_student, "student_content", h*0.45)
|
||
|
imgui.same_line()
|
||
|
|
||
|
with imgui_ctx.begin_child("Student", ImVec2(w*0.25, h*0.4)):
|
||
|
imgui.text("Edit Student")
|
||
|
|
||
|
prename = students[self.select_student].prename
|
||
|
_, self.student_prename = imgui.input_text_with_hint("##student_edit1", prename, self.student_prename)
|
||
|
|
||
|
surname = students[self.select_student].surname
|
||
|
_, self.student_surname = imgui.input_text_with_hint("##student_edit2", surname, self.student_surname)
|
||
|
|
||
|
if imgui.radio_button("Male##1", not self.student_sex):
|
||
|
self.student_sex = not self.student_sex
|
||
|
imgui.same_line()
|
||
|
if imgui.radio_button("Female##1", self.student_sex):
|
||
|
self.student_sex = not self.student_sex
|
||
|
|
||
|
if imgui.button("Update"):
|
||
|
Student.update(
|
||
|
prename = self.student_prename,
|
||
|
surname = self.student_surname,
|
||
|
sex = "Female" if self.student_sex else "Male"
|
||
|
).where(Student.id == students[self.select_student].id).execute()
|
||
|
|
||
|
imgui.same_line()
|
||
|
|
||
|
if imgui.button("Delete"):
|
||
|
id = students[self.select_student].id
|
||
|
Student.delete().where(Student.id == id).execute()
|
||
|
Submission.delete().where(Submission.student_id == id).execute()
|
||
|
self.select_student = 0
|
||
|
|
||
|
imgui.separator()
|
||
|
|
||
|
imgui.text("Add Student")
|
||
|
_, self.add_student_prename = imgui.input_text_with_hint("##student_edit3", "First Name", self.add_student_prename)
|
||
|
_, self.add_student_surname = imgui.input_text_with_hint("##student_edit4", "Last Name", self.add_student_surname)
|
||
|
|
||
|
if imgui.radio_button("Male##2", not self.add_student_sex):
|
||
|
self.add_student_sex = not self.add_student_sex
|
||
|
imgui.same_line()
|
||
|
if imgui.radio_button("Female##2", self.add_student_sex):
|
||
|
self.add_student_sex = not self.add_student_sex
|
||
|
|
||
|
if imgui.button("Add"):
|
||
|
Student.create(
|
||
|
prename=self.add_student_prename,
|
||
|
surname=self.add_student_surname,
|
||
|
sex="Female" if self.add_student_sex else "Male",
|
||
|
class_id=class_id
|
||
|
)
|
||
|
self.add_student_prename = str()
|
||
|
self.add_student_surname = str()
|
||
|
self.add_student_sex = False
|
||
|
|
||
|
return students[self.select_student].id
|
||
|
|
||
|
def lecture_editor(self, class_id: int):
|
||
|
w, h = imgui.get_window_size()
|
||
|
lectures = Lecture.select().where(Lecture.class_id == class_id)
|
||
|
content = [f"{l.title}" for l in lectures]
|
||
|
self.select_lecture = self.content_list(content, self.select_lecture, "lecture_content", h*0.15)
|
||
|
imgui.same_line()
|
||
|
|
||
|
with imgui_ctx.begin_child("Lecture", ImVec2(w*0.25, h*0.15)):
|
||
|
imgui.text("Edit Lecture")
|
||
|
_, self.lecture_title = imgui.input_text_with_hint("##lecture_edit1", content[self.select_lecture], self.lecture_title)
|
||
|
_, self.lecture_points = imgui.input_int("##lecture_points1", self.lecture_points)
|
||
|
if self.lecture_points < 0:
|
||
|
self.lecture_points = 0
|
||
|
|
||
|
if imgui.button("Update"):
|
||
|
Lecture.update(title=self.lecture_title, points=self.lecture_points).where(Lecture.id == lectures[self.select_lecture].id).execute()
|
||
|
|
||
|
imgui.same_line()
|
||
|
|
||
|
if imgui.button("Delete"):
|
||
|
id = lectures[self.select_lecture].id
|
||
|
Submission.delete().where(Submission.lecture_id == id).execute()
|
||
|
Lecture.delete().where(Lecture.id == id).execute()
|
||
|
|
||
|
imgui.separator()
|
||
|
|
||
|
imgui.text("Add Lecture")
|
||
|
_, self.add_lecture_title = imgui.input_text_with_hint("##lecture_edit2", "Lecture Title", self.add_lecture_title)
|
||
|
_, self.add_lecture_points = imgui.input_int("##lecture_points2", self.add_lecture_points)
|
||
|
if self.add_lecture_points < 0:
|
||
|
self.add_lecture_points = 0
|
||
|
|
||
|
if imgui.button("Add"):
|
||
|
Lecture.create(title=self.add_lecture_title, points=self.add_lecture_points, class_id=class_id)
|
||
|
|
||
|
return lectures[self.select_lecture].id
|
||
|
|
||
|
def submission_editor(self, student_id: int):
|
||
|
w, h = imgui.get_window_size()
|
||
|
submissions = Submission.select().where(Submission.student_id == student_id)
|
||
|
lectures = [Lecture.get_by_id(sub.lecture_id) for sub in submissions]
|
||
|
content = [l.title for l in lectures]
|
||
|
self.select_submission = self.content_list(content, self.select_submission, "submission_content", h*0.2)
|
||
|
imgui.same_line()
|
||
|
|
||
|
with imgui_ctx.begin_child("Submission", ImVec2(w*0.25, h*0.2)):
|
||
|
imgui.text("Edit Submission")
|
||
|
imgui.text(content[self.select_submission])
|
||
|
|
||
|
points = submissions[self.select_submission].points
|
||
|
if points.is_integer():
|
||
|
points = int(points)
|
||
|
|
||
|
max_points = lectures[self.select_submission].points
|
||
|
|
||
|
_, self.submission_points = imgui.input_float(f"{points}/{max_points}", self.submission_points, 0.5, 10, "%.1f")
|
||
|
if self.submission_points < 0:
|
||
|
self.submission_points = 0
|
||
|
|
||
|
if imgui.button("Update"):
|
||
|
Submission.update(points=self.submission_points).where(Submission.id == submissions[self.select_submission].id).execute()
|
||
|
|
||
|
imgui.same_line()
|
||
|
|
||
|
if imgui.button("Delete"):
|
||
|
Submission.delete().where(Submission.id == submissions[self.select_submission].id).execute()
|
||
|
|
||
|
imgui.separator()
|
||
|
|
||
|
imgui.text("Add Submission")
|
||
|
available_lectures = Lecture.select().where(Lecture.class_id == Student.get_by_id(student_id).class_id)
|
||
|
combo_items = [l.title for l in available_lectures]
|
||
|
_, self.add_submission_lecture = imgui.combo("##lecture_combo", self.add_submission_lecture, combo_items, len(combo_items))
|
||
|
_, self.add_submission_points = imgui.input_float("##lecture_title", self.add_submission_points, 0.5, 10, "%.1f")
|
||
|
if self.add_submission_points < 0:
|
||
|
self.add_submission_points = 0
|
||
|
|
||
|
if imgui.button("Add"):
|
||
|
Submission.create(
|
||
|
points=self.add_submission_points,
|
||
|
lecture_id=available_lectures[self.add_submission_lecture].id,
|
||
|
student_id=student_id
|
||
|
)
|
||
|
|
||
|
return submissions[self.select_submission].id
|
||
|
|
||
|
def __call__(self):
|
||
|
with imgui_ctx.begin("Database Editor"):
|
||
|
class_id = self.class_editor()
|
||
|
imgui.separator()
|
||
|
self.lecture_editor(class_id)
|
||
|
imgui.separator()
|
||
|
student_id = self.student_editor(class_id)
|
||
|
imgui.separator()
|
||
|
self.submission_editor(student_id)
|
||
|
return
|
||
|
classes = Class.select()
|
||
|
|
||
|
with imgui_ctx.begin("Database Editor"):
|
||
|
imgui.text("Add Class")
|
||
|
|
||
|
_, self.add_name = imgui.input_text(" ", self.add_name)
|
||
|
|
||
|
if imgui.button("Add"):
|
||
|
if self.add_name:
|
||
|
Class.create(name=self.add_name)
|
||
|
self.add_name = str()
|
||
|
|
||
|
imgui.separator()
|
||
|
|
||
|
if not classes:
|
||
|
imgui.text("No Dataset could be queried")
|
||
|
return
|
||
|
|
||
|
for n, c in enumerate(classes, start=1):
|
||
|
display = f"{n}. {c.name}"
|
||
|
opened, _ = imgui.selectable(display, self.select == n-1)
|
||
|
if opened:
|
||
|
self.select = n-1
|
||
|
|
||
|
return classes[self.select]
|