Skip to main content

Overview

The ESPUser model extends Django’s built-in User model with ESP-specific functionality for managing students, teachers, volunteers, guardians, and administrators. Source: esp/esp/users/models/__init__.py

Core Fields

ESPUser inherits from Django’s User model, which provides:
username
CharField
required
Unique username for login
  • Max length: 150 characters
  • Must be unique
first_name
CharField
User’s first name
  • Max length: 150 characters
last_name
CharField
User’s last name
  • Max length: 150 characters
email
EmailField
User’s email address
  • Max length: 254 characters
  • Used for notifications and password recovery
is_staff
BooleanField
Django admin panel access
  • Default: False
is_superuser
BooleanField
Full Django permissions
  • Default: False
groups
ManyToManyField
User roles/types
  • Links to: Django Group model
  • Common groups: Student, Teacher, Administrator, Guardian, Educator, Volunteer

User Type Methods

ESP automatically creates membership methods for each user type.
isStudent()
bool
Checks if user is a studentReturns: True if user is in the Student groupExample:
user = ESPUser.objects.get(username='jsmith')
if user.isStudent():
    print("This is a student account")
isTeacher()
bool
Checks if user is a teacher/volunteer instructorReturns: True if user is in the Teacher group
isAdministrator(program=None)
bool
Checks if user has admin privilegesParameters:
  • program (Program): Check for program-specific admin rights, or global if None
Returns: True if user has Administrator role or Administer permissionCached: YesExample:
from esp.program.models import Program

user = ESPUser.objects.get(username='admin')
program = Program.objects.get(url='Splash/2024')

if user.isAdministrator(program):
    print("User can manage this program")
isGuardian()
bool
Checks if user is a guardian/parentReturns: True if user is in the Guardian group
isEducator()
bool
Checks if user is a K-12 educatorReturns: True if user is in the Educator group
isVolunteer()
bool
Checks if user is an onsite volunteerReturns: True if user is in the Volunteer group

Name and Contact Methods

name()
string
Returns full nameReturns: Example:
user.first_name = "Jane"
user.last_name = "Doe"
print(user.name())  # "Jane Doe"
name_last_first()
string
Returns name in last, first formatReturns:,
get_email_sendto_address()
string
Returns properly formatted email address for sending mailReturns: "Full Name" <[email protected]>Example:
from_addr = user.get_email_sendto_address()
send_mail('Subject', 'Message', from_addr, [recipient])

Grade and Student Methods

getGrade(program=None)
int
Gets student’s grade levelParameters:
  • program (Program): Calculate grade for specific program, or current year if None
Returns: Integer grade (7-12 typically), or 0 if not a studentCached: YesExample:
student = ESPUser.objects.get(username='student123')
program = Program.objects.get(url='Splash/2024')
grade = student.getGrade(program)
print(f"Student is in grade {grade}")
getYOG(program=None)
int
Gets student’s year of graduationParameters:
  • program (Program): Use registration profile from program, or latest if None
Returns: Graduation year (e.g., 2025) or NoneCached: Yes
set_grade(grade)
Sets student’s grade level based on current school yearParameters:
  • grade (int): Grade level to set
Behavior:
  • Calculates graduation year from grade
  • Updates StudentInfo record
  • Only works for students
Example:
student.set_grade(10)  # Sets as 10th grader
set_student_grad_year(grad_year)
Directly sets graduation yearParameters:
  • grad_year (int): Year of graduation
Behavior:
  • Updates StudentInfo.graduation_year
  • Only works for students

Teaching Methods

getTaughtClasses(program=None, include_rejected=False, include_cancelled=True)
QuerySet
Returns classes taught by this userParameters:
  • program (Program): Filter by program, or all programs if None
  • include_rejected (bool): Include rejected classes
  • include_cancelled (bool): Include cancelled classes
Returns: QuerySet of ClassSubject objectsCached: Yes (when program specified)Example:
teacher = ESPUser.objects.get(username='teacher1')
program = Program.objects.get(url='Splash/2024')
classes = teacher.getTaughtClasses(program)

for cls in classes:
    print(f"{cls.emailcode()}: {cls.title}")
getTaughtSections(program=None, include_rejected=False, include_cancelled=True)
QuerySet
Returns class sections taught by this userParameters:
  • program (Program): Filter by program
  • include_rejected (bool): Include rejected sections
  • include_cancelled (bool): Include cancelled sections
Returns: QuerySet of ClassSection objectsCached: Yes
getTaughtPrograms()
QuerySet
Returns all programs where user has taughtReturns: QuerySet of Program objects
getTaughtTime(program=None, include_scheduled=True, round_to=0.0)
timedelta
Calculates total teaching timeParameters:
  • program (Program): Filter by program
  • include_scheduled (bool): Count already-scheduled classes
  • round_to (float): Round to nearest fraction of hour (0 = no rounding)
Returns: timedelta object with total hoursExample:
time = teacher.getTaughtTime(program)
hours = time.total_seconds() / 3600
print(f"Teaching {hours} hours")
getAvailableTimes(program, ignore_classes=False)
list
Returns time blocks when teacher is availableParameters:
  • program (Program): Program to check availability for
  • ignore_classes (bool): Don’t exclude times they’re teaching
Returns: List of Event objectsCached: YesExample:
available = teacher.getAvailableTimes(program)
for timeslot in available:
    print(f"{timeslot.start} - {timeslot.end}")

Student Enrollment Methods

getEnrolledClasses(program=None)
QuerySet
Returns classes student is enrolled inParameters:
  • program (Program): Filter by program, or all if None
Returns: QuerySet of ClassSubject objectsExample:
student = ESPUser.objects.get(username='student123')
program = Program.objects.get(url='Splash/2024')
classes = student.getEnrolledClasses(program)

print(f"{student.name()} is enrolled in {classes.count()} classes")
getEnrolledSections(program=None)
list
Returns class sections student is enrolled inParameters:
  • program (Program): Filter by program
Returns: List of ClassSection objectsCached: Yes (when program specified)
getSections(program=None, verbs=None)
QuerySet
Returns sections with specified relationship typeParameters:
  • program (Program): Filter by program
  • verbs (list): Registration types (e.g., [‘Enrolled’, ‘Interested’])
Returns: QuerySet of ClassSection objectsExample:
# Get priority/lottery selections
priority = student.getSections(program, verbs=['Priority/1', 'Priority/2'])
isEnrolledInClass(clsObj)
bool
Checks if student is enrolled in specific classParameters:
  • clsObj (ClassSubject): Class to check
Returns: True if student has any section of this class

Permission Methods

canEdit(cls)
bool
Checks if user can edit a classParameters:
  • cls (ClassSubject): Class to check
Returns: True if user is teacher of class or program admin
canMod(sec)
bool
Checks if user can moderate a sectionParameters:
  • sec (ClassSection): Section to check
Returns: True if user is moderator, teacher, or program admin
canRegToFullProgram(program)
bool
Checks if user can register even when program is fullParameters:
  • program (Program): Program to check
Returns: True if user has OverrideFull permission
isOnsite(program=None)
bool
Checks if user has onsite accessParameters:
  • program (Program): Check for specific program, or all if None
Returns: True if user has Onsite permission

Role Management

makeRole(role_name)
Adds a role/group to userParameters:
  • role_name (string): Name of group (e.g., “Teacher”, “Volunteer”)
Example:
user.makeRole('Teacher')
user.makeRole('Volunteer')
removeRole(role_name)
Removes a role/group from userParameters:
  • role_name (string): Name of group to remove
hasRole(role_name)
bool
Checks if user has specific roleParameters:
  • role_name (string): Group name to check
Returns: True if user is in the group
getUserTypes()
list
Returns all roles/types for this userReturns: List of group names (e.g., [‘Student’, ‘Teacher’])Example:
types = user.getUserTypes()
print(f"User roles: {', '.join(types)}")

Authentication

switch_to_user(request, user, retUrl, retTitle, onsite=False)
Morphs into another user (admin feature)Parameters:
  • request: Django request object
  • user (ESPUser): User to become
  • retUrl (string): URL to return to when switching back
  • retTitle (string): Display text for return link
  • onsite (bool): Whether this is onsite morphing
Security: Cannot morph into administratorsExample:
# Admin morphing to help a student
admin.switch_to_user(request, student, '/manage/', 'Back to Admin', False)
switch_back(request)
string
Returns to original user after morphingReturns: URL to redirect to
is_morphed(request=None)
bool
Checks if currently morphed as another userReturns: True if session contains morph data

Usage Examples

Creating Users

from esp.users.models import ESPUser

# Create a student
student = ESPUser.objects.create_user(
    username='jsmith',
    email='[email protected]',
    first_name='John',
    last_name='Smith',
    password='securepassword'
)
student.makeRole('Student')
student.set_grade(10)

# Create a teacher
teacher = ESPUser.objects.create_user(
    username='mjones',
    email='[email protected]',
    first_name='Mary',
    last_name='Jones'
)
teacher.makeRole('Teacher')

Checking User Classes

from esp.program.models import Program

program = Program.objects.get(url='Splash/2024')
user = ESPUser.objects.get(username='jsmith')

if user.isStudent():
    # Get student's schedule
    classes = user.getEnrolledClasses(program)
    print(f"Enrolled in {classes.count()} classes:")
    for cls in classes:
        print(f"  - {cls.title}")
        
elif user.isTeacher():
    # Get teacher's classes
    classes = user.getTaughtClasses(program)
    print(f"Teaching {classes.count()} classes:")
    for cls in classes:
        sections = cls.get_sections()
        print(f"  - {cls.title} ({sections.count()} sections)")

Managing Availability

from esp.cal.models import Event

teacher = ESPUser.objects.get(username='teacher1')
program = Program.objects.get(url='Splash/2024')

# Set teacher availability
timeslots = Event.objects.filter(program=program)
for slot in timeslots:
    teacher.addAvailableTime(program, slot)

# Check available times
available = teacher.getAvailableTimes(program)
print(f"Available for {len(available)} time blocks")
  • Program - Programs users participate in
  • ClassSubject - Classes users teach or take
  • Registration - Student enrollments
  • ContactInfo - Phone numbers and addresses
  • StudentInfo - Student-specific data (grade, school)
  • TeacherInfo - Teacher-specific data (bio, availability)

Build docs developers (and LLMs) love