def post_attendance(self, request): """Register whether or not a single student attended class. Arguments request: an AttendanceRecord message. Returns: An instance of message_types.VoidMessage. """ current_user = endpoints.get_current_user() app_id = os.environ['APPLICATION_ID'] if app_id.startswith('dev~') or app_id == 'testbed-test': email = '*****@*****.**' else: if current_user is None: raise endpoints.UnauthorizedException('Invalid token.') email = current_user.email() domain = email.split('@')[1] if domain == 'gmail.com': domain = '' namespace_manager.set_namespace(domain) student_key = ndb.Key('Student', request.student) student = student_key.get() if not student: raise endpoints.BadRequestException('No student: %s' % request.student) classname_key = ndb.Key('Class', request.classname) classname = classname_key.get() if not classname: raise endpoints.BadRequestException('No class: %s' % request.classname) if not AttendanceAPI.is_enrolled(classname, student_key): raise endpoints.BadRequestException( 'Student %s is not enrolled in class %s' % (student_key, classname.name)) today = AttendanceAPI.today_as_ordinal(classname.timezone) if request.date != today: raise endpoints.BadRequestException('Date must be %s, but is: %s' % (today, request.date)) logging.info('Updating class: %s student: %s date: %s user: %s attend: %s' % (classname.name, request.student, request.date, email, request.attended)) attendance_key = ndb.Key('Class', request.classname, 'Attendance', request.date) attendance = attendance_key.get() if not attendance: attendance = Attendance(key=attendance_key, attending=[]) if request.attended: if not AttendanceAPI.is_present(attendance, student_key): attendance.attending.append(StudentPresent(student=student_key)) attendance.put() else: try: attendance.attending.remove(student_present) attendance.put() except ValueError: pass return message_types.VoidMessage()
def get(self): # authorize web requests user = users.get_current_user() authz = Authorize() if not authz.authorize(): self.error(403) return # get the form input yes = int(self.request.get('yes')) class_id = self.request.get('class_id') student_id = self.request.get('student_id') if student_id: student_key = ndb.Key('Student', int(student_id)) student = student_key.get() date_ordinal = self.request.get('date') date_struct = datetime.date.fromordinal(int(date_ordinal)) class_key = ndb.Key('Class', int(class_id)) the_class = class_key.get() hours = self.request.get('hours') today_as_ordinal = self.today_as_ordinal(the_class.timezone) # can only edit attendance for today attendance = None if int(date_ordinal) == today_as_ordinal: attendance_key = ndb.Key('Class', int(class_id), 'Attendance', int(date_ordinal)) attendance = attendance_key.get() attendance_already_exists = False try: if attendance: attendance_already_exists = True if yes: if student_id: self.add_student(student_key, hours, attendance.attending) else: students = ndb.get_multi(the_class.enrolled) for student in students: self.add_student(student.key, hours, attendance.attending) else: self.remove_student(student_key, attendance.attending) else: if yes: attendance = Attendance(key=attendance_key, attending=[]) if student_id: self.add_student(student_key, hours, attendance.attending) else: students = ndb.get_multi(the_class.enrolled) for student in students: self.add_student(student.key, hours, attendance.attending) except ValueError: # hours was not a float self.redirect('/students?class_id=%s&date=%s&errmsg=Invalid%%20value%%20for%%20hours' % (class_id, date_ordinal)) return if attendance: if yes: status = "present" else: status = "absent" logging.info('Change by %s: %s %s marked as %s for %s (hours: %s)' % (authz.get_name(), student.first_name, student.last_name, status, the_class.name, hours)) attendance.put() elif attendance_already_exists: attendance_key.delete() self.redirect('/students?class_id=%s&date=%s' % (class_id, date_ordinal))