gyorgy@0
|
1 import cherrypy, os, random, smtplib, string
|
gyorgy@0
|
2 from cherrypy.lib.static import serve_file
|
gyorgy@0
|
3 from templates import *
|
gyorgy@0
|
4
|
gyorgy@0
|
5 from DirectorySession import DirectorySession
|
gyorgy@0
|
6 from ServerWrapper import ServerWrapper as CherryPyServer
|
gyorgy@0
|
7 from ServerWrapper import Config as ServerConfig
|
gyorgy@0
|
8
|
gyorgy@0
|
9 from email.MIMEBase import MIMEBase
|
gyorgy@0
|
10 from email.MIMEText import MIMEText
|
gyorgy@0
|
11 from email.MIMEMultipart import MIMEMultipart
|
gyorgy@0
|
12 from email.Utils import COMMASPACE, formatdate
|
gyorgy@0
|
13 from email import Encoders
|
gyorgy@0
|
14
|
gyorgy@0
|
15 from pprint import pprint
|
gyorgy@0
|
16
|
gyorgy@0
|
17 PATH = os.path.abspath(os.path.dirname(__file__))
|
gyorgy@0
|
18
|
gyorgy@0
|
19 class Root(object): pass
|
gyorgy@0
|
20
|
gyorgy@0
|
21 class HomePage:
|
gyorgy@0
|
22 def index(self):
|
gyorgy@0
|
23
|
daniele@11
|
24 return "This is the home page..."
|
gyorgy@0
|
25
|
gyorgy@0
|
26 index.exposed = True
|
gyorgy@0
|
27
|
gyorgy@0
|
28 class TestPage:
|
gyorgy@0
|
29
|
daniele@11
|
30 def getAASPFiles(self):
|
daniele@12
|
31 audioDir = './AASPAudio'
|
daniele@11
|
32 cherrypy.session['cats'] = [cherrypy.session['f'] for cherrypy.session['f'] in os.listdir(audioDir) if os.path.isdir(os.path.join(audioDir,cherrypy.session['f']))]
|
daniele@12
|
33 #print cherrypy.session['cats']
|
gyorgy@0
|
34
|
gyorgy@0
|
35 def index(self):
|
daniele@11
|
36 TestPage.getAASPFiles(self)
|
gyorgy@0
|
37 cherrypy.session['sid'] = None
|
gyorgy@0
|
38
|
gyorgy@0
|
39 cherrypy.session['sid_filename'] = None
|
gyorgy@0
|
40
|
gyorgy@0
|
41
|
gyorgy@0
|
42 if cherrypy.request.headers.has_key("X-Forwarded-For"):
|
gyorgy@0
|
43 cherrypy.session['ip'] = cherrypy.request.headers["X-Forwarded-For"]
|
gyorgy@0
|
44 elif cherrypy.request.headers.has_key("Remote-Addr"):
|
gyorgy@0
|
45 cherrypy.session['ip'] = cherrypy.request.headers["Remote-Addr"]
|
gyorgy@0
|
46 else :
|
gyorgy@0
|
47 cherrypy.session['ip'] = None
|
gyorgy@0
|
48
|
gyorgy@0
|
49 cherrypy.session['test'] = None
|
gyorgy@0
|
50 cherrypy.session['results'] = None
|
gyorgy@0
|
51 cherrypy.session['tests'] = None
|
gyorgy@0
|
52 cherrypy.session['test_nr'] = None
|
daniele@11
|
53 cherrypy.session['audio'] = None
|
gyorgy@0
|
54 cherrypy.session['page'] = 0
|
gyorgy@0
|
55 cherrypy.session['pages'] = 6
|
gyorgy@0
|
56 cherrypy.session['userinfobox'] = None
|
gyorgy@0
|
57 cherrypy.session['ts'] = None
|
gyorgy@0
|
58
|
daniele@11
|
59 cherrypy.session['audio'] = []
|
gyorgy@0
|
60
|
daniele@11
|
61 cherrypy.session['audio'] = []
|
daniele@11
|
62 for cherrypy.session['cat'] in cherrypy.session['cats']:
|
daniele@12
|
63 cherrypy.session['dirlist'] = os.listdir('./AASPAudio/%s/'%cherrypy.session['cat'])
|
daniele@11
|
64 for cherrypy.session['item'] in cherrypy.session['dirlist']:
|
daniele@11
|
65 if cherrypy.session['item'].split('.')[-1] == 'wav':
|
daniele@11
|
66 cherrypy.session['audio'].append(cherrypy.session['cat'] + '/' + cherrypy.session['item'].split('.')[0])
|
daniele@12
|
67
|
daniele@11
|
68 random.shuffle(cherrypy.session['audio'])
|
gyorgy@0
|
69
|
daniele@12
|
70 #print "NUMBER OF TESTS:"
|
daniele@12
|
71 #print len(cherrypy.session['audio'])
|
gyorgy@0
|
72
|
gyorgy@0
|
73 cherrypy.session['sid'] = cherrypy.session.get_session_path().split('/')[1]
|
daniele@12
|
74 #print cherrypy.session['sid']
|
daniele@12
|
75 #pprint(cherrypy.session['audio'])
|
gyorgy@0
|
76
|
gyorgy@0
|
77 TestPage.outfileid = '%s' %cherrypy.session['sid']
|
gyorgy@0
|
78 ida = 0
|
gyorgy@0
|
79 while os.path.exists('./sessions/%s/%s.txt' %(cherrypy.session['sid'], TestPage.outfileid)):
|
gyorgy@0
|
80 TestPage.outfileid += '_%s' %ida
|
gyorgy@0
|
81 ida += 1
|
gyorgy@0
|
82
|
gyorgy@0
|
83
|
gyorgy@0
|
84 return welcome_templ %cherrypy.session['sid']
|
gyorgy@0
|
85
|
gyorgy@0
|
86
|
daniele@11
|
87 def doStart(self, pageId, sessionId, startButton, uinfo00=None, uinfo01=None, info1=None):
|
gyorgy@0
|
88
|
gyorgy@0
|
89 if cherrypy.session['page'] != int(pageId):
|
gyorgy@0
|
90 print "################################# BACK BUTTON PRESSED #################################"
|
gyorgy@0
|
91
|
gyorgy@0
|
92
|
gyorgy@0
|
93 if cherrypy.session['sid'] != str(sessionId):
|
gyorgy@0
|
94 return TestPage.sessionError(self)
|
gyorgy@0
|
95
|
daniele@11
|
96 cherrypy.session['userinfobox'] = str([str(uinfo00), str(uinfo01), int(info1)]) + '\n'
|
gyorgy@0
|
97 cherrypy.session['sessionId'] = sessionId
|
gyorgy@0
|
98 if cherrypy.session['sid'] != str(cherrypy.session['sessionId']):
|
gyorgy@0
|
99 return TestPage.sessionError(self)
|
gyorgy@0
|
100 else:
|
gyorgy@0
|
101 return TestPage.index2(self)
|
gyorgy@0
|
102
|
gyorgy@0
|
103 def index2(self):
|
daniele@12
|
104
|
gyorgy@0
|
105 cherrypy.session['page'] = 1
|
daniele@11
|
106 cherrypy.session['pages'] = 10
|
daniele@12
|
107 cherrypy.session['tests'] = len(cherrypy.session['audio'])
|
gyorgy@0
|
108 cherrypy.session['results'] = []
|
daniele@11
|
109 for cherrypy.session['n'] in xrange(cherrypy.session['tests']): cherrypy.session['results'].append([None])
|
gyorgy@0
|
110
|
gyorgy@0
|
111 cherrypy.session['ts'] = []
|
daniele@11
|
112 for cherrypy.session['k'] in xrange(10):
|
gyorgy@0
|
113 cherrypy.session['ts'].append(0)
|
daniele@12
|
114
|
daniele@12
|
115 print "################################# %s" %str(cherrypy.session['page'])
|
daniele@12
|
116 return audiotempl%TestPage.makeTuple(self, 10)
|
gyorgy@0
|
117
|
daniele@11
|
118 def doAttrib(self, pageId, sessionId, submitButton, attribute1=None, attribute2=None, attribute3=None, attribute4=None, attribute5=None, attribute6=None, attribute7=None, attribute8=None, attribute9=None, attribute10=None):
|
gyorgy@0
|
119
|
gyorgy@0
|
120 print "################################# %s" %pageId
|
gyorgy@0
|
121
|
gyorgy@0
|
122 if cherrypy.session['page'] != int(pageId):
|
gyorgy@0
|
123 print "################################# BACK BUTTON PRESSED #################################"
|
gyorgy@0
|
124
|
gyorgy@0
|
125 cherrypy.session['page'] = int(pageId)
|
gyorgy@0
|
126
|
gyorgy@0
|
127 if cherrypy.session['sid'] != str(sessionId):
|
gyorgy@0
|
128 return TestPage.sessionError(self)
|
daniele@12
|
129
|
gyorgy@0
|
130 cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1)
|
gyorgy@0
|
131
|
daniele@12
|
132 cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio'][cherrypy.session['pos']].split('/')[-1], int(attribute1)]
|
daniele@12
|
133 cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio'][cherrypy.session['pos']+1].split('/')[-1], int(attribute2)]
|
daniele@12
|
134 cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio'][cherrypy.session['pos']+2].split('/')[-1], int(attribute3)]
|
daniele@12
|
135 cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio'][cherrypy.session['pos']+3].split('/')[-1], int(attribute4)]
|
daniele@12
|
136 cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio'][cherrypy.session['pos']+4].split('/')[-1], int(attribute5)]
|
daniele@12
|
137 cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio'][cherrypy.session['pos']+5].split('/')[-1], int(attribute6)]
|
daniele@12
|
138 cherrypy.session['results'][cherrypy.session['pos']+6] = [cherrypy.session['audio'][cherrypy.session['pos']+6].split('/')[-1], int(attribute7)]
|
daniele@12
|
139 cherrypy.session['results'][cherrypy.session['pos']+7] = [cherrypy.session['audio'][cherrypy.session['pos']+7].split('/')[-1], int(attribute8)]
|
daniele@12
|
140 cherrypy.session['results'][cherrypy.session['pos']+8] = [cherrypy.session['audio'][cherrypy.session['pos']+8].split('/')[-1], int(attribute9)]
|
daniele@12
|
141 cherrypy.session['results'][cherrypy.session['pos']+9] = [cherrypy.session['audio'][cherrypy.session['pos']+9].split('/')[-1], int(attribute10)]
|
daniele@12
|
142 resString = cherrypy.session['ip'] + '\n' + TestPage.outfileid + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
|
daniele@12
|
143 print resString
|
gyorgy@0
|
144
|
daniele@12
|
145
|
daniele@12
|
146 cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid)
|
daniele@12
|
147
|
gyorgy@0
|
148
|
gyorgy@0
|
149
|
gyorgy@0
|
150 cherrypy.session['page'] += 1
|
gyorgy@0
|
151 cherrypy.session['ts'] = []
|
gyorgy@0
|
152 cherrypy.session['npos'] = cherrypy.session['pos'] + 10
|
gyorgy@0
|
153
|
daniele@12
|
154 cherrypy.session['m'] = 10
|
gyorgy@0
|
155
|
daniele@12
|
156 for cherrypy.session['k'] in xrange(cherrypy.session['m']): cherrypy.session['ts'].append(0)
|
daniele@12
|
157 #cherrypy.session['ts'].append(cherrypy.session['results'][cherrypy.session['npos']+cherrypy.session['k']])
|
daniele@12
|
158
|
daniele@12
|
159
|
daniele@11
|
160 return audiotempl%TestPage.makeTuple(self, cherrypy.session['m'])
|
daniele@12
|
161
|
daniele@12
|
162 #if cherrypy.session['page'] != cherrypy.session['pages']
|
daniele@12
|
163 # return audiotempl%TestPage.makeTuple(self, cherrypy.session['m'])
|
daniele@12
|
164 #else
|
daniele@12
|
165 # cherrypy.session['templ'] = ''
|
daniele@12
|
166 # for cherrypy.session['n'] in xrange(cherrypy.session['tests']):
|
daniele@12
|
167 # cherrypy.session['_templ'] = endtempl2 %(cherrypy.session['results'][cherrypy.session['n']][0], cherrypy.session['results'][cherrypy.session['n']][1], cherrypy.session['results'][cherrypy.session['n']][2], cherrypy.session['results'][cherrypy.session['n']][3], cherrypy.session['results'][cherrypy.session['n']][4])
|
daniele@12
|
168 # cherrypy.session['templ'] += cherrypy.session['_templ']
|
daniele@12
|
169 # try:
|
daniele@12
|
170 # TestPage.sendMail(self)
|
daniele@12
|
171 # except:
|
daniele@12
|
172 # print "WARNING: COULD NOT SEND RESULTS"
|
daniele@12
|
173 # pass
|
daniele@12
|
174 # cherrypy.session['sid'] = None
|
daniele@12
|
175 # return endtempl%cherrypy.session['templ']
|
gyorgy@0
|
176
|
gyorgy@0
|
177 index.exposed = True
|
gyorgy@0
|
178 doAttrib.exposed = True
|
gyorgy@0
|
179 index2.exposed = True
|
gyorgy@0
|
180 doStart.exposed = True
|
gyorgy@0
|
181
|
gyorgy@0
|
182 def makeTuple(TestPage, nr):
|
gyorgy@0
|
183 cherrypy.session['nr'] = nr
|
gyorgy@0
|
184 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
185 cherrypy.session['ts'].append(cherrypy.session['pages'])
|
gyorgy@0
|
186 for cherrypy.session['k'] in xrange(cherrypy.session['nr']):
|
gyorgy@0
|
187 pos = 10 * (cherrypy.session['page'] - 1) + cherrypy.session['k']
|
daniele@12
|
188 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio'][pos])
|
gyorgy@0
|
189 cherrypy.session['ts'].append(cherrypy.session['page'])
|
gyorgy@0
|
190 cherrypy.session['ts'].append(cherrypy.session['sid'])
|
gyorgy@0
|
191 cherrypy.session['ts'] = tuple(cherrypy.session['ts'])
|
gyorgy@0
|
192 print cherrypy.session['ts']
|
gyorgy@0
|
193 return cherrypy.session['ts']
|
gyorgy@0
|
194
|
gyorgy@0
|
195 def sessionError(TestPage):
|
gyorgy@0
|
196 print "################################# SESSION ERROR #################################"
|
gyorgy@0
|
197 cherrypy.session['resString'] = cherrypy.session['ip'] + '\n' + str(cherrypy.session['sid']) + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
|
gyorgy@0
|
198 cherrypy.session['resString'] += '\n\nERROR: SESSION CONFUSION'
|
gyorgy@0
|
199 #f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
200 #f.write(resString)
|
gyorgy@0
|
201 #f.close()
|
gyorgy@0
|
202 cherrypy.session.write_data(cherrypy.session['resString'],'%s.txt'%TestPage.outfileid)
|
gyorgy@0
|
203
|
gyorgy@0
|
204 return '''
|
gyorgy@0
|
205 <p>
|
gyorgy@0
|
206 <a href="/test/">oh noes! there is something wrong with your session, please start again or go for a coffee!</a>
|
gyorgy@0
|
207 </p>'''
|
gyorgy@0
|
208
|
gyorgy@0
|
209
|
gyorgy@0
|
210 def sendMail(TestPage):
|
gyorgy@0
|
211 cherrypy.session['file'] = './sessions/%s/%s.txt'%(cherrypy.session['sid'], TestPage.outfileid)
|
gyorgy@0
|
212 username = 'eecsqmul@gmail.com'
|
gyorgy@0
|
213 password = 'perceptual'
|
gyorgy@0
|
214 fro = 'FX-Test <eecsqmul@gmail.com>'
|
gyorgy@0
|
215 to = ['thomas.wilmering@eecs.qmul.ac.uk', 'gyorgy.fazekas@eecs.qmul.ac.uk']
|
gyorgy@0
|
216 msg = MIMEMultipart()
|
gyorgy@0
|
217 msg['From'] = fro
|
gyorgy@0
|
218 msg['To'] = COMMASPACE.join(to)
|
gyorgy@0
|
219 msg['Date'] = formatdate(localtime=True)
|
gyorgy@0
|
220 msg['Subject'] = 'fx perceptual listening test'
|
gyorgy@0
|
221 msg.attach( MIMEText('Attached are new results from the listening test.'))
|
gyorgy@0
|
222 part = MIMEBase('application', "octet-stream")
|
gyorgy@0
|
223 part.set_payload( open(cherrypy.session['file'],"rb").read() )
|
gyorgy@0
|
224 Encoders.encode_base64(part)
|
gyorgy@0
|
225 part.add_header('Content-Disposition', 'attachment; filename="%s"' % cherrypy.session['file'])
|
gyorgy@0
|
226 msg.attach(part)
|
gyorgy@0
|
227 server = smtplib.SMTP('smtp.gmail.com:587')
|
gyorgy@0
|
228 server.starttls()
|
gyorgy@0
|
229 server.login(username,password)
|
gyorgy@0
|
230 server.sendmail(fro, to, msg.as_string() )
|
gyorgy@0
|
231 server.close()
|
gyorgy@0
|
232
|
gyorgy@0
|
233
|
gyorgy@0
|
234 class OutPage:
|
gyorgy@0
|
235 def index(self):
|
gyorgy@0
|
236 return '''
|
gyorgy@0
|
237 <html>
|
gyorgy@0
|
238 <body>
|
gyorgy@0
|
239 </body>
|
gyorgy@0
|
240 </html>
|
gyorgy@0
|
241
|
gyorgy@0
|
242 '''
|
gyorgy@0
|
243 index.exposed = True
|
gyorgy@0
|
244
|
gyorgy@0
|
245
|
gyorgy@0
|
246 # # Of course we can also mount request handler objects right here!
|
gyorgy@0
|
247 # root = HomePage()
|
gyorgy@0
|
248 # root.test = TestPage()
|
gyorgy@0
|
249 # root.out = OutPage()
|
gyorgy@0
|
250 # #root = TestPage()
|
gyorgy@0
|
251 #
|
gyorgy@0
|
252 # tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf')
|
gyorgy@0
|
253
|
gyorgy@0
|
254
|
gyorgy@0
|
255 def startFxTest(args):
|
gyorgy@0
|
256
|
gyorgy@0
|
257 # check local switch
|
gyorgy@0
|
258 if args.count('-local') :
|
gyorgy@0
|
259 local = True; args.remove('-local');
|
gyorgy@0
|
260 print 'Startup: Local mode.'
|
gyorgy@0
|
261 conf = os.path.join(os.path.dirname(__file__), 'local.conf')
|
gyorgy@0
|
262 else:
|
gyorgy@0
|
263 conf = os.path.join(os.path.dirname(__file__), 'server.conf')
|
gyorgy@0
|
264 local = False
|
gyorgy@0
|
265
|
gyorgy@0
|
266 # check string encoding
|
gyorgy@0
|
267 print "Startup: String encoding = '%s'" %(str(sys.getdefaultencoding()))
|
gyorgy@0
|
268
|
gyorgy@0
|
269 # check ip switch
|
gyorgy@0
|
270 ip = ''
|
gyorgy@0
|
271 if args.count('-ip') :
|
gyorgy@0
|
272 try :
|
gyorgy@0
|
273 # here we just see if it's numeric, parsing is done by the server wrapper
|
gyorgy@0
|
274 if args[args.index('-ip')+1].replace('.','').replace(':','').isdigit() :
|
gyorgy@0
|
275 ip = args[args.index('-ip')+1]
|
gyorgy@0
|
276 else :
|
gyorgy@0
|
277 print "Startup: Invalid service IP address. Use format: sawa.py -ip 127.0.0.1:8080"
|
gyorgy@0
|
278 os._exit(-1)
|
gyorgy@0
|
279 except :
|
gyorgy@0
|
280 print "Startup: Invalid service IP address. (Insufficient arguments.) Use format: cherryFxTest.py -ip 127.0.0.1:8080"
|
gyorgy@0
|
281 os._exit(-1)
|
gyorgy@0
|
282 args.remove(args[args.index('-ip')+1]);
|
gyorgy@0
|
283 args.remove('-ip')
|
gyorgy@0
|
284
|
gyorgy@0
|
285
|
gyorgy@0
|
286 # old command:
|
gyorgy@0
|
287 # cherrypy.quickstart(root, config=conf)
|
gyorgy@0
|
288
|
gyorgy@0
|
289 # Of course we can also mount request handler objects right here!
|
gyorgy@0
|
290 root = HomePage()
|
gyorgy@0
|
291 root.test = TestPage()
|
daniele@11
|
292 #root.out = OutPage()
|
gyorgy@0
|
293 #root = TestPage()
|
gyorgy@0
|
294
|
gyorgy@0
|
295 server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
|
gyorgy@0
|
296 # if local :
|
gyorgy@0
|
297 # server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
|
gyorgy@0
|
298 # else :
|
gyorgy@0
|
299 # server = CherryPyServer(ServerConfig(root=False,local=local,conf=conf))
|
gyorgy@0
|
300 server.mount(root,path_name='')
|
gyorgy@0
|
301 server.quickstart(ip)
|
gyorgy@0
|
302
|
gyorgy@0
|
303
|
gyorgy@0
|
304 if __name__ == '__main__':
|
gyorgy@0
|
305 # CherryPy always starts with app.root when trying to map request URIs
|
gyorgy@0
|
306 # to objects, so we need to mount a request handler root. A request
|
gyorgy@0
|
307 # to '/' will be mapped to HelloWorld().index().
|
gyorgy@0
|
308 # cherrypy.quickstart(root, config=tutconf)
|
gyorgy@0
|
309 import sys
|
gyorgy@0
|
310 startFxTest(sys.argv[1:])
|
gyorgy@0
|
311 else:
|
gyorgy@0
|
312 # This branch is for the test suite; you can ignore it.
|
daniele@11
|
313 cherrypy.tree.mount(root, config=tutconf) |