1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-09-19 18:31:16 +00:00

Add filters, row actions, AdminView

This commit is contained in:
Mo 2022-03-03 04:26:05 +01:00
parent 874510412b
commit 3c7b578352

View file

@ -26,7 +26,7 @@ from wtforms.validators import URL, DataRequired, Email, NumberRange, Optional
from advlabdb import adminSpace, app, assistantSpace, db, user_datastore from advlabdb import adminSpace, app, assistantSpace, db, user_datastore
from advlabdb.configUtils import getConfig from advlabdb.configUtils import getConfig
from advlabdb.customClasses import SecureAdminBaseView, SecureAdminModelView from advlabdb.customClasses import SecureAdminBaseView, SecureAdminModelView, CustomIdEndpointLinkRowAction
from advlabdb.database_import import importFromFile from advlabdb.database_import import importFromFile
from advlabdb.exceptions import DataBaseException, ModelViewException from advlabdb.exceptions import DataBaseException, ModelViewException
from advlabdb.models import ( from advlabdb.models import (
@ -59,7 +59,25 @@ def semesterExperimentQueryFactory():
return SemesterExperiment.query.filter(SemesterExperiment.semester == userActiveSemester()) return SemesterExperiment.query.filter(SemesterExperiment.semester == userActiveSemester())
def semesterFilterOptions():
semesters = Semester.query.order_by(Semester.id.desc())
return tuple((semester.id, semester.repr()) for semester in semesters)
class UserView(SecureAdminModelView): class UserView(SecureAdminModelView):
@expose("/")
def index_view(self):
# To update filter options
self._refresh_filters_cache()
return super().index_view()
class SemesterFilter(FilterEqual):
def get_options(self, view):
return semesterFilterOptions()
def apply(self, query, value, alias=None):
return query.filter(self.column.active_semester_id == int(value))
class CreateForm(Form): class CreateForm(Form):
def roleQueryFactory(): def roleQueryFactory():
return Role.query return Role.query
@ -135,8 +153,8 @@ class UserView(SecureAdminModelView):
"email", "email",
] ]
column_filters = ( column_filters = (
SemesterFilter(User, "Active Semester"),
"active", "active",
"active_semester",
) )
column_editable_list = [ column_editable_list = [
"active", "active",
@ -218,12 +236,12 @@ class UserView(SecureAdminModelView):
class RoleView(SecureAdminModelView): class RoleView(SecureAdminModelView):
can_export = False
can_set_page_size = False
can_create = False can_create = False
can_edit = False can_edit = False
can_delete = False can_delete = False
column_display_actions = False column_display_actions = False
can_export = False
can_set_page_size = False
column_list = [ column_list = [
"name", "name",
@ -326,7 +344,6 @@ class PartView(SecureAdminModelView):
column_list = [ column_list = [
"program", "program",
"number", "number",
"semester",
] ]
column_details_list = column_list + [ column_details_list = column_list + [
"part_students", "part_students",
@ -342,6 +359,8 @@ class PartView(SecureAdminModelView):
) )
} }
column_searchable_list = ["program.label", "number"]
def queryFilter(self): def queryFilter(self):
return Part.semester == userActiveSemester() return Part.semester == userActiveSemester()
@ -390,10 +409,10 @@ class StudentView(SecureAdminModelView):
column_extra_row_actions = [ column_extra_row_actions = [
EndpointLinkRowAction( EndpointLinkRowAction(
"glyphicon glyphicon-time", icon_class="fa fa-history",
endpoint="experimentmark.index_view",
id_arg="flt1_0", id_arg="flt1_0",
title="Experiments history", title="Experiments history",
endpoint="experimentmark.index_view",
) )
] ]
@ -426,6 +445,18 @@ class PartStudentView(SecureAdminModelView):
def apply(self, query, value, alias=None): def apply(self, query, value, alias=None):
return query.filter(self.column.part_id == int(value)) return query.filter(self.column.part_id == int(value))
class StudentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.student_id
class GroupEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.group_id
class PartEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.part_id
class CreateForm(Form): class CreateForm(Form):
def studentQueryFactory(): def studentQueryFactory():
return Student.query return Student.query
@ -474,6 +505,24 @@ class PartStudentView(SecureAdminModelView):
"experiment_marks", "experiment_marks",
) )
column_extra_row_actions = [
StudentEndpointLinkRowAction(
icon_class="fa fa-user",
endpoint="student.details_view",
title="Student",
),
GroupEndpointLinkRowAction(
icon_class="fa fa-users",
endpoint="group.details_view",
title="Group",
),
PartEndpointLinkRowAction(
icon_class="fa fa-puzzle-piece",
endpoint="part.details_view",
title="Part",
),
]
def queryFilter(self): def queryFilter(self):
return PartStudent.part.has(Part.semester == userActiveSemester()) return PartStudent.part.has(Part.semester == userActiveSemester())
@ -530,12 +579,15 @@ class GroupView(SecureAdminModelView):
return CustomForm return CustomForm
can_view_details = True
column_list = [ column_list = [
"number", "number",
"program", "program",
"part_students", "part_students",
"group_experiments", "group_experiments",
] ]
column_details_list = column_list
column_filters = ( column_filters = (
ProgramFilter(Group, "Program"), ProgramFilter(Group, "Program"),
"number", "number",
@ -624,6 +676,10 @@ class SemesterExperimentView(SecureAdminModelView):
def apply(self, query, value, alias=None): def apply(self, query, value, alias=None):
return query.filter(self.column.experiment.has(Experiment.program_id == int(value))) return query.filter(self.column.experiment.has(Experiment.program_id == int(value)))
class ExperimentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.experiment_id
class CreateForm(Form): class CreateForm(Form):
def experimentQueryFactory(): def experimentQueryFactory():
return Experiment.query.filter(Experiment.active == True) return Experiment.query.filter(Experiment.active == True)
@ -680,6 +736,14 @@ class SemesterExperimentView(SecureAdminModelView):
"experiment.title", "experiment.title",
] ]
column_extra_row_actions = [
ExperimentEndpointLinkRowAction(
icon_class="fa fa-flask",
endpoint="experiment.details_view",
title="Experiment",
),
]
def queryFilter(self): def queryFilter(self):
return SemesterExperiment.semester == userActiveSemester() return SemesterExperiment.semester == userActiveSemester()
@ -698,6 +762,10 @@ class SemesterExperimentView(SecureAdminModelView):
class AssistantView(SecureAdminModelView): class AssistantView(SecureAdminModelView):
class UserEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.user_id
def assistantUserQueryFactory(): def assistantUserQueryFactory():
return User.query.filter(User.roles.any(Role.name == "assistant")) return User.query.filter(User.roles.any(Role.name == "assistant"))
@ -706,7 +774,6 @@ class AssistantView(SecureAdminModelView):
column_list = [ column_list = [
"user.first_name", "user.first_name",
"user.last_name", "user.last_name",
"user",
"semester_experiments", "semester_experiments",
] ]
column_details_list = column_list + [ column_details_list = column_list + [
@ -744,8 +811,39 @@ class AssistantView(SecureAdminModelView):
), ),
} }
column_extra_row_actions = [
UserEndpointLinkRowAction(
icon_class="fa fa-user",
endpoint="user.details_view",
title="User",
),
]
# TODO: Add AdminView
class AdminView(SecureAdminModelView):
class UserEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.user_id
can_export = False
can_set_page_size = False
can_create = False
can_edit = False
can_delete = False
column_list = [
"user.first_name",
"user.last_name",
]
column_filters = ("user.active",)
column_extra_row_actions = [
UserEndpointLinkRowAction(
icon_class="fa fa-user",
endpoint="user.details_view",
title="User",
),
]
assistantBlankText = "Auto assign if experiment has only one assistant" assistantBlankText = "Auto assign if experiment has only one assistant"
@ -755,7 +853,7 @@ def experimentFilterOptions():
activeExperiments = Experiment.query.filter(Experiment.active == True) activeExperiments = Experiment.query.filter(Experiment.active == True)
return tuple( return tuple(
( (
f"{activeExperiment.number},{activeExperiment.program.id}", f"{activeExperiment.number},{activeExperiment.program_id}",
f"{activeExperiment.number} {activeExperiment.program.repr()}", f"{activeExperiment.number} {activeExperiment.program.repr()}",
) )
for activeExperiment in activeExperiments for activeExperiment in activeExperiments
@ -787,6 +885,14 @@ class GroupExperimentView(SecureAdminModelView):
), ),
) )
class GroupEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.group_id
class SemesterExperimentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.semester_experiment_id
class CreateForm(Form): class CreateForm(Form):
group = QuerySelectField( group = QuerySelectField(
"Group", "Group",
@ -830,6 +936,7 @@ class GroupExperimentView(SecureAdminModelView):
form = CreateForm form = CreateForm
can_edit = False can_edit = False
can_view_details = True
column_list = [ column_list = [
"group", "group",
@ -837,6 +944,7 @@ class GroupExperimentView(SecureAdminModelView):
"appointments", "appointments",
"experiment_marks", "experiment_marks",
] ]
column_details_list = column_list
column_filters = ( column_filters = (
ExperimentFilter(GroupExperiment, "Experiment"), ExperimentFilter(GroupExperiment, "Experiment"),
"group.number", "group.number",
@ -844,6 +952,19 @@ class GroupExperimentView(SecureAdminModelView):
"experiment_marks", "experiment_marks",
) )
column_extra_row_actions = [
GroupEndpointLinkRowAction(
icon_class="fa fa-users",
endpoint="group.details_view",
title="Group",
),
SemesterExperimentEndpointLinkRowAction(
icon_class="fa fa-flask",
endpoint="semesterexperiment.details_view",
title="SemesterExperiment",
),
]
def queryFilter(self): def queryFilter(self):
return GroupExperiment.group.has(Group.semester == userActiveSemester()) return GroupExperiment.group.has(Group.semester == userActiveSemester())
@ -917,6 +1038,14 @@ class AppointmentView(SecureAdminModelView):
def apply(self, query, value, alias=None): def apply(self, query, value, alias=None):
return query.filter(self.column.assistant_id == int(value)) return query.filter(self.column.assistant_id == int(value))
class GroupExperimentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.group_experiment_id
class AssistantEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.assistant_id
class CreateForm(Form): class CreateForm(Form):
group_experiment = QuerySelectField( group_experiment = QuerySelectField(
"Group Experiment", "Group Experiment",
@ -948,6 +1077,19 @@ class AppointmentView(SecureAdminModelView):
"special", "special",
] ]
column_extra_row_actions = [
GroupExperimentEndpointLinkRowAction(
icon_class="fa fa-flask",
endpoint="groupexperiment.details_view",
title="GroupExperiment",
),
AssistantEndpointLinkRowAction(
icon_class="fa fa-user-secret",
endpoint="assistant.details_view",
title="Assistant",
),
]
def queryFilter(self): def queryFilter(self):
return Appointment.group_experiment.has( return Appointment.group_experiment.has(
GroupExperiment.semester_experiment.has(SemesterExperiment.semester == userActiveSemester()) GroupExperiment.semester_experiment.has(SemesterExperiment.semester == userActiveSemester())
@ -1051,8 +1193,7 @@ class ExperimentMarkView(SecureAdminModelView):
class SemesterFilter(FilterEqual): class SemesterFilter(FilterEqual):
def get_options(self, view): def get_options(self, view):
semesters = Semester.query.order_by(Semester.id.desc()) return semesterFilterOptions()
return tuple((semester.id, semester.repr()) for semester in semesters)
def apply(self, query, value, alias=None): def apply(self, query, value, alias=None):
return query.filter( return query.filter(
@ -1061,6 +1202,18 @@ class ExperimentMarkView(SecureAdminModelView):
) )
) )
class PartStudentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.part_student_id
class GroupExperimentEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.group_experiment_id
class AssistantEndpointLinkRowAction(CustomIdEndpointLinkRowAction):
def customId(self, row):
return row.assistant_id
class CreateForm(Form): class CreateForm(Form):
part_student = QuerySelectField( part_student = QuerySelectField(
"Part Student", "Part Student",
@ -1114,6 +1267,24 @@ class ExperimentMarkView(SecureAdminModelView):
) )
column_default_sort = [("oral_mark", False), ("protocol_mark", False)] column_default_sort = [("oral_mark", False), ("protocol_mark", False)]
column_extra_row_actions = [
PartStudentEndpointLinkRowAction(
icon_class="fa fa-user",
endpoint="partstudent.details_view",
title="PartStudent",
),
GroupExperimentEndpointLinkRowAction(
icon_class="fa fa-flask",
endpoint="groupexperiment.details_view",
title="GroupExperiment",
),
AssistantEndpointLinkRowAction(
icon_class="fa fa-user-secret",
endpoint="assistant.details_view",
title="Assistant",
),
]
""" """
# Deactivated for the experiments history of a student. # Deactivated for the experiments history of a student.
def queryFilter(self): def queryFilter(self):
@ -1148,6 +1319,9 @@ class ExperimentMarkView(SecureAdminModelView):
class ProgramView(SecureAdminModelView): class ProgramView(SecureAdminModelView):
can_export = False
can_set_page_size = False
can_view_details = True can_view_details = True
column_list = [ column_list = [
@ -1210,6 +1384,7 @@ adminSpace.add_view(SemesterExperimentView(SemesterExperiment, db.session))
adminSpace.add_view(SemesterView(Semester, db.session)) adminSpace.add_view(SemesterView(Semester, db.session))
adminSpace.add_view(PartView(Part, db.session)) adminSpace.add_view(PartView(Part, db.session))
adminSpace.add_view(AssistantView(Assistant, db.session)) adminSpace.add_view(AssistantView(Assistant, db.session))
adminSpace.add_view(AdminView(Admin, db.session))
adminSpace.add_view(UserView(User, db.session)) adminSpace.add_view(UserView(User, db.session))
adminSpace.add_view(RoleView(Role, db.session)) adminSpace.add_view(RoleView(Role, db.session))
adminSpace.add_view(ProgramView(Program, db.session)) adminSpace.add_view(ProgramView(Program, db.session))