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()
Пример #2
0
  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))