Coverage for app/models/user.py: 89%

73 statements  

« prev     ^ index     » next       coverage.py v7.10.2, created at 2025-12-17 17:33 +0000

1from app.models import * 

2 

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) 

22 

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) 

26 

27 self._pmCache = {} 

28 self._bsCache = None 

29 self._laborCache = None 

30 self._isProgramManagerCache = None 

31 

32 @property 

33 def processedClassLevel(self): 

34 if not self.rawClassLevel: 

35 return "" 

36 return "Graduated" if (self.hasGraduated) else self.rawClassLevel 

37 

38 @property 

39 def isAdmin(self): 

40 return (self.isCeltsAdmin or self.isCeltsStudentStaff) 

41 

42 @property 

43 def isBonnerScholar(self): 

44 from app.models.bonnerCohort import BonnerCohort 

45 if self._bsCache is None: 

46 # TODO should we exclude users who are banned from Bonner here? 

47 self._bsCache = BonnerCohort.select().where(BonnerCohort.user == self).exists() 

48 

49 return self._bsCache 

50 

51 @property 

52 def hasCurrentCeltsLabor(self): 

53 if self._laborCache is None: 

54 from app.models.celtsLabor import CeltsLabor 

55 from app.models.term import Term 

56 self._laborCache = (CeltsLabor.select() 

57 .join(Term) 

58 .where(CeltsLabor.user == self, 

59 CeltsLabor.term.isCurrentTerm == True) 

60 .exists()) 

61 return self._laborCache 

62 

63 @property 

64 def fullName(self): 

65 return f"{self.firstName} {self.lastName}" 

66 

67 def addProgramManager(self, program): 

68 # Makes a user a Program Manager 

69 from app.models.programManager import ProgramManager 

70 ProgramManager.create(user = self, program = program) 

71 

72 return (f' {self} added as Program Manager') 

73 

74 def removeProgramManager(self, program): 

75 # Removes an existing Program Manager from being a Program Manager 

76 from app.models.programManager import ProgramManager 

77 ProgramManager.delete().where(ProgramManager.user == self, ProgramManager.program == program).execute() 

78 

79 return (f'{self} removed from Program Manager') 

80 

81 def isProgramManagerFor(self, program): 

82 # Looks to see who is the Program Manager for a program 

83 from app.models.programManager import ProgramManager # Must defer import until now to avoid circular reference 

84 if not program: 

85 return False 

86 

87 if program not in self._pmCache: 

88 self._pmCache[program] = ProgramManager.select().where(ProgramManager.user == self, ProgramManager.program == program).exists() 

89 

90 return self._pmCache[program] 

91 

92 def isProgramManagerForEvent(self, event): 

93 # Looks to see who the Program Manager for a specific event is 

94 return self.isProgramManagerFor(event.program) 

95 

96 @property 

97 def isProgramManager(self): 

98 from app.models.programManager import ProgramManager 

99 

100 if self._isProgramManagerCache is None: 

101 self._isProgramManagerCache = ProgramManager.select().where(ProgramManager.user == self).exists() 

102 

103 return self._isProgramManagerCache 

104 

105