mirror of
https://codeberg.org/Mo8it/AdvLabDB.git
synced 2024-11-08 21:21:06 +00:00
Big changes to the database, mainly due to adding Program
This commit is contained in:
parent
b2655e2023
commit
605edeecca
5 changed files with 84 additions and 38 deletions
File diff suppressed because one or more lines are too long
|
@ -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_(
|
||||||
|
|
|
@ -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()}>"
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"defaultPartLabels": [
|
|
||||||
"A/1",
|
|
||||||
"A/2",
|
|
||||||
"A/m",
|
|
||||||
"B/1",
|
|
||||||
"B/2"
|
|
||||||
]
|
|
||||||
}
|
|
11
testDB.py
11
testDB.py
|
@ -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]
|
||||||
|
|
Loading…
Reference in a new issue