def displayScheduleAdmin(): printLogEntry("Running displayScheduleAdmin()") uploadClassScheduleFormDetails = uploadClassScheduleForm() propagateClassAttendanceLogsFormDetails = propagateClassAttendanceLogsForm( ) propagateClassAttendanceLogsFormDetails.schoolYear.choices = getSchoolYear( ) propagateClassAttendanceLogsFormDetails.semester.choices = getSemester() deleteClassScheduleFormDetails = deleteClassScheduleForm() deleteClassScheduleFormDetails.schoolYear.choices = getSchoolYear() deleteClassScheduleFormDetails.semester.choices = getSemester() deleteClassScheduleFormDetails.yearOfGraduation.choices = getYearOfGraduation( ) downloadClassScheduleFormDetails = downloadClassScheduleForm() downloadClassScheduleFormDetails.schoolYear.choices = getSchoolYear() downloadClassScheduleFormDetails.semester.choices = getSemester() downloadClassAttendanceFormDetails = downloadClassAttendanceForm() downloadClassAttendanceFormDetails.schoolYear.choices = getSchoolYear() downloadClassAttendanceFormDetails.semester.choices = getSemester() downloadClassAttendanceFormDetails.teacherName.choices = getTeachers() addSingleClassScheduleDetails = addSingleClassSchedule() addSingleClassScheduleDetails.schoolYear.choices = getSchoolYear() addSingleClassScheduleDetails.semester.choices = getSemester() addSingleClassScheduleDetails.teacherName.choices = getTeachers() addSingleClassScheduleDetails.studentName.choices = getStudents() addSingleClassScheduleDetails.campus.choices = getCampusChoices() addSingleClassScheduleDetails.className.choices = getClassNames() addSingleClassScheduleDetails.classDays.choices = [ ("M", "M"), ("T", "T"), ("W", "W"), ("R", "R"), ("F", "F"), ] if request.method == "POST": printLogEntry("form= " + str(request.form)) if "submitUploadClassSchedule" in request.form: if uploadClassScheduleFormDetails.validate_on_submit(): printLogEntry("Upload Form Submitted") if uploadClassScheduleFormDetails.csvClassScheduleFile.data: uploadedScheduleFile = save_File( uploadClassScheduleFormDetails.csvClassScheduleFile.data, "Uploaded_Schedule_File.csv", ) uploadSchedules(uploadedScheduleFile) return redirect( url_for("scheduleAdmin_bp.displayScheduleAdmin")) printFormErrors(uploadClassScheduleFormDetails) if "submitPropagatelassAttendanceLogs" in request.form: if propagateClassAttendanceLogsFormDetails.validate_on_submit(): printLogEntry("Propagate Form Submitted") schoolYear = int( propagateClassAttendanceLogsFormDetails.schoolYear.data) semester = propagateClassAttendanceLogsFormDetails.semester.data startDate = propagateClassAttendanceLogsFormDetails.startDate.data endDate = propagateClassAttendanceLogsFormDetails.endDate.data print( "schoolYear=", schoolYear, "semester=", semester, "startDate=", startDate, "endDate=", endDate, ) propagateClassSchedule(startDate, endDate, schoolYear, semester) return redirect(url_for("scheduleAdmin_bp.displayScheduleAdmin")) printFormErrors(propagateClassAttendanceLogsFormDetails) if "submitDeleteClassScheduleForm" in request.form: if deleteClassScheduleFormDetails.validate_on_submit(): if (deleteClassScheduleFormDetails.confirmDeleteClassSchedule.data == "DELETE"): printLogEntry("Delete Class Schedule Form Submitted") schoolYear = deleteClassScheduleFormDetails.schoolYear.data semester = deleteClassScheduleFormDetails.semester.data yearOfGraduation = deleteClassScheduleFormDetails.yearOfGraduation.data print( "SchoolYear=", schoolYear, " Semester=", semester, yearOfGraduation, ) deleteClassSchedule(schoolYear, semester, yearOfGraduation) deleteClassScheduleFormDetails.confirmDeleteClassSchedule.data = "" # deleteClassScheduleFormDetails.process() return redirect( url_for("scheduleAdmin_bp.displayScheduleAdmin")) else: deleteClassScheduleFormDetails.confirmDeleteClassSchedule.data = "" printLogEntry("Type DELETE in the text box to confirm delete") if "submitAddSingleClassSchedule" in request.form: if addSingleClassScheduleDetails.validate_on_submit(): printLogEntry("Add Single Class Schedule submitted") schoolYear = addSingleClassScheduleDetails.schoolYear.data semester = addSingleClassScheduleDetails.semester.data chattStateANumber = addSingleClassScheduleDetails.studentName.data teacherLastName = addSingleClassScheduleDetails.teacherName.data className = addSingleClassScheduleDetails.className.data classDaysList = addSingleClassScheduleDetails.classDays.data classDays = "" for classDay in classDaysList: classDays = classDays + classDay startTime = addSingleClassScheduleDetails.startTime.data endTime = addSingleClassScheduleDetails.endTime.data online = addSingleClassScheduleDetails.online.data indStudy = addSingleClassScheduleDetails.indStudy.data comment = addSingleClassScheduleDetails.comment.data googleCalendarEventID = ( addSingleClassScheduleDetails.googleCalendarEventID.data) campus = "STEM School" staffID = None print( schoolYear, semester, chattStateANumber, teacherLastName, className, classDays, startTime, endTime, online, indStudy, comment, googleCalendarEventID, ) addClassSchedule( schoolYear, semester, chattStateANumber, campus, className, teacherLastName, staffID, online, indStudy, classDays, startTime, endTime, comment, googleCalendarEventID, ) return redirect(url_for("scheduleAdmin_bp.displayScheduleAdmin")) if "submitDownloadClassScheduleForm" in request.form: if downloadClassScheduleFormDetails.validate_on_submit(): schoolYear = downloadClassScheduleFormDetails.schoolYear.data semester = downloadClassScheduleFormDetails.semester.data printLogEntry("Download Class Schedule Form Submitted") print( "SchoolYear=", schoolYear, " Semester=", semester, ) return downloadClassSchedule(schoolYear, semester) if "submitDownloadClassAttendanceForm" in request.form: if downloadClassAttendanceFormDetails.validate_on_submit(): schoolYear = downloadClassAttendanceFormDetails.schoolYear.data semester = downloadClassAttendanceFormDetails.semester.data teacherName = downloadClassAttendanceFormDetails.teacherName.data startDate = downloadClassAttendanceFormDetails.startDate.data endDate = downloadClassAttendanceFormDetails.endDate.data printLogEntry("Download Class Attendance Form Submitted") print( "SchoolYear=", schoolYear, " Semester=", semester, " teacherName=", teacherName, " startDate=", startDate, " endDate=", endDate, ) return downloadClassAttendanceLog(schoolYear, semester, teacherName, startDate, endDate) return render_template( "scheduleadmin.html", title="Schedule Admin", propagateClassAttendanceLogsForm= propagateClassAttendanceLogsFormDetails, uploadClassScheduleForm=uploadClassScheduleFormDetails, deleteClassScheduleForm=deleteClassScheduleFormDetails, downloadClassScheduleForm=downloadClassScheduleFormDetails, downloadClassAttendanceForm=downloadClassAttendanceFormDetails, addSingleClassSchedule=addSingleClassScheduleDetails, )
def displayClassAttendanceLog(): printLogEntry("Running displayClassAttendanceLog()") classAttendanceForm = updateClassAttendanceForm() classAttendanceForm.teacherName.choices = getTeachers() # Update class choices to remove blank choice and include "All Classes" as default classNameChoices = list(getClassNames()) classNameChoices.remove(("", "")) classNameChoices.insert(0, ("All Classes", "All Classes")) classAttendanceForm.className.choices = tuple(classNameChoices) classDateTime = date.today() # classDateTime = datetime( # datetime.today().year, datetime.today().month, datetime.today().day, 0, 0, 0, 0 # ) # print( # "\nclassAttendanceForm.identifier.data = ", classAttendanceForm.identifier.data # ) print( "classAttendanceForm.updateFiltersFlag.data =", classAttendanceForm.updateFiltersFlag.data, ) print("request.method =", request.method) if classAttendanceForm.validate_on_submit(): print( "classAttendanceForm.validate_on_submit() =", classAttendanceForm.validate_on_submit(), ) print("classAttendanceForm.errors =", classAttendanceForm.errors) # if classAttendanceForm.identifier.data is None: if request.method == "GET": if classAttendanceForm.classDate.data: classDateTime = classAttendanceForm.classDate.data classAttendanceForm.classDate.default = classDateTime else: classDateTime = date.today() # classDateTime = datetime.now() # classDateTime = classDateTime.replace( # hour=0, minute=0, second=0, microsecond=0 # ) classAttendanceForm.classDate.data = classDateTime # classAttendanceForm.classDate.data = classDateTime.date() classAttendanceForm.className.default = classAttendanceForm.className.data classAttendanceForm.teacherName.default = classAttendanceForm.teacherName.data classAttendanceForm.updateFiltersFlag.data = "" if classAttendanceForm.validate_on_submit(): # Update default values for teacher name and class name classAttendanceForm.className.default = classAttendanceForm.className.data classAttendanceForm.teacherName.default = classAttendanceForm.teacherName.data # Format class date for compatibility with database classDate = classAttendanceForm.classDate.data classDateTime = classDate print(classDate, classDateTime) # classDateTime = datetime( # classDate.year, classDate.month, classDate.day, 0, 0, 0, 0 # ) print( "classAttendanceForm.updateFiltersFlag.data =", classAttendanceForm.updateFiltersFlag.data, ) # Update database with attendance updates if (classAttendanceForm.classMembers and classAttendanceForm.updateFiltersFlag.data != "updated"): print("Class attendance submitted") print(len(classAttendanceForm.classMembers.data)) for studentForm in classAttendanceForm.classMembers.data: if studentForm["updateFlag"] == "updated": # Record updated attendance for student log_id = studentForm["log_id"] print("log_id = ", log_id) classAttendanceLog = ClassAttendanceLog.query.get_or_404( log_id) classAttendanceLog.attendanceCode = studentForm[ "attendanceCode"] classAttendanceLog.comment = studentForm["comment"] # Don't mark assignTmi for missed learning labs learningLab = classAttendanceLog.ClassSchedule.learningLab if classAttendanceLog.attendanceCode == "P" and not learningLab: classAttendanceLog.assignTmi = False if classAttendanceLog.attendanceCode == "E" and not learningLab: classAttendanceLog.assignTmi = False # if classAttendanceLog.attendanceCode == "T": # classAttendanceLog.assignTmi = False if classAttendanceLog.attendanceCode == "U" and not learningLab: classAttendanceLog.assignTmi = True if classAttendanceLog.attendanceCode == "Q" and not learningLab: classAttendanceLog.assignTmi = True db.session.commit() # Need to run the next statement [classAttendanceForm.process()] # or the updated values for the studentAttendanceForm won't display classAttendanceForm.process() # Retrive updated fixed-value attendance fields from database # If "All Classes" is selected, display all clases # Otherwise, only display classes for selecetd class if classAttendanceForm.className.default == "All Classes": print("All classes selected") classAttendanceFixedFields = (db.session.query( ClassAttendanceLog, ClassSchedule, DailyAttendanceLog).select_from(ClassAttendanceLog).join( ClassSchedule).join(ClassSchedule.Student).outerjoin( DailyAttendanceLog, (ClassAttendanceLog.classDate == DailyAttendanceLog.absenceDate) & (ClassSchedule.chattStateANumber == DailyAttendanceLog.chattStateANumber), ).filter( ClassAttendanceLog.classDate == classDateTime, ClassSchedule.teacherLastName == classAttendanceForm.teacherName.default, ).order_by(ClassSchedule.startTime, ClassSchedule.className, Student.lastName).all()) else: classAttendanceFixedFields = (db.session.query( ClassAttendanceLog, ClassSchedule, DailyAttendanceLog ).select_from(ClassAttendanceLog).join(ClassSchedule).join( ClassSchedule.Student ).outerjoin( DailyAttendanceLog, (ClassAttendanceLog.classDate == DailyAttendanceLog.absenceDate) & (ClassSchedule.chattStateANumber == DailyAttendanceLog.chattStateANumber), ).filter( ClassAttendanceLog.classDate == classDateTime, ClassSchedule.teacherLastName == classAttendanceForm.teacherName.default, ClassSchedule.className == classAttendanceForm.className.default, ).order_by(ClassSchedule.startTime, ClassSchedule.className, Student.lastName).all()) # Retrieve updated student attendance fields from database for studentAttendance in classAttendanceFixedFields: print(studentAttendance) studentAttendanceForm = updateStudentAttendanceForm() studentAttendanceForm.log_id = studentAttendance.ClassAttendanceLog.id studentAttendanceForm.attendanceCode = ( studentAttendance.ClassAttendanceLog.attendanceCode) studentAttendanceForm.comment = studentAttendance.ClassAttendanceLog.comment studentAttendanceForm.updateFlag = "" print( "ROSTER ", studentAttendanceForm.log_id, studentAttendance.ClassSchedule.className, studentAttendance.ClassSchedule.startTime, studentAttendance.ClassSchedule.endTime, studentAttendance.ClassSchedule.Student.firstName, studentAttendance.ClassSchedule.Student.lastName, studentAttendanceForm.attendanceCode, studentAttendanceForm.comment, ) classAttendanceForm.classMembers.append_entry(studentAttendanceForm) # Reset the updateFiltersFlag before rendering page classAttendanceForm.updateFiltersFlag.data = "" print("Final before render_template") print( "classAttendanceForm.classDate.default =", classAttendanceForm.classDate.default, ) print( "classAttendanceForm.classDate.data =", classAttendanceForm.classDate.data, ) return render_template( "classattendancelog.html", title="Attendance Log", classAttendanceForm=classAttendanceForm, classAttendanceFixedFields=classAttendanceFixedFields, )
def displayLearningLab(): printLogEntry("Running displayLearningLab()") # Learning lab uses the same form as adding a single class schedule # This form includes several fields which can be pre-set rather # than including the fields on the form # Pre-setting the fields will avoid form validation errors later addLearningLabDetails = addLearningLabToSchedule() # Pre-set campus equal to STEM School addLearningLabDetails.campus.choices = getCampusChoices() addLearningLabDetails.campus.data = "STEM School" # Pre-set school year to current school year addLearningLabDetails.schoolYear.choices = getSchoolYear() addLearningLabDetails.schoolYear.data = getCurrentSchoolYear() # Pre-set semester to current semester addLearningLabDetails.semester.choices = getSemester() addLearningLabDetails.semester.data = getCurrentSemester() addLearningLabDetails.teacherName.choices = getTeachers( use_staff_list=True) addLearningLabDetails.studentName.choices = getStudents() addLearningLabDetails.className.choices = getClassNames(campus="All") addLearningLabDetails.classDays.choices = getClassDayChoices() addLearningLabDetails.classDays2.choices = getClassDayChoices() addLearningLabDetails.classDays3.choices = getClassDayChoices() addLearningLabDetails.classDays4.choices = getClassDayChoices() addLearningLabDetails.classDays5.choices = getClassDayChoices() addLearningLabDetails.submitAddSingleClassSchedule.label.text = ( "Submit New Learning Lab") print(request.form) # Handle form submission for adding new learning lab if "submitAddSingleClassSchedule" in request.form: if addLearningLabDetails.validate_on_submit(): printLogEntry("Add Learning Lab submitted") schoolYear = addLearningLabDetails.schoolYear.data semester = addLearningLabDetails.semester.data chattStateANumber = addLearningLabDetails.studentName.data teacherLastName = addLearningLabDetails.teacherName.data className = addLearningLabDetails.className.data startDate = addLearningLabDetails.startDate.data endDate = addLearningLabDetails.endDate.data online = addLearningLabDetails.online.data indStudy = addLearningLabDetails.indStudy.data comment = addLearningLabDetails.comment.data googleCalendarEventID = addLearningLabDetails.googleCalendarEventID.data campus = "STEM School" staffID = current_user.id learningLab = True print( schoolYear, semester, chattStateANumber, teacherLastName, className, online, indStudy, comment, googleCalendarEventID, learningLab, ) printLogEntry("Adding intervention") interventionType = 2 interventionLevel = 1 interventionLog = add_InterventionLog( chattStateANumber, interventionType, interventionLevel, startDate, endDate, comment, parentNotification=datetime.utcnow(), ) db.session.commit() print("new intervention log ID:", interventionLog.id) # Store all of the common fields in a single variable for later use learningLabCommonFields = [ schoolYear, semester, chattStateANumber, campus, className, teacherLastName, staffID, online, indStudy, comment, googleCalendarEventID, interventionLog.id, learningLab, startDate, endDate, ] # Initialize a list to store details of learning labs for email notifications learningLabList = [] # Process each of the five possible entries of learning lab days/time if addLearningLabDetails.addTimeAndDays.data: print("Adding learning lab time 1") # Format time values from string objects to time objects startTime = datetime.strptime( addLearningLabDetails.startTime.data, "%H:%M").time() endTime = datetime.strptime(addLearningLabDetails.endTime.data, "%H:%M").time() learningLabClassSchedule = addLearningLabTimeAndDays( learningLabCommonFields, addLearningLabDetails.classDays.data, startTime, endTime, ) propagateLearningLab( learningLabClassSchedule.id, startDate, endDate, schoolYear, semester, ) learningLabList = updatelearningLabList( learningLabList, addLearningLabDetails.classDays.data, startTime, endTime, ) if addLearningLabDetails.addTimeAndDays2.data: print("Adding learning lab time 2") # Format time values from string objects to time objects startTime2 = datetime.strptime( addLearningLabDetails.startTime2.data, "%H:%M").time() endTime2 = datetime.strptime( addLearningLabDetails.endTime2.data, "%H:%M").time() learningLabClassSchedule = addLearningLabTimeAndDays( learningLabCommonFields, addLearningLabDetails.classDays2.data, startTime2, endTime2, ) propagateLearningLab( learningLabClassSchedule.id, startDate, endDate, schoolYear, semester, ) learningLabList = updatelearningLabList( learningLabList, addLearningLabDetails.classDays2.data, startTime2, endTime2, ) if addLearningLabDetails.addTimeAndDays3.data: print("Adding learning lab time 3") # Format time values from string objects to time objects startTime3 = datetime.strptime( addLearningLabDetails.startTime3.data, "%H:%M").time() endTime3 = datetime.strptime( addLearningLabDetails.endTime3.data, "%H:%M").time() learningLabClassSchedule = addLearningLabTimeAndDays( learningLabCommonFields, addLearningLabDetails.classDays3.data, startTime3, endTime3, ) propagateLearningLab( learningLabClassSchedule.id, startDate, endDate, schoolYear, semester, ) learningLabList = updatelearningLabList( learningLabList, addLearningLabDetails.classDays3.data, startTime3, endTime3, ) if addLearningLabDetails.addTimeAndDays4.data: print("Adding learning lab time 4") # Format time values from string objects to time objects startTime4 = datetime.strptime( addLearningLabDetails.startTime4.data, "%H:%M").time() endTime4 = datetime.strptime( addLearningLabDetails.endTime4.data, "%H:%M").time() learningLabClassSchedule = addLearningLabTimeAndDays( learningLabCommonFields, addLearningLabDetails.classDays4.data, startTime4, endTime4, ) propagateLearningLab( learningLabClassSchedule.id, startDate, endDate, schoolYear, semester, ) learningLabList = updatelearningLabList( learningLabList, addLearningLabDetails.classDays4.data, startTime4, endTime4, ) if addLearningLabDetails.addTimeAndDays5.data: print("Adding learning lab time 5") # Format time values from string objects to time objects startTime5 = datetime.strptime( addLearningLabDetails.startTime5.data, "%H:%M").time() endTime5 = datetime.strptime( addLearningLabDetails.endTime5.data, "%H:%M").time() learningLabClassSchedule = addLearningLabTimeAndDays( learningLabCommonFields, addLearningLabDetails.classDays5.data, startTime5, endTime5, ) propagateLearningLab( learningLabClassSchedule.id, startDate, endDate, schoolYear, semester, ) learningLabList = updatelearningLabList( learningLabList, addLearningLabDetails.classDays5.data, startTime5, endTime5, ) print("learningLabList =", learningLabList) # Define learning lab parameters for intervention email intervention_id = getInterventionId("Academic Behavior") interventionLevel = 1 templateParams = { "learningLabList": learningLabList, "className": className, "teacherLastName": teacherLastName, } sendInterventionEmail( chattStateANumber, intervention_id, interventionLevel, startDate, endDate, comment, templateParams=templateParams, ) return redirect(url_for("learningLab_bp.displayLearningLab")) print("addLearningLabDetails.errors: ", addLearningLabDetails.errors) # Get list of learning labs to display on learning lab manager start_of_current_school_year = get_start_of_current_school_year() end_of_current_school_year = get_end_of_current_school_year() LearningLabSchedules = (db.session.query(ClassSchedule).join( InterventionLog).join(Student).filter( ClassSchedule.learningLab == True, InterventionLog.endDate >= start_of_current_school_year, InterventionLog.endDate <= end_of_current_school_year, ).order_by(InterventionLog.endDate.desc(), Student.lastName.asc())).all() return render_template( "learninglabmanager.html", title="Learning Lab", addSingleClassSchedule=addLearningLabDetails, ClassSchedules=LearningLabSchedules, )