2021-06-02 21:43:41 +00:00
from flask import flash , request , url_for
2021-04-27 13:50:03 +00:00
from flask_admin . contrib . sqla . filters import BaseSQLAFilter
2021-06-02 21:43:41 +00:00
from flask_admin . menu import MenuLink
2021-07-01 14:38:37 +00:00
from flask_admin . model . template import EndpointLinkRowAction
2021-06-09 00:51:26 +00:00
from flask_security import current_user , hash_password
2021-06-14 10:50:09 +00:00
from sqlalchemy import func
2021-07-11 12:27:00 +00:00
from wtforms import Form , BooleanField , SelectField , TextField , RadioField , IntegerField
2021-06-30 19:58:57 +00:00
from wtforms . validators import DataRequired , Email , Optional
from flask_admin . contrib . sqla . fields import QuerySelectMultipleField , QuerySelectField
from flask_admin . helpers import get_form_data
2021-07-01 11:12:43 +00:00
from wtforms . fields . html5 import DateField
2021-04-24 10:05:58 +00:00
2021-06-02 21:43:41 +00:00
from advlabdb import admin , app , db , user_datastore
2021-06-01 23:56:49 +00:00
from advlabdb . configUtils import getConfig
2021-06-02 21:43:41 +00:00
from advlabdb . customClasses import SecureModelView
from advlabdb . models import (
Appointment ,
Assistant ,
Experiment ,
ExperimentMark ,
Group ,
GroupExperiment ,
Part ,
2021-07-01 12:41:20 +00:00
SemesterExperiment ,
2021-06-02 21:43:41 +00:00
PartStudent ,
Role ,
Semester ,
Student ,
User ,
)
from advlabdb . utils import (
partFromLabelInUserActiveSemester ,
randomPassword ,
2021-06-25 23:59:21 +00:00
setUserActiveSemester ,
2021-06-02 21:43:41 +00:00
userActiveSemester ,
)
2021-04-26 19:31:15 +00:00
2021-06-30 20:04:33 +00:00
class UserView ( SecureModelView ) :
2021-07-11 12:27:00 +00:00
column_list = [ " email " , " active " , " roles " , " assistant " , " active_semester " ]
2021-04-24 10:05:58 +00:00
column_searchable_list = [ " email " ]
column_filters = [ " active " ]
2021-04-27 21:28:47 +00:00
form_columns = [ " email " , " active " , " roles " ]
2021-07-01 11:12:43 +00:00
column_editable_list = [ " active " ]
2021-04-27 21:28:47 +00:00
form_args = {
" email " : { " validators " : [ Email ( ) ] } ,
" active " : { " default " : True } ,
2021-06-02 21:43:41 +00:00
" roles " : { " validators " : [ DataRequired ( message = " A role is required! " ) ] } ,
2021-04-27 21:28:47 +00:00
}
2021-04-24 10:05:58 +00:00
2021-06-09 00:22:37 +00:00
deleteSelfException = " Tried to delete yourself as user! "
deactivateSelfException = " Tried to deactiavte yourself as user! "
2021-04-24 10:05:58 +00:00
def create_model ( self , form ) :
password = randomPassword ( )
passwordHash = hash_password ( password )
email = form . email . data . lower ( )
roles = [ role . name for role in form . roles . data ]
if " admin " in roles :
flash ( " You have registered a new admin! " , " danger " )
2021-06-08 23:07:02 +00:00
try :
model = user_datastore . create_user ( email = email , password = passwordHash , roles = roles )
2021-06-30 19:58:57 +00:00
self . on_model_change ( form , model , True )
2021-06-08 23:07:02 +00:00
self . session . commit ( )
except Exception as ex :
2021-07-11 12:27:00 +00:00
flash ( str ( ex ) , " error " )
2021-06-08 23:07:02 +00:00
self . session . rollback ( )
else :
flash (
f " { email } registered with roles: { ' , ' . join ( [ role . name for role in form . roles . data ] ) } . " ,
category = " success " ,
)
flash ( f " Random password: { password } " , category = " warning " )
return model
2021-04-24 10:05:58 +00:00
2021-06-09 00:22:37 +00:00
def on_model_delete ( self , model ) :
if model == current_user :
raise Exception ( self . deleteSelfException )
def on_model_change ( self , form , model , is_created ) :
if model == current_user and not form . active . data :
raise Exception ( self . deactivateSelfException )
def handle_view_exception ( self , exc ) :
if exc . args [ 0 ] in ( self . deleteSelfException , self . deactivateSelfException ) :
pass
else :
return super ( ) . handle_view_exception ( exc )
2021-04-24 10:05:58 +00:00
2021-06-30 20:04:33 +00:00
class RoleView ( SecureModelView ) :
2021-06-09 00:22:37 +00:00
can_create = False
can_edit = False
can_delete = False
column_display_actions = False
column_list = [ " name " , " description " ]
2021-04-24 10:05:58 +00:00
2021-04-24 11:38:03 +00:00
2021-06-30 20:04:33 +00:00
class SemesterView ( SecureModelView ) :
2021-06-08 23:07:02 +00:00
can_edit = False
2021-07-01 21:17:09 +00:00
can_delete = False
2021-07-11 12:27:00 +00:00
can_view_details = True
2021-06-08 23:07:02 +00:00
2021-04-24 11:38:03 +00:00
column_list = [ " label " , " parts " ]
2021-07-11 12:27:00 +00:00
column_details_list = column_list + [ " active_users " ]
2021-07-01 21:17:09 +00:00
form_columns = [ " semester_label " , " year " , " transfer_parts " , " transfer_assistants " ]
2021-04-24 11:38:03 +00:00
2021-06-08 23:07:02 +00:00
semesterLabels = [ " WS " , " SS " ]
2021-04-24 11:38:03 +00:00
form_extra_fields = {
2021-06-25 23:59:21 +00:00
" semester_label " : RadioField (
2021-06-08 23:07:02 +00:00
" Semester " , choices = list ( zip ( semesterLabels , semesterLabels ) ) , validators = [ DataRequired ( ) ]
) ,
" year " : TextField ( " Year " , validators = [ DataRequired ( ) ] ) ,
2021-07-01 12:41:20 +00:00
" transfer_parts " : BooleanField (
2021-07-01 14:38:37 +00:00
" Transfer parts " ,
2021-07-01 21:17:09 +00:00
description = " This option transfers the parts you have in your current active semester. Make sure that your semester is the last semester before creating a new one (recommended)! " ,
2021-06-25 23:59:21 +00:00
default = True ,
) ,
2021-07-01 14:38:37 +00:00
" transfer_assistants " : BooleanField (
" Transfer Assistants " ,
2021-07-11 01:17:21 +00:00
description = " This option transfers assistants of your active semester to active experiments in the new semester. Make sure that your semester is the last semester before creating a new one (recommended)! Active experiments are transfered anyway. If you do not want an experiment to be transfered, set it to inactive before creating the new semester. Experiments which are switched to active before creating the new semester will be created in the new semester without assistants. It is important to check the assistants of all experiments after creating a new semester. " ,
2021-07-01 14:38:37 +00:00
default = True ,
2021-07-01 12:41:20 +00:00
) ,
2021-04-24 11:38:03 +00:00
}
2021-06-08 23:07:02 +00:00
def create_model ( self , form ) :
try :
model = Semester ( label = form . semester_label . data + form . year . data )
2021-06-30 19:58:57 +00:00
2021-06-08 23:07:02 +00:00
self . session . add ( model )
2021-06-30 19:58:57 +00:00
self . on_model_change ( form , model , True )
2021-06-08 23:07:02 +00:00
self . session . commit ( )
except Exception as ex :
2021-07-11 12:27:00 +00:00
flash ( str ( ex ) , " error " )
2021-06-08 23:07:02 +00:00
self . session . rollback ( )
else :
self . after_model_change ( form , model , True )
return model
2021-04-24 11:38:03 +00:00
def after_model_change ( self , form , model , is_created ) :
2021-06-25 23:59:21 +00:00
admin . add_link (
MenuLink (
name = model . label ,
url = url_for ( " set_semester " ) + " ?semester_id= " + str ( model . id ) ,
category = " Active semester " ,
)
)
2021-07-01 12:41:20 +00:00
oldSemester = userActiveSemester ( )
2021-06-25 23:59:21 +00:00
setUserActiveSemester ( model . id )
2021-07-01 20:20:34 +00:00
try :
if form . transfer_parts . data :
model . transferPartsFrom ( oldSemester )
2021-04-24 11:38:03 +00:00
2021-07-01 21:17:09 +00:00
oldSemesterExperiments = [
semesterExperiment . experiment for semesterExperiment in oldSemester . semester_experiments
]
for experiment in Experiment . query . filter ( Experiment . active == True ) :
newSemesterExperiment = SemesterExperiment ( experiment = experiment , semester = model )
if form . transfer_assistants . data :
for oldSemesterExperiment in oldSemester . semester_experiments :
if oldSemesterExperiment . experiment == experiment :
newSemesterExperiment . assistants = oldSemesterExperiment . assistants
self . session . add ( newSemesterExperiment )
2021-06-25 23:59:21 +00:00
2021-07-01 20:20:34 +00:00
self . session . commit ( )
except Exception as ex :
2021-07-11 12:27:00 +00:00
flash ( str ( ex ) , " error " )
2021-07-01 20:20:34 +00:00
self . session . rollback ( )
2021-05-18 12:54:30 +00:00
2021-04-24 11:38:03 +00:00
2021-06-30 20:04:33 +00:00
class PartView ( SecureModelView ) :
2021-04-24 11:38:03 +00:00
can_view_details = True
2021-07-01 12:41:20 +00:00
column_details_list = [ " label " , " semester " , " part_students " , " groups " ]
2021-04-24 11:38:03 +00:00
form_columns = [ " label " , " semester " ]
2021-07-12 14:42:11 +00:00
def queryFilter ( self ) :
return Part . id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] )
2021-06-10 01:14:30 +00:00
2021-04-27 13:50:03 +00:00
2021-06-30 20:04:33 +00:00
class StudentView ( SecureModelView ) :
2021-04-26 19:31:15 +00:00
can_view_details = True
2021-06-30 19:58:57 +00:00
2021-05-14 16:53:15 +00:00
column_list = [ " student_number " , " first_name " , " last_name " , " uni_email " , " contact_email " , " part_students " ]
2021-04-26 22:26:11 +00:00
column_details_list = column_list + [ " bachelor_thesis " , " bachelor_thesis_work_group " , " note " ]
2021-06-30 19:58:57 +00:00
column_sortable_list = [ " student_number " , " first_name " , " last_name " ]
column_searchable_list = column_sortable_list + [ " uni_email " , " contact_email " ]
form_excluded_columns = [ " part_students " ]
2021-04-26 22:26:11 +00:00
2021-04-27 21:28:47 +00:00
form_args = {
2021-05-14 16:53:15 +00:00
" uni_email " : { " validators " : [ Email ( ) ] } ,
" contact_email " : { " validators " : [ Email ( ) ] } ,
2021-04-27 21:28:47 +00:00
}
2021-07-01 14:38:37 +00:00
column_extra_row_actions = [
EndpointLinkRowAction (
" glyphicon glyphicon-time " ,
id_arg = " flt1_0 " ,
title = " Experiments history " ,
endpoint = " experimentmark.index_view " ,
)
]
2021-06-10 01:14:30 +00:00
2021-07-12 14:42:11 +00:00
def partQueryFactory ( ) :
return Part . query . filter ( Part . id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] ) )
2021-06-10 01:14:30 +00:00
2021-07-12 14:42:11 +00:00
def groupQueryFactory ( ) :
return Group . query . filter ( Group . part_id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] ) )
2021-07-01 11:12:43 +00:00
2021-06-30 20:04:33 +00:00
class PartStudentView ( SecureModelView ) :
2021-06-30 19:58:57 +00:00
class CreateForm ( Form ) :
2021-07-12 14:42:11 +00:00
def studentQueryFactory ( ) :
return Student . query
2021-04-26 22:26:11 +00:00
2021-06-30 19:58:57 +00:00
student = QuerySelectField (
" Student " , query_factory = studentQueryFactory , validators = [ DataRequired ( ) ] , allow_blank = True , blank_text = " - "
)
part = QuerySelectField (
" Part " , query_factory = partQueryFactory , validators = [ DataRequired ( ) ] , allow_blank = True , blank_text = " - "
)
group = QuerySelectField ( " Group " , query_factory = groupQueryFactory , allow_blank = True , blank_text = " - " )
2021-04-26 22:26:11 +00:00
2021-06-30 19:58:57 +00:00
class EditForm ( CreateForm ) :
student = None
part = None
2021-07-11 12:27:00 +00:00
final_part_mark = IntegerField ( " Final Part Mark " , validators = [ Optional ( ) ] )
2021-06-08 23:07:02 +00:00
2021-06-30 19:58:57 +00:00
form = EditForm
2021-06-08 23:07:02 +00:00
2021-06-30 19:58:57 +00:00
column_filters = [ " part " , " student " , " group " ]
2021-04-26 19:31:15 +00:00
2021-07-11 01:17:21 +00:00
partGroupPartMismatchException = " Student ' s part and group ' s part do not match! "
2021-04-26 19:31:15 +00:00
2021-07-12 14:42:11 +00:00
def queryFilter ( self ) :
return PartStudent . part_id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] )
2021-06-30 19:58:57 +00:00
def create_form ( self , obj = None ) :
form = self . CreateForm
return form ( get_form_data ( ) , obj = obj )
2021-04-27 21:28:47 +00:00
2021-06-30 19:58:57 +00:00
def on_model_change ( self , form , model , is_created ) :
if model . group and model . part != model . group . part :
raise Exception ( self . partGroupPartMismatchException )
2021-04-27 21:28:47 +00:00
2021-06-30 19:58:57 +00:00
def handle_view_exception ( self , exc ) :
if exc . args [ 0 ] in ( self . partGroupPartMismatchException ) :
pass
2021-04-27 21:28:47 +00:00
else :
2021-06-30 19:58:57 +00:00
return super ( ) . handle_view_exception ( exc )
2021-04-27 21:28:47 +00:00
2021-04-27 13:50:03 +00:00
2021-06-30 20:04:33 +00:00
class GroupView ( SecureModelView ) :
2021-06-30 19:58:57 +00:00
class CreateForm ( Form ) :
2021-07-12 14:42:11 +00:00
def partStudentsQueryFactory ( ) :
return PartStudent . query . filter ( PartStudent . part_id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] ) )
2021-06-30 19:58:57 +00:00
part = QuerySelectField (
2021-07-01 11:12:43 +00:00
" Part " , query_factory = partQueryFactory , validators = [ DataRequired ( ) ] , allow_blank = True , blank_text = " - "
2021-06-30 19:58:57 +00:00
)
2021-07-01 11:12:43 +00:00
part_students = QuerySelectMultipleField ( " Part Students " , query_factory = partStudentsQueryFactory )
2021-06-30 19:58:57 +00:00
class EditForm ( CreateForm ) :
part = None
form = EditForm
2021-07-01 20:20:34 +00:00
column_list = [ " number " , " part " , " part_students " , " group_experiments " ]
2021-07-01 11:12:43 +00:00
column_filters = [ " number " , " part " ]
2021-06-30 19:58:57 +00:00
2021-07-11 01:17:21 +00:00
partStudentPartPartMismatchException = " Group ' s part and student ' s part do not match! "
2021-06-30 19:58:57 +00:00
2021-07-12 14:42:11 +00:00
def queryFilter ( self ) :
return Group . part_id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] )
2021-06-30 19:58:57 +00:00
def create_model ( self , form ) :
try :
2021-07-12 12:48:29 +00:00
model = Group . customInit ( form . part . data , form . part_students . data )
2021-06-30 19:58:57 +00:00
self . session . add ( model )
self . on_model_change ( form , model , True )
self . session . commit ( )
except Exception as ex :
2021-07-11 12:27:00 +00:00
flash ( str ( ex ) , " error " )
2021-06-30 19:58:57 +00:00
self . session . rollback ( )
else :
self . after_model_change ( form , model , True )
return model
def on_model_change ( self , form , model , is_created ) :
for partStudent in model . part_students :
if model . part != partStudent . part :
raise Exception ( self . partStudentPartPartMismatchException )
def handle_view_exception ( self , exc ) :
if exc . args [ 0 ] in ( self . partStudentPartPartMismatchException ) :
pass
else :
return super ( ) . handle_view_exception ( exc )
def create_form ( self , obj = None ) :
form = self . CreateForm
return form ( get_form_data ( ) , obj = obj )
2021-06-07 15:15:10 +00:00
2021-06-30 20:04:33 +00:00
class ExperimentView ( SecureModelView ) :
2021-06-21 16:07:18 +00:00
can_view_details = True
2021-07-01 21:17:09 +00:00
column_filters = [ " active " ]
2021-07-10 23:49:39 +00:00
column_list = [ " label " , " title " , " active " ]
column_details_list = column_list + [
" desciption " ,
" wiki_link " ,
" room " ,
" building " ,
" responsibility " ,
" duration_in_days " ,
" oral_weighting " ,
" protocol_weighting " ,
" final_weighting " ,
" semester_experiments " ,
]
2021-07-01 21:17:09 +00:00
column_editable_list = [ " active " ]
2021-06-21 16:26:38 +00:00
2021-07-01 12:41:20 +00:00
class SemesterExperimentView ( SecureModelView ) :
column_list = [ " experiment " , " semester " , " assistants " ]
2021-06-21 16:26:38 +00:00
2021-07-12 14:42:11 +00:00
def queryFilter ( self ) :
return SemesterExperiment . semester == userActiveSemester ( )
2021-06-21 16:07:18 +00:00
2021-06-30 20:04:33 +00:00
class AssistantView ( SecureModelView ) :
2021-06-24 17:24:14 +00:00
can_view_details = True
2021-07-11 01:17:21 +00:00
column_list = [ " first_name " , " last_name " , " user " , " semester_experiments " ]
2021-07-01 11:12:43 +00:00
column_details_list = column_list + [
" phone_number " ,
" mobile_phone_number " ,
" room " ,
" building " ,
" appointments " ,
" experiment_marks " ,
]
2021-06-24 17:24:14 +00:00
column_filters = [ " user.active " ]
form_excluded_columns = [ " experiment_marks " ]
2021-07-12 14:42:11 +00:00
def assistantQueryFactory ( ) :
return Assistant . query . filter ( Assistant . user_id . in_ ( [ user . id for user in User . query . filter ( User . active == True ) ] ) )
assistantBlankText = " Auto assign if experiment has only one assistant "
2021-06-30 20:04:33 +00:00
class GroupExperimentView ( SecureModelView ) :
2021-07-01 11:12:43 +00:00
class CreateForm ( Form ) :
2021-07-12 14:42:11 +00:00
def semesterExperimentQueryFactory ( ) :
return SemesterExperiment . query . filter ( SemesterExperiment . semester == userActiveSemester ( ) )
2021-07-01 11:12:43 +00:00
group = QuerySelectField (
" Group " , query_factory = groupQueryFactory , validators = [ DataRequired ( ) ] , allow_blank = True , blank_text = " - "
)
2021-07-01 12:41:20 +00:00
semester_experiment = QuerySelectField (
" Semester Experiment " ,
query_factory = semesterExperimentQueryFactory ,
2021-07-01 11:12:43 +00:00
validators = [ DataRequired ( ) ] ,
allow_blank = True ,
blank_text = " - " ,
)
2021-07-01 17:43:59 +00:00
appointment1_date = DateField ( " Appointment-1 Date " , validators = [ Optional ( ) ] )
2021-07-12 14:42:11 +00:00
appointment1_special = BooleanField ( " Appointment-1 Special " , default = False )
2021-07-01 11:12:43 +00:00
appointment1_assistant = QuerySelectField (
2021-07-01 14:38:37 +00:00
" Appointment-1 Assistant " ,
2021-07-01 11:12:43 +00:00
query_factory = assistantQueryFactory ,
allow_blank = True ,
blank_text = assistantBlankText ,
)
2021-07-01 17:43:59 +00:00
appointment2_date = DateField ( " Appointment-2 Date " , validators = [ Optional ( ) ] )
2021-07-12 14:42:11 +00:00
appointment2_special = BooleanField ( " Appointment-2 Special " , default = False )
2021-07-01 11:12:43 +00:00
appointment2_assistant = QuerySelectField (
2021-07-01 14:38:37 +00:00
" Appointment-2 Assistant " ,
2021-07-01 11:12:43 +00:00
query_factory = assistantQueryFactory ,
allow_blank = True ,
blank_text = assistantBlankText ,
)
form = CreateForm
2021-07-01 14:38:37 +00:00
can_edit = False
2021-07-01 12:41:20 +00:00
column_list = [ " group " , " semester_experiment " , " appointments " , " experiment_marks " ]
column_filters = [ " group " , " semester_experiment.experiment " , " appointments " ]
2021-06-24 17:39:26 +00:00
2021-07-12 14:42:11 +00:00
def queryFilter ( self ) :
return GroupExperiment . group_id . in_ (
[ g . id for g in Group . query . filter ( Group . part_id . in_ ( [ part . id for part in userActiveSemester ( ) . parts ] ) ) ]
)
2021-07-12 11:06:44 +00:00
2021-07-01 17:43:59 +00:00
def create_model ( self , form ) :
try :
2021-07-12 12:48:29 +00:00
model = GroupExperiment . customInit ( semester_experiment = form . semester_experiment . data , group = form . group . data )
2021-07-01 17:43:59 +00:00
self . session . add ( model )
2021-07-12 12:48:29 +00:00
for date , special , assistant in zip (
2021-07-01 17:43:59 +00:00
[ form . appointment1_date . data , form . appointment2_date . data ] ,
[ form . appointment1_special . data , form . appointment2_special . data ] ,
[ form . appointment1_assistant . data , form . appointment2_assistant . data ] ,
) :
2021-07-12 12:48:29 +00:00
if date :
appointment = Appointment . customInit ( date , special , assistant , model )
2021-07-01 17:43:59 +00:00
self . session . add ( appointment )
self . on_model_change ( form , model , True )
self . session . commit ( )
except Exception as ex :
2021-07-11 12:27:00 +00:00
flash ( str ( ex ) , " error " )
2021-07-01 17:43:59 +00:00
self . session . rollback ( )
else :
2021-07-01 20:20:34 +00:00
if model . appointments :
flash ( f " Appointments { model . appointments } added. " , " success " )
2021-07-01 17:43:59 +00:00
self . after_model_change ( form , model , True )
return model
2021-06-24 17:39:26 +00:00
2021-07-12 14:42:11 +00:00
def groupExperimentQueryFactory ( ) :
return GroupExperiment . query . filter (
GroupExperiment . semester_experiment_id . in_ (
[
semesterExperiment . id
for semesterExperiment in SemesterExperiment . query . filter (
SemesterExperiment . semester == userActiveSemester ( )
)
]
)
)
2021-07-01 11:12:43 +00:00
class AppointmentView ( SecureModelView ) :
2021-07-12 14:42:11 +00:00
class CreateForm ( Form ) :
group_experiment = QuerySelectField (
" Group Experiment " , query_factory = groupExperimentQueryFactory , validators = [ DataRequired ( ) ]
)
date = DateField ( " Date " , validators = [ DataRequired ( ) ] )
special = BooleanField ( " Special " , default = False )
assistant = QuerySelectField (
" Assistant " ,
query_factory = assistantQueryFactory ,
allow_blank = True ,
blank_text = assistantBlankText ,
)
form = CreateForm
column_filters = [ " date " , " special " , " group_experiment.group " , " group_experiment.group.part " , " assistant " ]
def queryFilter ( self ) :
return Appointment . group_experiment_id . in_ (
groupExperiment . id for groupExperiment in groupExperimentQueryFactory ( )
)
def create_model ( self , form ) :
try :
model = Appointment . customInit (
form . date . data , form . special . data , form . assistant . data , form . group_experiment . data
)
self . session . add ( model )
self . on_model_change ( form , model , True )
self . session . commit ( )
except Exception as ex :
flash ( str ( ex ) , " error " )
self . session . rollback ( )
else :
self . after_model_change ( form , model , True )
return model
def update_model ( self , form , model ) :
try :
model . customUpdate ( form . date . data , form . special . data , form . assistant . data , form . group_experiment . data )
self . on_model_change ( form , model , False )
self . session . commit ( )
except Exception as ex :
flash ( str ( ex ) , " error " )
self . session . rollback ( )
return False
else :
self . after_model_change ( form , model , False )
return True
2021-07-01 11:12:43 +00:00
2021-07-01 14:38:37 +00:00
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 " ,
2021-07-01 17:43:59 +00:00
" assistant " ,
2021-07-01 14:38:37 +00:00
]
2021-06-30 20:04:33 +00:00
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 ) )
2021-07-01 14:38:37 +00:00
admin . add_view ( AppointmentView ( Appointment , db . session ) )
admin . add_view ( ExperimentMarkView ( ExperimentMark , db . session ) )
2021-06-30 20:04:33 +00:00
admin . add_view ( ExperimentView ( Experiment , db . session ) )
2021-07-01 12:41:20 +00:00
admin . add_view ( SemesterExperimentView ( SemesterExperiment , db . session ) )
2021-06-30 20:04:33 +00:00
admin . add_view ( AssistantView ( Assistant , 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 ) )
2021-04-18 23:33:46 +00:00
2021-04-24 10:05:58 +00:00
with app . app_context ( ) :
2021-07-01 12:41:20 +00:00
semesters = Semester . query . order_by ( Semester . id )
2021-05-17 14:55:04 +00:00
for semester in semesters :
2021-06-02 21:43:41 +00:00
admin . add_link (
MenuLink (
name = semester . label ,
url = url_for ( " set_semester " ) + " ?semester_id= " + str ( semester . id ) ,
category = " Active semester " ,
)
)
2021-06-28 16:43:13 +00:00
admin . add_link ( MenuLink ( name = " Logout " , url = url_for ( " security.logout " ) ) )