Coverage for app/models/user.py: 94%
79 statements
« prev ^ index » next coverage.py v7.10.2, created at 2026-01-23 18:51 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2026-01-23 18:51 +0000
1from app.models import *
3class User(baseModel):
4 username = CharField(primary_key=True)
5 bnumber = CharField(unique=True)
6 email = CharField()
7 phoneNumber = CharField(null=True)
8 firstName = CharField()
9 lastName = CharField()
10 cpoNumber = CharField(null=False)
11 isStudent = BooleanField(default=False)
12 major = CharField(null=True)
13 rawClassLevel = CharField(null=True)
14 isFaculty = BooleanField(default=False)
15 isStaff = BooleanField(default=False)
16 isCeltsAdmin = BooleanField(default=False)
17 isCeltsStudentStaff = BooleanField(default=False)
18 dietRestriction = TextField(null=True)
19 minorInterest = BooleanField(null=True)
20 hasGraduated = BooleanField(default=False)
21 declaredMinor = BooleanField(default=False)
23 # override BaseModel's __init__ so that we can set up an instance attribute for cache
24 def __init__(self,*args, **kwargs):
25 super().__init__(*args,**kwargs)
27 self._pmCache = {}
28 self._bsCache = None
29 self._laborCache = None
30 self._isProgramManagerCache = None
32 @property
33 def processedClassLevel(self):
34 if self.hasGraduated or self.rawClassLevel == "Graduating":
35 return "Alumni"
36 return self.rawClassLevel or "Not Enrolled"
38 @property
39 def isAlumni(self):
40 return self.hasGraduated or self.rawClassLevel == "Graduating"
42 @property
43 def isCurrentlyEnrolled(self):
44 return self.isStudent and not self.isAlumni
46 @property
47 def isAdmin(self):
48 return (self.isCeltsAdmin or self.isCeltsStudentStaff)
50 @property
51 def isBonnerScholar(self):
52 from app.models.bonnerCohort import BonnerCohort
53 if self._bsCache is None:
54 # TODO should we exclude users who are banned from Bonner here?
55 self._bsCache = BonnerCohort.select().where(BonnerCohort.user == self).exists()
57 return self._bsCache
59 @property
60 def hasCurrentCeltsLabor(self):
61 if self._laborCache is None:
62 from app.models.celtsLabor import CeltsLabor
63 from app.models.term import Term
64 self._laborCache = (CeltsLabor.select()
65 .join(Term)
66 .where(CeltsLabor.user == self,
67 CeltsLabor.term.isCurrentTerm == True)
68 .exists())
69 return self._laborCache
71 @property
72 def fullName(self):
73 return f"{self.firstName} {self.lastName}"
75 def addProgramManager(self, program):
76 # Makes a user a Program Manager
77 from app.models.programManager import ProgramManager
78 ProgramManager.create(user = self, program = program)
80 return (f' {self} added as Program Manager')
82 def removeProgramManager(self, program):
83 # Removes an existing Program Manager from being a Program Manager
84 from app.models.programManager import ProgramManager
85 ProgramManager.delete().where(ProgramManager.user == self, ProgramManager.program == program).execute()
87 return (f'{self} removed from Program Manager')
89 def isProgramManagerFor(self, program):
90 # Looks to see who is the Program Manager for a program
91 from app.models.programManager import ProgramManager # Must defer import until now to avoid circular reference
92 if not program:
93 return False
95 if program not in self._pmCache:
96 self._pmCache[program] = ProgramManager.select().where(ProgramManager.user == self, ProgramManager.program == program).exists()
98 return self._pmCache[program]
100 def isProgramManagerForEvent(self, event):
101 # Looks to see who the Program Manager for a specific event is
102 return self.isProgramManagerFor(event.program)
104 @property
105 def isProgramManager(self):
106 from app.models.programManager import ProgramManager
108 if self._isProgramManagerCache is None:
109 self._isProgramManagerCache = ProgramManager.select().where(ProgramManager.user == self).exists()
111 return self._isProgramManagerCache