gyorgy@0
|
1 """
|
gyorgy@0
|
2 Tutorial - Multiple objects
|
gyorgy@0
|
3
|
gyorgy@0
|
4 This tutorial shows you how to create a site structure through multiple
|
gyorgy@0
|
5 possibly nested request handler objects.
|
gyorgy@0
|
6 """
|
gyorgy@0
|
7
|
gyorgy@0
|
8 import cherrypy, os, random
|
gyorgy@0
|
9 from cherrypy.lib.static import serve_file
|
gyorgy@0
|
10 from templates import *
|
gyorgy@0
|
11
|
gyorgy@0
|
12 from DirectorySession import DirectorySession
|
gyorgy@0
|
13
|
gyorgy@0
|
14 #from pprint import pprint
|
gyorgy@0
|
15
|
gyorgy@0
|
16 PATH = os.path.abspath(os.path.dirname(__file__))
|
gyorgy@0
|
17
|
gyorgy@0
|
18
|
gyorgy@0
|
19 audiodir = './audio'
|
gyorgy@0
|
20 fxs = [f for f in os.listdir(audiodir) if os.path.isdir(os.path.join(audiodir, f))]
|
gyorgy@0
|
21 fxs.remove('dry')
|
gyorgy@0
|
22 print fxs
|
gyorgy@0
|
23
|
gyorgy@0
|
24 class Root(object): pass
|
gyorgy@0
|
25
|
gyorgy@0
|
26
|
gyorgy@0
|
27 class HomePage:
|
gyorgy@0
|
28 def index(self):
|
gyorgy@0
|
29 #return ''' <p> <a href="/test/">start test </a> </p>'''
|
gyorgy@0
|
30
|
gyorgy@0
|
31 #print cherrypy.session.get_session_name()
|
gyorgy@0
|
32 #cherry.session.write_data()
|
gyorgy@0
|
33
|
gyorgy@0
|
34 #print cherrypy.session['gfdxgfdx']
|
gyorgy@0
|
35
|
gyorgy@0
|
36 #cherrypy.session['x'] = [1,2,3]
|
gyorgy@0
|
37 #print cherrypy.session['x']
|
gyorgy@0
|
38 #x = cherrypy.session['x']
|
gyorgy@0
|
39 #x.append(5)
|
gyorgy@0
|
40 #print cherrypy.session['x']
|
gyorgy@0
|
41 return "empty"
|
gyorgy@0
|
42
|
gyorgy@0
|
43
|
gyorgy@0
|
44 index.exposed = True
|
gyorgy@0
|
45
|
gyorgy@0
|
46 class TestPage:
|
gyorgy@0
|
47
|
gyorgy@0
|
48 sid = None
|
gyorgy@0
|
49 sid_filename = None
|
gyorgy@0
|
50
|
gyorgy@0
|
51 test = None
|
gyorgy@0
|
52 results = None
|
gyorgy@0
|
53 tests = None
|
gyorgy@0
|
54 test_nr = None
|
gyorgy@0
|
55 audio_pairs = None
|
gyorgy@0
|
56 page = None
|
gyorgy@0
|
57 pages = 4
|
gyorgy@0
|
58 pageComplete = None
|
gyorgy@0
|
59 userInfo = None
|
gyorgy@0
|
60
|
gyorgy@0
|
61 def index(self):
|
gyorgy@0
|
62 #return '''
|
gyorgy@0
|
63 # <p>
|
gyorgy@0
|
64 # <a href="/test/">start test</a>
|
gyorgy@0
|
65 # </p>'''
|
gyorgy@0
|
66 TestPage.sid = TestPage.getSid(self)
|
gyorgy@0
|
67 print TestPage.sid
|
gyorgy@0
|
68 return welcome_templ %TestPage.sid
|
gyorgy@0
|
69
|
gyorgy@0
|
70
|
gyorgy@0
|
71 def doStart(self, sessionId, startButton, userinfobox=None):
|
gyorgy@0
|
72 print "sid:"
|
gyorgy@0
|
73 print TestPage.sid
|
gyorgy@0
|
74 print sessionId
|
gyorgy@0
|
75 if TestPage.sid != int(sessionId):
|
gyorgy@0
|
76 return TestPage.sessionError(self)
|
gyorgy@0
|
77 else:
|
gyorgy@0
|
78 return TestPage.index2(self, userinfobox)
|
gyorgy@0
|
79
|
gyorgy@0
|
80
|
gyorgy@0
|
81
|
gyorgy@0
|
82
|
gyorgy@0
|
83 def index2(self, userinfo):
|
gyorgy@0
|
84
|
gyorgy@0
|
85 #TestPage.sid = TestPage.getSid(self)
|
gyorgy@0
|
86
|
gyorgy@0
|
87 #if TestPage.sid != TestPage.sidstart:
|
gyorgy@0
|
88 # return TestPage.sessionError(self)
|
gyorgy@0
|
89
|
gyorgy@0
|
90
|
gyorgy@0
|
91 TestPage.sid_filename = 'results/%s.txt'%TestPage.sid
|
gyorgy@0
|
92 TestPage.sid_userinfofilename = 'results/%s_info.txt'%TestPage.sid
|
gyorgy@0
|
93 print TestPage.sid_filename
|
gyorgy@0
|
94
|
gyorgy@0
|
95 f = open(TestPage.sid_userinfofilename, 'w')
|
gyorgy@0
|
96 f.write('%s\n%s'%(TestPage.sid, str(userinfo)))
|
gyorgy@0
|
97 f.close()
|
gyorgy@0
|
98
|
gyorgy@0
|
99
|
gyorgy@0
|
100 TestPage.pageComplete = []
|
gyorgy@0
|
101 for n in xrange(TestPage.pages):
|
gyorgy@0
|
102 TestPage.pageComplete.append(0)
|
gyorgy@0
|
103
|
gyorgy@0
|
104
|
gyorgy@0
|
105 #take 2 examples for each effect
|
gyorgy@0
|
106
|
gyorgy@0
|
107 TestPage.audio_pairs = []
|
gyorgy@0
|
108
|
gyorgy@0
|
109 # get effected files:
|
gyorgy@0
|
110
|
gyorgy@0
|
111 for fx in fxs:
|
gyorgy@0
|
112 dirlist = os.listdir('./audio/%s/'%fx)
|
gyorgy@0
|
113 filelist = []
|
gyorgy@0
|
114 for item in dirlist:
|
gyorgy@0
|
115 if item.split('.')[-1] == 'mp3':
|
gyorgy@0
|
116 filelist.append(item.split('.')[0])
|
gyorgy@0
|
117
|
gyorgy@0
|
118 # create audio pairs for this fx
|
gyorgy@0
|
119
|
gyorgy@0
|
120 first = second = random.choice(filelist)
|
gyorgy@0
|
121 while first==second:
|
gyorgy@0
|
122 second = random.choice(filelist)
|
gyorgy@0
|
123
|
gyorgy@0
|
124 dry1 = 'dry/%s' %first.split('_%s'%fx)[0]
|
gyorgy@0
|
125 fx1 = '%s/%s' %(fx, first)
|
gyorgy@0
|
126 dry2 = 'dry/%s' %second.split('_%s'%fx)[0]
|
gyorgy@0
|
127 fx2 = '%s/%s' %(fx, second)
|
gyorgy@0
|
128 TestPage.audio_pairs.append([fx, dry1, fx1])
|
gyorgy@0
|
129 TestPage.audio_pairs.append([fx, dry2, fx2])
|
gyorgy@0
|
130
|
gyorgy@0
|
131 #print TestPage.audio_pairs
|
gyorgy@0
|
132 random.shuffle(TestPage.audio_pairs)
|
gyorgy@0
|
133
|
gyorgy@0
|
134 TestPage.page = 1
|
gyorgy@0
|
135 TestPage.pages = 4
|
gyorgy@0
|
136 TestPage.tests = 10 * TestPage.pages
|
gyorgy@0
|
137 TestPage.results = []
|
gyorgy@0
|
138 for n in xrange(TestPage.tests): TestPage.results.append([None,0,0,0,0])
|
gyorgy@0
|
139
|
gyorgy@0
|
140 # create tuple to fill template
|
gyorgy@0
|
141 ts = []
|
gyorgy@0
|
142 for k in xrange(40):
|
gyorgy@0
|
143 ts.append(0)
|
gyorgy@0
|
144 ts.append(TestPage.page)
|
gyorgy@0
|
145 ts.append(TestPage.pages)
|
gyorgy@0
|
146
|
gyorgy@0
|
147 for k in xrange(10):
|
gyorgy@0
|
148 pos = 10 * (TestPage.page - 1) + k
|
gyorgy@0
|
149 #print pos
|
gyorgy@0
|
150 for n in xrange(3): ts.append(TestPage.audio_pairs[pos][1])
|
gyorgy@0
|
151 for n in xrange(3): ts.append(TestPage.audio_pairs[pos][2])
|
gyorgy@0
|
152
|
gyorgy@0
|
153 ts.append(TestPage.page)
|
gyorgy@0
|
154 ts.append(TestPage.sid)
|
gyorgy@0
|
155 print ts
|
gyorgy@0
|
156 ts = tuple(ts)
|
gyorgy@0
|
157
|
gyorgy@0
|
158 return audiotempl %ts
|
gyorgy@0
|
159
|
gyorgy@0
|
160
|
gyorgy@0
|
161
|
gyorgy@0
|
162 def doAttrib(self, pageId, sessionId, submitButton, attribute1_1=None, attribute1_2=None, attribute1_3=None, attribute1_4=None, attribute2_1=None, attribute2_2=None, attribute2_3=None, attribute2_4=None, attribute3_1=None, attribute3_2=None, attribute3_3=None, attribute3_4=None, attribute4_1=None, attribute4_2=None, attribute4_3=None, attribute4_4=None, attribute5_1=None, attribute5_2=None, attribute5_3=None, attribute5_4=None, attribute6_1=None, attribute6_2=None, attribute6_3=None, attribute6_4=None, attribute7_1=None, attribute7_2=None, attribute7_3=None, attribute7_4=None, attribute8_1=None, attribute8_2=None, attribute8_3=None, attribute8_4=None, attribute9_1=None, attribute9_2=None, attribute9_3=None, attribute9_4=None, attribute10_1=None, attribute10_2=None, attribute10_3=None, attribute10_4=None):
|
gyorgy@0
|
163 #print attribute1 + ' ' + attribute2
|
gyorgy@0
|
164 # Error check
|
gyorgy@0
|
165
|
gyorgy@0
|
166 print "################################# %s" %pageId
|
gyorgy@0
|
167 _pageId = int(pageId) - 1
|
gyorgy@0
|
168
|
gyorgy@0
|
169 if TestPage.page != int(pageId):
|
gyorgy@0
|
170 print "################################# BACK BUTTON PRESSED #################################"
|
gyorgy@0
|
171 #resString = ',\n'.join(str(x) for x in TestPage.results)
|
gyorgy@0
|
172 #resString += '\n\nERROR: BACK BUTTON PRESSED'
|
gyorgy@0
|
173 #f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
174 #f.write(resString)
|
gyorgy@0
|
175 #f.close()
|
gyorgy@0
|
176 #return '''
|
gyorgy@0
|
177 # <p>
|
gyorgy@0
|
178 # <a href="/test/">nooo! you pressed the back button, please start again!</a>
|
gyorgy@0
|
179 # </p>'''
|
gyorgy@0
|
180
|
gyorgy@0
|
181 # instead: overwrite previously submitted data. WILL THE OLD VALUES BE SUBMITTED AGAIN IN ALL BROWSERS?
|
gyorgy@0
|
182 TestPage.page = int(pageId)
|
gyorgy@0
|
183
|
gyorgy@0
|
184
|
gyorgy@0
|
185
|
gyorgy@0
|
186 if TestPage.sid != int(sessionId):
|
gyorgy@0
|
187 return TestPage.sessionError(self)
|
gyorgy@0
|
188
|
gyorgy@0
|
189
|
gyorgy@0
|
190
|
gyorgy@0
|
191 #store results
|
gyorgy@0
|
192
|
gyorgy@0
|
193 pos = 10 * (TestPage.page - 1)
|
gyorgy@0
|
194
|
gyorgy@0
|
195 TestPage.results[pos] = [TestPage.audio_pairs[pos][2].split('/')[-1], int(attribute1_1), int(attribute1_2), int(attribute1_3), int(attribute1_4)]
|
gyorgy@0
|
196 TestPage.results[pos+1] = [TestPage.audio_pairs[pos+1][2].split('/')[-1], int(attribute2_1), int(attribute2_2), int(attribute2_3), int(attribute2_4)]
|
gyorgy@0
|
197 TestPage.results[pos+2] = [TestPage.audio_pairs[pos+2][2].split('/')[-1], int(attribute3_1), int(attribute3_2), int(attribute3_3), int(attribute3_4)]
|
gyorgy@0
|
198 TestPage.results[pos+3] = [TestPage.audio_pairs[pos+3][2].split('/')[-1], int(attribute4_1), int(attribute4_2), int(attribute4_3), int(attribute4_4)]
|
gyorgy@0
|
199 TestPage.results[pos+4] = [TestPage.audio_pairs[pos+4][2].split('/')[-1], int(attribute5_1), int(attribute5_2), int(attribute5_3), int(attribute5_4)]
|
gyorgy@0
|
200 TestPage.results[pos+5] = [TestPage.audio_pairs[pos+5][2].split('/')[-1], int(attribute6_1), int(attribute6_2), int(attribute6_3), int(attribute6_4)]
|
gyorgy@0
|
201 TestPage.results[pos+6] = [TestPage.audio_pairs[pos+6][2].split('/')[-1], int(attribute7_1), int(attribute7_2), int(attribute7_3), int(attribute7_4)]
|
gyorgy@0
|
202 TestPage.results[pos+7] = [TestPage.audio_pairs[pos+7][2].split('/')[-1], int(attribute8_1), int(attribute8_2), int(attribute8_3), int(attribute8_4)]
|
gyorgy@0
|
203 TestPage.results[pos+8] = [TestPage.audio_pairs[pos+8][2].split('/')[-1], int(attribute9_1), int(attribute9_2), int(attribute9_3), int(attribute9_4)]
|
gyorgy@0
|
204 TestPage.results[pos+9] = [TestPage.audio_pairs[pos+9][2].split('/')[-1], int(attribute10_1), int(attribute10_2), int(attribute10_3), int(attribute10_4)]
|
gyorgy@0
|
205
|
gyorgy@0
|
206 resString = ',\n'.join(str(x) for x in TestPage.results)
|
gyorgy@0
|
207
|
gyorgy@0
|
208 f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
209 f.write(resString)
|
gyorgy@0
|
210 f.close()
|
gyorgy@0
|
211
|
gyorgy@0
|
212
|
gyorgy@0
|
213 if TestPage.page < TestPage.pages:
|
gyorgy@0
|
214 TestPage.page += 1
|
gyorgy@0
|
215
|
gyorgy@0
|
216 # create tuple to fill template
|
gyorgy@0
|
217 ts = []
|
gyorgy@0
|
218
|
gyorgy@0
|
219 npos = pos + 10
|
gyorgy@0
|
220 for k in xrange(10):
|
gyorgy@0
|
221 for i in xrange(4):
|
gyorgy@0
|
222 ts.append(TestPage.results[npos+k][i+1])
|
gyorgy@0
|
223
|
gyorgy@0
|
224 ts.append(TestPage.page)
|
gyorgy@0
|
225 ts.append(TestPage.pages)
|
gyorgy@0
|
226
|
gyorgy@0
|
227 for k in xrange(10):
|
gyorgy@0
|
228 pos = 10 * (TestPage.page - 1) + k
|
gyorgy@0
|
229 #print pos
|
gyorgy@0
|
230 for n in xrange(3): ts.append(TestPage.audio_pairs[pos][1])
|
gyorgy@0
|
231 for n in xrange(3): ts.append(TestPage.audio_pairs[pos][2])
|
gyorgy@0
|
232 ts.append(TestPage.page)
|
gyorgy@0
|
233 ts.append(TestPage.sid)
|
gyorgy@0
|
234 ts = tuple(ts)
|
gyorgy@0
|
235
|
gyorgy@0
|
236 #print TestPage.audio_pairs[TestPage.test-1][2]
|
gyorgy@0
|
237 #TestPage.pageComplete += 1
|
gyorgy@0
|
238 return audiotempl %ts
|
gyorgy@0
|
239 else:
|
gyorgy@0
|
240 end_filename = 'results/%s_f.txt'%TestPage.sid
|
gyorgy@0
|
241 os.rename(TestPage.sid_filename, end_filename)
|
gyorgy@0
|
242
|
gyorgy@0
|
243 print TestPage.results
|
gyorgy@0
|
244 _results = []
|
gyorgy@0
|
245
|
gyorgy@0
|
246 templ = ''
|
gyorgy@0
|
247 for n in xrange(TestPage.tests):
|
gyorgy@0
|
248 _templ = endtempl2 %(TestPage.results[n][0], TestPage.results[n][1], TestPage.results[n][2], TestPage.results[n][3], TestPage.results[n][4])
|
gyorgy@0
|
249 templ += _templ
|
gyorgy@0
|
250
|
gyorgy@0
|
251 #TestPage.pageComplete += 1
|
gyorgy@0
|
252 TestPage.sid = None
|
gyorgy@0
|
253 return endtempl%templ
|
gyorgy@0
|
254
|
gyorgy@0
|
255 index.exposed = True
|
gyorgy@0
|
256 doAttrib.exposed = True
|
gyorgy@0
|
257 index2.exposed = True
|
gyorgy@0
|
258 doStart.exposed = True
|
gyorgy@0
|
259
|
gyorgy@0
|
260
|
gyorgy@0
|
261 def sessionError(TestPage):
|
gyorgy@0
|
262 print "################################# SESSION ERROR #################################"
|
gyorgy@0
|
263 resString = ',\n'.join(str(x) for x in TestPage.results)
|
gyorgy@0
|
264 resString += '\n\nERROR: SESSION CONFUSION'
|
gyorgy@0
|
265 f = open(TestPage.sid_filename, 'w')
|
gyorgy@0
|
266 f.write(resString)
|
gyorgy@0
|
267 f.close()
|
gyorgy@0
|
268 return '''
|
gyorgy@0
|
269 <p>
|
gyorgy@0
|
270 <a href="/test/">oh noes! there is something wrong with your session, please start again or go for a coffee!</a>
|
gyorgy@0
|
271 </p>'''
|
gyorgy@0
|
272
|
gyorgy@0
|
273
|
gyorgy@0
|
274 def getSid(TestPage):
|
gyorgy@0
|
275 result_txts = os.listdir('results')
|
gyorgy@0
|
276 print result_txts
|
gyorgy@0
|
277 sid = int(random.random() * 100000000)
|
gyorgy@0
|
278 sid_filen = '%s.txt'%sid
|
gyorgy@0
|
279 while sid_filen in result_txts:
|
gyorgy@0
|
280 sid = int(random.random() * 100000000)
|
gyorgy@0
|
281 sid_filen = '%s.txt'%sid
|
gyorgy@0
|
282 return sid
|
gyorgy@0
|
283
|
gyorgy@0
|
284
|
gyorgy@0
|
285 # Of course we can also mount request handler objects right here!
|
gyorgy@0
|
286 root = HomePage()
|
gyorgy@0
|
287 root.test = TestPage()
|
gyorgy@0
|
288 #root = TestPage()
|
gyorgy@0
|
289
|
gyorgy@0
|
290
|
gyorgy@0
|
291 tutconf = os.path.join(os.path.dirname(__file__), 'conf.conf')
|
gyorgy@0
|
292
|
gyorgy@0
|
293 if __name__ == '__main__':
|
gyorgy@0
|
294 # CherryPy always starts with app.root when trying to map request URIs
|
gyorgy@0
|
295 # to objects, so we need to mount a request handler root. A request
|
gyorgy@0
|
296 # to '/' will be mapped to HelloWorld().index().
|
gyorgy@0
|
297 cherrypy.quickstart(root, config=tutconf)
|
gyorgy@0
|
298 else:
|
gyorgy@0
|
299 # This branch is for the test suite; you can ignore it.
|
gyorgy@0
|
300 cherrypy.tree.mount(root, config=tutconf)
|
gyorgy@0
|
301
|