From 0be6b64b8aede40f0a872365c39bf3be531b144c Mon Sep 17 00:00:00 2001 From: Mo8it Date: Fri, 30 Jul 2021 02:03:44 +0200 Subject: [PATCH] Added assistantSpace --- README.md | 1 - advlabdb/__init__.py | 18 ++++++- advlabdb/customClasses.py | 44 ++++++++++++---- advlabdb/modelViews.py | 66 ++++++++++++------------ advlabdb/templates/assistant_create.html | 7 +++ advlabdb/templates/assistant_edit.html | 7 +++ advlabdb/templates/assistant_index.html | 8 +++ advlabdb/templates/assistant_list.html | 7 +++ 8 files changed, 111 insertions(+), 47 deletions(-) create mode 100644 advlabdb/templates/assistant_create.html create mode 100644 advlabdb/templates/assistant_edit.html create mode 100644 advlabdb/templates/assistant_index.html create mode 100644 advlabdb/templates/assistant_list.html diff --git a/README.md b/README.md index 389d5f4..d85cf36 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,6 @@ This URL leads to the home page where you can login with this testing admin acco - password: admin # To-Do: -- Rest of admin model views - Calculate final experiment and part mark - Assistants space - Deactivate assistants account after a while if not assigned to experiments diff --git a/advlabdb/__init__.py b/advlabdb/__init__.py index d8baa11..30f83c7 100644 --- a/advlabdb/__init__.py +++ b/advlabdb/__init__.py @@ -26,11 +26,25 @@ fsqla.FsModels.set_db_info(db) from advlabdb import customClasses -admin = Admin( +adminSpace = Admin( app, name="Admin@AdvLabDB", + url="/admin", + endpoint="adminSpace", template_mode="bootstrap3", - index_view=customClasses.SecureAdminIndexView(template="admin_index.html"), + index_view=customClasses.SecureAdminIndexView( + name="Admin", template="admin_index.html", url="/admin", endpoint="adminSpace" + ), +) +assistantSpace = Admin( + app, + name="Assistant@AdvLabDB", + url="/assistant", + endpoint="assistantSpace", + template_mode="bootstrap3", + index_view=customClasses.SecureAssistantIndexView( + name="Assistant", template="assistant_index.html", url="/assistant", endpoint="assistantSpace" + ), ) from advlabdb import models diff --git a/advlabdb/customClasses.py b/advlabdb/customClasses.py index 8637556..79b859b 100644 --- a/advlabdb/customClasses.py +++ b/advlabdb/customClasses.py @@ -10,16 +10,27 @@ def adminViewIsAccessible(): return current_user.has_role("admin") -class SecureAdminIndexView(AdminIndexView): - def is_accessible(self): - return adminViewIsAccessible() +def assistantViewIsAccessible(): + return current_user.has_role("assistant") + +class CustomIndexView(AdminIndexView): def inaccessible_callback(self, name, **kwargs): # Redirect to login page if user doesn't have access return redirect(url_for("security.login", next=request.url)) -class SecureModelView(ModelView): +class SecureAdminIndexView(CustomIndexView): + def is_accessible(self): + return adminViewIsAccessible() + + +class SecureAssistantIndexView(CustomIndexView): + def is_accessible(self): + return assistantViewIsAccessible() + + +class CustomModelView(ModelView): can_export = True can_set_page_size = True @@ -27,16 +38,9 @@ class SecureModelView(ModelView): edit_modal = True details_modal = True - list_template = "admin_list.html" - create_template = "admin_create.html" - edit_template = "admin_edit.html" - queryFilter = None customCreateModel = None - def is_accessible(self): - return adminViewIsAccessible() - def inaccessible_callback(self, name, **kwargs): # Redirect to login page if user doesn't have access return redirect(url_for("security.login", next=request.url)) @@ -80,3 +84,21 @@ class SecureModelView(ModelView): self.after_model_change(form, model, True) return model + + +class SecureAdminModelView(CustomModelView): + list_template = "admin_list.html" + create_template = "admin_create.html" + edit_template = "admin_edit.html" + + def is_accessible(self): + return adminViewIsAccessible() + + +class SecureAssistantModelView(CustomModelView): + list_template = "assistant_list.html" + create_template = "assistant_create.html" + edit_template = "assistant_edit.html" + + def is_accessible(self): + return assistantViewIsAccessible() diff --git a/advlabdb/modelViews.py b/advlabdb/modelViews.py index 05eaf46..b7261e8 100644 --- a/advlabdb/modelViews.py +++ b/advlabdb/modelViews.py @@ -10,9 +10,9 @@ from flask_admin.contrib.sqla.fields import QuerySelectMultipleField, QuerySelec from flask_admin.helpers import get_form_data from wtforms.fields.html5 import DateField -from advlabdb import admin, app, db, user_datastore +from advlabdb import adminSpace, app, db, user_datastore from advlabdb.configUtils import getConfig -from advlabdb.customClasses import SecureModelView +from advlabdb.customClasses import SecureAdminModelView from advlabdb.models import ( Appointment, Assistant, @@ -37,7 +37,7 @@ from advlabdb.utils import ( from advlabdb.exceptions import ModelViewException, DataBaseException -class UserView(SecureModelView): +class UserView(SecureAdminModelView): class CreateForm(Form): def roleQueryFactory(): return Role.query @@ -132,7 +132,7 @@ class UserView(SecureModelView): ) # Password is automatically hashed with this method -class RoleView(SecureModelView): +class RoleView(SecureAdminModelView): can_create = False can_edit = False can_delete = False @@ -141,7 +141,7 @@ class RoleView(SecureModelView): column_list = ["name", "description"] -class SemesterView(SecureModelView): +class SemesterView(SecureAdminModelView): class CreateForm(Form): def labelDefault(): if userActiveSemester().label == "WS": @@ -191,7 +191,7 @@ class SemesterView(SecureModelView): def after_model_change(self, form, model, is_created): setUserActiveSemester(model.id) - admin.add_link( + adminSpace.add_link( MenuLink( name=model.repr(), url=url_for("set_semester") + "?semester_id=" + str(model.id), @@ -204,7 +204,7 @@ def programQueryFactory(): return Program.query -class PartView(SecureModelView): +class PartView(SecureAdminModelView): can_view_details = True column_sortable_list = [] @@ -225,7 +225,7 @@ class PartView(SecureModelView): return Part(program=form.program.data, number=form.number.data, semester=userActiveSemester()) -class StudentView(SecureModelView): +class StudentView(SecureAdminModelView): can_view_details = True column_list = ["student_number", "first_name", "last_name", "uni_email", "contact_email", "part_students"] @@ -262,7 +262,7 @@ def groupQueryFactory(): markChoices = [(-1, "-")] + list(zip(range(16)[::-1], range(16)[::-1])) -class PartStudentView(SecureModelView): +class PartStudentView(SecureAdminModelView): class CreateForm(Form): def studentQueryFactory(): return Student.query @@ -318,7 +318,7 @@ def partStudentQueryFactory(): return PartStudent.query.filter(PartStudent.part_id.in_([part.id for part in userActiveSemester().parts])) -class GroupView(SecureModelView): +class GroupView(SecureAdminModelView): def formFactory(create, group): if create: @@ -363,7 +363,7 @@ class GroupView(SecureModelView): return form(get_form_data(), obj=obj) -class ExperimentView(SecureModelView): +class ExperimentView(SecureAdminModelView): can_view_details = True column_filters = ["active"] @@ -396,7 +396,7 @@ def assistantQueryFactory(): return Assistant.query.filter(Assistant.user_id.in_([user.id for user in User.query.filter(User.active == True)])) -class SemesterExperimentView(SecureModelView): +class SemesterExperimentView(SecureAdminModelView): class CreateForm(Form): def experimentQueryFactory(): return Experiment.query.filter(Experiment.active == True) @@ -428,7 +428,7 @@ class SemesterExperimentView(SecureModelView): ) -class AssistantView(SecureModelView): +class AssistantView(SecureAdminModelView): def assistantUserQueryFactory(): return User.query.filter(User.roles.any(Role.name == "assistant")) @@ -461,7 +461,7 @@ class AssistantView(SecureModelView): assistantBlankText = "Auto assign if experiment has only one assistant" -class GroupExperimentView(SecureModelView): +class GroupExperimentView(SecureAdminModelView): class CreateForm(Form): def semesterExperimentQueryFactory(): return SemesterExperiment.query.filter(SemesterExperiment.semester == userActiveSemester()) @@ -545,7 +545,7 @@ def groupExperimentQueryFactory(): ) -class AppointmentView(SecureModelView): +class AppointmentView(SecureAdminModelView): class CreateForm(Form): group_experiment = QuerySelectField( "Group Experiment", @@ -600,7 +600,7 @@ class AppointmentView(SecureModelView): return True -class ExperimentMarkView(SecureModelView): +class ExperimentMarkView(SecureAdminModelView): class StudentIdFilter(BaseSQLAFilter): def apply(self, query, value, alias=None): return query.filter(self.column == value) @@ -680,7 +680,7 @@ class ExperimentMarkView(SecureModelView): self.session.rollback() -class ProgramView(SecureModelView): +class ProgramView(SecureAdminModelView): can_view_details = True column_list = ["label"] @@ -688,25 +688,25 @@ class ProgramView(SecureModelView): column_details_list = column_list + form_excluded_columns -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(ProgramView(Program, db.session)) -admin.add_view(PartView(Part, db.session)) -admin.add_view(SemesterView(Semester, db.session)) -admin.add_view(UserView(User, db.session)) -admin.add_view(RoleView(Role, db.session)) +adminSpace.add_view(StudentView(Student, db.session)) +adminSpace.add_view(PartStudentView(PartStudent, db.session)) +adminSpace.add_view(GroupView(Group, db.session)) +adminSpace.add_view(GroupExperimentView(GroupExperiment, db.session)) +adminSpace.add_view(AppointmentView(Appointment, db.session)) +adminSpace.add_view(ExperimentMarkView(ExperimentMark, db.session)) +adminSpace.add_view(ExperimentView(Experiment, db.session)) +adminSpace.add_view(SemesterExperimentView(SemesterExperiment, db.session)) +adminSpace.add_view(AssistantView(Assistant, db.session)) +adminSpace.add_view(ProgramView(Program, db.session)) +adminSpace.add_view(PartView(Part, db.session)) +adminSpace.add_view(SemesterView(Semester, db.session)) +adminSpace.add_view(UserView(User, db.session)) +adminSpace.add_view(RoleView(Role, db.session)) with app.app_context(): semesters = Semester.query.order_by(Semester.id) for semester in semesters: - admin.add_link( + adminSpace.add_link( MenuLink( name=semester.repr(), url=url_for("set_semester") + "?semester_id=" + str(semester.id), @@ -714,4 +714,4 @@ with app.app_context(): ) ) - admin.add_link(MenuLink(name="Logout", url=url_for("security.logout"))) + adminSpace.add_link(MenuLink(name="Logout", url=url_for("security.logout"))) diff --git a/advlabdb/templates/assistant_create.html b/advlabdb/templates/assistant_create.html new file mode 100644 index 0000000..2935891 --- /dev/null +++ b/advlabdb/templates/assistant_create.html @@ -0,0 +1,7 @@ +{% from "macros.html" import information %} +{% extends "admin/model/create.html" %} + +{% block body %} +{{ information(current_user, userActiveSemester, role="assistant") }} +{{super()}} +{% endblock %} \ No newline at end of file diff --git a/advlabdb/templates/assistant_edit.html b/advlabdb/templates/assistant_edit.html new file mode 100644 index 0000000..cdcd722 --- /dev/null +++ b/advlabdb/templates/assistant_edit.html @@ -0,0 +1,7 @@ +{% from "macros.html" import information %} +{% extends "admin/model/edit.html" %} + +{% block body %} +{{ information(current_user, userActiveSemester, role="assistant") }} +{{super()}} +{% endblock %} \ No newline at end of file diff --git a/advlabdb/templates/assistant_index.html b/advlabdb/templates/assistant_index.html new file mode 100644 index 0000000..08e6184 --- /dev/null +++ b/advlabdb/templates/assistant_index.html @@ -0,0 +1,8 @@ +{% from "macros.html" import information %} +{% extends "admin/index.html" %} + +{% block body %} +{{ information(current_user, userActiveSemester, role="assistant") }} +

Welcome back!

+{{super()}} +{% endblock %} \ No newline at end of file diff --git a/advlabdb/templates/assistant_list.html b/advlabdb/templates/assistant_list.html new file mode 100644 index 0000000..83abd6e --- /dev/null +++ b/advlabdb/templates/assistant_list.html @@ -0,0 +1,7 @@ +{% from "macros.html" import information %} +{% extends "admin/model/list.html" %} + +{% block body %} +{{ information(current_user, userActiveSemester, role="assistant") }} +{{super()}} +{% endblock %} \ No newline at end of file