mirror of https://github.com/stijndcl/didier
				
				
				
			Restart rework, for real this time ™️
							parent
							
								
									ec30228929
								
							
						
					
					
						commit
						49870d23eb
					
				
							
								
								
									
										143
									
								
								data/les.py
								
								
								
								
							
							
						
						
									
										143
									
								
								data/les.py
								
								
								
								
							|  | @ -1,143 +0,0 @@ | |||
| from enums.platforms import Platforms | ||||
| from functions.timeFormatters import timeFromInt | ||||
| 
 | ||||
| 
 | ||||
| # A container class for schedules | ||||
| class Schedule: | ||||
|     def __init__(self, schedule: dict): | ||||
|         self.courses = [Course(course) for course in schedule] | ||||
|         self.customs = []  # Courses that only the person that called the schedule has | ||||
|         self.extra = []  # Courses that need special attention (canceled, online, ...) | ||||
| 
 | ||||
|     def addCustom(self, course): | ||||
|         """ | ||||
|         Function that adds a course into the list of courses, | ||||
|         useful for adding a user's custom courses | ||||
|         """ | ||||
|         self.customs.append(Course(course)) | ||||
| 
 | ||||
| 
 | ||||
| # A container class for courses | ||||
| class Course: | ||||
|     # Initialize a course from the dict that the JSON contains | ||||
|     def __init__(self, courseInfo: dict): | ||||
|         self.courseInfo = courseInfo | ||||
|         self.name = courseInfo["course"] | ||||
| 
 | ||||
|         self.slots = [] | ||||
|         self.initSlots() | ||||
| 
 | ||||
|         self.platforms = {} | ||||
|         self.initPlatforms() | ||||
| 
 | ||||
|     def initSlots(self): | ||||
|         """ | ||||
|         Function that creates Slot instances & adds them to the list | ||||
|         """ | ||||
|         for slot in self.courseInfo["slots"]: | ||||
|             self.slots.append(Slot(self, slot)) | ||||
| 
 | ||||
|     def initPlatforms(self): | ||||
|         """ | ||||
|         Function that creates Platform instances & adds them into the dict | ||||
|         """ | ||||
|         for platform in Platforms: | ||||
|             if platform["rep"] in self.courseInfo: | ||||
|                 self.platforms[platform["rep"]] = Platform(platform["name"], self.courseInfo[platform["rep"]]) | ||||
| 
 | ||||
|     def getSlotsOnDay(self, day: str, week: int): | ||||
|         """ | ||||
|         Function that returns a list of all slots of this course | ||||
|         on a given day of the week | ||||
| 
 | ||||
|         This list then has duplicate days filtered out depending on | ||||
|         whether or not there is a special class on this day | ||||
|         """ | ||||
|         slots = [] | ||||
|         specials = [] | ||||
| 
 | ||||
|         for slot in self.slots: | ||||
|             # Skip slots on other days | ||||
|             if slot.day != day: | ||||
|                 continue | ||||
| 
 | ||||
|             # This is a special slot that should only be added | ||||
|             # if the week corresponds | ||||
|             if slot.weeks and week not in slot.weeks: | ||||
|                 continue | ||||
| 
 | ||||
|             if slot.special: | ||||
|                 specials.append(slot) | ||||
|             else: | ||||
|                 slots.append(slot) | ||||
| 
 | ||||
| #         Filter doubles out (special classes, ...) | ||||
|         for special in specials: | ||||
|             for slot in slots: | ||||
|                 if slot.start == special.start and slot.end == special.end: | ||||
|                     slots.remove(slot) | ||||
| 
 | ||||
|         return slots, specials | ||||
| 
 | ||||
| 
 | ||||
| # TODO add an is_online field to the JSON to allow toggling | ||||
| #   temporary online classes easier | ||||
| # A slot in a course | ||||
| class Slot: | ||||
|     def __init__(self, course: Course, slot: dict): | ||||
|         self.course = course | ||||
|         self.day = slot["time"][0] | ||||
|         self.start = timeFromInt(slot["time"][1]) | ||||
|         self.end = timeFromInt(slot["time"][2]) | ||||
|         self.weeks = [] if "weeks" not in slot else slot["weeks"] | ||||
|         self.canceled = "canceled" in slot  # Boolean indicating whether or not this class has been canceled | ||||
|         self.special = "weeks" in slot or self.canceled  # Boolean indicating if this class is special or generic | ||||
| 
 | ||||
|         # TODO check if on-campus, else None | ||||
|         self.locations = self.setLocations(slot) | ||||
|         self.platform = self.course.platforms[slot["online"]] | ||||
| 
 | ||||
|     def setLocations(self, slot: dict): | ||||
|         """ | ||||
|         Function that creates a list of Location instances | ||||
|         """ | ||||
|         locations = [] | ||||
| 
 | ||||
|         # Slot has multiple locations | ||||
|         if "locations" in slot: | ||||
|             for location in slot["locations"]: | ||||
|                 locations.append(Location(location)) | ||||
|         else: | ||||
|             # Slot has only one location | ||||
|             locations.append(Location(slot)) | ||||
| 
 | ||||
|         return locations | ||||
| 
 | ||||
|     def getLocations(self): | ||||
|         """ | ||||
|         Function that creates a string representation for this | ||||
|         slot's locations | ||||
|         """ | ||||
|         if self.locations is None: | ||||
|             return "" | ||||
| 
 | ||||
|     def getOnline(self): | ||||
|         pass | ||||
| 
 | ||||
| 
 | ||||
| # A location where a course might take place | ||||
| class Location: | ||||
|     def __init__(self, slot: dict): | ||||
|         self.campus = slot["campus"] | ||||
|         self.building = slot["building"] | ||||
|         self.room = slot["room"] | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return " ".join([self.campus, self.building, self.room]) | ||||
| 
 | ||||
| 
 | ||||
| # A streaming platform | ||||
| class Platform: | ||||
|     def __init__(self, name, url): | ||||
|         self.name = name | ||||
|         self.url = url | ||||
|  | @ -0,0 +1,58 @@ | |||
| from datetime import datetime, timedelta | ||||
| from timeFormatters import dateTimeNow, weekdayToInt | ||||
| from typing import Optional | ||||
| 
 | ||||
| 
 | ||||
| def find_target_date(arg: Optional[str]) -> datetime: | ||||
|     """ | ||||
|     Find the requested date out of the user's arguments | ||||
|     """ | ||||
|     # Start at current date | ||||
|     day: datetime = dateTimeNow() | ||||
| 
 | ||||
|     # If no offset was provided, check the time | ||||
|     # otherwise the argument overrides it | ||||
|     if arg is None: | ||||
|         # When the command is used after 6 pm, show schedule | ||||
|         # for the next day instead | ||||
|         if day.hour > 18: | ||||
|             day += timedelta(days=1) | ||||
|     elif 0 <= (weekday := weekdayToInt(arg)) <= 4:  # Weekday provided | ||||
|         day = forward_to_weekday(day, weekday) | ||||
|     elif arg.lower() == "morgen":  # Tomorrow's schedule | ||||
|         day += timedelta(days=1) | ||||
|     elif arg.lower() == "overmorgen":  # Day after tomorrow's schedule | ||||
|         day += timedelta(days=2) | ||||
| 
 | ||||
|     # Don't land on a weekend | ||||
|     day = skip_weekends(day) | ||||
| 
 | ||||
|     return day | ||||
| 
 | ||||
| 
 | ||||
| def skip_weekends(day: datetime) -> datetime: | ||||
|     """ | ||||
|     Increment the current date if it's not a weekday | ||||
|     """ | ||||
|     weekday = day.weekday() | ||||
| 
 | ||||
|     # Friday is weekday 4 | ||||
|     if weekday > 4: | ||||
|         return day + timedelta(days=(7 - weekday)) | ||||
| 
 | ||||
|     return day | ||||
| 
 | ||||
| 
 | ||||
| def forward_to_weekday(day: datetime, weekday: int) -> datetime: | ||||
|     """ | ||||
|     Increment a date until the weekday is the same as the one provided | ||||
|     Finds the "next" [weekday] | ||||
|     """ | ||||
|     current = day.weekday() | ||||
| 
 | ||||
|     # This avoids negative numbers below, and shows | ||||
|     # next week in case the days are the same | ||||
|     if weekday >= current: | ||||
|         weekday += 7 | ||||
| 
 | ||||
|     return day + timedelta(days=(weekday - current)) | ||||
|  | @ -134,8 +134,12 @@ def getPlural(amount, unit): | |||
|     return dic[unit.lower()]["s" if amount == 1 else "p"] | ||||
| 
 | ||||
| 
 | ||||
| def weekdayToInt(day): | ||||
| def weekdayToInt(day) -> int: | ||||
|     days = {"maandag": 0, "dinsdag": 1, "woensdag": 2, "donderdag": 3, "vrijdag": 4, "zaterdag": 5, "zondag": 6} | ||||
| 
 | ||||
|     if day.lower() not in days: | ||||
|         return -1 | ||||
| 
 | ||||
|     return days[day.lower()] | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue