132 lines
4.0 KiB
Python
132 lines
4.0 KiB
Python
import datetime
|
|
from src import logger
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class Semester:
|
|
logger.debug("Semester class loaded")
|
|
|
|
_year: int | None = str(datetime.datetime.now().year)[2:]
|
|
_semester: str | None = None
|
|
_month: int | None = datetime.datetime.now().month
|
|
value: str = None
|
|
logger.debug(
|
|
f"Initialized Semester class with values: month: {_month}, semester: {_semester}, year {_year}"
|
|
)
|
|
def __post_init__(self):
|
|
if isinstance(self._year, str):
|
|
self._year = int(self._year)
|
|
if self._year is None:
|
|
self._year = datetime.datetime.now().year[2:]
|
|
if self._month is None:
|
|
self._month = datetime.datetime.now().month
|
|
if self._semester is None:
|
|
self.generateSemester()
|
|
self.computeValue()
|
|
|
|
def __str__(self):
|
|
return self.value
|
|
|
|
def generateSemester(self):
|
|
if self._month <= 3 or self._month > 9:
|
|
self._semester = "WiSe"
|
|
else:
|
|
self._semester = "SoSe"
|
|
|
|
@logger.catch
|
|
def computeValue(self):
|
|
# year is only last two digits
|
|
year = self._year
|
|
valueyear = str(year)
|
|
if self._semester == "WiSe":
|
|
if self._month < 4:
|
|
valueyear = str(year - 1) + "/" + str(year)
|
|
else:
|
|
valueyear = str(year) + "/" + str(year + 1)
|
|
self.value = f"{self._semester} {valueyear}"
|
|
|
|
@logger.catch
|
|
def offset(self, value: int) -> str:
|
|
"""Generate a new Semester object by offsetting the current semester by a given value
|
|
|
|
Args:
|
|
value (int): The value by which the semester should be offset
|
|
|
|
Returns:
|
|
str: the new semester value
|
|
"""
|
|
assert isinstance(value, int), "Value must be an integer"
|
|
if value == 0:
|
|
return self
|
|
if value > 0:
|
|
if value % 2 == 0:
|
|
return Semester(
|
|
self._year - value // 2, self._semester - value // 2 + 1
|
|
)
|
|
else:
|
|
semester = self._semester
|
|
semester = "SoSe" if semester == "WiSe" else "WiSe"
|
|
return Semester(self._year + value // 2, semester)
|
|
else:
|
|
if value % 2 == 0:
|
|
return Semester(self.year + value // 2, self._semester)
|
|
else:
|
|
semester = self._semester
|
|
semester = "SoSe" if semester == "WiSe" else "WiSe"
|
|
return Semester(self._year + value // 2, semester)
|
|
|
|
def isPastSemester(self, semester) -> bool:
|
|
"""Checks if the current Semester is a past Semester compared to the given Semester
|
|
|
|
Args:
|
|
semester (str): The semester to compare to
|
|
|
|
Returns:
|
|
bool: True if the current semester is in the past, False otherwise
|
|
"""
|
|
if self.year < semester.year:
|
|
return True
|
|
if self.year == semester.year:
|
|
if self.semester == "WiSe" and semester.semester == "SoSe":
|
|
return True
|
|
return False
|
|
|
|
def isFutureSemester(self, semester: "Semester") -> bool:
|
|
"""Checks if the current Semester is a future Semester compared to the given Semester
|
|
|
|
Args:
|
|
semester (str): The semester to compare to
|
|
|
|
Returns:
|
|
bool: True if the current semester is in the future, False otherwise
|
|
"""
|
|
if self.year > semester.year:
|
|
return True
|
|
if self.year == semester.year:
|
|
if self.semester == "SoSe" and semester.semester == "WiSe":
|
|
return True
|
|
return False
|
|
|
|
def from_string(self, val):
|
|
self.value = val
|
|
self._year = int(val[-2:])
|
|
self._semester = val[:4]
|
|
return self
|
|
|
|
@property
|
|
def next(self):
|
|
return self.offset(1)
|
|
|
|
@property
|
|
def previous(self):
|
|
return self.offset(-1)
|
|
|
|
@property
|
|
def year(self):
|
|
return self._year
|
|
|
|
@property
|
|
def semester(self):
|
|
return self._semester
|