# Check user typeuser.isStudent() # True if user is in Student groupuser.isTeacher() # True if user is in Teacher group user.isAdministrator() # True if user has admin privileges# Get all user types for a useruser.getUserTypes() # Returns: ['Student', 'Teacher']# Add a user typeuser.makeRole('Volunteer')# Remove a user type user.removeRole('Volunteer')
# Name formattinguser.name() # "John Smith"user.name_last_first() # "Smith, John"user.nonblank_name() # Falls back to username if name is blank# Emailuser.get_email_sendto_address() # "John Smith <[email protected]>"# User displayuser.ajax_str() # "Smith, John (jsmith)"
class StudentInfo(models.Model): user = models.ForeignKey(ESPUser) graduation_year = models.IntegerField() # Year of high school graduation school = models.CharField(max_length=128) heard_about = models.TextField() # How they heard about the program # ... and more fields
The system calculates a student’s grade based on graduation year:
# Get student's current gradegrade = user.getGrade(program)# Get year of graduation yog = user.getYOG(program)# Convert between grade and YOGgrade = ESPUser.gradeFromYOG(yog, schoolyear=2024)yog = ESPUser.YOGFromGrade(grade, schoolyear=2024)
How grade calculation works
The system uses a “school year” that runs from August to July:
School year 2024 = August 2023 through July 2024
If a student graduates in 2026, in school year 2024 they are in 10th grade
class TeacherInfo(models.Model): user = models.ForeignKey(ESPUser) affiliation = models.CharField(max_length=64) # University, employer, etc. college_name = models.CharField(max_length=128) major = models.CharField(max_length=64) # ... and more fields
# Get available times for a programavailable_times = user.getAvailableTimes(program)# Add availabilityuser.addAvailableTime(program, timeslot)# Clear all availabilityuser.clearAvailableTimes(program)
# Check if user is adminif user.isAdministrator(program): # Can manage this program passif user.isAdministrator(): # No program specified # Global administrator pass
class Permission(ExpirableModel): user = models.ForeignKey(ESPUser, blank=True, null=True) role = models.ForeignKey(Group, blank=True, null=True) # Or to entire group program = models.ForeignKey(Program, blank=True, null=True) permission_type = models.CharField(max_length=80) # start_date and end_date from ExpirableModel
Common permission types:
Administer - Full program management
Onsite - Access onsite check-in interface
OverrideFull - Register for full programs/classes
OverridePhaseZero - Skip lottery phase
# Grant admin permissionPermission.objects.create( user=user, program=program, permission_type="Administer")# Check permissionif Permission.user_has_perm(user, 'Onsite', program): # User can access onsite interface pass
# All students in a programstudents = program.students()['classreg']# All teachers in a program teachers = program.teachers()['class_approved']# All volunteersvolunteers = program.volunteers()['volunteer_all']
# All students in the systemall_students = ESPUser.getAllOfType('Student', QObject=False)# As a Q object for filteringstudent_q = ESPUser.getAllOfType('Student', QObject=True)
# Autocomplete searchresults = ESPUser.ajax_autocomplete("Smith, J")# Searches last name, first name, username, and ID# Get user by name (if multiple exist)user = ESPUser.getUserFromNum("John", "Smith", 0) # First John Smithuser = ESPUser.getUserFromNum("John", "Smith", 1) # Second John Smith
def can_register_for_class(student, class_subject, program): """Check if student can register for a class.""" # Check grade level student_grade = student.getGrade(program) if student_grade < class_subject.grade_min or student_grade > class_subject.grade_max: return False, "Grade level not in range" # Check if already registered if student.isEnrolledInClass(class_subject): return False, "Already enrolled" return True, "OK"
def get_teacher_schedule(teacher, program): """Get all times when a teacher is teaching.""" schedule = [] sections = teacher.getTaughtSections(program) for section in sections: for time in section.meeting_times.all(): schedule.append({ 'class': section.parent_class.title, 'section': section.emailcode(), 'time': time.pretty_time(), 'room': ', '.join(section.prettyrooms()) }) return sorted(schedule, key=lambda x: x['time'])
def students_in_grade(program, grade): """Find all students in a specific grade for a program.""" yog = ESPUser.YOGFromGrade(grade, ESPUser.program_schoolyear(program)) students = program.students()['classreg'] students_in_grade = [ s for s in students if s.getYOG(program) == yog ] return students_in_grade
Use getLastProfile(): Always use user.getLastProfile() rather than directly querying RegistrationProfile - it handles edge cases and returns an empty profile if none exists.
Check user types: Don’t assume a user has only one type. A user can be both a Student and a Teacher.
Program-specific grades: Always pass the program when getting a student’s grade: user.getGrade(program). Grade can vary by program due to timing.