Nächstes Treffen

pycgnweb/events.py live
def meeting_dates(count: int = 12) -> Iterator[datetime]:
    """Return iterator yielding datetime instances for next meeting dates.

    Yields *count* items (defaults to twelve).
    """
    return iter(rrule(MONTHLY, byweekday=WE(+2), byhour=19, byminute=0, bysecond=0, count=count))

next(meeting_dates())
datetime.datetime(2026, 11, 11, 19, 0)

Vergangene Treffen

Aus dem Archiv

2026 3 Treffen
2024 1 Treffen
2020 4 Treffen
2019 12 Treffen
2018 12 Treffen
2017 12 Treffen
2016 12 Treffen
2015 12 Treffen
2014 11 Treffen
2013 3 Treffen

Terminvorschau

Die nächsten Termine

  • PyCologne #6
  • PyCologne Treffen
  • PyCologne Treffen
  • PyCologne Treffen
  • PyCologne Treffen
  • PyCologne Treffen
  • PyCologne Treffen
pycgnweb/webapp.py live
def upcoming_events(count: int = 7) -> list[UpcomingEvent]:
    """Die naechsten regulaeren Treffen, Sonderveranstaltungen dazwischen.

    Eine Sonderveranstaltung zaehlt nur bis zum letzten gezeigten Treffen,
    sonst wuerde die Liste beliebig weit in die Zukunft greifen.
    """
    meetings = [
        UpcomingEvent(start=day, title="PyCologne Treffen", url=f"/events/{day:%Y-%m-%d}")
        for day in meeting_dates(count=count)
    ]
    horizon = meetings[-1].start
    specials = [event for event in get_special_events(datetime.now()) if event.start <= horizon]
    return sorted(meetings + specials, key=lambda event: event.start)

[e.title for e in upcoming_events() if e.special]
['PyCologne #6']

Kalender-Abo

Alle Termine als iCalendar-Feed, zum Abonnieren in Apple Calendar, Google Calendar oder Thunderbird. Immer aktuell, inklusive Thema und Ort des jeweiligen Treffens.

Kalender abonnieren (.ics)

pycgnweb/webapp.py live
def _ics_fold(line: str) -> str:
    """Fold a content line to 75 octets per RFC 5545, section 3.1.

    Fortsetzungszeilen beginnen mit einem Leerzeichen, das selbst als
    Oktett zaehlt. Gefaltet wird an Zeichen-, nicht an Byte-Grenzen,
    damit Umlaute nicht mitten in der UTF-8-Sequenz zerreissen.
    """
    parts: list[str] = []
    current = ""
    used = 0
    for char in line:
        size = len(char.encode("utf-8"))
        if used + size > 75:
            parts.append(current)
            current = ""
            used = 1  # das fuehrende Leerzeichen der Fortsetzungszeile
        current += char
        used += size
    parts.append(current)
    return "\r\n ".join(parts)