annotate cherryFxTest.py @ 14:e48866766f56

Added audio, removed original audio
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Wed, 13 Mar 2013 16:20:00 +0000
parents 8261089e6f04
children e4921590577e
rev   line source
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@13 106 cherrypy.session['pages'] = 100
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@13 112 for cherrypy.session['k'] in xrange(1):
gyorgy@0 113 cherrypy.session['ts'].append(0)
daniele@12 114
daniele@12 115 print "################################# %s" %str(cherrypy.session['page'])
daniele@13 116 return audiotempl%TestPage.makeTuple(self, 1)
gyorgy@0 117
daniele@13 118 def doAttrib(self, pageId, sessionId, submitButton, attribute1=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
daniele@13 130 cherrypy.session['pos'] = (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@13 133
daniele@12 134 resString = cherrypy.session['ip'] + '\n' + TestPage.outfileid + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
daniele@12 135 print resString
gyorgy@0 136
daniele@12 137
daniele@12 138 cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid)
daniele@12 139
gyorgy@0 140
gyorgy@0 141
gyorgy@0 142 cherrypy.session['page'] += 1
gyorgy@0 143 cherrypy.session['ts'] = []
daniele@13 144 cherrypy.session['npos'] = cherrypy.session['pos'] + 1
gyorgy@0 145
daniele@13 146 cherrypy.session['m'] = 1
gyorgy@0 147
daniele@12 148 for cherrypy.session['k'] in xrange(cherrypy.session['m']): cherrypy.session['ts'].append(0)
daniele@12 149 #cherrypy.session['ts'].append(cherrypy.session['results'][cherrypy.session['npos']+cherrypy.session['k']])
daniele@12 150
daniele@13 151 if cherrypy.session['page'] != 100:
daniele@13 152 return audiotempl%TestPage.makeTuple(self, cherrypy.session['m'])
daniele@13 153 else:
daniele@13 154 return endtempl%resString
gyorgy@0 155
gyorgy@0 156 index.exposed = True
gyorgy@0 157 doAttrib.exposed = True
gyorgy@0 158 index2.exposed = True
gyorgy@0 159 doStart.exposed = True
gyorgy@0 160
gyorgy@0 161 def makeTuple(TestPage, nr):
gyorgy@0 162 cherrypy.session['nr'] = nr
gyorgy@0 163 cherrypy.session['ts'].append(cherrypy.session['page'])
gyorgy@0 164 cherrypy.session['ts'].append(cherrypy.session['pages'])
gyorgy@0 165 for cherrypy.session['k'] in xrange(cherrypy.session['nr']):
daniele@13 166 pos = (cherrypy.session['page'] - 1) + cherrypy.session['k']
daniele@12 167 for n in xrange(3): cherrypy.session['ts'].append(cherrypy.session['audio'][pos])
gyorgy@0 168 cherrypy.session['ts'].append(cherrypy.session['page'])
gyorgy@0 169 cherrypy.session['ts'].append(cherrypy.session['sid'])
gyorgy@0 170 cherrypy.session['ts'] = tuple(cherrypy.session['ts'])
gyorgy@0 171 print cherrypy.session['ts']
gyorgy@0 172 return cherrypy.session['ts']
gyorgy@0 173
gyorgy@0 174 def sessionError(TestPage):
gyorgy@0 175 print "################################# SESSION ERROR #################################"
gyorgy@0 176 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 177 cherrypy.session['resString'] += '\n\nERROR: SESSION CONFUSION'
gyorgy@0 178 #f = open(TestPage.sid_filename, 'w')
gyorgy@0 179 #f.write(resString)
gyorgy@0 180 #f.close()
gyorgy@0 181 cherrypy.session.write_data(cherrypy.session['resString'],'%s.txt'%TestPage.outfileid)
gyorgy@0 182
gyorgy@0 183 return '''
gyorgy@0 184 <p>
gyorgy@0 185 <a href="/test/">oh noes! there is something wrong with your session, please start again or go for a coffee!</a>
gyorgy@0 186 </p>'''
gyorgy@0 187
gyorgy@0 188
gyorgy@0 189 def sendMail(TestPage):
gyorgy@0 190 cherrypy.session['file'] = './sessions/%s/%s.txt'%(cherrypy.session['sid'], TestPage.outfileid)
daniele@13 191 # username = 'eecsqmul@gmail.com'
daniele@13 192 # password = 'perceptual'
daniele@13 193 # fro = 'FX-Test <eecsqmul@gmail.com>'
daniele@13 194 # to = ['thomas.wilmering@eecs.qmul.ac.uk', 'gyorgy.fazekas@eecs.qmul.ac.uk']
daniele@13 195 # msg = MIMEMultipart()
daniele@13 196 # msg['From'] = fro
daniele@13 197 # msg['To'] = COMMASPACE.join(to)
daniele@13 198 # msg['Date'] = formatdate(localtime=True)
daniele@13 199 # msg['Subject'] = 'fx perceptual listening test'
daniele@13 200 # msg.attach( MIMEText('Attached are new results from the listening test.'))
daniele@13 201 # part = MIMEBase('application', "octet-stream")
daniele@13 202 # part.set_payload( open(cherrypy.session['file'],"rb").read() )
daniele@13 203 # Encoders.encode_base64(part)
daniele@13 204 # part.add_header('Content-Disposition', 'attachment; filename="%s"' % cherrypy.session['file'])
daniele@13 205 # msg.attach(part)
daniele@13 206 # server = smtplib.SMTP('smtp.gmail.com:587')
daniele@13 207 # server.starttls()
daniele@13 208 # server.login(username,password)
daniele@13 209 # server.sendmail(fro, to, msg.as_string() )
daniele@13 210 # server.close()
gyorgy@0 211
gyorgy@0 212
gyorgy@0 213 class OutPage:
gyorgy@0 214 def index(self):
gyorgy@0 215 return '''
gyorgy@0 216 <html>
gyorgy@0 217 <body>
gyorgy@0 218 </body>
gyorgy@0 219 </html>
gyorgy@0 220
gyorgy@0 221 '''
gyorgy@0 222 index.exposed = True
gyorgy@0 223
gyorgy@0 224
gyorgy@0 225 # # Of course we can also mount request handler objects right here!
gyorgy@0 226 # root = HomePage()
gyorgy@0 227 # root.test = TestPage()
gyorgy@0 228 # root.out = OutPage()
gyorgy@0 229 # #root = TestPage()
gyorgy@0 230 #
gyorgy@0 231 # tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf')
gyorgy@0 232
gyorgy@0 233
gyorgy@0 234 def startFxTest(args):
gyorgy@0 235
gyorgy@0 236 # check local switch
gyorgy@0 237 if args.count('-local') :
gyorgy@0 238 local = True; args.remove('-local');
gyorgy@0 239 print 'Startup: Local mode.'
gyorgy@0 240 conf = os.path.join(os.path.dirname(__file__), 'local.conf')
gyorgy@0 241 else:
gyorgy@0 242 conf = os.path.join(os.path.dirname(__file__), 'server.conf')
gyorgy@0 243 local = False
gyorgy@0 244
gyorgy@0 245 # check string encoding
gyorgy@0 246 print "Startup: String encoding = '%s'" %(str(sys.getdefaultencoding()))
gyorgy@0 247
gyorgy@0 248 # check ip switch
gyorgy@0 249 ip = ''
gyorgy@0 250 if args.count('-ip') :
gyorgy@0 251 try :
gyorgy@0 252 # here we just see if it's numeric, parsing is done by the server wrapper
gyorgy@0 253 if args[args.index('-ip')+1].replace('.','').replace(':','').isdigit() :
gyorgy@0 254 ip = args[args.index('-ip')+1]
gyorgy@0 255 else :
gyorgy@0 256 print "Startup: Invalid service IP address. Use format: sawa.py -ip 127.0.0.1:8080"
gyorgy@0 257 os._exit(-1)
gyorgy@0 258 except :
gyorgy@0 259 print "Startup: Invalid service IP address. (Insufficient arguments.) Use format: cherryFxTest.py -ip 127.0.0.1:8080"
gyorgy@0 260 os._exit(-1)
gyorgy@0 261 args.remove(args[args.index('-ip')+1]);
gyorgy@0 262 args.remove('-ip')
gyorgy@0 263
gyorgy@0 264
gyorgy@0 265 # old command:
gyorgy@0 266 # cherrypy.quickstart(root, config=conf)
gyorgy@0 267
gyorgy@0 268 # Of course we can also mount request handler objects right here!
gyorgy@0 269 root = HomePage()
gyorgy@0 270 root.test = TestPage()
daniele@11 271 #root.out = OutPage()
gyorgy@0 272 #root = TestPage()
gyorgy@0 273
gyorgy@0 274 server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
gyorgy@0 275 # if local :
gyorgy@0 276 # server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
gyorgy@0 277 # else :
gyorgy@0 278 # server = CherryPyServer(ServerConfig(root=False,local=local,conf=conf))
gyorgy@0 279 server.mount(root,path_name='')
gyorgy@0 280 server.quickstart(ip)
gyorgy@0 281
gyorgy@0 282
gyorgy@0 283 if __name__ == '__main__':
gyorgy@0 284 # CherryPy always starts with app.root when trying to map request URIs
gyorgy@0 285 # to objects, so we need to mount a request handler root. A request
gyorgy@0 286 # to '/' will be mapped to HelloWorld().index().
gyorgy@0 287 # cherrypy.quickstart(root, config=tutconf)
gyorgy@0 288 import sys
gyorgy@0 289 startFxTest(sys.argv[1:])
gyorgy@0 290 else:
gyorgy@0 291 # This branch is for the test suite; you can ignore it.
daniele@11 292 cherrypy.tree.mount(root, config=tutconf)