annotate cherryFxTest.py.orig @ 25:4a4bd554b4c1 tip

Closing this sub branch.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Mon, 25 Mar 2013 14:02:54 +0000
parents 8498a7b84ff1
children
rev   line source
daniele@22 1
daniele@22 2 import cherrypy, os, random, smtplib, string
daniele@22 3 from cherrypy.lib.static import serve_file
daniele@22 4 from templates import *
daniele@22 5
daniele@22 6 from DirectorySession import DirectorySession
daniele@22 7 from ServerWrapper import ServerWrapper as CherryPyServer
daniele@22 8 from ServerWrapper import Config as ServerConfig
daniele@22 9
daniele@22 10 from email.MIMEBase import MIMEBase
daniele@22 11 from email.MIMEText import MIMEText
daniele@22 12 from email.MIMEMultipart import MIMEMultipart
daniele@22 13 from email.Utils import COMMASPACE, formatdate
daniele@22 14 from email import Encoders
daniele@22 15
daniele@22 16 from pprint import pprint
daniele@22 17
daniele@22 18 PATH = os.path.abspath(os.path.dirname(__file__))
daniele@22 19
daniele@22 20 #audiodir = './audio'
daniele@22 21 #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 22 #cherrypy.session['fxs'].remove('dry')
daniele@22 23 #print cherrypy.session['fxs']
daniele@22 24
daniele@22 25 class Root(object): pass
daniele@22 26
daniele@22 27
daniele@22 28 class HomePage:
daniele@22 29 def index(self):
daniele@22 30
daniele@22 31 return "move along, nothing to see here!"
daniele@22 32
daniele@22 33 index.exposed = True
daniele@22 34
daniele@22 35
daniele@22 36
daniele@22 37 class TestPage:
daniele@22 38
daniele@22 39 def getAASPFiles(self):
daniele@22 40 audioDir = './AASPAudio'
daniele@22 41 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 42 print cherrypy.session['cats']
daniele@22 43
daniele@22 44 def index(self):
daniele@22 45 TestPage.getAASPFiles(self)
daniele@22 46 cherrypy.session['sid'] = None
daniele@22 47
daniele@22 48 cherrypy.session['sid_filename'] = None
daniele@22 49
daniele@22 50
daniele@22 51 if cherrypy.request.headers.has_key("X-Forwarded-For"):
daniele@22 52 cherrypy.session['ip'] = cherrypy.request.headers["X-Forwarded-For"]
daniele@22 53 elif cherrypy.request.headers.has_key("Remote-Addr"):
daniele@22 54 cherrypy.session['ip'] = cherrypy.request.headers["Remote-Addr"]
daniele@22 55 else :
daniele@22 56 cherrypy.session['ip'] = None
daniele@22 57
daniele@22 58 cherrypy.session['test'] = None
daniele@22 59 cherrypy.session['results'] = None
daniele@22 60 cherrypy.session['tests'] = None
daniele@22 61 cherrypy.session['test_nr'] = None
daniele@22 62 cherrypy.session['audio'] = None
daniele@22 63 cherrypy.session['page'] = 0
daniele@22 64 cherrypy.session['pages'] = 6
daniele@22 65 cherrypy.session['userinfobox'] = None
daniele@22 66 cherrypy.session['ts'] = None
daniele@22 67 #return '''
daniele@22 68 # <p>
daniele@22 69 # <a href="/test/">start test</a>
daniele@22 70 # </p>'''
daniele@22 71
daniele@22 72 #take 2 examples for each effect
daniele@22 73
daniele@22 74 cherrypy.session['audio'] = []
daniele@22 75
daniele@22 76 # get effected files:
daniele@22 77 cherrypy.session['audio'] = []
daniele@22 78 for cherrypy.session['cat'] in cherrypy.session['cats']:
daniele@22 79 cherrypy.session['dirlist'] = os.listdir('./AASPAudio/%s/'%cherrypy.session['cat'])
daniele@22 80 for cherrypy.session['item'] in cherrypy.session['dirlist']:
daniele@22 81 if cherrypy.session['item'].split('.')[-1] == 'wav':
daniele@22 82 cherrypy.session['audio'].append(cherrypy.session['cat'] + '/' + cherrypy.session['item'].split('.')[0])
daniele@22 83
daniele@22 84
daniele@22 85 #print TestPage.audio
daniele@22 86 random.shuffle(cherrypy.session['audio'])
daniele@22 87
daniele@22 88 print "NUMBER OF TESTS:"
daniele@22 89 print len(cherrypy.session['audio'])
daniele@22 90
daniele@22 91 cherrypy.session['sid'] = cherrypy.session.get_session_path().split('/')[1]
daniele@22 92 print cherrypy.session['sid']
daniele@22 93
daniele@22 94 #print cherrypy.session['audio']
daniele@22 95 pprint(cherrypy.session['audio'])
daniele@22 96
daniele@22 97
daniele@22 98 TestPage.outfileid = '%s' %cherrypy.session['sid']
daniele@22 99 ida = 0
daniele@22 100 while os.path.exists('./sessions/%s/%s.txt' %(cherrypy.session['sid'], TestPage.outfileid)):
daniele@22 101 TestPage.outfileid += '_%s' %ida
daniele@22 102 ida += 1
daniele@22 103
daniele@22 104
daniele@22 105 return welcome_templ %cherrypy.session['sid']
daniele@22 106
daniele@22 107
daniele@22 108 def doStart(self, pageId, sessionId, startButton, uinfo00=None, uinfo01=None, info1=None):
daniele@22 109
daniele@22 110
daniele@22 111
daniele@22 112 if cherrypy.session['page'] != int(pageId):
daniele@22 113 print "################################# BACK BUTTON PRESSED #################################"
daniele@22 114
daniele@22 115
daniele@22 116 if cherrypy.session['sid'] != str(sessionId):
daniele@22 117 return TestPage.sessionError(self)
daniele@22 118 #cherrypy.session['page'] = int(pageId)
daniele@22 119
daniele@22 120
daniele@22 121
daniele@22 122
daniele@22 123 cherrypy.session['userinfobox'] = str([str(uinfo00), str(uinfo01), int(info1)]) + '\n'
daniele@22 124 cherrypy.session['sessionId'] = sessionId
daniele@22 125 #print "sid:"
daniele@22 126 #print TestPage.sid
daniele@22 127 #print sessionId
daniele@22 128 if cherrypy.session['sid'] != str(cherrypy.session['sessionId']):
daniele@22 129 return TestPage.sessionError(self)
daniele@22 130 else:
daniele@22 131 return TestPage.index2(self)
daniele@22 132
daniele@22 133
daniele@22 134
daniele@22 135 def index2(self):
daniele@22 136 #try: print testvar
daniele@22 137 #except: pass
daniele@22 138
daniele@22 139 cherrypy.session['page'] = 1
daniele@22 140 cherrypy.session['pages'] = 10
daniele@22 141 cherrypy.session['tests'] = len(cherrypy.session['audio']) #should be 66 #10 * cherrypy.session['pages']
daniele@22 142 cherrypy.session['results'] = []
daniele@22 143 for cherrypy.session['n'] in xrange(cherrypy.session['tests']): cherrypy.session['results'].append([None])
daniele@22 144
daniele@22 145 # create tuple to fill template
daniele@22 146 cherrypy.session['ts'] = []
daniele@22 147 for cherrypy.session['k'] in xrange(10):
daniele@22 148 cherrypy.session['ts'].append(0)
daniele@22 149
daniele@22 150 return audiotempl%TestPage.makeTuple(self, 10)
daniele@22 151
daniele@22 152 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 153 #print attribute1 + ' ' + attribute2
daniele@22 154 # Error check
daniele@22 155
daniele@22 156 print "################################# %s" %pageId
daniele@22 157 #_pageId = int(pageId) - 1
daniele@22 158
daniele@22 159 if cherrypy.session['page'] != int(pageId):
daniele@22 160 print "################################# BACK BUTTON PRESSED #################################"
daniele@22 161
daniele@22 162 cherrypy.session['page'] = int(pageId)
daniele@22 163
daniele@22 164 if cherrypy.session['sid'] != str(sessionId):
daniele@22 165 return TestPage.sessionError(self)
daniele@22 166
daniele@22 167 #store results
daniele@22 168
daniele@22 169 cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1)
daniele@22 170
daniele@22 171 cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio'][cherrypy.session['pos']][2].split('/')[-1], int(attribute1)]
daniele@22 172 cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio'][cherrypy.session['pos']+1][2].split('/')[-1], int(attribute2)]
daniele@22 173 cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio'][cherrypy.session['pos']+2][2].split('/')[-1], int(attribute3)]
daniele@22 174 cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio'][cherrypy.session['pos']+3][2].split('/')[-1], int(attribute4)]
daniele@22 175 cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio'][cherrypy.session['pos']+4][2].split('/')[-1], int(attribute5)]
daniele@22 176 cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio'][cherrypy.session['pos']+5][2].split('/')[-1], int(attribute6)]
daniele@22 177 cherrypy.session['results'][cherrypy.session['pos']+6] = [cherrypy.session['audio'][cherrypy.session['pos']+6][2].split('/')[-1], int(attribute7)]
daniele@22 178 cherrypy.session['results'][cherrypy.session['pos']+7] = [cherrypy.session['audio'][cherrypy.session['pos']+7][2].split('/')[-1], int(attribute8)]
daniele@22 179 cherrypy.session['results'][cherrypy.session['pos']+8] = [cherrypy.session['audio'][cherrypy.session['pos']+8][2].split('/')[-1], int(attribute9)]
daniele@22 180 cherrypy.session['results'][cherrypy.session['pos']+9] = [cherrypy.session['audio'][cherrypy.session['pos']+9][2].split('/')[-1], int(attribute10)]
daniele@22 181
daniele@22 182
daniele@22 183 resString = cherrypy.session['ip'] + '\n' + TestPage.outfileid + '\n' + cherrypy.session['userinfobox'] + '\n' + ',\n'.join(str(x) for x in cherrypy.session['results'])
daniele@22 184
daniele@22 185 #f = open(TestPage.sid_filename, 'w')
daniele@22 186 #f.write(resString)
daniele@22 187 #f.close()
daniele@22 188
daniele@22 189 cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid)
daniele@22 190
daniele@22 191 #if cherrypy.session['page'] < cherrypy.session['pages'] - 1:
daniele@22 192 cherrypy.session['page'] += 1
daniele@22 193 # create tuple to fill template
daniele@22 194 cherrypy.session['ts'] = []
daniele@22 195 cherrypy.session['npos'] = cherrypy.session['pos'] + 10
daniele@22 196
daniele@22 197 if cherrypy.session['page'] < cherrypy.session['pages']:
daniele@22 198 cherrypy.session['m'] = 10
daniele@22 199 else:
daniele@22 200 cherrypy.session['m'] = 6
daniele@22 201
daniele@22 202 for cherrypy.session['k'] in xrange(cherrypy.session['m']):
daniele@22 203 for cherrypy.session['i'] in xrange(4):
daniele@22 204 #print cherrypy.session['k']
daniele@22 205 #print cherrypy.session['i']
daniele@22 206 cherrypy.session['ts'].append(cherrypy.session['results'][cherrypy.session['npos']+cherrypy.session['k']][cherrypy.session['i']+1])
daniele@22 207
daniele@22 208 return audiotempl%TestPage.makeTuple(self, cherrypy.session['m'])
daniele@22 209
daniele@22 210
daniele@22 211 index.exposed = True
daniele@22 212 doAttrib.exposed = True
daniele@22 213 index2.exposed = True
daniele@22 214 doStart.exposed = True
daniele@22 215
daniele@22 216
daniele@22 217 def doAttrib2(self, pageId, sessionId, submitButton, attribute1=None, attribute2=None, attribute3=None, attribute4=None, attribute5=None, attribute6=None):
daniele@22 218 #print attribute1 + ' ' + attribute2
daniele@22 219 # Error check
daniele@22 220
daniele@22 221 print "################################# %s" %pageId
daniele@22 222 #_pageId = int(pageId) - 1
daniele@22 223
daniele@22 224 if cherrypy.session['page'] != int(pageId):
daniele@22 225 print "################################# BACK BUTTON PRESSED #################################"
daniele@22 226
daniele@22 227 cherrypy.session['page'] = int(pageId)
daniele@22 228
daniele@22 229 if cherrypy.session['sid'] != str(sessionId):
daniele@22 230 return TestPage.sessionError(self)
daniele@22 231
daniele@22 232 #store results
daniele@22 233
daniele@22 234 cherrypy.session['pos'] = 10 * (cherrypy.session['page'] - 1)
daniele@22 235
daniele@22 236 cherrypy.session['results'][cherrypy.session['pos']] = [cherrypy.session['audio'][cherrypy.session['pos']][2].split('/')[-1], int(attribute1)]
daniele@22 237 cherrypy.session['results'][cherrypy.session['pos']+1] = [cherrypy.session['audio'][cherrypy.session['pos']+1][2].split('/')[-1], int(attribute2)]
daniele@22 238 cherrypy.session['results'][cherrypy.session['pos']+2] = [cherrypy.session['audio'][cherrypy.session['pos']+2][2].split('/')[-1], int(attribute3)]
daniele@22 239 cherrypy.session['results'][cherrypy.session['pos']+3] = [cherrypy.session['audio'][cherrypy.session['pos']+3][2].split('/')[-1], int(attribute4)]
daniele@22 240 cherrypy.session['results'][cherrypy.session['pos']+4] = [cherrypy.session['audio'][cherrypy.session['pos']+4][2].split('/')[-1], int(attribute5)]
daniele@22 241 cherrypy.session['results'][cherrypy.session['pos']+5] = [cherrypy.session['audio'][cherrypy.session['pos']+5][2].split('/')[-1], int(attribute6)]
daniele@22 242
daniele@22 243
daniele@22 244
daniele@22 245 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 246
daniele@22 247 #f = open(TestPage.sid_filename, 'w')
daniele@22 248 #f.write(resString)
daniele@22 249 #f.close()
daniele@22 250 #os.path.exists()
daniele@22 251
daniele@22 252 cherrypy.session.write_data(resString,'%s.txt'%TestPage.outfileid)
daniele@22 253
daniele@22 254
daniele@22 255 print cherrypy.session['results']
daniele@22 256 #_results = []
daniele@22 257
daniele@22 258 cherrypy.session['templ'] = ''
daniele@22 259 for cherrypy.session['n'] in xrange(cherrypy.session['tests']):
daniele@22 260 #print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
daniele@22 261 #print cherrypy.session['n']
daniele@22 262 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 263 cherrypy.session['templ'] += cherrypy.session['_templ']
daniele@22 264
daniele@22 265 #TestPage.pageComplete += 1
daniele@22 266 try:
daniele@22 267 #print 'skipping email'
daniele@22 268 TestPage.sendMail(self)
daniele@22 269 except:
daniele@22 270 print "WARNING: COULD NOT SEND RESULTS"
daniele@22 271 pass
daniele@22 272 cherrypy.session['sid'] = None
daniele@22 273 return endtempl%cherrypy.session['templ']
daniele@22 274 #return lastpage
daniele@22 275
daniele@22 276
daniele@22 277 index.exposed = True
daniele@22 278 doAttrib.exposed = True
daniele@22 279 doAttrib2.exposed = True
daniele@22 280 index2.exposed = True
daniele@22 281 doStart.exposed = True
daniele@22 282
daniele@22 283
daniele@22 284 def makeTuple(TestPage, nr):
daniele@22 285 cherrypy.session['nr'] = nr
daniele@22 286 cherrypy.session['ts'].append(cherrypy.session['page'])
daniele@22 287 cherrypy.session['ts'].append(cherrypy.session['pages'])
daniele@22 288 for cherrypy.session['k'] in xrange(cherrypy.session['nr']):
daniele@22 289 pos = 10 * (cherrypy.session['page'] - 1) + cherrypy.session['k']
daniele@22 290 #print pos
daniele@22 291 cherrypy.session['ts'].append(cherrypy.session['audio'][pos])
daniele@22 292 cherrypy.session['ts'].append(cherrypy.session['page'])
daniele@22 293 cherrypy.session['ts'].append(cherrypy.session['sid'])
daniele@22 294 cherrypy.session['ts'] = tuple(cherrypy.session['ts'])
daniele@22 295 print cherrypy.session['ts']
daniele@22 296 return cherrypy.session['ts']
daniele@22 297
daniele@22 298 def sessionError(TestPage):
daniele@22 299 print "################################# SESSION ERROR #################################"
daniele@22 300 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 301 cherrypy.session['resString'] += '\n\nERROR: SESSION CONFUSION'
daniele@22 302 #f = open(TestPage.sid_filename, 'w')
daniele@22 303 #f.write(resString)
daniele@22 304 #f.close()
daniele@22 305 cherrypy.session.write_data(cherrypy.session['resString'],'%s.txt'%TestPage.outfileid)
daniele@22 306
daniele@22 307 return '''
daniele@22 308 <p>
daniele@22 309 <a href="/test/">oh noes! there is something wrong with your session, please start again or go for a coffee!</a>
daniele@22 310 </p>'''
daniele@22 311
daniele@22 312
daniele@22 313 def sendMail(TestPage):
daniele@22 314 cherrypy.session['file'] = './sessions/%s/%s.txt'%(cherrypy.session['sid'], TestPage.outfileid)
daniele@22 315 username = 'eecsqmul@gmail.com'
daniele@22 316 password = 'perceptual'
daniele@22 317 fro = 'FX-Test <eecsqmul@gmail.com>'
daniele@22 318 to = ['thomas.wilmering@eecs.qmul.ac.uk', 'gyorgy.fazekas@eecs.qmul.ac.uk']
daniele@22 319 msg = MIMEMultipart()
daniele@22 320 msg['From'] = fro
daniele@22 321 msg['To'] = COMMASPACE.join(to)
daniele@22 322 msg['Date'] = formatdate(localtime=True)
daniele@22 323 msg['Subject'] = 'fx perceptual listening test'
daniele@22 324 msg.attach( MIMEText('Attached are new results from the listening test.'))
daniele@22 325 part = MIMEBase('application', "octet-stream")
daniele@22 326 part.set_payload( open(cherrypy.session['file'],"rb").read() )
daniele@22 327 Encoders.encode_base64(part)
daniele@22 328 part.add_header('Content-Disposition', 'attachment; filename="%s"' % cherrypy.session['file'])
daniele@22 329 msg.attach(part)
daniele@22 330 server = smtplib.SMTP('smtp.gmail.com:587')
daniele@22 331 server.starttls()
daniele@22 332 server.login(username,password)
daniele@22 333 server.sendmail(fro, to, msg.as_string() )
daniele@22 334 server.close()
daniele@22 335
daniele@22 336
daniele@22 337 class OutPage:
daniele@22 338 def index(self):
daniele@22 339 return '''
daniele@22 340 <html>
daniele@22 341 <body>
daniele@22 342 <div id="video">
daniele@22 343 <embed id="roll-video" src="http://www.dafk.net/what/ilovethe80s.swf" width="400" height="300"></embed>
daniele@22 344 </div>
daniele@22 345 </body>
daniele@22 346 </html>
daniele@22 347
daniele@22 348 '''
daniele@22 349 index.exposed = True
daniele@22 350
daniele@22 351
daniele@22 352 # # Of course we can also mount request handler objects right here!
daniele@22 353 # root = HomePage()
daniele@22 354 # root.test = TestPage()
daniele@22 355 # root.out = OutPage()
daniele@22 356 # #root = TestPage()
daniele@22 357 #
daniele@22 358 # tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf')
daniele@22 359
daniele@22 360
daniele@22 361 def startFxTest(args):
daniele@22 362
daniele@22 363 # check local switch
daniele@22 364 if args.count('-local') :
daniele@22 365 local = True; args.remove('-local');
daniele@22 366 print 'Startup: Local mode.'
daniele@22 367 conf = os.path.join(os.path.dirname(__file__), 'local.conf')
daniele@22 368 else:
daniele@22 369 conf = os.path.join(os.path.dirname(__file__), 'server.conf')
daniele@22 370 local = False
daniele@22 371
daniele@22 372 # check string encoding
daniele@22 373 print "Startup: String encoding = '%s'" %(str(sys.getdefaultencoding()))
daniele@22 374
daniele@22 375 # check ip switch
daniele@22 376 ip = ''
daniele@22 377 if args.count('-ip') :
daniele@22 378 try :
daniele@22 379 # here we just see if it's numeric, parsing is done by the server wrapper
daniele@22 380 if args[args.index('-ip')+1].replace('.','').replace(':','').isdigit() :
daniele@22 381 ip = args[args.index('-ip')+1]
daniele@22 382 else :
daniele@22 383 print "Startup: Invalid service IP address. Use format: sawa.py -ip 127.0.0.1:8080"
daniele@22 384 os._exit(-1)
daniele@22 385 except :
daniele@22 386 print "Startup: Invalid service IP address. (Insufficient arguments.) Use format: cherryFxTest.py -ip 127.0.0.1:8080"
daniele@22 387 os._exit(-1)
daniele@22 388 args.remove(args[args.index('-ip')+1]);
daniele@22 389 args.remove('-ip')
daniele@22 390
daniele@22 391
daniele@22 392 # old command:
daniele@22 393 # cherrypy.quickstart(root, config=conf)
daniele@22 394
daniele@22 395 # Of course we can also mount request handler objects right here!
daniele@22 396 root = HomePage()
daniele@22 397 root.test = TestPage()
daniele@22 398 root.daniele = TestPage()
daniele@22 399 root.out = OutPage()
daniele@22 400 #root = TestPage()
daniele@22 401
daniele@22 402 server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
daniele@22 403 # if local :
daniele@22 404 # server = CherryPyServer(ServerConfig(root=root,local=local,conf=conf))
daniele@22 405 # else :
daniele@22 406 # server = CherryPyServer(ServerConfig(root=False,local=local,conf=conf))
daniele@22 407 server.mount(root,path_name='')
daniele@22 408 server.quickstart(ip)
daniele@22 409
daniele@22 410
daniele@22 411 if __name__ == '__main__':
daniele@22 412 # CherryPy always starts with app.root when trying to map request URIs
daniele@22 413 # to objects, so we need to mount a request handler root. A request
daniele@22 414 # to '/' will be mapped to HelloWorld().index().
daniele@22 415 # cherrypy.quickstart(root, config=tutconf)
daniele@22 416 import sys
daniele@22 417 startFxTest(sys.argv[1:])
daniele@22 418 else:
daniele@22 419 # This branch is for the test suite; you can ignore it.
daniele@22 420 cherrypy.tree.mount(root, config=tutconf)