diff --git a/README.md b/README.md index 3f64bbd..f97ce05 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,6 @@ This URL leads to the home page where you can login with this testing admin acco # To-Do: - Rest of admin model views - - Experiments history for students - Assistants space - Homepage text changeable - Email integration? diff --git a/advlabdb/modelViews.py b/advlabdb/modelViews.py index 072772d..d3ce28d 100644 --- a/advlabdb/modelViews.py +++ b/advlabdb/modelViews.py @@ -1,6 +1,7 @@ from flask import flash, request, url_for from flask_admin.contrib.sqla.filters import BaseSQLAFilter from flask_admin.menu import MenuLink +from flask_admin.model.template import EndpointLinkRowAction from flask_security import current_user, hash_password from sqlalchemy import func from wtforms import Form, BooleanField, SelectField, TextField, RadioField, FloatField @@ -109,19 +110,25 @@ class SemesterView(SecureModelView): form_columns = ["semester_label", "year", "transfer_parts", "transfer_semester_experiments", "transfer_assistants"] semesterLabels = ["WS", "SS"] + transferDesciption = "Will be trasfered from your current semester." form_extra_fields = { "semester_label": RadioField( "Semester", choices=list(zip(semesterLabels, semesterLabels)), validators=[DataRequired()] ), "year": TextField("Year", validators=[DataRequired()]), "transfer_parts": BooleanField( - "Transfer parts from your current semester", + "Transfer parts", + description=transferDesciption, default=True, ), "transfer_semester_experiments": BooleanField( - "Transfer Semester Experiemnts from your current semester", default=True + "Transfer Semester Experiemnts", description=transferDesciption, default=True + ), + "transfer_assistants": BooleanField( + "Transfer Assistants", + description=transferDesciption + " This option has no effect if Semester Experiments are not transfered.", + default=True, ), - "transfer_assistants": BooleanField("Transfer Assistants from your current active semester", default=True), } def create_model(self, form): @@ -203,6 +210,15 @@ class StudentView(SecureModelView): "contact_email": {"validators": [Email()]}, } + column_extra_row_actions = [ + EndpointLinkRowAction( + "glyphicon glyphicon-time", + id_arg="flt1_0", + title="Experiments history", + endpoint="experimentmark.index_view", + ) + ] + def partQueryFactory(): return Part.query.filter(Part.id.in_([part.id for part in userActiveSemester().parts])) @@ -387,19 +403,19 @@ class GroupExperimentView(SecureModelView): assistantBlankText = "Auto assign if experiment has only one assistant" - appointment1 = DateField("Appointment 1") - appointment1_special = BooleanField("Appointment 1 special", default=False) + appointment1 = DateField("Appointment-1") + appointment1_special = BooleanField("Appointment-1 special", default=False) appointment1_assistant = QuerySelectField( - "Appointment 1 Assistant", + "Appointment-1 Assistant", query_factory=assistantQueryFactory, allow_blank=True, blank_text=assistantBlankText, ) - appointment2 = DateField("Appointment 2") - appointment2_special = BooleanField("Appointment 2 special", default=False) + appointment2 = DateField("Appointment-2") + appointment2_special = BooleanField("Appointment-2 special", default=False) appointment2_assistant = QuerySelectField( - "Appointment 2 Assistant", + "Appointment-2 Assistant", query_factory=assistantQueryFactory, allow_blank=True, blank_text=assistantBlankText, @@ -407,6 +423,7 @@ class GroupExperimentView(SecureModelView): form = CreateForm + can_edit = False column_list = ["group", "semester_experiment", "appointments", "experiment_marks"] column_filters = ["group", "semester_experiment.experiment", "appointments"] @@ -443,17 +460,39 @@ class AppointmentView(SecureModelView): column_list = ["date", "special", "group_experiment", "assistant"] +class ExperimentMarkView(SecureModelView): + class StudentIdFilter(BaseSQLAFilter): + def apply(self, query, value, alias=None): + return query.filter(self.column == value) + + def operation(self): + return "equals" + + def validate(self, value): + if Student.query.get(value): + return True + else: + return False + + column_filters = [ + StudentIdFilter(PartStudent.id, "Student / ID"), + "part_student.student", + "group_experiment.semester_experiment.semester", + "group_experiment.semester_experiment.experiment", + ] + + admin.add_view(StudentView(Student, db.session)) admin.add_view(PartStudentView(PartStudent, db.session)) admin.add_view(GroupView(Group, db.session)) admin.add_view(GroupExperimentView(GroupExperiment, db.session)) +admin.add_view(AppointmentView(Appointment, db.session)) +admin.add_view(ExperimentMarkView(ExperimentMark, db.session)) admin.add_view(ExperimentView(Experiment, db.session)) admin.add_view(SemesterExperimentView(SemesterExperiment, db.session)) admin.add_view(AssistantView(Assistant, db.session)) -admin.add_view(AppointmentView(Appointment, db.session)) admin.add_view(PartView(Part, db.session)) admin.add_view(SemesterView(Semester, db.session)) -admin.add_view(SecureModelView(ExperimentMark, db.session)) admin.add_view(UserView(User, db.session)) admin.add_view(RoleView(Role, db.session))