refacture all the things!

This commit is contained in:
XenGi 2023-06-13 12:47:07 +02:00
parent 9a7b9ba2c0
commit 2e3a02af0c
Signed by: xengi
SSH key fingerprint: SHA256:EvLbWxFCtfmd+8Xa6RkzkhIga+wFkKCekfFacYVn63M
12 changed files with 169 additions and 153 deletions

View file

@ -1,4 +1,4 @@
name: Test deployment
name: Release website
on:
push:

View file

@ -1,42 +1,51 @@
![CCCB logo](static/img/logo.png)
# CCCB Website
This is the website of CCCB.
This is the website of the CCCB.
## Getting started
Get Hugo: <https://gohugo.io/getting-started/installing>
Clone this repo
```
git clone https://github.com/cccb/www
```
Switch directory
```
cd www
```
Fetch Submodules
```
git submodule update --recursive --remote --init
```
1. Get Hugo: <https://gohugo.io/getting-started/installing>
2. Clone this repo
```shell
git clone https://github.com/cccb/www
```
3. Switch directory
```shell
cd www
```
3. Fetch Submodules
```shell
git submodule update --recursive --remote --init
```
### Run site locally
Run hugo webserver
```
Run hugo webserver:
```shell
hugo serve
```
Point your browser to http://localhost:1313/
To ready your site for upload, run "./build.sh", which also generates all.ics and adds the calendar table to index.html
Point your browser to: http://localhost:1313/
To ready your site for upload, run `./build.sh`, which also generates `all.ics` and adds the calendar table to `index.html`.
Every change you make on the project will be reflected in your browser as long as `hugo serve` is running.
## Making a change
* Use your local dev setup (see Getting started) or via GitLab editor.
* Make your change in `staging` branch.
* Commit (and push) your change.
* Gitlab CI is running pipeline. If successfull, check [Staging Website](https://staging.berlin.ccc.de/) if change is correct.
* Create merge request to merge changes from `staging` to `production`. Ask somebody to check merge request or if small change, merge yourself.
* Gitlab CI is running pipeline. If successfull, check [Website](https://berlin.ccc.de/) if change is correct.
1. Use your local dev setup (see Getting started) or via GitHub editor.
2. Make your change in `staging` branch.
3. Commit (and push) your change.
4. GitHub Actions is running the release workflow.
- If successful, check [Staging Website](https://staging.berlin.ccc.de/) if change is correct.
5. Create merge request to merge changes from `staging` to `production` branch. Ask somebody to check merge request or if small change, merge yourself.
6. GitHub Actions is running the release workflow.
- If successfull, check [Website](https://berlin.ccc.de/) if change is correct.
7. Profit!
---
Made with ❤️ and [Hugo](https://gohugo.io).

12
TODO.md
View file

@ -1,15 +1,14 @@
Todo
----
# Todo
- DSGVO-compliant Datenschutzerklärung reinbasteln
- Entscheiden, welche Seiten sonst noch konvertiert werden sollen und welche in die ewigen Datengründe gehen können
Done
----
# Done
- Template aussuchen
- Rausfinden, wie man eine Seite konvertiert
- hugo new page/mypage.md
- pandoc -f mediawiki page.mw -t markdown >> page/mypage.md
- `hugo new page/mypage.md`
- `pandoc -f mediawiki page.mw -t markdown >> page/mypage.md`
- Wichtigste Seiten konvertieren
- Membership-Seite auf den aktuellen Stand der Wahrheit bringen
- Ical template bauen
@ -17,3 +16,4 @@ Done
- Bestehende Datengarten-Termine konvertieren
- ggf. template mit frontmatter
- Theme forken, alle assets sollten lokal gehosted sein und nicht von irgendwelchen CDNs bezogen werden (HTTP/2 ftw!)

View file

@ -1,7 +1,8 @@
#!/usr/bin/env sh
#!/bin/sh
hugo $(cat .hugo-params)
tools/merge_cals.py
upcoming="$(tools/gen_upcoming.py static/all.ics 20 5|tr '\n' ' ')"
./tools/merge_cals.py
upcoming="$(tools/gen_upcoming.py static/all.ics 20 5 | tr '\n' ' ')"
cp static/all.ics public/all.ics
sed -i "s#CALENDAR#$upcoming#g" public/index.html

View file

@ -63,7 +63,6 @@ mediaTypes:
suffixes:
- "xml"
outputFormats:
RSS:
mediaType: "application/rss"
@ -72,11 +71,12 @@ outputFormats:
mediaType: "application/xml"
outputs:
section:
- "HTML"
- "Calendar"
- "RSS"
- "XML"
section:
- "HTML"
- "Calendar"
- "RSS"
- "XML"
page:
- "HTML"
- "Calendar"
- "HTML"
- "Calendar"

View file

@ -30,6 +30,6 @@
<links/>
</event>
</room>
</day>
</day>
{{end -}}
</schedule>

View file

@ -3,7 +3,7 @@
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<article role="main" class="blog-post">
{{ partial "talk-infobox" . }}
{{ partial "talk-infobox" . }}
{{ .Content }}
{{ if .Params.tags }}
@ -11,7 +11,7 @@
{{ range .Params.tags }}
<a href="{{ $.Site.LanguagePrefix | absURL }}/tags/{{ . | urlize }}/">{{ . }}</a>&nbsp;
{{ end }}
</div>
</div><!--/.blog-tags-->
{{ end }}
{{ if .Site.Params.socialShare }}
@ -19,24 +19,24 @@
<section id="social-share">
<ul class="list-inline footer-links">
{{ partial "share-links" . }}
</ul>
</section>
</ul><!--/.social-share-->
</section><!--/.list-inline /.footer-links-->
{{ end }}
</article>
</article><!--/.blog-post-->
{{ if ne .Type "page" }}
<ul class="pager blog-pager">
{{ if .PrevInSection }}
<li class="previous">
<a href="{{ .PrevInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .PrevInSection.Title }}">&larr; {{ i18n "previousPost" }}</a>
</li>
</li><!--/.previous-->
{{ end }}
{{ if .NextInSection }}
<li class="next">
<a href="{{ .NextInSection.Permalink }}" data-toggle="tooltip" data-placement="top" title="{{ .NextInSection.Title }}">{{ i18n "nextPost" }} &rarr;</a>
</li>
</li><!--/.next-->
{{ end }}
</ul>
</ul><!--/.pager /.blog-pager-->
{{ end }}
@ -44,16 +44,16 @@
{{ if .Site.DisqusShortname }}
<div class="disqus-comments">
{{ template "_internal/disqus.html" . }}
</div>
</div><!--/.disqus-comments-->
{{ end }}
{{ if .Site.Params.staticman }}
<div class="staticman-comments">
{{ partial "staticman-comments.html" . }}
</div>
</div><!--/.staticman-comments-->
{{ end }}
{{ end }}
</div>
</div>
</div>
</div><!--/.col-lg-8 /.col-lg-offset-2 /.col-md-10 /.col-md-offset-1-->
</div><!--/.row-->
</div><!--/.container-->
{{ end }}

View file

@ -31,7 +31,7 @@ DTEND;TZID=Europe/Berlin:{{.Params.dtend}}
RRULE:{{.Params.rrule}}
{{if isset .Params "rrule_excludes" }}
{{range .Params.rrule_excludes }}
EXDATE;TZID=Europe/Berlin:{{.}}
EXDATE;TZID=Europe/Berlin:{{.}}
{{end -}}
{{end -}}
LOCATION:{{with .Params.location}}{{.}}{{else}}CCCB{{end}}

View file

@ -1,29 +1,29 @@
{{ $series := or (.Get 0) $.Page.Params.series }}
<table>
<tr>
<th>No.</th>
<th>Date</th>
<th>Speaker</th>
<th>Topic</th>
<th>Video</th>
</tr>
{{ range $ind,$art := $.Site.Pages.ByDate.Reverse }}
{{ if eq $art.Params.series $series }}
<tr>
<tr>
<th>No.</th>
<th>Date</th>
<th>Speaker</th>
<th>Topic</th>
<th>Video</th>
</tr>
{{ range $ind,$art := $.Site.Pages.ByDate.Reverse }}
{{ if eq $art.Params.series $series }}
<tr>
<td>{{ $art.Params.no }}</td>
<td>{{ dateFormat "02.01.2006" $art.Params.event.start }}</td>
{{ if isset $art.Params "speaker_url" }}
<td><a href="{{ $art.Params.speaker_url }}">{{ $art.Params.speaker }}</a></td>
{{ else }}
{{ else }}
<td>{{ $art.Params.speaker }}</td>
{{ end }}
<td><a href="{{ $art.Permalink }}">{{ $art.Params.subtitle }}</a></td>
{{ if $art.Params.recording }}
<td><a href="{{ $art.Params.recording }}"><i class="fa fa-video fa-fw"></i></a></td>
{{ else }}
<td><i class="fa fa-video-slash fa-fw"></i></a></td>
{{ end }}
</tr>
{{ end }}
{{ end }}
<td><a href="{{ $art.Permalink }}">{{ $art.Params.subtitle }}</a></td>
{{ if $art.Params.recording }}
<td><a href="{{ $art.Params.recording }}"><i class="fa fa-video fa-fw"></i></a></td>
{{ else }}
<td><i class="fa fa-video-slash fa-fw"></i></a></td>
{{ end }}
</tr>
{{ end }}
{{ end }}
</table>

View file

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
if [ $# -lt 2 ]; then
echo "Usage: $0 Mediawiki_Page_Name [page|post]"
@ -7,9 +7,12 @@ fi
echo Converting $1...
page=$(echo $1 | sed 's,/,_,g'|tr '[:upper:]' '[:lower:]')
page=$(echo $1 | sed 's,/,_,g' | tr '[:upper:]' '[:lower:]')
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 \
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

View file

@ -3,7 +3,6 @@
import sys
import logging
import locale
from pprint import pprint
from dateutil.parser import parse
from datetime import datetime, timedelta
from dateutil.rrule import rruleset, rrulestr
@ -12,79 +11,83 @@ import icalendar
def vevent_to_event(event, rrstart=None):
if rrstart == None:
begin = parse(event['DTSTART'].to_ical())
else:
begin = rrstart
return { "name": event['SUMMARY'].to_ical(), "url": event['URL'].to_ical(), "begin": begin }
if rrstart == None:
begin = parse(event["DTSTART"].to_ical())
else:
begin = rrstart
return {
"name": event["SUMMARY"].to_ical(),
"url": event["URL"].to_ical(),
"begin": begin
}
def parse_single_event(event, start, end):
logging.info("Processing single event %s" % event['SUMMARY'].to_ical().decode('utf-8'))
dtstart = parse(event['DTSTART'].to_ical())
if dtstart >= start and dtstart < end:
return vevent_to_event(event)
else:
return None
logging.info(f"Processing single event {event['SUMMARY'].to_ical().decode('utf-8')}")
dtstart = parse(event["DTSTART"].to_ical())
if dtstart >= start and dtstart < end:
return vevent_to_event(event)
def parse_recurring_event(event, start, end):
logging.info("Processing recurring event %s" % 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))
if 'EXDATE' in event.keys():
exdates = event['EXDATE']
for exdate in exdates:
rs.exdate(parse(exdate.to_ical()))
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))
if "EXDATE" in event.keys():
for exdate in event["EXDATE"]:
rs.exdate(parse(exdate.to_ical()))
dates = list(rs)
events = []
for date in dates:
if date >= start and date < end:
events.append(vevent_to_event(event, date))
return events
events = []
for date in list(rs):
if date >= start and date < end:
events.append(vevent_to_event(event, date))
return events
def find_events(icsfilestr, start, end, num):
with open(icsfilestr, 'r') as icsfile:
cal=icalendar.Calendar.from_ical(icsfile.read())
with open(icsfilestr, "r") as icsfile:
cal = icalendar.Calendar.from_ical(icsfile.read())
events=[]
for event in cal.subcomponents:
if event.name == 'VEVENT':
if 'RRULE' in event.keys():
events = events + parse_recurring_event(event, start, end)
else:
ev = parse_single_event(event, start, end)
if ev != None:
events.append(ev)
events = []
for event in cal.subcomponents:
if event.name == "VEVENT":
if "RRULE" in event.keys():
events.append(parse_recurring_event(event, start, end))
elif ev := parse_single_event(event, start, end) != None:
events.append(ev)
events = sorted(events, key=lambda k: k['begin'])
events = events[0:num]
return events
events = sorted(events, key=lambda k: k["begin"])
events = events[0:num]
return events
def format_events(events):
print('<table class="table table-condensed">')
for event in events:
dateStr = event['begin'].strftime("%A, %d.%m um %H:%M Uhr")
#print("<li><a href=\"%s\">%s: %s</a></li>" % (event['url'].decode('utf-8'), dateStr, event['name'].decode('utf-8')))
print("<tr><td>%s</td><td><a href=\"%s\">%s</a></td></tr>"
% (dateStr, event['url'].decode('utf-8'), event['name'].decode('utf-8')))
print('</table>')
print("<table class=\"table table-condensed\">")
for event in events:
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>"
"</tr>"
)
print("</table><!--/.table /.table-condensed-->")
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: %s calendar max_days max_items" % sys.argv[0])
sys.exit(-1)
if len(sys.argv) < 3:
print(f"Usage: {sys.argv[0]} calendar max_days max_items")
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])
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])
events=find_events(calendar, datetime.now(), datetime.now() + timedelta(days=max_days), max_items)
format_events(events)
now = datetime.now()
events = find_events(calendar, now, now + timedelta(days=max_days), max_items)
format_events(events)

View file

@ -6,22 +6,22 @@ import pytz
import icalendar
cals = []
calendars = []
merged = icalendar.Calendar()
merged.add('prodid', '-//CCCB Calendar Generator//berlin.ccc.de//')
merged.add('version', '2.0')
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('Importing', icsfilestr)
cals.append(icalendar.Calendar.from_ical(icsfile.read()))
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()))
for cal in cals:
for e in cal.subcomponents:
merged.add_component(e)
for calendar in calendars:
for event in calendar.subcomponents:
merged.add_component(event)
outfile = 'static/all.ics'
with open(outfile, 'wb') as f:
print(f'writing to {outfile}...')
outfile = "static/all.ics"
with open(outfile, "wb") as f:
print(f"writing to {outfile}...")
f.write(merged.to_ical())