.
[HamExam.git] / interface.py
blob087ac34803c3e886b6e5292c228c3d899a349e04
1 #!/usr/bin/python
2 import string,cgi,time
3 from os import curdir, sep
4 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
5 import posixpath, urllib, os
7 import framework
9 class MyHandler(BaseHTTPRequestHandler):
10 def do_GET(self):
11 if self.path.endswith(".afu"):
12 self.AFU()
13 else:
14 f = self.send_head()
15 if f:
16 self.copyfile(f, self.wfile)
17 f.close()
19 def do_HEAD(self):
20 f = self.send_head()
21 if f:
22 f.close()
24 def send_head(self):
25 path = self.translate_path(self.path)
26 if os.path.isdir(path):
27 self.send_error(403, "Directory listing not supported")
28 return None
29 try:
30 f = open(path, 'rb')
31 except IOError:
32 self.send_error(404, "File not found")
33 return None
34 self.send_response(200)
35 self.send_header("Content-type", self.guess_type(path))
36 self.end_headers()
37 return f
39 def translate_path(self, path):
40 path = posixpath.normpath(urllib.unquote(path))
41 words = string.splitfields(path, '/')
42 words = filter(None, words)
43 path = os.getcwd()
44 for word in words:
45 drive, word = os.path.splitdrive(word)
46 head, word = os.path.split(word)
47 if word in (os.curdir, os.pardir): continue
48 path = os.path.join(path, word)
49 return path
51 def copyfile(self, source, outputfile):
52 BLOCKSIZE = 8192
53 while 1:
54 data = source.read(BLOCKSIZE)
55 if not data: break
56 outputfile.write(data)
58 def guess_type(self, path):
59 base, ext = posixpath.splitext(path)
60 if self.extensions_map.has_key(ext):
61 return self.extensions_map[ext]
62 ext = string.lower(ext)
63 if self.extensions_map.has_key(ext):
64 return self.extensions_map[ext]
65 else:
66 return self.extensions_map['']
68 extensions_map = {
69 '': 'text/plain', # Default, *must* be present
70 '.html': 'text/html',
71 '.htm': 'text/html',
72 '.gif': 'image/gif',
73 '.jpg': 'image/jpeg',
74 '.jpeg': 'image/jpeg',
77 def AFU(self):
78 if self.path.endswith("a.afu") or self.path.endswith("b.afu") or self.path.endswith("c.afu") or self.path.endswith("d.afu"):
79 answer = (self.path.split("/")[-1]).replace(".afu","")
80 if not f.EvalQuestion (answer):
81 self.WrongAnswer()
82 else:
83 self.AskQuestion()
84 elif self.path.endswith("hint.afu"):
85 self.DisplayHint()
86 elif self.path.endswith("menue.afu"):
87 self.DisplayMenu()
88 elif self.path.endswith("askquestion.afu"):
89 self.AskQuestion()
90 else:
91 self.StartDisplay()
93 def ShowHead(self):
94 self.base="http://127.0.0.1:8080"
95 self.stylefile=self.base+"/style.css"
97 self.wfile.write ("<html><head><base href="+self.base+"/Questions/>")
98 self.wfile.write ("<link href="+self.stylefile+" rel=stylesheet type=text/css>")
99 self.wfile.write ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\">")
101 self.wfile.write ("<SCRIPT LANGUAGE=JavaScript>")
102 self.wfile.write ("document.onkeydown = eval_key; ")
103 self.wfile.write ("function eval_key (e) {")
104 self.wfile.write ("var keycode; if (window.event) keycode = window.event.keyCode; else if (e) keycode = e.which;")
105 self.wfile.write ("if (keycode == 65) { window.location = \""+self.base+"/a.afu\";")
106 self.wfile.write ("} else if (keycode == 67) { window.location = \""+self.base+"/b.afu\";")
107 self.wfile.write ("} else if (keycode == 68) { window.location = \""+self.base+"/c.afu\";")
108 self.wfile.write ("} else if (keycode == 69) { window.location = \""+self.base+"/d.afu\";")
109 self.wfile.write ("}")
110 self.wfile.write ("</script>")
112 self.wfile.write ("</head><body>")
114 def DisplayHint(self):
115 self.SendHeader()
116 print "Hint:",f.hint
117 self.wfile.write ("<html><head><meta http-equiv=refresh content=\"0; URL=/"+f.hint+"\"></head></html>")
119 def SendHeader(self):
120 self.send_response(200)
121 self.send_header('Content-type', 'text/html')
122 self.end_headers()
124 def DisplayQuestion(self):
125 self.wfile.write("<div class=id>"+f.id+"</div>")
126 self.wfile.write("<div class=question>")
127 self.wfile.write(f.question.encode("utf8"))
128 self.wfile.write("</div>")
129 self.wfile.write("<div class=statistics>Richtig: "+f.correct+" <br>Falsch: "+f.wrong+"</div>")
131 def WrongAnswer(self):
132 self.SendHeader()
133 self.ShowHead()
134 self.wfile.write("<div class=wronganswer>Falsche Antwort</div>")
135 self.DisplayQuestion()
136 self.wfile.write("<div class=correctanswer>"+f.answercorrect.encode("utf8")+"</div>")
139 def StartDisplay(self):
140 self.SendHeader()
141 self.base="http://127.0.0.1:8080"
143 self.wfile.write("<frameset border=0 frameborder=0 framespacing=0 marginwidth=0 rows=30px,*>")
144 self.wfile.write("<frame name=menue src=menue.afu scrolling=no noresize>")
145 self.wfile.write("<frame name=main src=askquestion.afu scrolling=auto noresize>")
146 self.wfile.write("</frameset>")
148 def AskQuestion(self):
149 self.base="http://127.0.0.1:8080"
150 self.ShowHead()
151 self.wfile.write("<body>")
153 f.AskQuestion()
154 self.DisplayQuestion()
156 self.wfile.write("<div class=answer>")
157 self.wfile.write("<a href="+self.base+"/a.afu>A</a>"+f.answera.encode("utf8")+"<br>")
158 self.wfile.write("<a href="+self.base+"/b.afu>B</a>"+f.answerb.encode("utf8")+"<br>")
159 self.wfile.write("<a href="+self.base+"/c.afu>C</a>"+f.answerc.encode("utf8")+"<br>")
160 self.wfile.write("<a href="+self.base+"/d.afu>D</a>"+f.answerd.encode("utf8")+"<br>")
161 self.wfile.write("</div>")
163 self.wfile.write("<div class=button>")
164 self.wfile.write("<a href="+self.base+"/a.afu class=button>A</a>")
165 self.wfile.write("<a href="+self.base+"/b.afu class=button>B</a>")
166 self.wfile.write("<a href="+self.base+"/c.afu class=button>C</a>")
167 self.wfile.write("<a href="+self.base+"/d.afu class=button>D</a>")
168 self.wfile.write("</div>")
170 self.wfile.write("<div class=hint>")
171 self.wfile.write("<a href="+self.base+"/hint.afu>Hinweis</a></div>")
173 self.wfile.write("</body></html>")
175 def DisplayMenu(self):
176 self.SendHeader()
177 self.base="http://127.0.0.1:8080"
178 self.stylefile=self.base+"/style.css"
180 self.wfile.write("<html><head><base target=main><link href="+self.stylefile+" rel=stylesheet type=text/css></head>")
181 self.wfile.write("<body class=menue><div class=menue>")
182 self.wfile.write("<a class=menue href="+self.base+"/askquestion.afu>Abfragen</a>")
183 self.wfile.write("<a class=menue href="+self.base+"/method.afu>Abfragemethode</a>")
184 self.wfile.write("<a class=menue href="+self.base+"/statistic.afu>Statistik</a>")
185 self.wfile.write("</div></body></html>")
188 def do_POST(self):
189 global rootnode
190 ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
191 if ctype == 'multipart/form-data':
192 query=cgi.parse_multipart(self.rfile, pdict)
193 self.send_response(301)
195 self.end_headers()
196 upfilecontent = query.get('upfile')
197 print "filecontent", upfilecontent[0]
198 self.wfile.write("<HTML>POST OK.<BR><BR>");
199 self.wfile.write(upfilecontent[0]);
201 def main():
202 try:
203 global f
204 f = framework.Framework()
205 server = HTTPServer(('', 8080), MyHandler)
206 print 'started httpserver...'
207 server.serve_forever()
208 except KeyboardInterrupt:
209 print '^C received, shutting down server'
210 server.socket.close()
212 if __name__ == '__main__':
213 main()