-
Notifications
You must be signed in to change notification settings - Fork 1
/
adventskalender.py
124 lines (98 loc) · 3.37 KB
/
adventskalender.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""
THIS IS AN ADVENTSKALENDER WEBAPP.
A NEW PICTURE WILL BE SHOWN EVERY DAY FROM 1ST DECEMBER TO 24. DECEMBER.
@author: Mario W. Kaufmann
"""
from bottle import route, get, post, run
from bottle import error, template, request, response, static_file, redirect
import datetime
import os
import re
# config stuff and sanity checks
PASSWORD = "blah"
PORT = 8080
MONTH = 11
COOKIESECRET = os.urandom(24)
SUPPORTEDFILETYPES = ["png", "jpg", "jpeg", "gif"]
IMAGEDIR = "static/images"
IMAGES = os.listdir(os.path.join(os.getcwd(), IMAGEDIR ))
try:
# filter for image files only
IMAGES = [img for img in IMAGES if img.split(".")[1] in SUPPORTEDFILETYPES]
# convert filenames to numbers and sort them
IMAGES = sorted([int(img.split(".")[0]) for img in IMAGES])
except:
print "image names may only contain numbers!"
raise SystemExit
print "The following images have been loaded"
print IMAGES
if IMAGES == range(1,25):
print "all images are ready!"
print "STARTING"
else:
print "not enough images"
missingImages = list(set(range(1,25)) - set(IMAGES))
print "please add the following images: " + str(missingImages)
raise SystemExit
# decorator used for authentication
def checkAuth():
""" handler for the main page of the adventskalender """
password = request.get_cookie("password", secret=COOKIESECRET)
if not password:
redirect("/login")
@route('/')
def showIndex():
checkAuth()
""" handler for the main page of the adventskalender """
index = open("views/adventskalender.html").read() % str(datetime.date.today().day)
return index
@get("/login")
def showLogin():
""" handler for showing the password form """
loginText = """
<h1>Bitte das Passwort eingeben, um den Adventskalender zu sehen</h1>
<form action="/login" method="post">
<input type="password" name="password" min="1" max="10">
<input type="button" value="submit">
</form>
"""
return loginText
@post("/login")
def showLogin():
""" handler for doing the actual login """
password = request.forms.get('password')
if password == PASSWORD:
response.set_cookie("password", password, secret=COOKIESECRET)
response.set_header('location', "/")
response.status = 303
else:
return "Falsches Passwort! Bitte nochmal versuchen."
@error(404)
def showError404(error):
""" redirect to root, if the requested handler does not exist """
response.set_header('location', "/")
response.status = 303
@route('/static/<path>')
def serveStatic(path):
""" handler for the static files (javascript, css...) """
return static_file(path, "./static/")
@route("/static/images/<day>")
def getImage(day):
checkAuth()
if "day" in day:
return ""
# check constraints
today = datetime.date.today()
isDecember = today.month == MONTH
isChristmasTime = (today.day >= 1 and today.day <= 24)
isNotFromTheFuture = int(day.split(".")[0]) <= today.day
if isDecember and isNotFromTheFuture:
for filetype in SUPPORTEDFILETYPES:
if os.path.isfile("static/images/" + day + "." + filetype):
return static_file(day + "." + filetype, "static/images")
return "ERROR: image not found"
else:
return static_file("closed.jpg", "./static/")
# MAIN
if __name__ == "__main__":
run(host='localhost', port=PORT)