Coverage for app/models/event.py: 88%
66 statements
« prev ^ index » next coverage.py v7.10.2, created at 2026-07-08 20:07 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2026-07-08 20:07 +0000
1from app.models import *
2from app.models.term import Term
3from app.models.program import Program
4from datetime import datetime
6class Event(baseModel):
7 name = CharField()
8 term = ForeignKeyField(Term)
9 description = TextField()
10 timeStart = TimeField()
11 timeEnd = TimeField()
12 location = CharField()
13 isFoodProvided = BooleanField(default=False)
14 isLaborOnly = BooleanField(default=False)
15 isTraining = BooleanField(default=False)
16 isRsvpRequired = BooleanField(default=False)
17 isService = BooleanField(default=False)
18 isEngagement = BooleanField(default=False)
19 isAllVolunteerTraining = BooleanField(default=False)
20 rsvpLimit = IntegerField(null=True)
21 startDate = DateField()
22 seriesId = IntegerField(null=True)
23 isRepeating = BooleanField(default=False)
24 contactEmail = CharField(null=True)
25 contactName = CharField(null=True)
26 program = ForeignKeyField(Program)
27 isCanceled = BooleanField(default=False)
28 deletionDate = DateTimeField(null=True)
29 deletedBy = TextField(null=True)
30 campusGroupsId = IntegerField(null=True)
31 campusGroupsURL = CharField(null=True)
32 isCampusGroupsSynced = BooleanField(default=False)
34 _spCache = "Empty"
36 def __str__(self):
37 return f"{self.id}: {self.description}"
39 @property
40 def isDeleted(self):
41 return self.deletionDate is not None
43 @property
44 def noProgram(self):
45 return not self.program_id
47 @property
48 def isPastStart(self):
49 return datetime.now() >= datetime.combine(self.startDate, self.timeStart)
51 @property
52 def isPastEnd(self):
53 return datetime.now() >= datetime.combine(self.startDate, self.timeEnd)
55 @property
56 def isFirstRepeatingEvent(self):
57 firstRepeatingEvent = Event.select().where(Event.seriesId==self.seriesId).order_by(Event.id).get()
58 return firstRepeatingEvent.id == self.id
60 @property
61 def relativeTime(self):
62 relativeTime = datetime.combine(self.startDate, self.timeStart) - datetime.now()
64 secondsFromNow = relativeTime.seconds
65 minutesFromNow = secondsFromNow // 60
66 hoursFromNow = minutesFromNow // 60
67 daysFromNow = relativeTime.days
68 if self.isPastStart:
69 return ""
70 elif (daysFromNow):
71 return f"{daysFromNow} day" + ("s" if daysFromNow > 1 else "")
72 elif hoursFromNow:
73 return f"{hoursFromNow} hour" + ("s" if hoursFromNow > 1 else "")
74 elif minutesFromNow:
75 return f"{minutesFromNow} minute" + ("s" if minutesFromNow > 1 else "")
76 else:
77 return f"happening now"