forked from cccb-website-team/www
adjust styling and bump dates etc
This commit is contained in:
parent
476bf0d6d9
commit
a584a5252f
40 changed files with 678 additions and 294 deletions
BIN
tools/__pycache__/gen_upcoming.cpython-312.pyc
Normal file
BIN
tools/__pycache__/gen_upcoming.cpython-312.pyc
Normal file
Binary file not shown.
|
|
@ -2,16 +2,16 @@
|
|||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "Usage: $0 Mediawiki_Page_Name [page|post]"
|
||||
exit
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo Converting $1...
|
||||
echo "Converting $1..."
|
||||
|
||||
page=$(echo $1 | sed 's,/,_,g' | tr '[:upper:]' '[:lower:]')
|
||||
page=$(printf '%s\n' "$1" | sed 's,/,_,g' | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
hugo new $2/$page.md
|
||||
hugo new "$2/$page.md"
|
||||
curl -s "https://berlin.ccc.de/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=$1" \
|
||||
| jq -r '.query.pages |..| objects|.["*"]' \
|
||||
| sed '/null/d' \
|
||||
| pandoc -f mediawiki -t markdown \
|
||||
>> content/$2/$page.md
|
||||
>> "content/$2/$page.md"
|
||||
|
|
|
|||
|
|
@ -1,48 +1,60 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import html
|
||||
import logging
|
||||
import locale
|
||||
from dateutil.parser import parse
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone, date
|
||||
from dateutil.rrule import rruleset, rrulestr
|
||||
|
||||
import icalendar
|
||||
|
||||
|
||||
def _to_aware(dt):
|
||||
"""Normalize a date or datetime to a timezone-aware UTC datetime."""
|
||||
if isinstance(dt, date) and not isinstance(dt, datetime):
|
||||
return datetime(dt.year, dt.month, dt.day, tzinfo=timezone.utc)
|
||||
if dt.tzinfo is None:
|
||||
return dt.replace(tzinfo=timezone.utc)
|
||||
return dt.astimezone(timezone.utc)
|
||||
|
||||
|
||||
def vevent_to_event(event, rrstart=None):
|
||||
if rrstart == None:
|
||||
begin = parse(event["DTSTART"].to_ical())
|
||||
if rrstart is None:
|
||||
begin = _to_aware(event["DTSTART"].dt)
|
||||
else:
|
||||
begin = rrstart
|
||||
begin = _to_aware(rrstart)
|
||||
|
||||
return {
|
||||
"name": event["SUMMARY"].to_ical(),
|
||||
"url": event["URL"].to_ical(),
|
||||
"name": str(event.get("SUMMARY", "")),
|
||||
"url": str(event.get("URL", "")),
|
||||
"begin": begin
|
||||
}
|
||||
|
||||
|
||||
def parse_single_event(event, start, end):
|
||||
logging.info(f"Processing single event {event['SUMMARY'].to_ical().decode('utf-8')}")
|
||||
dtstart = parse(event["DTSTART"].to_ical())
|
||||
logging.info(f"Processing single event {event.get('SUMMARY', '')}")
|
||||
dtstart = _to_aware(event["DTSTART"].dt)
|
||||
if dtstart >= start and dtstart < end:
|
||||
return vevent_to_event(event)
|
||||
|
||||
|
||||
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())
|
||||
logging.info(f"Processing recurring event {event.get('SUMMARY', '')}")
|
||||
dtstart = _to_aware(event["DTSTART"].dt)
|
||||
rs = rruleset()
|
||||
rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart))
|
||||
if "EXDATE" in event.keys():
|
||||
for exdate in event["EXDATE"]:
|
||||
rs.exdate(parse(exdate.to_ical()))
|
||||
exdates = event["EXDATE"]
|
||||
if not isinstance(exdates, list):
|
||||
exdates = [exdates]
|
||||
for exdate_list in exdates:
|
||||
for dt in exdate_list.dts:
|
||||
rs.exdate(_to_aware(dt.dt))
|
||||
|
||||
events = []
|
||||
for date in list(rs):
|
||||
if date >= start and date < end:
|
||||
events.append(vevent_to_event(event, date))
|
||||
for dt in rs.between(start, end, inc=True):
|
||||
events.append(vevent_to_event(event, dt))
|
||||
|
||||
return events
|
||||
|
||||
|
|
@ -70,26 +82,27 @@ def find_events(icsfilestr, start, end, num):
|
|||
def format_events(events):
|
||||
print("<table class=\"table table-condensed\">")
|
||||
for event in events:
|
||||
name = html.escape(event['name'])
|
||||
url = html.escape(event['url'])
|
||||
print(
|
||||
"<tr>"
|
||||
f"<td>{event['begin'].strftime('%A, %d.%m um %H:%M Uhr')}</td>"
|
||||
f"<td><a href=\"{event['url'].decode('utf-8')}\">{event['name'].decode('utf-8')}</a></td>"
|
||||
f"<td><a href=\"{url}\">{name}</a></td>"
|
||||
"</tr>"
|
||||
)
|
||||
print("</table><!--/.table .table-condensed-->")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 3:
|
||||
if len(sys.argv) < 4:
|
||||
print(f"Usage: {sys.argv[0]} calendar max_days max_items")
|
||||
sys.exit(-1)
|
||||
sys.exit(1)
|
||||
|
||||
locale.setlocale(locale.LC_TIME, "de_DE.UTF-8")
|
||||
calendar = sys.argv[1]
|
||||
max_days = int(sys.argv[2])
|
||||
max_items = int(sys.argv[3])
|
||||
|
||||
now = datetime.now()
|
||||
now = datetime.now(timezone.utc)
|
||||
events = find_events(calendar, now, now + timedelta(days=max_days), max_items)
|
||||
format_events(events)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import logging
|
||||
from glob import glob
|
||||
|
||||
import pytz
|
||||
import icalendar
|
||||
|
||||
|
||||
|
|
@ -12,9 +12,12 @@ merged.add("prodid", "-//CCCB Calendar Generator//berlin.ccc.de//")
|
|||
merged.add("version", "2.0")
|
||||
|
||||
for icsfilestr in glob("public/*/**/*.ics", recursive=True):
|
||||
with open(icsfilestr, "r") as icsfile:
|
||||
print(f"Importing {icsfilestr}")
|
||||
calendars.append(icalendar.Calendar.from_ical(icsfile.read()))
|
||||
try:
|
||||
with open(icsfilestr, "r") as icsfile:
|
||||
print(f"Importing {icsfilestr}")
|
||||
calendars.append(icalendar.Calendar.from_ical(icsfile.read()))
|
||||
except Exception as e:
|
||||
logging.warning(f"Skipping {icsfilestr}: {e}")
|
||||
|
||||
for calendar in calendars:
|
||||
for event in calendar.subcomponents:
|
||||
|
|
|
|||
Loading…
Reference in a new issue