Skip to content

Feiertagskalender: Optimierter Algorithmus für Liste von Bundesländern #33

Description

@PhrozenByte

Vielen Dank für die Umsetzung von #28 mit #32! 🎉 🚀 Ich hatte mir den Code zuvor nicht näher angesehen, dachte das sei eine eher kleine Änderung, war dann aber offensichtlich doch deutlich mehr Arbeit als gedacht - dafür nochmal ein extra Dankeschön! ❤️

Einen optionalen Aspekt von #28 möchte ich gerne nochmal kurz fürs Ortsfeld und die Beschreibung vorschlagen:

Die absolute Premium-Lösung wäre wenn dann noch eine kleine Prüflogik für "Alle Bundesländer" und "Alle Bundesländer außer <bis zu 5 Länder>" existieren würde, die dafür sorgt, dass bei (nahezu) bundesweiten Feiertagen nicht immer (fast) alle Bundesländer aufgezählt werden.

Für die Basisvariante dürfte es reichen die folgenden beiden Codezeilen auch in die build_location Methode fürs Ortsfeld einzubauen, nicht nur in build_description für die Beschreibung:

if set(ordered_codes) == ALL_STATE_CODES:
return "Gilt in allen Bundesländern."

Für die Premiumvariante könnte man den Codepfad auch in eine kleine Helper-Methode auslagern, die die oben erwähnte Prüflogik für "Alle Bundesländer außer <bis zu 5 Länder>" realisiert. Hier ein kleines PoC (ungetestet):

def _excluded_state_codes(state_codes: list[str]) -> list[str] | None:
    excluded_codes = ALL_STATE_CODES - set(state_codes)
    return list(excluded_codes) if len(excluded_codes) <= 5 else None


def build_description(state_codes: list[str], own_state_code: str | None = None) -> str:
    excluded_codes = _excluded_state_codes(state_codes)
    if excluded_codes is not None:
        if not excluded_codes:
            return "Gilt in allen Bundesländern."
        excluded_names = [STATE_NAME_BY_CODE[code] for code in excluded_codes]
        return "\n".join(["Gilt in allen Bundesländern außer:"] + [f"- {state_name}" for state_name in excluded_names])

    ordered_codes = ordered_state_codes(state_codes, own_state_code=own_state_code)
    state_names = [STATE_NAME_BY_CODE[code] for code in ordered_codes]
    return "\n".join(["Gilt in:"] + [f"- {state_name}" for state_name in state_names])


def build_location(state_codes: list[str], own_state_code: str | None = None) -> str:
    excluded_codes = _excluded_state_codes(state_codes)
    if excluded_codes is not None:
        return "Alle Bundesländer" + ("" if not excluded_codes else " außer " + ", ".join(excluded_codes))

    ordered_codes = ordered_state_codes(state_codes, own_state_code=own_state_code)
    return ", ".join(ordered_codes)

Falls du das nicht für sinnvoll hältst: No hard feelings, danke nochmal!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions