.
[HamExam.git] / interface.py
blob1f529d24fbd390bdab008a282cd65d31fc20d938
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"):
79 if q.correct == "a":
80 self.wfile.write("RICHTIG!")
81 else:
82 self.wfile.write("FALSCH!")
83 elif self.path.endswith("b.afu"):
84 if q.correct == "b":
85 self.wfile.write("RICHTIG!")
86 else:
87 self.wfile.write("FALSCH!")
88 elif self.path.endswith("c.afu"):
89 if q.correct == "c":
90 self.wfile.write("RICHTIG!")
91 else:
92 self.wfile.write("FALSCH!")
93 elif self.path.endswith("d.afu"):
94 if q.correct == "d":
95 self.wfile.write("RICHTIG!")
96 else:
97 self.wfile.write("FALSCH!")
98 elif self.path.endswith("hint.afu"):
99 print "FIXME"
100 else:
101 print "FIXME"
103 self.StartDisplay()
105 def StartDisplay(self):
106 self.send_response(200)
107 self.send_header('Content-type', 'text/html')
108 self.end_headers()
110 self.base="http://127.0.0.1:8080"
112 self.wfile.write("<html><head><base href="+self.base+"/Questions/></head><body>")
114 f.AskQuestion("TB305")
116 self.wfile.write("<div class=id>"+f.id+"</div>")
118 self.wfile.write("<div class=question>")
119 self.wfile.write(f.question)
120 self.wfile.write("</div>")
122 self.wfile.write("<div class=answer>")
123 self.wfile.write("<a href="+self.base+"/a.afu class=button>A</a>"+f.answera+"<br>")
124 self.wfile.write("<a href="+self.base+"/b.afu class=button>B</a>"+f.answerb+"<br>")
125 self.wfile.write("<a href="+self.base+"/c.afu class=button>C</a>"+f.answerc+"<br>")
126 self.wfile.write("<a href="+self.base+"/d.afu class=button>D</a>"+f.answerd+"<br>")
127 self.wfile.write("</div>")
129 self.wfile.write("<div class=hint>")
130 self.wfile.write("<a href="+self.base+"/hint.afu>Hinweis</a>")
132 self.wfile.write("</body></html>")
136 def do_POST(self):
137 global rootnode
138 ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
139 if ctype == 'multipart/form-data':
140 query=cgi.parse_multipart(self.rfile, pdict)
141 self.send_response(301)
143 self.end_headers()
144 upfilecontent = query.get('upfile')
145 print "filecontent", upfilecontent[0]
146 self.wfile.write("<HTML>POST OK.<BR><BR>");
147 self.wfile.write(upfilecontent[0]);
149 def main():
150 try:
151 global f
152 f = framework.Framework()
153 server = HTTPServer(('', 8080), MyHandler)
154 print 'started httpserver...'
155 server.serve_forever()
156 except KeyboardInterrupt:
157 print '^C received, shutting down server'
158 server.socket.close()
160 if __name__ == '__main__':
161 main()