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 edit_ClassSchedule(log_id): editSingleClassScheduleDetails = editSingleClassSchedule() log = ClassSchedule.query.get_or_404(log_id) LogDetails = f"{(log_id)} {log.chattStateANumber} {log.className}" printLogEntry("Running update_ClassSchedule(" + LogDetails + ")") if "submitEditSingleClassSchedule" in request.form: print("submitEditSingleClassSchedule submitted") # Get the pre-update class days and times for use in log comment later preUpdateClassDays = log.classDays preUpdateStartTime = log.startTime preUpdateEndTime = log.endTime # Update the database with the values submitted in the form log.schoolYear = editSingleClassScheduleDetails.schoolYear.data log.semester = editSingleClassScheduleDetails.semester.data log.campus = editSingleClassScheduleDetails.campus.data log.className = editSingleClassScheduleDetails.className.data log.teacherLastName = editSingleClassScheduleDetails.teacherName.data classDaysList = editSingleClassScheduleDetails.classDays.data classDays = "" for classDay in classDaysList: classDays = classDays + classDay print("classDaysList=", classDaysList) # Set updatedClassDays to True if the classDays are updated # updatedClassDays is used to determine whether to delete attendance logs if classDays == preUpdateClassDays: updatedClassDays = False else: updatedClassDays = True log.classDays = classDays startTime = editSingleClassScheduleDetails.startTime.data endTime = editSingleClassScheduleDetails.endTime.data updatedTimes = False # Set updatedTimes to True if the class times are updated # updatedTimes is used to determine whether to append comment to attendance logs if startTime != preUpdateStartTime: updatedTimes = True log.startTime = startTime if endTime != preUpdateEndTime: updatedTimes = True log.endTime = endTime log.online = editSingleClassScheduleDetails.online.data log.indStudy = editSingleClassScheduleDetails.indStudy.data log.comment = editSingleClassScheduleDetails.comment.data log.googleCalendarEventID = ( editSingleClassScheduleDetails.googleCalendarEventID.data) db.session.commit() # If classDays change, delete any class attendance logs that are null # If logs have attendance code, append a comment explaining the original class days and times # If class days or class times changes, append a comment on logs with an attendance code if updatedClassDays or updatedTimes: print( "classDays or class times updated -- reviewing associated class attendance logs" ) attendanceLogs = ClassAttendanceLog.query.filter( ClassAttendanceLog.classSchedule_id == log.id).all() for attendanceLog in attendanceLogs: # Delete class logs with null attendance codes and new days if attendanceLog.attendanceCode == None and updatedClassDays: db.session.delete(attendanceLog) db.session.commit() print( "Deleting attendance log for ", log.className, "on", attendanceLog.classDate, ) # Append comment to logs with attendance codes noting the original class schedule info if attendanceLog.attendanceCode != None and (updatedTimes or updatedClassDays): scheduleComment = ( "[Class schedule changed from: " + preUpdateClassDays + " " + preUpdateStartTime.strftime("%-I:%M") + "-" + preUpdateEndTime.strftime("%-I:%M") + " on " + date.today().strftime("%-m/%-d/%Y") + "] ") if attendanceLog.comment == None: attendanceLog.comment = "" attendanceLog.comment = scheduleComment + attendanceLog.comment db.session.commit() print("Appending attendanceLog.comment:", attendanceLog.comment) return redirect(url_for("masterSchedule_bp.displayMasterSchedule")) studentName = getStudentName(log.chattStateANumber) print("studentName =", studentName) if log: editSingleClassScheduleDetails.schoolYear.choices = getSchoolYear() editSingleClassScheduleDetails.semester.choices = getSemester() editSingleClassScheduleDetails.teacherName.choices = getTeachers() editSingleClassScheduleDetails.campus.choices = getCampusChoices() editSingleClassScheduleDetails.className.choices = ( getStemAndChattStateClassNames()) editSingleClassScheduleDetails.classDays.choices = [ ("M", "M"), ("T", "T"), ("W", "W"), ("R", "R"), ("F", "F"), ] editSingleClassScheduleDetails.log_id.data = log.id editSingleClassScheduleDetails.schoolYear.data = log.schoolYear editSingleClassScheduleDetails.semester.data = log.semester editSingleClassScheduleDetails.campus.data = log.campus editSingleClassScheduleDetails.className.data = log.className editSingleClassScheduleDetails.teacherName.data = log.teacherLastName # Set classDays by creating list of days from string (e.g., 'MWF' -> [M, W, F]) classDaysList = [] for classDay in log.classDays: classDaysList.append(classDay) editSingleClassScheduleDetails.classDays.data = classDaysList editSingleClassScheduleDetails.startTime.data = log.startTime editSingleClassScheduleDetails.endTime.data = log.endTime editSingleClassScheduleDetails.online.data = log.online editSingleClassScheduleDetails.indStudy.data = log.indStudy editSingleClassScheduleDetails.comment.data = log.comment editSingleClassScheduleDetails.googleCalendarEventID.data = ( log.googleCalendarEventID) print( "editSingleClassScheduleDetails=", editSingleClassScheduleDetails.log_id.data, editSingleClassScheduleDetails.schoolYear.data, editSingleClassScheduleDetails.classDays.data, ) return render_template( "updatemasterschedule.html", title="Update Master Schedule", editSingleClassSchedule=editSingleClassScheduleDetails, studentName=studentName, )
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, )