Skip to content

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