diff --git a/content/post/2026-07-04-kein-diday-im-cccb/index.md b/content/post/2026-07-04-kein-diday-im-cccb/index.md new file mode 100644 index 0000000..d64dd4b --- /dev/null +++ b/content/post/2026-07-04-kein-diday-im-cccb/index.md @@ -0,0 +1,15 @@ +--- +title: "Kein DI.Day am 5. Juli im CCCB" +date: 2026-07-04T12:00:00+02:00 +showHero: false +tags: ["di.day", "Ankündigung"] +--- + +**Kurzfristige Änderung:** Der [Digital Independence Day](/veranstaltungen/didit/) findet am **Sonntag, dem 5. Juli 2026, nicht** im Chaos Computer Club Berlin (Marienstraße 11) statt. + +Wer trotzdem am DI.Day teilnehmen und den Weg in die digitale Unabhängigkeit weitergehen möchte, ist herzlich bei den anderen Berliner Veranstaltungen willkommen: + +- [„Let's DID it!" mit Linux & Sommerfest der BELUG](https://f.termine.di.day/events/ee48fdda-a134-4f27-932e-b87c7a9fa24a) in der c-base +- [DI.Day im Stadtschloss Moabit](https://f.termine.di.day/events/41ab17fe-05ab-4308-9abb-d38d9485fd4f) + +Weitere Termine und Orte findet ihr wie immer auf [termine.di.day](https://termine.di.day/). diff --git a/content/veranstaltungen/didit.md b/content/veranstaltungen/didit.md index b5badfc..b89b44a 100644 --- a/content/veranstaltungen/didit.md +++ b/content/veranstaltungen/didit.md @@ -4,7 +4,7 @@ subtitle: "Digital Independence Day im CCCB" date: 2026-01-04T12:23:00+01:00 dtstart: 20260104T122300 dtend: 20260104T174200 -rrule: "FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU;WKST=MO" +rrule: "FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU;WKST=MO;UNTIL=20260503T235959Z" menu: main: parent: "Veranstaltungen" diff --git a/layouts/_default/baseof.calendar.html b/layouts/_default/baseof.calendar.html deleted file mode 100644 index bddf04a..0000000 --- a/layouts/_default/baseof.calendar.html +++ /dev/null @@ -1 +0,0 @@ -{{ block "main" . }}{{ .Content }}{{ end }} diff --git a/layouts/_default/list.calendar.html b/layouts/_default/list.calendar.html deleted file mode 100644 index 3259690..0000000 --- a/layouts/_default/list.calendar.html +++ /dev/null @@ -1,21 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//CCCB//Calendar//DE -{{ with .Title }} -X-WR-CALNAME:{{ . }} -{{ end }} -CALSCALE:GREGORIAN -METHOD:PUBLISH -{{ range .Pages }} -{{ if .Date }} -BEGIN:VEVENT -UID:{{ .File.UniqueID }}@berlin.ccc.de -DTSTAMP:{{ .Date.Format "20060102T150405Z" }} -DTSTART:{{ .Date.Format "20060102T150405Z" }} -SUMMARY:{{ .Title }} -DESCRIPTION:{{ .Summary | plainify }} -URL:{{ .Permalink }} -END:VEVENT -{{ end }} -{{ end }} -END:VCALENDAR diff --git a/layouts/_default/list.xml.html b/layouts/_default/list.xml.xml similarity index 100% rename from layouts/_default/list.xml.html rename to layouts/_default/list.xml.xml diff --git a/layouts/_default/single.calendar.html b/layouts/_default/single.calendar.html deleted file mode 100644 index 5a22ec4..0000000 --- a/layouts/_default/single.calendar.html +++ /dev/null @@ -1,21 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//CCCB//Calendar//DE -{{ with .Title }} -X-WR-CALNAME:{{ . }} -{{ end }} -CALSCALE:GREGORIAN -METHOD:PUBLISH -{{ if .Date }} -BEGIN:VEVENT -UID:{{ .File.UniqueID }}@berlin.ccc.de -DTSTAMP:{{ .Date.Format "20060102T150405Z" }} -DTSTART:{{ .Date.Format "20060102T150405Z" }} -{{ with .Params.event.end }}DTEND:{{ dateFormat "20060102T150405Z" . }}{{ end }} -SUMMARY:{{ .Title }} -DESCRIPTION:{{ .Summary | plainify }} -URL:{{ .Permalink }} -{{ with .Params.location }}LOCATION:{{ . }}{{ end }} -END:VEVENT -{{ end }} -END:VCALENDAR diff --git a/tools/gen_upcoming.py b/tools/gen_upcoming.py index 0f69f6a..31763f7 100755 --- a/tools/gen_upcoming.py +++ b/tools/gen_upcoming.py @@ -3,13 +3,23 @@ import sys import logging import locale -from dateutil.parser import parse +from dateutil.parser import parse as _parse from datetime import datetime, timedelta from dateutil.rrule import rruleset, rrulestr import icalendar +def parse(value): + # Some templates emit DTSTART with a trailing "Z" (e.g. 20260507T190000Z) + # which produces tz-aware datetimes, while others emit naive local times. + # Normalize to naive so comparisons and sorting don't mix the two. + dt = _parse(value) + if dt.tzinfo is not None: + dt = dt.replace(tzinfo=None) + return dt + + def vevent_to_event(event, rrstart=None): if rrstart == None: begin = parse(event["DTSTART"].to_ical()) @@ -34,7 +44,10 @@ def parse_recurring_event(event, start, end): logging.info(f"Processing recurring event {event['SUMMARY'].to_ical().decode('utf-8')}") dtstart = parse(event["DTSTART"].to_ical()) rs = rruleset() - rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart)) + # dtstart is normalized to naive local time above; pass ignoretz so a + # tz-aware UNTIL (RFC 5545 requires UTC for it) is treated as naive too, + # otherwise dateutil rejects the naive/aware mismatch. + rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart, ignoretz=True)) if "EXDATE" in event.keys(): for exdate in event["EXDATE"]: rs.exdate(parse(exdate.to_ical()))