daniele@22: daniele@22: import cherrypy, os, random, smtplib, string daniele@22: from cherrypy.lib.static import serve_file daniele@22: from templates import * daniele@22: daniele@22: from DirectorySession import DirectorySession daniele@22: from ServerWrapper import ServerWrapper as CherryPyServer daniele@22: from ServerWrapper import Config as ServerConfig daniele@22: daniele@22: from email.MIMEBase import MIMEBase daniele@22: from email.MIMEText import MIMEText daniele@22: from email.MIMEMultipart import MIMEMultipart daniele@22: from email.Utils import COMMASPACE, formatdate daniele@22: from email import Encoders daniele@22: daniele@22: from pprint import pprint daniele@22: daniele@22: PATH = os.path.abspath(os.path.dirname(__file__)) daniele@22: daniele@22: #audiodir = './audio' daniele@22: #cherrypy.session['fxs'] = [cherrypy.session['f'] for cherrypy.session['f'] in os.listdir(audiodir) if os.path.isdir(os.path.join(audiodir, cherrypy.session['f']))] daniele@22: #cherrypy.session['fxs'].remove('dry') daniele@22: #print cherrypy.session['fxs'] daniele@22: daniele@22: class Root(object): pass daniele@22: daniele@22: daniele@22: class HomePage: daniele@22: def index(self): daniele@22: daniele@22: return "move along, nothing to see here!" daniele@22: daniele@22: index.exposed = True daniele@22: daniele@22: daniele@22: daniele@22: class TestPage: daniele@22: daniele@22: def getAASPFiles(self): daniele@22: audioDir = './AASPAudio' daniele@22: 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@22: print cherrypy.session['cats'] daniele@22: daniele@22: def index(self): daniele@22: TestPage.getAASPFiles(self) daniele@22: cherrypy.session['sid'] = None daniele@22: daniele@22: cherrypy.session['sid_filename'] = None daniele@22: daniele@22: daniele@22: if cherrypy.request.headers.has_key("X-Forwarded-For"): daniele@22: cherrypy.session['ip'] = cherrypy.request.headers["X-Forwarded-For"] daniele@22: elif cherrypy.request.headers.has_key("Remote-Addr"): daniele@22: cherrypy.session['ip'] = cherrypy.request.headers["Remote-Addr"] daniele@22: else : daniele@22: cherrypy.session['ip'] = None daniele@22: daniele@22: cherrypy.session['test'] = None daniele@22: cherrypy.session['results'] = None daniele@22: cherrypy.session['tests'] = None daniele@22: cherrypy.session['test_nr'] = None daniele@22: cherrypy.session['audio'] = None daniele@22: cherrypy.session['page'] = 0 daniele@22: cherrypy.session['pages'] = 6 daniele@22: cherrypy.session['userinfobox'] = None daniele@22: cherrypy.session['ts'] = None daniele@22: #return ''' daniele@22: #

daniele@22: # start test daniele@22: #

''' daniele@22: daniele@22: #take 2 examples for each effect daniele@22: daniele@22: cherrypy.session['audio'] = [] daniele@22: daniele@22: # get effected files: daniele@22: cherrypy.session['audio'] = [] daniele@22: for cherrypy.session['cat'] in cherrypy.session['cats']: daniele@22: cherrypy.session['dirlist'] = os.listdir('./AASPAudio/%s/'%cherrypy.session['cat']) daniele@22: for cherrypy.session['item'] in cherrypy.session['dirlist']: daniele@22: if cherrypy.session['item'].split('.')[-1] == 'wav': daniele@22: cherrypy.session['audio'].append(cherrypy.session['cat'] + '/' + cherrypy.session['item'].split('.')[0]) daniele@22: daniele@22: daniele@22: #print TestPage.audio daniele@22: random.shuffle(cherrypy.session['audio']) daniele@22: daniele@22: print "NUMBER OF TESTS:" daniele@22: print len(cherrypy.session['audio']) daniele@22: daniele@22: cherrypy.session['sid'] = cherrypy.session.get_session_path().split('/')[1] daniele@22: print cherrypy.session['sid'] daniele@22: daniele@22: #print cherrypy.session['audio'] daniele@22: pprint(cherrypy.session['audio']) daniele@22: daniele@22: daniele@22: TestPage.outfileid = '%s' %cherrypy.session['sid'] daniele@22: ida = 0 daniele@22: while os.path.exists('./sessions/%s/%s.txt' %(cherrypy.session['sid'], TestPage.outfileid)): daniele@22: TestPage.outfileid += '_%s' %ida daniele@22: ida += 1 daniele@22: daniele@22: daniele@22: return welcome_templ %cherrypy.session['sid'] daniele@22: daniele@22: daniele@22: def doStart(self, pageId, sessionId, startButton, uinfo00=None, uinfo01=None, info1=None): daniele@22: daniele@22: daniele@22: daniele@22: if cherrypy.session['page'] != int(pageId): daniele@22: print "################################# BACK BUTTON PRESSED #################################" daniele@22: daniele@22: daniele@22: if cherrypy.session['sid'] != str(sessionId): daniele@22: return TestPage.sessionError(self) daniele@22: #cherrypy.session['page'] = int(pageId) daniele@22: daniele@22: daniele@22: daniele@22: daniele@22: cherrypy.session['userinfobox'] = str([str(uinfo00), str(uinfo01), int(info1)]) + '\n' daniele@22: cherrypy.session['sessionId'] = sessionId daniele@22: #print "sid:" daniele@22: #print TestPage.sid daniele@22: #print sessionId daniele@22: if cherrypy.session['sid'] != str(cherrypy.session['sessionId']): daniele@22: return TestPage.sessionError(self) daniele@22: else: daniele@22: return TestPage.index2(self) daniele@22: daniele@22: daniele@22: daniele@22: def index2(self): daniele@22: #try: print testvar daniele@22: #except: pass daniele@22: daniele@22: cherrypy.session['page'] = 1 daniele@22: cherrypy.session['pages'] = 10 daniele@22: cherrypy.session['tests'] = len(cherrypy.session['audio']) #should be 66 #10 * cherrypy.session['pages'] daniele@22: cherrypy.session['results'] = [] daniele@22: for cherrypy.session['n'] in xrange(cherrypy.session['tests']): cherrypy.session['results'].append([None]) daniele@22: daniele@22: # create tuple to fill template daniele@22: cherrypy.session['ts'] = [] daniele@22: for cherrypy.session['k'] in xrange(10): daniele@22: cherrypy.session['ts'].append(0) daniele@22: daniele@22: return audiotempl%TestPage.makeTuple(self, 10) daniele@22: daniele@22: 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): daniele@22: #print attribute1 + ' ' + attribute2 daniele@22: # Error check daniele@22: daniele@22: print "################################# %s" %pageId daniele@22: #_pageId = int(pageId) - 1 daniele@22: daniele@22: if cherrypy.session['page'] != int(pageId): daniele@22: print "################################# BACK BUTTON PRESSED #################################" daniele@22: daniele@22: cherrypy.session['page'] = int(pageId) daniele@22: daniele@22: if cherrypy.session['sid'] != str(sessionId): daniele@22: return TestPage.sessionError(self) daniele@22: daniele@22: #store results daniele@22: daniele@22: cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1) daniele@22: daniele@22: cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio'][cherrypy.session['pos']][2].split('/')[-1], int(attribute1)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio'][cherrypy.session['pos']+1][2].split('/')[-1], int(attribute2)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio'][cherrypy.session['pos']+2][2].split('/')[-1], int(attribute3)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio'][cherrypy.session['pos']+3][2].split('/')[-1], int(attribute4)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio'][cherrypy.session['pos']+4][2].split('/')[-1], int(attribute5)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio'][cherrypy.session['pos']+5][2].split('/')[-1], int(attribute6)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+6] = [cherrypy.session['audio'][cherrypy.session['pos']+6][2].split('/')[-1], int(attribute7)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+7] = [cherrypy.session['audio'][cherrypy.session['pos']+7][2].split('/')[-1], int(attribute8)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+8] = [cherrypy.session['audio'][cherrypy.session['pos']+8][2].split('/')[-1], int(attribute9)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+9] = [cherrypy.session['audio'][cherrypy.session['pos']+9][2].split('/')[-1], int(attribute10)] daniele@22: daniele@22: daniele@22: resString = cherrypy.session['ip'] + '\n' + TestPage.outfileid + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results']) daniele@22: daniele@22: #f = open(TestPage.sid_filename, 'w') daniele@22: #f.write(resString) daniele@22: #f.close() daniele@22: daniele@22: cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid) daniele@22: daniele@22: #if cherrypy.session['page'] < cherrypy.session['pages'] - 1: daniele@22: cherrypy.session['page'] += 1 daniele@22: # create tuple to fill template daniele@22: cherrypy.session['ts'] = [] daniele@22: cherrypy.session['npos'] = cherrypy.session['pos'] + 10 daniele@22: daniele@22: if cherrypy.session['page'] < cherrypy.session['pages']: daniele@22: cherrypy.session['m'] = 10 daniele@22: else: daniele@22: cherrypy.session['m'] = 6 daniele@22: daniele@22: for cherrypy.session['k'] in xrange(cherrypy.session['m']): daniele@22: for cherrypy.session['i'] in xrange(4): daniele@22: #print cherrypy.session['k'] daniele@22: #print cherrypy.session['i'] daniele@22: cherrypy.session['ts'].append(cherrypy.session['results'][cherrypy.session['npos']+cherrypy.session['k']][cherrypy.session['i']+1]) daniele@22: daniele@22: return audiotempl%TestPage.makeTuple(self, cherrypy.session['m']) daniele@22: daniele@22: daniele@22: index.exposed = True daniele@22: doAttrib.exposed = True daniele@22: index2.exposed = True daniele@22: doStart.exposed = True daniele@22: daniele@22: daniele@22: def doAttrib2(self, pageId, sessionId, submitButton, attribute1=None, attribute2=None, attribute3=None, attribute4=None, attribute5=None, attribute6=None): daniele@22: #print attribute1 + ' ' + attribute2 daniele@22: # Error check daniele@22: daniele@22: print "################################# %s" %pageId daniele@22: #_pageId = int(pageId) - 1 daniele@22: daniele@22: if cherrypy.session['page'] != int(pageId): daniele@22: print "################################# BACK BUTTON PRESSED #################################" daniele@22: daniele@22: cherrypy.session['page'] = int(pageId) daniele@22: daniele@22: if cherrypy.session['sid'] != str(sessionId): daniele@22: return TestPage.sessionError(self) daniele@22: daniele@22: #store results daniele@22: daniele@22: cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1) daniele@22: daniele@22: cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio'][cherrypy.session['pos']][2].split('/')[-1], int(attribute1)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio'][cherrypy.session['pos']+1][2].split('/')[-1], int(attribute2)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio'][cherrypy.session['pos']+2][2].split('/')[-1], int(attribute3)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio'][cherrypy.session['pos']+3][2].split('/')[-1], int(attribute4)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio'][cherrypy.session['pos']+4][2].split('/')[-1], int(attribute5)] daniele@22: cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio'][cherrypy.session['pos']+5][2].split('/')[-1], int(attribute6)] daniele@22: daniele@22: daniele@22: daniele@22: resString = cherrypy.session['ip'] + '\n' + cherrypy.session['sid'] + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results']) daniele@22: daniele@22: #f = open(TestPage.sid_filename, 'w') daniele@22: #f.write(resString) daniele@22: #f.close() daniele@22: #os.path.exists() daniele@22: daniele@22: cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid) daniele@22: daniele@22: daniele@22: print cherrypy.session['results'] daniele@22: #_results = [] daniele@22: daniele@22: cherrypy.session['templ'] = '' daniele@22: for cherrypy.session['n'] in xrange(cherrypy.session['tests']): daniele@22: #print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" daniele@22: #print cherrypy.session['n'] daniele@22: 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@22: cherrypy.session['templ'] += cherrypy.session['_templ'] daniele@22: daniele@22: #TestPage.pageComplete += 1 daniele@22: try: daniele@22: #print 'skipping email' daniele@22: TestPage.sendMail(self) daniele@22: except: daniele@22: print "WARNING: COULD NOT SEND RESULTS" daniele@22: pass daniele@22: cherrypy.session['sid'] = None daniele@22: return endtempl%cherrypy.session['templ'] daniele@22: #return lastpage daniele@22: daniele@22: daniele@22: index.exposed = True daniele@22: doAttrib.exposed = True daniele@22: doAttrib2.exposed = True daniele@22: index2.exposed = True daniele@22: doStart.exposed = True daniele@22: daniele@22: daniele@22: def makeTuple(TestPage, nr): daniele@22: cherrypy.session['nr'] = nr daniele@22: cherrypy.session['ts'].append(cherrypy.session['page']) daniele@22: cherrypy.session['ts'].append(cherrypy.session['pages']) daniele@22: for cherrypy.session['k'] in xrange(cherrypy.session['nr']): daniele@22: pos = 10 * (cherrypy.session['page'] - 1) + cherrypy.session['k'] daniele@22: #print pos daniele@22: cherrypy.session['ts'].append(cherrypy.session['audio'][pos]) daniele@22: cherrypy.session['ts'].append(cherrypy.session['page']) daniele@22: cherrypy.session['ts'].append(cherrypy.session['sid']) daniele@22: cherrypy.session['ts'] = tuple(cherrypy.session['ts']) daniele@22: print cherrypy.session['ts'] daniele@22: return cherrypy.session['ts'] daniele@22: daniele@22: def sessionError(TestPage): daniele@22: print "################################# SESSION ERROR #################################" daniele@22: 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']) daniele@22: cherrypy.session['resString'] += '\n\nERROR: SESSION CONFUSION' daniele@22: #f = open(TestPage.sid_filename, 'w') daniele@22: #f.write(resString) daniele@22: #f.close() daniele@22: cherrypy.session.write_data(cherrypy.session['resString'],'%s.txt'%TestPage.outfileid) daniele@22: daniele@22: return ''' daniele@22:

daniele@22: oh noes! there is something wrong with your session, please start again or go for a coffee! daniele@22:

''' daniele@22: daniele@22: daniele@22: def sendMail(TestPage): daniele@22: cherrypy.session['file'] = './sessions/%s/%s.txt'%(cherrypy.session['sid'], TestPage.outfileid) daniele@22: username = 'eecsqmul@gmail.com' daniele@22: password = 'perceptual' daniele@22: fro = 'FX-Test ' daniele@22: to = ['thomas.wilmering@eecs.qmul.ac.uk', 'gyorgy.fazekas@eecs.qmul.ac.uk'] daniele@22: msg = MIMEMultipart() daniele@22: msg['From'] = fro daniele@22: msg['To'] = COMMASPACE.join(to) daniele@22: msg['Date'] = formatdate(localtime=True) daniele@22: msg['Subject'] = 'fx perceptual listening test' daniele@22: msg.attach( MIMEText('Attached are new results from the listening test.')) daniele@22: part = MIMEBase('application', "octet-stream") daniele@22: part.set_payload( open(cherrypy.session['file'],"rb").read() ) daniele@22: Encoders.encode_base64(part) daniele@22: part.add_header('Content-Disposition', 'attachment; filename="%s"' % cherrypy.session['file']) daniele@22: msg.attach(part) daniele@22: server = smtplib.SMTP('smtp.gmail.com:587') daniele@22: server.starttls() daniele@22: server.login(username,password) daniele@22: server.sendmail(fro, to, msg.as_string() ) daniele@22: server.close() daniele@22: daniele@22: daniele@22: class OutPage: daniele@22: def index(self): daniele@22: return ''' daniele@22: daniele@22: daniele@22:
daniele@22: daniele@22:
daniele@22: daniele@22: daniele@22: daniele@22: ''' daniele@22: index.exposed = True daniele@22: daniele@22: daniele@22: # # Of course we can also mount request handler objects right here! daniele@22: # root = HomePage() daniele@22: # root.test = TestPage() daniele@22: # root.out = OutPage() daniele@22: # #root = TestPage() daniele@22: # daniele@22: # tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf') daniele@22: daniele@22: daniele@22: def startFxTest(args): daniele@22: daniele@22: # check local switch daniele@22: if args.count('-local') : daniele@22: local = True; args.remove('-local'); daniele@22: print 'Startup: Local mode.' daniele@22: conf = os.path.join(os.path.dirname(__file__), 'local.conf') daniele@22: else: daniele@22: conf = os.path.join(os.path.dirname(__file__), 'server.conf') daniele@22: local = False daniele@22: daniele@22: # check string encoding daniele@22: print "Startup: String encoding = '%s'" %(str(sys.getdefaultencoding())) daniele@22: daniele@22: # check ip switch daniele@22: ip = '' daniele@22: if args.count('-ip') : daniele@22: try : daniele@22: # here we just see if it's numeric, parsing is done by the server wrapper daniele@22: if args[args.index('-ip')+1].replace('.','').replace(':','').isdigit() : daniele@22: ip = args[args.index('-ip')+1] daniele@22: else : daniele@22: print "Startup: Invalid service IP address. Use format: sawa.py -ip 127.0.0.1:8080" daniele@22: os._exit(-1) daniele@22: except : daniele@22: print "Startup: Invalid service IP address. (Insufficient arguments.) Use format: cherryFxTest.py -ip 127.0.0.1:8080" daniele@22: os._exit(-1) daniele@22: args.remove(args[args.index('-ip')+1]); daniele@22: args.remove('-ip') daniele@22: daniele@22: daniele@22: # old command: daniele@22: # cherrypy.quickstart(root, config=conf) daniele@22: daniele@22: # Of course we can also mount request handler objects right here! daniele@22: root = HomePage() daniele@22: root.test = TestPage() daniele@22: root.daniele = TestPage() daniele@22: root.out = OutPage() daniele@22: #root = TestPage() daniele@22: daniele@22: server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf)) daniele@22: # if local : daniele@22: # server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf)) daniele@22: # else : daniele@22: # server = CherryPyServer(ServerConfig(root=False,local=local,conf=conf)) daniele@22: server.mount(root,path_name='') daniele@22: server.quickstart(ip) daniele@22: daniele@22: daniele@22: if __name__ == '__main__': daniele@22: # CherryPy always starts with app.root when trying to map request URIs daniele@22: # to objects, so we need to mount a request handler root. A request daniele@22: # to '/' will be mapped to HelloWorld().index(). daniele@22: # cherrypy.quickstart(root, config=tutconf) daniele@22: import sys daniele@22: startFxTest(sys.argv[1:]) daniele@22: else: daniele@22: # This branch is for the test suite; you can ignore it. daniele@22: cherrypy.tree.mount(root, config=tutconf)