170 lines
6.2 KiB
Python
170 lines
6.2 KiB
Python
from peewee import *
|
|
from datetime import datetime
|
|
|
|
import json
|
|
from typing import TextIO
|
|
from pathlib import Path
|
|
|
|
db = SqliteDatabase(None, autoconnect=False)
|
|
|
|
class BaseModel(Model):
|
|
class Meta:
|
|
database = db
|
|
|
|
class Class(BaseModel):
|
|
name = CharField()
|
|
created_at = DateTimeField(default=datetime.now)
|
|
|
|
class Student(BaseModel):
|
|
prename = CharField()
|
|
surname = CharField()
|
|
sex = CharField()
|
|
class_id = ForeignKeyField(Class, backref='class')
|
|
created_at = DateTimeField(default=datetime.now)
|
|
|
|
class Lecture(BaseModel):
|
|
title = CharField()
|
|
points = IntegerField()
|
|
class_id = ForeignKeyField(Class, backref='class')
|
|
created_at = DateTimeField(default=datetime.now)
|
|
|
|
class Submission(BaseModel):
|
|
student_id = ForeignKeyField(Student, backref='student')
|
|
lecture_id = ForeignKeyField(Lecture, backref='lecture')
|
|
points = FloatField()
|
|
created_at = DateTimeField(default=datetime.now)
|
|
|
|
def load_from_json(fp: Path) -> None:
|
|
'''
|
|
Rebuilding Database from a given json
|
|
'''
|
|
with open(fp, "r") as file:
|
|
data = json.load(file)
|
|
|
|
for c_k, c_v in data.items():
|
|
Class.create(
|
|
name=c_k,
|
|
id=c_v["DB ID"],
|
|
created_at=c_v["Date"]
|
|
)
|
|
#print(f"KLASSE = {c.id} {c.name} ({c.created_at})")
|
|
|
|
for student in c_v["Students"]:
|
|
Student.create(
|
|
id=student["DB ID"],
|
|
created_at=student["Date"],
|
|
prename=student["First Name"],
|
|
surname=student["Last Name"],
|
|
sex=student["Sex"],
|
|
class_id=c_v["DB ID"]
|
|
)
|
|
#print(f"STUDENT = {s.id}. {s.prename} {s.surname} {s.sex} ({s.created_at}) Klasse: {s.class_id}")
|
|
|
|
for submission in student["Submissions"]:
|
|
Submission.create(
|
|
id=submission["DB ID"],
|
|
created_at=submission["Date"],
|
|
points=submission["Points"],
|
|
lecture_id=submission["Lecture ID"],
|
|
student_id=student["DB ID"]
|
|
)
|
|
#print(f"SUBMISSION = {sub.id}. {sub.points} Lecture: {sub.lecture_id} Student: {sub.student_id} ({sub.created_at})")
|
|
|
|
for lecture in c_v["Lectures"]:
|
|
Lecture.create(
|
|
id=lecture["DB ID"],
|
|
created_at=lecture["Date"],
|
|
title=lecture["Title"],
|
|
points=lecture["Points"],
|
|
class_id=c_v["DB ID"]
|
|
)
|
|
#print(f"LECTURE = {l.id}. {l.title} {l.points} ({l.created_at}) Klasse: {l.class_id}")
|
|
|
|
def dump_to_json(fp: Path, indent=None) -> None:
|
|
'''
|
|
Dump existing Database to Json
|
|
'''
|
|
classes = Class.select()
|
|
d = {c.name: {
|
|
"DB ID": int(c.id),
|
|
"Date": c.created_at.isoformat(),
|
|
"Students": [
|
|
{
|
|
"DB ID": s.id,
|
|
"Date": s.created_at.isoformat(),
|
|
"First Name": s.prename,
|
|
"Last Name": s.surname,
|
|
"Sex": s.sex,
|
|
"Submissions": [
|
|
{
|
|
"DB ID": sub.id,
|
|
"Date": sub.created_at.isoformat(),
|
|
"Points": sub.points,
|
|
"Lecture ID": sub.lecture_id.id
|
|
}
|
|
for sub in Submission.select().where(Submission.student_id == s.id)
|
|
]
|
|
}
|
|
for s in Student.select().where(Student.class_id == c.id)
|
|
],
|
|
"Lectures": [
|
|
{
|
|
"DB ID": l.id,
|
|
"Date": l.created_at.isoformat(),
|
|
"Title": l.title,
|
|
"Points": l.points
|
|
}
|
|
for l in Lecture.select().where(Lecture.class_id == c.id)
|
|
],
|
|
}
|
|
for c in classes
|
|
}
|
|
|
|
with open(fp, "w") as file:
|
|
json.dump(d, file, indent=indent)
|
|
|
|
db.init('test.db')
|
|
db.connect()
|
|
db.create_tables([Class, Student, Lecture, Submission])
|
|
|
|
def main():
|
|
import random
|
|
# Generate Test Data
|
|
class1 = Class.create(name="WiSe 22/23")
|
|
class2 = Class.create(name="WiSe 23/24")
|
|
class3 = Class.create(name="WiSe 24/25")
|
|
|
|
phil = Student.create(prename="Phil", surname="Keier", sex="Male", class_id=class1.id)
|
|
calvin = Student.create(prename="Calvin", surname="Brandt", sex="Male", class_id=class2.id)
|
|
nova = Student.create(prename="Nova", surname="Eib", sex="Female", class_id=class1.id)
|
|
kathi = Student.create(prename="Katharina", surname="Walz", sex="Female", class_id=class3.id)
|
|
victoria = Student.create(prename="Victoria", surname="Möller", sex="Female", class_id=class3.id)
|
|
|
|
lec1 = Lecture.create(title="Tutorial 1", points=30, class_id=class1.id)
|
|
lec2 = Lecture.create(title="Tutorial 1", points=30, class_id=class3.id)
|
|
lec3 = Lecture.create(title="Tutorial 2", points=20, class_id=class1.id)
|
|
lec4 = Lecture.create(title="Tutorial 2", points=20, class_id=class2.id)
|
|
lec5 = Lecture.create(title="Extended Applications", points=44, class_id=class1.id)
|
|
|
|
sub1_phil = Submission.create(student_id=phil.id, lecture_id=lec1.id, points=random.randint(0, lec1.points))
|
|
sub2_phil = Submission.create(student_id=phil.id, lecture_id=lec3.id, points=random.randint(0, lec3.points))
|
|
sub3_phil = Submission.create(student_id=phil.id, lecture_id=lec5.id, points=random.randint(0, lec5.points))
|
|
sub1_nova = Submission.create(student_id=nova.id, lecture_id=lec1.id, points=random.randint(0, lec1.points))
|
|
sub2_nova = Submission.create(student_id=nova.id, lecture_id=lec3.id, points=random.randint(0, lec3.points))
|
|
sub1_kathi = Submission.create(student_id=kathi.id, lecture_id=lec3.id, points=random.randint(0, lec3.points))
|
|
sub1_vici = Submission.create(student_id=victoria.id, lecture_id=lec2.id, points=random.randint(0, lec2.points))
|
|
|
|
return
|
|
fp = Path().cwd()/"Test.json"
|
|
dump_to_json(fp)
|
|
db.close()
|
|
db.init("Test.db")
|
|
db.connect()
|
|
db.create_tables([Class, Student, Lecture, Submission])
|
|
load_from_json(fp)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# main()
|
|
dump_to_json(Path().cwd()/"TEST.json")
|