1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-12-20 23:41:20 +00:00

Big changes to the database, mainly due to adding Program

This commit is contained in:
Mo 2021-07-13 21:49:44 +02:00
parent b2655e2023
commit 605edeecca
5 changed files with 84 additions and 38 deletions

File diff suppressed because one or more lines are too long

View file

@ -489,7 +489,13 @@ class AppointmentView(SecureModelView):
form = CreateForm form = CreateForm
column_filters = ["date", "special", "group_experiment.group", "group_experiment.group.part", "assistant"] column_filters = [
"date",
"special",
"group_experiment.group",
"group_experiment.semester_experiment.experiment",
"assistant",
]
def queryFilter(self): def queryFilter(self):
return Appointment.group_experiment_id.in_( return Appointment.group_experiment_id.in_(

View file

@ -25,6 +25,7 @@ class Student(db.Model):
bachelor_thesis = db.Column(db.String, nullable=True) bachelor_thesis = db.Column(db.String, nullable=True)
bachelor_thesis_work_group = db.Column(db.String, nullable=True) bachelor_thesis_work_group = db.Column(db.String, nullable=True)
note = db.Column(db.Text, nullable=True) note = db.Column(db.Text, nullable=True)
part_students = db.relationship("PartStudent", backref="student", lazy=True) part_students = db.relationship("PartStudent", backref="student", lazy=True)
def repr(self): def repr(self):
@ -43,9 +44,11 @@ class PartStudent(db.Model):
db.CheckConstraint("final_part_mark < 16"), db.CheckConstraint("final_part_mark < 16"),
nullable=True, nullable=True,
) )
student_id = db.Column(db.Integer, db.ForeignKey("student.id"), nullable=False) student_id = db.Column(db.Integer, db.ForeignKey("student.id"), nullable=False)
part_id = db.Column(db.Integer, db.ForeignKey("part.id"), nullable=False) part_id = db.Column(db.Integer, db.ForeignKey("part.id"), nullable=False)
group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=True) group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=True)
experiment_marks = db.relationship("ExperimentMark", backref="part_student", lazy=True) experiment_marks = db.relationship("ExperimentMark", backref="part_student", lazy=True)
__table_args__ = ( __table_args__ = (
@ -63,24 +66,28 @@ class PartStudent(db.Model):
class Group(db.Model): class Group(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
number = db.Column(db.Integer, db.CheckConstraint("number > 0"), nullable=False) number = db.Column(db.Integer, db.CheckConstraint("number > 0"), nullable=False)
part_id = db.Column(db.Integer, db.ForeignKey("part.id"), nullable=False)
semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False)
program_id = db.Column(db.Integer, db.ForeignKey("program.id", nullable=False))
part_students = db.relationship("PartStudent", backref="group", lazy=True) part_students = db.relationship("PartStudent", backref="group", lazy=True)
group_experiments = db.relationship("GroupExperiment", backref="group", lazy=True) group_experiments = db.relationship("GroupExperiment", backref="group", lazy=True)
__table_args__ = (db.UniqueConstraint(number, part_id),) __table_args__ = (db.UniqueConstraint(number, semester_id, program_id),)
def customInit(part, partStudents): def customInit(semester, program, partStudents):
orderedPartGroups = Group.query.filter(Group.part == part).order_by(Group.number) orderedGroups = Group.query.filter(Group.semester == semester, Group.program == program).order_by(Group.number)
lastTakenGroupNumber = orderedPartGroups[-1].number if orderedPartGroups.count() > 0 else 0 lastTakenGroupNumber = orderedGroups[-1].number if orderedPartGroups.count() > 0 else 0
return Group( return Group(
program=program,
number=lastTakenGroupNumber + 1, number=lastTakenGroupNumber + 1,
part_students=partStudents, part_students=partStudents,
part=part, semester=semester,
) )
def repr(self): def repr(self):
return f"{self.number} {self.part.repr()}" return f"{self.number} {self.program.repr()} {self.semester.repr()}"
def __repr__(self): def __repr__(self):
return f"<GR {self.repr()}>" return f"<GR {self.repr()}>"
@ -89,8 +96,10 @@ class Group(db.Model):
class GroupExperiment(db.Model): class GroupExperiment(db.Model):
# An experiment specified to a group # An experiment specified to a group
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
semester_experiment_id = db.Column(db.Integer, db.ForeignKey("semester_experiment.id"), nullable=False) semester_experiment_id = db.Column(db.Integer, db.ForeignKey("semester_experiment.id"), nullable=False)
group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=False) group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=False)
appointments = db.relationship("Appointment", backref="group_experiment", lazy=True) appointments = db.relationship("Appointment", backref="group_experiment", lazy=True)
experiment_marks = db.relationship("ExperimentMark", backref="group_experiment", lazy=True) experiment_marks = db.relationship("ExperimentMark", backref="group_experiment", lazy=True)
@ -126,15 +135,16 @@ class GroupExperiment(db.Model):
class Experiment(db.Model): class Experiment(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
label = db.Column(db.String(20), nullable=False, unique=True) number = db.Column(db.Integer, db.CheckConstraint("number > 0"), nullable=False)
title = db.Column(db.String(200), nullable=False) title = db.Column(db.String(200), nullable=False)
description = db.Column(db.Text, nullable=True) description = db.Column(db.Text, nullable=True)
wiki_link = db.Column(db.String(200), nullable=True) wiki_link = db.Column(db.String(300), nullable=True)
room = db.Column(db.String(100), nullable=False) room = db.Column(db.String(100), nullable=False)
building = db.Column(db.String(100), nullable=False) building = db.Column(db.String(100), nullable=False)
responsibility = db.Column(db.String(200), nullable=True) responsibility = db.Column(db.String(200), nullable=True)
duration_in_days = db.Column(db.Integer, db.CheckConstraint("duration_in_days > -1"), nullable=False) duration_in_days = db.Column(db.Integer, db.CheckConstraint("duration_in_days > -1"), nullable=False)
active = db.Column(db.Boolean, default=True, nullable=False) active = db.Column(db.Boolean, default=True, nullable=False)
oral_weighting = db.Column( oral_weighting = db.Column(
db.Float, db.CheckConstraint("oral_weighting >= 0"), db.CheckConstraint("oral_weighting <= 1"), nullable=False db.Float, db.CheckConstraint("oral_weighting >= 0"), db.CheckConstraint("oral_weighting <= 1"), nullable=False
) )
@ -147,10 +157,15 @@ class Experiment(db.Model):
final_weighting = db.Column( final_weighting = db.Column(
db.Float, db.CheckConstraint("final_weighting >= 0"), db.CheckConstraint("final_weightin <= 1"), nullable=False db.Float, db.CheckConstraint("final_weighting >= 0"), db.CheckConstraint("final_weightin <= 1"), nullable=False
) )
program_id = db.Column(db.Integer, db.ForeignKey("program.id"), nullable=False)
semester_experiments = db.relationship("SemesterExperiment", backref="experiment", lazy=True) semester_experiments = db.relationship("SemesterExperiment", backref="experiment", lazy=True)
__table_args__ = (db.UniqueConstraint(number, program_id),)
def repr(self): def repr(self):
return f"{self.label}" return f"{self.number} {self.program.repr()}"
def __repr__(self): def __repr__(self):
return f"<EXP {self.repr()}>" return f"<EXP {self.repr()}>"
@ -167,8 +182,10 @@ experiment_assistant = db.Table(
class SemesterExperiment(db.Model): class SemesterExperiment(db.Model):
# An experiment in a specific semester # An experiment in a specific semester
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
experiment_id = db.Column(db.Integer, db.ForeignKey("experiment.id"), nullable=False) experiment_id = db.Column(db.Integer, db.ForeignKey("experiment.id"), nullable=False)
semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False) semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False)
assistants = db.relationship( assistants = db.relationship(
"Assistant", secondary=experiment_assistant, lazy=True, backref=db.backref("semester_experiments", lazy=True) "Assistant", secondary=experiment_assistant, lazy=True, backref=db.backref("semester_experiments", lazy=True)
) )
@ -191,7 +208,9 @@ class Assistant(db.Model):
mobile_phone_number = db.Column(db.String(50), nullable=True) mobile_phone_number = db.Column(db.String(50), nullable=True)
room = db.Column(db.String(100), nullable=True) room = db.Column(db.String(100), nullable=True)
building = db.Column(db.String(100), nullable=True) building = db.Column(db.String(100), nullable=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False, unique=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False, unique=True)
appointments = db.relationship("Appointment", backref="assistant", lazy=True) appointments = db.relationship("Appointment", backref="assistant", lazy=True)
experiment_marks = db.relationship("ExperimentMark", backref="assistant", lazy=True) experiment_marks = db.relationship("ExperimentMark", backref="assistant", lazy=True)
@ -206,6 +225,7 @@ class Appointment(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.Date, nullable=False) # To be specified with the python package "datetime" date = db.Column(db.Date, nullable=False) # To be specified with the python package "datetime"
special = db.Column(db.Boolean, default=False, nullable=False) # In the break or not special = db.Column(db.Boolean, default=False, nullable=False) # In the break or not
group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False) group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False)
assistant_id = db.Column(db.Integer, db.ForeignKey("assistant.id"), nullable=False) assistant_id = db.Column(db.Integer, db.ForeignKey("assistant.id"), nullable=False)
@ -256,15 +276,17 @@ class Appointment(db.Model):
class Part(db.Model): class Part(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
label = db.Column(db.String(100), nullable=False) # A/1, A/2, B/1, B/2 number = db.Column(db.Integer, db.CheckConstraint("number > 0"), nullable=False)
semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False)
part_students = db.relationship("PartStudent", backref="part", lazy=True)
groups = db.relationship("Group", backref="part", lazy=True)
__table_args__ = (db.UniqueConstraint(label, semester_id),) program_id = db.Column(db.Integer, db.ForeignKey("program.id"), nullable=True)
semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False)
part_students = db.relationship("PartStudent", backref="part", lazy=True)
__table_args__ = (db.UniqueConstraint(program_id, number, semester_id),)
def repr(self): def repr(self):
return f"{self.label} {self.semester.repr()}" return f"{self.program.repr()}{self.number} {self.semester.repr()}"
def __repr__(self): def __repr__(self):
return f"<PART {self.repr()}>" return f"<PART {self.repr()}>"
@ -272,37 +294,40 @@ class Part(db.Model):
class Semester(db.Model): class Semester(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
label = db.Column(db.String(100), nullable=False, unique=True) # WS2122 for example label = db.Column(db.String(10), nullable=False)
year = db.Column(db.Integer, db.CheckConstraint("year > 0"), db.CheckConstraint("year < 100"), nullalbe=False)
parts = db.relationship("Part", backref="semester", lazy=True) parts = db.relationship("Part", backref="semester", lazy=True)
semester_experiments = db.relationship("SemesterExperiment", backref="semester", lazy=True) semester_experiments = db.relationship("SemesterExperiment", backref="semester", lazy=True)
active_users = db.relationship("User", backref="active_semester", lazy=True) active_users = db.relationship("User", backref="active_semester", lazy=True)
groups = db.relationship("Group", backref="semester", lazy=True)
__table_args__ = (db.UniqueConstraint(label, year),)
def repr(self): def repr(self):
return f"{self.label}" return f"{self.label}{self.year}"
def __repr__(self): def __repr__(self):
return f"<SEM {self.repr()}>" return f"<SEM {self.repr()}>"
def transferPartsFrom(self, oldSemester): def transferPartsFrom(self, oldSemester):
if oldSemester: for part in oldSemester.parts:
partLabels = [part.label for part in oldSemester.parts] db.session.add(Part(program=part.program, number=part.number, semester=self))
else:
partLabels = getConfig("defaultPartLabels")
for partLabel in partLabels:
db.session.add(Part(label=partLabel, semester=self))
class ExperimentMark(db.Model): class ExperimentMark(db.Model):
# A mark for a student after a specific experiment # A mark for a student after a specific experiment
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
oral_mark = db.Column( oral_mark = db.Column(
db.Integer, db.CheckConstraint("oral_mark > -1"), db.CheckConstraint("oral_mark < 16"), nullable=True db.Integer, db.CheckConstraint("oral_mark > -1"), db.CheckConstraint("oral_mark < 16"), nullable=True
) )
protocol_mark = db.Column( protocol_mark = db.Column(
db.Integer, db.CheckConstraint("protocol_mark > -1"), db.CheckConstraint("protocol_mark < 16"), nullable=True db.Integer, db.CheckConstraint("protocol_mark > -1"), db.CheckConstraint("protocol_mark < 16"), nullable=True
) )
edited_by_admin = db.Column(db.Boolean, default=False, nullable=True) edited_by_admin = db.Column(db.Boolean, default=False, nullable=True)
part_student_id = db.Column(db.Integer, db.ForeignKey("part_student.id"), nullable=False) part_student_id = db.Column(db.Integer, db.ForeignKey("part_student.id"), nullable=False)
group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False) group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False)
assistant_id = db.Column( assistant_id = db.Column(
@ -319,9 +344,10 @@ class ExperimentMark(db.Model):
class User(db.Model, FsUserMixin): class User(db.Model, FsUserMixin):
assistant = db.relationship("Assistant", backref="user", lazy=True, uselist=False)
active_semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=True) active_semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=True)
assistant = db.relationship("Assistant", backref="user", lazy=True, uselist=False)
def repr(self): def repr(self):
return f"{self.email}" return f"{self.email}"
@ -335,3 +361,17 @@ class Role(db.Model, FsRoleMixin):
def __repr__(self): def __repr__(self):
return f"<ROLE {self.repr()}>" return f"<ROLE {self.repr()}>"
class Program(db.Model):
label = db.Column(db.String(25), nullable=False)
parts = db.relationship("Part", backref="program", lazy=True)
experiments = db.relationship("Experiment", backref="program", lazy=True)
groups = db.relationship("Group", backref="program", lazy=True)
def repr(self):
return f"{self.label}"
def __repr__(self):
return f"<PROG {self.repr()}>"

View file

@ -1,9 +0,0 @@
{
"defaultPartLabels": [
"A/1",
"A/2",
"A/m",
"B/1",
"B/2"
]
}

View file

@ -15,7 +15,16 @@ with app.app_context():
db.session.add(sem1) db.session.add(sem1)
db.session.add(sem2) db.session.add(sem2)
sem1.transferPartsFrom(None) partKwargs = [
{"label": "BS", "number": 1},
{"label": "BS", "number": 2},
{"label": "BE", "number": 1},
{"label": "MS", "number": 1},
{"label": "MS", "number": 2},
]
for kwargs in partKwargs:
db.session.add(Part(semester=sem1, **kwargs))
sem2.transferPartsFrom(sem1) sem2.transferPartsFrom(sem1)
parta1 = sem2.parts[0] parta1 = sem2.parts[0]