Module Filtering
The ModulesFilter class encapsulates the logic for filtering the raw module list based on numerical criteria like Credit Points (CP) or Semester Hours (SWS).
Filter Logic
Key Behaviors:
* Auto-Initialization: If instantiated without a list, it automatically fetches the latest module catalogue (get_rows(720)) from the API.
* Regex Parsing: Since the source API returns CP and SWS as free-text strings (e.g., "5 CP" or "2 SWS"), the filter uses re.findall(r"\d+", ...) to extract comparable integers.
* SWS Sanitization: The SWS filter performs aggressive string cleaning (removing newlines, spaces, uppercasing) to handle inconsistent formatting. Note that the source code marks this method as potentially "flawed" due to the non-standardized input data.
src.util.modules_filter.ModulesFilter
ModulesFilter(remove_invalid: bool = False)
Class for filtering module list based on different criterias
Parameters:
remove_invalid: whether invalid results should be removed from the result list
Source code in src/util/modules_filter.py
| def __init__(self, remove_invalid: bool = False) -> None:
""" Parameters:
remove_invalid: whether invalid results should be removed from the result list
"""
self.remove_invalid = remove_invalid
self.module_list = get_module_list()
|
filter_cp
filter_cp(criterion: CpFilter, modules: list[Module] | None = None) -> list[Module]
Retrieves the a list of modules that fulfill the criterion.
Parameters:
| Name |
Type |
Description |
Default |
criterion
|
CpFilter
|
The desired cp count as a CpFilter.
|
required
|
Returns:
| Type |
Description |
list[Module]
|
A list of modules, that fulfill this criterion.
|
Source code in src/util/modules_filter.py
| def filter_cp(self, criterion: CpFilter, modules: list[Module] | None = None) -> list[Module]:
""" Retrieves the a list of modules that fulfill the criterion.
Parameters:
criterion: The desired cp count as a CpFilter.
Returns:
A list of modules, that fulfill this criterion.
"""
if modules is None:
modules = self.module_list
result: list[Module] = []
cp: list[str]
if criterion == CpFilter.LESS_THAN_5:
for module in modules:
cp = re.findall(r"\d+", module.credit_points)
if any(int(n) < 5 for n in cp) or (len(cp)==0 and not self.remove_invalid):
result.append(module)
# return [m for m in modules if int(m.credit_points)<5]
elif criterion == CpFilter.EQUALS_5:
for module in modules:
cp = re.findall(r"\d+", module.credit_points)
if any(int(n) == 5 for n in cp) or (len(cp)==0 and not self.remove_invalid):
result.append(module)
elif criterion == CpFilter.GREATER_THAN_5:
for module in modules:
cp = re.findall(r"\d+", module.credit_points)
if any(int(n) > 5 for n in cp) or (len(cp)==0 and not self.remove_invalid):
result.append(module)
logger.debug(f"filtered list -> {len(result)}/{len(modules)} - (cp filter)")
return result
|
filter_sws
filter_sws(criterion: SwsFilter, modules: list[Module] | None = None) -> list[Module]
Retrieves the a list of modules that fulfill the criterion.
but this function is flawed, since the sws information
is provided as a non standardized string!
Parameters:
| Name |
Type |
Description |
Default |
criterion
|
SwsFilter
|
The desired sws count as a SwsFilter.
|
required
|
Returns:
| Type |
Description |
list[Module]
|
A list of modules, that fulfill this criterion.
|
Source code in src/util/modules_filter.py
| def filter_sws(self, criterion: SwsFilter, modules: list[Module] | None = None) -> list[Module]:
""" Retrieves the a list of modules that fulfill the criterion.
but this function is flawed, since the sws information
is provided as a non standardized string!
Parameters:
criterion: The desired sws count as a SwsFilter.
Returns:
A list of modules, that fulfill this criterion.
"""
if modules is None:
modules = self.module_list
result: list[Module] = []
sws: list[str]
if criterion == SwsFilter.LESS_THAN_3:
for module in modules:
sws = re.findall(
r'\d+SWS',
module.get_teaching_form_sws().replace('\n', '').replace(' ', '').upper()
)
if len(sws)==0:
if not self.remove_invalid:
result.append(module)
else:
sws_sum = 0
for x in sws:
sws_sum += int(x.replace("SWS", ""))
if sws_sum < 3:
result.append(module)
elif criterion == SwsFilter.EQUALS_3:
for module in modules:
sws = re.findall(
r'\d+SWS',
module.get_teaching_form_sws().replace('\n', '').replace(' ', '').upper()
)
if len(sws)==0:
if not self.remove_invalid:
result.append(module)
else:
sws_sum = 0
for x in sws:
sws_sum += int(x.replace("SWS", ""))
if sws_sum == 3:
result.append(module)
elif criterion == SwsFilter.GREATER_THAN_3:
for module in modules:
sws = re.findall(
r'\d+SWS',
module.get_teaching_form_sws().replace('\n', '').replace(' ', '').upper()
)
if len(sws)==0:
if not self.remove_invalid:
result.append(module)
else:
sws_sum = 0
for x in sws:
sws_sum += int(x.replace("SWS", ""))
if sws_sum > 3:
result.append(module)
logger.debug(f"filtered list -> {len(result)}/{len(modules)} - (sws filter)")
return result
|
Filter Enums
These Enums define the comparison operators used by the SelectView UI.
Bases: IntEnum
Defines all valid crdit point filter options
Bases: IntEnum
Defines all valid sws filter options