def adminConsole_semesterDetails(): date = Date() form = SemesterMetaDataForm() if form.validate_on_submit(): semester = SemesterMetaData.query.filter_by(semester=date.season).filter_by(year=date.year).first() # Current Semester not an entry in the database, create a new semester entry if not semester: semester = SemesterMetaData(semester=date.season, year=date.year) db.session.add(semester) db.session.commit() # Update semester fields for number of points and time/date survey expiration if form.onePoint.data: semester.numEventsOnePoint = form.onePoint.data if form.twoPoints.data: semester.numEventsTwoPoints = form.twoPoints.data if form.expirationDate.data: semester.dateSurveyExpire = form.expirationDate.data.strftime("%m_%d_%Y") if form.expirationTime.data: semester.timeSurveyExpire = form.expirationTime.data.strftime("%H_%M_%S") # if a change has been made, commit the data if form.onePoint.data or form.twoPoints.data or form.expirationDate.data or form.expirationTime.data: db.session.commit() flash(f'{date.season}, {date.year} semester details have been updated!', 'success') return render_template('semester_metadata.html', title='edit-semester-details', form=form, date=date)
def attendance(): form = StudentSignInForm() if form.validate_on_submit(): student = Student.query.filter_by(id=form.studentID.data).first() if student: date = Date() attendance = Attendance.query.filter_by(studentID=form.studentID.data).\ filter_by(semester=date.season).\ filter_by(year=date.year).all() events = Event.query.filter_by(semester=date.season).\ filter_by(year=date.year).all() semester = SemesterMetaData.query.filter_by(semester=date.season).\ filter_by(year=date.year).first() # Check to see if student qualifies for any points if (semester == None): pointsQualified = (None, None) elif (len(attendance) >= semester.numEventsTwoPoints): pointsQualified = (0,2) elif (len(attendance) >= semester.numEventsOnePoint): pointsQualified = (0,1) else: pointsQualified = (semester.numEventsOnePoint - len(attendance), 0) return render_template('student-console.html', title='Student Attendance', date=date, student=student, pointsQualified=pointsQualified, attendance=attendance, events=events) else: flash(f'The user \'{form.studentID.data}\' does not exist.\ Please contact your department administrator.', 'danger') return render_template('student-signin.html', title='Login', form=form)
class SemesterMetaDataForm(FlaskForm): date = Date() onePoint = IntegerField('Number of events for one point', validators=[Optional()]) twoPoints = IntegerField('Number of events for two points', validators=[Optional()]) expirationDate = DateField('Survey expiration date', default=date.currentDay, validators=[Optional()]) expirationTime = TimeField('Survey expiration time', default=date.currentTime, validators=[Optional()]) updateSemester = SubmitField('Update Semester')
class Event(db.Model): __tablename__ = 'events' id = db.Column('event_id', db.Integer, primary_key=True, nullable=False) date = Date() eventDate = db.Column('event_date', db.String(10), default=date.stringDate) eventName = db.Column('event_name', db.String(50), nullable=False) attendanceTotal = db.Column('attendance_total', db.Integer, nullable=False, default=0) newStudentTotal = db.Column('new_student_total', db.Integer, nullable=False, default=0) semester = db.Column('semester', db.String(6), nullable=False, default=date.season) year = db.Column('year', db.String(4), nullable=False, default=date.year) def __init__(self, eventName, attendanceTotal, newStudentTotal, semester, year): self.eventName = eventName self.attendanceTotal = attendanceTotal self.newStudentTotal = newStudentTotal self.semester = semester self.year = year def __repr__(self): return f"Event('{self.id}', '{self.eventDate}', '{self.eventName}',"\ f"'{self.attendanceTotal}','{self.semester}', '{self.year}')"
class SemesterMetaData(db.Model): __tablename__ = 'semester_metadata' id = db.Column('semester_id', db.Integer, primary_key=True, nullable=False) date = Date() semester = db.Column('semester', db.String(6), nullable=False, default=date.season) year = db.Column('year', db.String(4), nullable=False, default=date.year) numEventsOnePoint = db.Column('num_events_one_point', db.Integer, nullable=False, default=10) numEventsTwoPoints = db.Column('num_events_two_points', db.Integer, nullable=False, default=12) dateSurveyExpire = db.Column('survey_expiration_date', db.String(10), default='null') timeSurveyExpire = db.Column('survey_expiration_time', db.String(10), default='null') def __init__(self, semester, year): self.semester = semester self.year = year def __repr__(self): return f"Semester('{self.id}', '{self.semester}', '{self.year}',"\ f"'{self.numEventsOnePoint}', '{self.numEventsTwoPoints}',"\ f"'{self.dateSurveyExpire}', '{self.timeSurveyExpire}')"
class Attendance(db.Model): __tablename__ = 'attendance' id = db.Column('attendance_id', db.Integer, primary_key=True, nullable=False) date = Date() eventID = db.Column('event_id', db.Integer, nullable=False) studentID = db.Column('student_id', db.String(10), db.ForeignKey('students.student_id'), nullable=False) isNew = db.Column('is_new', db.Integer, nullable=False, default=0) semester = db.Column('semester', db.String(6), nullable=False, default=date.season) year = db.Column('year', db.String(4), nullable=False, default=date.year) date = db.Column('date_added', db.String(10), default=date.stringDate) def __init__(self, eventID, studentID, isNew, semester, year): self.eventID = eventID self.studentID = studentID self.isNew = isNew self.semester = semester self.year = year def __repr__(self): return f"Attendance('{self.id}', '{self.eventID}', '{self.studentID}',"\ f"'{self.isNew}', '{self.semester}', '{self.year}', '{self.date}')"
def adminConsole_eventSession(event_url): date = Date() event = Event.query.filter_by(id=event_url).first() attendance = Attendance.query.filter_by(eventID=event.id).all() if not event: flash(f'Cannot open event session for event id: {event_url}', 'danger') return redirect(url_for('adminConsole_startEvent')) form = IDReaderForm() if form.validate_on_submit(): id = form.id.data # Trim scanned barcode ID to 00xxxxxx ID format if id.startswith('2000'): id = id[2:] elif id.startswith('200'): id = id[1:] student = Student.query.filter_by(id=id).first() # Check that the student hasn't already been registered for the event if (not Attendance.query.filter_by(eventID=event.id).filter_by(studentID=id).first()): event.attendanceTotal += 1 # If a student is new, create an entry in the database and generate an attendance record # Otherwise just generate the attendance record if student == None: isNew = True else: isNew = False if isNew: newStudent = Student(id=id) attendanceEntry = Attendance(eventID=event.id, studentID=id, isNew=1, semester=date.season, year=date.year) db.session.add(newStudent) else: attendanceEntry = Attendance(eventID=event.id, studentID=id, isNew=0, semester=date.season, year=date.year) db.session.add(attendanceEntry) db.session.commit() if isNew: flash(f'Welcome New Student!', 'success') else: flash(f'Welcome {student.firstName} {student.lastName}!', 'success') return redirect(url_for('adminConsole_eventSession', event_url=event.id)) else: if student.firstName == 'new_student': flash(f'New Student ({student.id}) has already checked in!', 'danger') else: flash(f'{student.firstName} {student.lastName} has already checked in!', 'danger') return redirect(url_for('adminConsole_eventSession', event_url=event.id)) return render_template('event_session.html', title='event-session', form=form, event=event, attendance=attendance)
def __init__(self): date = Date() self.attendance = Attendance.query.filter_by(semester=date.season, year=date.year) self.events = Event.query.filter_by(semester=date.season, year=date.year) self.students = Student.query.all() self.filename = str(date.season) + str( date.year) + '__Master_Spreadsheet.csv' self.filepath = os.getcwd() + '/pmm_server/spreadsheets/master/' self.generateSpreadsheet()
def adminConsole_openExistingEvent(): date = Date() eventChoices = [(str(g.id), g.eventName) for g in Event.query.filter_by(semester=date.season).filter_by(year=date.year).all()] form = LoadEventForm() form.chooseEvent.choices = eventChoices if form.validate_on_submit(): eventChosen = Event.query.filter_by(id=form.chooseEvent.data)\ .filter_by(semester=date.season)\ .filter_by(year=date.year).first() pageTitle = "event: " + str(eventChosen.eventName) return redirect(url_for('adminConsole_eventSession', event_url=eventChosen.id)) return render_template('reload_event.html', title='Re-open existing event', form=form)
class CourseData(db.Model): __tablename__ = 'course_data' date = Date() id = db.Column('course_id', db.Integer, primary_key=True, nullable=False) semester = db.Column('semester', db.String(6), nullable=False, default=date.season) year = db.Column('year', db.String(4), nullable=False, default=date.year) crn = db.Column('crn', db.Integer, nullable=False) course = db.Column('course', db.String(10), nullable=False) section = db.Column('section', db.String(5), nullable=False) title = db.Column('title', db.String(100), nullable=False) hours = db.Column('hours', db.String(3), nullable=False) llc = db.Column('area_of_llc', db.String(10)) type = db.Column('type', db.String(3), nullable=False) days = db.Column('days', db.String(3)) time = db.Column('time', db.String(9)) location = db.Column('location', db.String(15), nullable=False) instructor = db.Column('instructor', db.String(50), nullable=False) seats = db.Column('seats_still_available', db.Integer, nullable=False) status = db.Column('status', db.String(6), nullable=False) def __init__(self, crn, course, section, title, hours, llc, type, days, time, location, instructor, seats, status): self.crn = crn self.course = course self.section = section self.title = title self.hours = hours self.llc = llc self.type = type self.days = days self.time = time self.location = location self.instructor = instructor self.seats = seats self.status = status def __repr__(self): return f"Course('{self.id}', '{self.semester}', '{self.year}', '{self.crn}',"\ f"'{self.course}', '{self.title}', '{self.hours}', '{self.llc}',"\ f"'{self.type}', '{self.days}', '{self.time}', '{self.location}',"\ f"'{self.instructor}', '{self.seats}', '{self.status}')"
def adminConsole(): date = Date() events = Event.query.filter_by(semester=date.season).filter_by(year=date.year).all() generateMasterSpreadsheet = MasterSpreadsheet() masterSpreadsheet = ('master', generateMasterSpreadsheet.filename) # Attendance Total is used to generate percentage style chart on admin-console page allSemesterAttendance = 0 eventsWithFilePath = [] for event in events: allSemesterAttendance += int(event.attendanceTotal) spreadsheet = EventSpreadsheet(event.id) eventWithFilePath = (event, ('event',spreadsheet.filename)) eventsWithFilePath.append(eventWithFilePath) return render_template('admin.html', title='Admin Console', events=eventsWithFilePath, date=date, attendTotal=allSemesterAttendance, masterSpreadsheet=masterSpreadsheet)
def adminConsole_startEvent(): date = Date() eventChoices = [(str(g.id), g.eventName) for g in Event.query.filter_by(semester=date.season).filter_by(year=date.year).all()] eventChoices.insert(0,('none', 'none (new event session)')) form = NewEventForm() form.attendance.choices = eventChoices if form.validate_on_submit(): # Check to see if user chose to create a new pmm event with preexisting attendance data if form.attendance.data != 'none': eventAttendance = Event.query.filter_by(id=form.attendance.data)\ .filter_by(semester=date.season)\ .filter_by(year=date.year).first() attendanceEntries = Attendance.query.filter_by(eventID=eventAttendance.id).all() event = Event(eventName=form.eventName.data, attendanceTotal=eventAttendance.attendanceTotal, newStudentTotal=0, semester=date.season, year=date.year) db.session.add(event) db.session.commit() for entry in attendanceEntries: newEntry = Attendance(event.id, entry.studentID, 0, entry.semester, entry.year) db.session.add(newEntry) db.session.commit() # Create new pmm event with blank attendance record else: event = Event(eventName=form.eventName.data, attendanceTotal=0, newStudentTotal=0, semester=date.season, year=date.year) db.session.add(event) db.session.commit() pageTitle = "event: " + str(event.eventName) return redirect(url_for('adminConsole_eventSession', event_url=event.id)) return render_template('create_event.html', title='start new event', form=form)
class NewEventForm(FlaskForm): date = Date() eventName = StringField('Event Name', validators=[DataRequired()]) attendance = SelectField('Use Attendance From', validators=[DataRequired()]) startNew = SubmitField('Start Event')