www/board_minutes.cgi (85 lines of code) (raw):
#!/usr/bin/env python3
"""
CGI script to render Board minutes with HTML anchors
"""
import os
import os.path
import sys
import re
import traceback
sys.path.append('/srv/whimsy/tools')
import boardminutes2html
# Where to find minutes (locally to Whimsy)
MINUTES_TXT = '/srv/svn/minutes'
MINUTES_HTTPS = 'https://www.apache.org/foundation/records/minutes'
HEAD = """<head>
<meta charset="UTF-8">
</head>
<body>"""
TAIL = """<p>Generated dynamically by Whimsy</p>
</body>
</html>"""
MINUTES_RE = r'board_minutes_\d\d\d\d_\d\d_\d\d\.txt'
def minutes(path):
"""Return sorted list of minute base names"""
for file in sorted(os.listdir(path)):
if (re.fullmatch(MINUTES_RE, file)
and os.path.isfile(os.path.join(path, file))):
yield file
def year_index(year):
"""Generate year index"""
if not re.fullmatch(r'\d\d\d\d', year):
print("Invalid year")
return
folder = os.path.join(MINUTES_TXT, year)
if not os.path.isdir(folder):
print(f"Could not read directory: {year}")
return
print(HEAD)
print(f'<h1>Board minutes: index of {year}</h1>')
print('<p><a href=".">Main Index</a></p>')
for minute in minutes(folder):
print(f"<a href='{year}/{minute}'>{minute}</a><br>")
print(TAIL)
def top_index():
"""Generate index of years"""
print(HEAD)
print('<h1>Board minutes: index of years</h1>')
for folder in sorted(os.listdir(MINUTES_TXT)):
if re.fullmatch(r'\d\d\d\d', folder):
print(f"<a href='{folder}'>{folder}</a>")
print(TAIL)
def main():
"""Handle HTTP requests"""
print("Content-type: text/html\n\n")
try:
info = os.environ.get('PATH_INFO', '')
parts = info.lstrip('/').split('/')
if parts[-1] == '': # drop trailing empty part
parts.pop()
# Route the request
if len(parts) == 0:
top_index()
elif len(parts) == 1:
year_index(parts[0])
elif len(parts) == 2:
year = parts[0]
basename = parts[1]
if not re.fullmatch(MINUTES_RE, basename):
print("Invalid request")
return
source = os.path.join(MINUTES_TXT, year, basename)
if not os.path.exists(source):
print("No such file")
return
with open(source, encoding='utf8') as inp:
extrahdr = f"""Links: <a href="../{year}">{year}</a> - <a href="../">All years</a>
- <a href="{MINUTES_HTTPS}/{year}/{basename}" target="_blank">Original</a>"""
boardminutes2html.text2html(inp, sys.stdout, extrahdr)
else:
print("Invalid request")
except Exception as ex:
print('Sorry, something went wrong')
traceback.print_exc()
if __name__ == '__main__':
main()