source: main/waeup.kofa/trunk/src/waeup/kofa/doctests/batchprocessing_browser.txt @ 17762

Last change on this file since 17762 was 17755, checked in by Henrik Bettermann, 8 months ago

Add exporter and importer for session configuration objects (tests will follow).

File size: 20.6 KB
RevLine 
[12920]1Batch Processing via Browser
[4857]2****************************
3
[4869]4Preliminaries:
5
6We define a function that looks up a form with several submit buttons
7for the one with a given value (this functionality is missing in
8zope.testbrowser):
9
10    >>> def lookup_submit_value(name, value, browser):
11    ...   """Find a button with a certain value."""
12    ...   for num in range(0, 100):
13    ...     try:
14    ...       button = browser.getControl(name=name, index=num)
[4899]15    ...       if button.value.endswith(value):
[4869]16    ...         return button
17    ...     except IndexError:
18    ...       break
19    ...   return None
20
[4857]21Create a site:
22
[7811]23    >>> from waeup.kofa.app import University
[4857]24    >>> getRootFolder()['app'] = University()
[9312]25    >>> from zope.component.hooks import setSite
26    >>> setSite(getRootFolder()['app'])
[4857]27
28Create a datacenter storage path:
29
30    >>> import os
31    >>> import tempfile
32    >>> dc_path = tempfile.mkdtemp()
33
34Log in:
35
36    >>> from zope.testbrowser.testing import Browser
37    >>> browser = Browser()
38    >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
39    >>> browser.handleErrors = False
40
41Set datacenter path and deselect moving old data:
42
43    >>> browser.open('http://localhost/app')
44    >>> browser.getLink('Data Center').click()
45    >>> browser.getLink('Edit settings').click()
46    >>> browser.getControl(name='newpath').value = dc_path
47    >>> browser.getControl(name='move').value = False
48    >>> browser.getControl(name='save').click()
49
[6611]50Set non-usable datacenter path:
51
52    >>> browser.getLink('Edit settings').click()
53    >>> browser.getControl(name='newpath').value = '/'
54    >>> browser.getControl(name='save').click()
55    >>> 'Given storage path cannot be used.' in browser.contents
56    True
[11254]57    >>> browser.getControl('Back to Data Center').click()
[6611]58
59
[12920]60Batch Processing Faculties
[4857]61==========================
62
63Go to datacenter page:
64
65    >>> browser.open('http://localhost/app/datacenter')
66
[9919]67Prepare a CSV file for faculties (extended ascii values are accepted):
[4857]68
69    >>> open('faculties.csv', 'wb').write(
[6823]70    ... """code,title,title_prefix
71    ... FAC1,Faculty 1,faculty
72    ... FAC2,Faculty 2,institute
[9919]73    ... FAC3,Fäcülty 3,school
[4857]74    ... """)
75
76Upload the file:
77
78    >>> import cStringIO
[9024]79    >>> browser.getLink('Upload data').click()
[4857]80    >>> filecontents = cStringIO.StringIO(
81    ...   open('faculties.csv', 'rb').read())
82    >>> filewidget = browser.getControl(name='uploadfile:file')
83    >>> filewidget.add_file(filecontents, 'text/plain', 'faculties.csv')
84    >>> browser.getControl(name='SUBMIT').click()
85
86Step 1: start batch processing:
87
[13431]88    >>> browser.getLink('Process data').click()
[13394]89    >>> browser.getLink('Switch maintenance mode').click()
[4869]90    >>> button = lookup_submit_value(
91    ...   'select', 'faculties_zope.mgr.csv', browser)
92    >>> button.click()
[4857]93
94Step 2: select a processor and mode:
95
96    >>> importerselect = browser.getControl(name='importer')
97    >>> importerselect.displayOptions
[12439]98    ['AccessCodeBatch Processor',
99    'AccessCode Processor',
[13872]100    'ApplicantOnlinePayment Processor',
[12439]101    'Applicant Processor',
102    'ApplicantsContainer Processor',
[13431]103    'Bed Processor (update only)',
[12439]104    'CertificateCourse Processor',
105    'Certificate Processor',
[17755]106    'SessionConfiguration Processor',
[9420]107    'Course Processor',
[9418]108    'CourseTicket Processor',
[12439]109    'Department Processor',
110    'Faculty Processor',
[9203]111    'Hostel Processor',
[12439]112    'Public HTML Document Processor',
113    'StudentOnlinePayment Processor',
114    'Public PDF Document Processor',
115    'Public REST Document Processor',
116    'Student Processor',
[16834]117    'StudentStudyCourse Processor',
[8973]118    'StudentStudyLevel Processor',
119    'User Processor',
[9418]120    'Verdict Processor (special processor, update only)']
[4857]121
[7933]122    >>> importerselect.getControl('Faculty Processor').selected = True
[4857]123
124    >>> modeselect = browser.getControl(name='mode')
125    >>> modeselect.options
126    ['create', 'update', 'remove']
127
128    >>> modeselect.getControl(value='create').selected = True
[7705]129    >>> browser.getControl('Proceed to step 3').click()
[4857]130
131Step 3: Fix headerlines
132
133We get informed that there are no problems with the current header:
134
135    >>> print browser.contents
136    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
137    ...
138    Header fields OK
139    ...
140
141The submit button is enabled:
142
[7705]143    >>> browser.getControl('Perform import').disabled
[4857]144    False
145
[7705]146    >>> browser.getControl('Perform import').click()
[4857]147
148Step 4: See import results
149
150The import was successful:
151
152    >>> print browser.contents
153    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
154    ...Successfully processed 3 rows...
155    ...Batch processing finished...
156    ...File:...faculties_zope.mgr.csv...
157
[7749]158We can grep the entries generated in logfile:
[4857]159
[10099]160    >>> browser.open('http://localhost/app/datacenter/logs')
161    >>> browser.getControl('Show', index=0).click()
[4857]162    >>> print browser.contents
163    <!DOCTYPE ...
[10207]164    ...<h1 class="kofa-content-label">Logfile datacenter.log</h1>...
[4857]165
[7749]166    >>> browser.getControl(name='query').value = "zope.mgr"
167    >>> browser.getControl('Search').click()
[9739]168    >>> 'zope.mgr - processed' in browser.contents
[7749]169    True
[4857]170
[7749]171
[12920]172Batch Processing Departments
[4857]173============================
174
175    >>> browser.open('http://localhost/app/datacenter')
176
177Prepare a CSV file for departments:
178
179    >>> open('departments.csv', 'wb').write(
[6823]180    ... """code,faculty_code,title,title_prefix
181    ... DEP1,FAC1,Department 1,department
182    ... DEP2,FAC2,Department 2,centre
[4857]183    ... """)
184
185Upload the file:
186
187    >>> import cStringIO
[9024]188    >>> browser.getLink('Upload data').click()
[4857]189    >>> filecontents = cStringIO.StringIO(
190    ...   open('departments.csv', 'rb').read())
191    >>> filewidget = browser.getControl(name='uploadfile:file')
192    >>> filewidget.add_file(filecontents, 'text/plain', 'departments.csv')
193    >>> browser.getControl(name='SUBMIT').click()
194
195Step 1: start batch processing:
196
[13431]197    >>> browser.getLink('Process data').click()
[13394]198    >>> browser.getLink('Switch maintenance mode').click()
[4869]199    >>> button = lookup_submit_value(
200    ...   'select', 'departments_zope.mgr.csv', browser)
201    >>> button.click()
[4857]202
203Step 2: select a processor and mode:
204
205    >>> importerselect = browser.getControl(name='importer')
[7933]206    >>> importerselect.getControl('Department Processor').selected = True
[4857]207    >>> modeselect = browser.getControl(name='mode')
208    >>> modeselect.getControl(value='create').selected = True
[7705]209    >>> browser.getControl('Proceed to step 3').click()
[4857]210
211Step 3: Fix headerlines
212
213We get informed that there are no problems with the current header:
214
215    >>> print browser.contents
216    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
217    ...
218    Header fields OK
219    ...
220
221The submit button is enabled:
222
[7705]223    >>> browser.getControl('Perform import').disabled
[4857]224    False
225
[7705]226    >>> browser.getControl('Perform import').click()
[4857]227
228Step 4: See import results
229
230The import was successful:
231
232    >>> print browser.contents
233    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
234    ...Successfully processed 2 rows...
235    ...Batch processing finished...
236    ...File:...departments_zope.mgr.csv...
237
[12920]238Batch Processing Courses
[4857]239========================
240
241    >>> browser.open('http://localhost/app/datacenter')
242
243Prepare a CSV file for courses:
244
245    >>> open('courses.csv', 'wb').write(
246    ... """code,faculty_code,department_code,title,level,passmark,credits,semester
247    ... CRS1,FAC1,DEP1,Course 1,100,40,2,1
248    ... CRS2,FAC1,DEP1,Course 2,100,40,2,2
249    ... """)
250
251Upload the file:
252
253    >>> import cStringIO
[9024]254    >>> browser.getLink('Upload data').click()
[4857]255    >>> filecontents = cStringIO.StringIO(
256    ...   open('courses.csv', 'rb').read())
257    >>> filewidget = browser.getControl(name='uploadfile:file')
258    >>> filewidget.add_file(filecontents, 'text/plain', 'courses.csv')
259    >>> browser.getControl(name='SUBMIT').click()
260
261Step 1: start batch processing:
262
[13431]263    >>> browser.getLink('Process data').click()
[13394]264    >>> browser.getLink('Switch maintenance mode').click()
[4869]265    >>> button = lookup_submit_value(
266    ...   'select', 'courses_zope.mgr.csv', browser)
267    >>> button.click()
[4857]268
269Step 2: select a processor and mode:
270
271    >>> importerselect = browser.getControl(name='importer')
[7954]272    >>> importerselect.getControl('Course Processor', index=1).selected = True
[4857]273    >>> modeselect = browser.getControl(name='mode')
274    >>> modeselect.getControl(value='create').selected = True
[7705]275    >>> browser.getControl('Proceed to step 3').click()
[4857]276
277Step 3: Fix headerlines
278
279We get informed that there are no problems with the current header:
280
281    >>> print browser.contents
282    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
283    ...
284    Header fields OK
285    ...
286
287The submit button is enabled:
288
[7705]289    >>> browser.getControl('Perform import').disabled
[4857]290    False
291
[7705]292    >>> browser.getControl('Perform import').click()
[4857]293
294Step 4: See import results
295
296The import was successful:
297
298    >>> print browser.contents
299    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
300    ...Successfully processed 2 rows...
301    ...Batch processing finished...
302    ...File:...courses_zope.mgr.csv...
303
[12920]304Batch Processing Certificates
[4857]305=============================
306
307    >>> browser.open('http://localhost/app/datacenter')
308
309Prepare a CSV file for certificates:
310
311    >>> open('certificates.csv', 'wb').write(
[5947]312    ... """code,faculty_code,department_code,title,study_mode,start_level,end_level,application_category
[8472]313    ... CERT1,FAC1,DEP1,Certificate 1,pg_ft,999,999,basic
[5986]314    ... CERT2,FAC1,DEP1,Certificate 2,ug_ft,200,300,cest
[4857]315    ... """)
316
317Upload the file:
318
319    >>> import cStringIO
[9024]320    >>> browser.getLink('Upload data').click()
[4857]321    >>> filecontents = cStringIO.StringIO(
322    ...   open('certificates.csv', 'rb').read())
323    >>> filewidget = browser.getControl(name='uploadfile:file')
324    >>> filewidget.add_file(filecontents, 'text/plain', 'certificates.csv')
325    >>> browser.getControl(name='SUBMIT').click()
326
327Step 1: start batch processing:
328
[13431]329    >>> browser.getLink('Process data').click()
[13394]330    >>> browser.getLink('Switch maintenance mode').click()
[4869]331    >>> button = lookup_submit_value(
332    ...   'select', 'certificates_zope.mgr.csv', browser)
333    >>> button.click()
[4857]334
[4869]335
[4857]336Step 2: select a processor and mode:
337
338    >>> importerselect = browser.getControl(name='importer')
[7933]339    >>> importerselect.getControl('Certificate Processor').selected = True
[4857]340    >>> modeselect = browser.getControl(name='mode')
341    >>> modeselect.getControl(value='create').selected = True
[7705]342    >>> browser.getControl('Proceed to step 3').click()
[4857]343
344Step 3: Fix headerlines
345
346We get informed that there are no problems with the current header:
347
348    >>> print browser.contents
349    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
350    ...
351    Header fields OK
352    ...
353
354The submit button is enabled:
355
[7705]356    >>> browser.getControl('Perform import').disabled
[4857]357    False
358
[7705]359    >>> browser.getControl('Perform import').click()
[4857]360
361Step 4: See import results
362
363The import was successful:
364
365    >>> print browser.contents
366    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
367    ...Successfully processed 2 rows...
368    ...Batch processing finished...
369    ...File:...certificates_zope.mgr.csv...
370
[12920]371Batch Processing Certificate Courses
[4857]372====================================
373
374    >>> browser.open('http://localhost/app/datacenter')
375
376Prepare a CSV file for certificate courses:
377
378    >>> open('mycertcourses.csv', 'wb').write(
[7665]379    ... """course,faculty_code,department_code,certificate_code,level,mandatory
[4857]380    ... CRS1,FAC1,DEP1,CERT1,100,True
381    ... CRS2,FAC1,DEP1,CERT1,100,True
382    ... """)
383
384Upload the file:
385
386    >>> import cStringIO
[9024]387    >>> browser.getLink('Upload data').click()
[4857]388    >>> filecontents = cStringIO.StringIO(
389    ...   open('mycertcourses.csv', 'rb').read())
390    >>> filewidget = browser.getControl(name='uploadfile:file')
391    >>> filewidget.add_file(filecontents, 'text/plain', 'mycertcourses.csv')
392    >>> browser.getControl(name='SUBMIT').click()
393
394Step 1: start batch processing:
395
[13431]396    >>> browser.getLink('Process data').click()
[13394]397    >>> browser.getLink('Switch maintenance mode').click()
[4869]398    >>> button = lookup_submit_value(
399    ...   'select', 'mycertcourses_zope.mgr.csv', browser)
400    >>> button.click()
[4857]401
402Step 2: select a processor and mode:
403
404    >>> importerselect = browser.getControl(name='importer')
[7933]405    >>> importerselect.getControl('CertificateCourse Processor').selected = True
[4857]406    >>> modeselect = browser.getControl(name='mode')
407    >>> modeselect.getControl(value='create').selected = True
[7705]408    >>> browser.getControl('Proceed to step 3').click()
[4857]409
410Step 3: Fix headerlines
411
412We get informed that there are no problems with the current header:
413
414    >>> print browser.contents
415    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
416    ...
417    Header fields OK
418    ...
419
420The submit button is enabled:
421
[7705]422    >>> browser.getControl('Perform import').disabled
[4857]423    False
424
[7705]425    >>> browser.getControl('Perform import').click()
[4857]426
427Step 4: See import results
428
429The import was successful:
430
431    >>> print browser.contents
432    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
433    ...Successfully processed 2 rows...
434    ...Batch processing finished...
435    ...File:...mycertcourses_zope.mgr.csv...
436
[12920]437Batch Processing Users
[8973]438======================
[4857]439
[8973]440    >>> browser.open('http://localhost/app/datacenter')
441
[9203]442Prepare a CSV file for users:
[8973]443
444    >>> open('users.csv', 'wb').write(
[8976]445    ... """name,title,public_name,email,phone,roles
[9310]446    ... uli,Uli Fouquet,Chief Developer,uli@abc.de,+49-234-567,[]
447    ... henrik,Henrik Bettermann,Admin,henrik@abc.de,+49-234-567,"['waeup.PortalManager', 'waeup.ImportManager']"
[12190]448    ... anne,Anne Palina,,anne@abc.de,+49-234-567,"['waeup.Nonsense']"
[8973]449    ... """)
450
451Upload the file:
452
453    >>> import cStringIO
[9024]454    >>> browser.getLink('Upload data').click()
[8973]455    >>> filecontents = cStringIO.StringIO(
456    ...   open('users.csv', 'rb').read())
457    >>> filewidget = browser.getControl(name='uploadfile:file')
458    >>> filewidget.add_file(filecontents, 'text/plain', 'users.csv')
459    >>> browser.getControl(name='SUBMIT').click()
460
461Step 1: start batch processing:
462
[13431]463    >>> browser.getLink('Process data').click()
[13394]464    >>> browser.getLink('Switch maintenance mode').click()
[8973]465    >>> button = lookup_submit_value(
466    ...   'select', 'users_zope.mgr.csv', browser)
467    >>> button.click()
468
469Step 2: select a processor and mode:
470
471    >>> importerselect = browser.getControl(name='importer')
472    >>> importerselect.getControl('User Processor').selected = True
473    >>> modeselect = browser.getControl(name='mode')
474    >>> modeselect.getControl(value='create').selected = True
475    >>> browser.getControl('Proceed to step 3').click()
476
477Step 3: Fix headerlines
478
479We get informed that there are no problems with the current header:
480
481    >>> print browser.contents
482    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
483    ...
484    Header fields OK
485    ...
486
487The submit button is enabled:
488
489    >>> browser.getControl('Perform import').disabled
490    False
491
492    >>> browser.getControl('Perform import').click()
493
494Step 4: See import results
495
496The import was successful:
497
498    >>> print browser.contents
499    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
500    ...Successfully processed 2 rows...
501    ...Batch processing finished...
502    ...File:...users_zope.mgr.csv...
503
[9310]504User henrik has got the global roles:
505
506   >>> henrik = getRootFolder()['app']['users']['henrik']
507   >>> henrik.roles
[9312]508   ['waeup.PortalManager', 'waeup.AcademicsOfficer', 'waeup.ImportManager']
[9310]509
[12920]510Pending Files
[4899]511=============
512
513When an error occurs during an import, two files are generated: a CSV
514file with finished files and a CSV file with pending data. Both are
515stored in the appropriate subdirectories in datacenter. We try to
516create faculties, from which one already exists.
517
518Go to datacenter page:
519
520    >>> browser.open('http://localhost/app/datacenter')
521
522Prepare a CSV file for faculties:
523
524    >>> open('newfaculties.csv', 'wb').write(
[6823]525    ... """code,title,title_prefix
526    ... FAC1,Faculty 1,faculty
527    ... FAC4,Faculty 4,school
[12191]528    ... FAC 5,Faculty 5,faculty
[4899]529    ... """)
530
531Upload the file:
532
533    >>> import cStringIO
[9024]534    >>> browser.getLink('Upload data').click()
[4899]535    >>> filecontents = cStringIO.StringIO(
536    ...   open('newfaculties.csv', 'rb').read())
537    >>> filewidget = browser.getControl(name='uploadfile:file')
538    >>> filewidget.add_file(filecontents, 'text/plain', 'newfaculties.csv')
539    >>> browser.getControl(name='SUBMIT').click()
540
[9310]541Since we now have a user with waeup.ImportManager role, an email has been sent:
542    >>> print browser.contents
543    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
544    ...
545    ...All import managers have been notified by email...
546    ...
547
[4899]548Step 1: start batch processing:
549
[13431]550    >>> browser.getLink('Process data').click()
[13394]551    >>> browser.getLink('Switch maintenance mode').click()
[4899]552    >>> button = lookup_submit_value(
553    ...   'select', 'newfaculties_zope.mgr.csv', browser)
554    >>> button.click()
555
556Step 2: select a processor and mode:
557
558    >>> importerselect = browser.getControl(name='importer')
[7933]559    >>> importerselect.getControl('Faculty Processor').selected = True
[4899]560    >>> modeselect = browser.getControl(name='mode')
561    >>> modeselect.getControl(value='create').selected = True
[7705]562    >>> browser.getControl('Proceed to step 3').click()
[4899]563
564Step 3: Fix headerlines
565
566As there should be no problem with the headers, we can immediately
567perfom the import:
568
[7705]569    >>> browser.getControl('Perform import').click()
[4899]570
[12191]571Two lines could not be imported:
[4899]572
573    >>> print browser.contents
574    <!DOCTYPE html PUBLIC...
575    ...
[12191]576    ...Processing of 2 rows failed...
[4899]577    ...Successfully processed 1 rows...
578    ...
579
580Now there are two files as a result in datacenter storage's root and
581``finished`` dirs:
582
[4998]583    >>> pending_file = dc_path + '/newfaculties_zope.mgr.create.pending.csv'
[4899]584    >>> print open(pending_file).read()
[6824]585    title_prefix,code,title,--ERRORS--
[12868]586    faculty,FAC1,Faculty 1,This object already exists.
[12415]587    faculty,FAC 5,Faculty 5,code: Invalid input
[4899]588
[4998]589    >>> finished_file = dc_path + '/finished/newfaculties_zope.mgr.create.finished.csv'
[4899]590    >>> print open(finished_file).read()
[6824]591    title_prefix,code,title
[6823]592    school,FAC4,Faculty 4
[4899]593
594The finished-file contains the dataset we could import, while the
595pending file contains the dataset that failed, appended by an error
596message.
597
598
[12920]599Fixing the Pending File
[4981]600-----------------------
601
602We 'edit' the pending file (setting code to ``FAC5`` and title
603appropriately, and removing the --ERROR-- column) and finish the
604import this way:
605
[4998]606    >>> open(dc_path + '/newfaculties_zope.mgr.create.pending.csv', 'wb').write(
[4981]607    ... """title_prefix,--IGNORE--,code,title
[12191]608    ... faculty,,FAC5,Faculty 5
[4981]609    ... """)
610
611Step 1: start batch processing:
612
613    >>> browser.open('http://localhost/app/datacenter')
[13431]614    >>> browser.getLink('Process data').click()
[13394]615    >>> browser.getLink('Switch maintenance mode').click()
[4981]616    >>> button = lookup_submit_value(
[4998]617    ...   'select', 'newfaculties_zope.mgr.create.pending.csv', browser)
[4981]618    >>> button.click()
619
620Step 2: select a processor and mode:
621
622    >>> importerselect = browser.getControl(name='importer')
[7933]623    >>> importerselect.getControl('Faculty Processor').selected = True
[4981]624    >>> modeselect = browser.getControl(name='mode')
625    >>> modeselect.getControl(value='create').selected = True
[7705]626    >>> browser.getControl('Proceed to step 3').click()
[4981]627
628Step 3/4: Fix headerlines and import:
629
630As there should be no problem with the headers, we can immediately
631perfom the import:
632
[7705]633    >>> browser.getControl('Perform import').click()
[4981]634
635This time everything should work:
636
637    >>> print browser.contents
638    <!DOCTYPE html PUBLIC...
639    ...
640    ...Successfully processed 1 rows...
641    ...
642
[12190]643Oh no, we forgot Anne Palina. Her user record was not imported because
644she has a non-existent role:
645
[4981]646    >>> sorted(os.listdir(dc_path))
[15416]647    ['deleted', 'finished', 'graduated', 'logs', 'unfinished', 'users_zope.mgr.create.pending.csv']
[4981]648
649    >>> os.listdir(dc_path + '/unfinished')
[12190]650    ['users_zope.mgr.csv']
[4981]651
[12190]652    >>> pending_file = dc_path + '/users_zope.mgr.create.pending.csv'
653    >>> print open(pending_file).read()
654    name,roles,title,public_name,phone,email,--ERRORS--
[12981]655    anne,['waeup.Nonsense'],Anne Palina,<IGNORE>,+49-234-567,anne@abc.de,roles: invalid role
[12190]656
657There are many finished-files:
658
[4981]659    >>> sorted(os.listdir(dc_path + '/finished'))
[8372]660    ['certificates_zope.mgr.create.finished.csv', ...,
[12190]661    'users_zope.mgr.create.finished.csv']
[4981]662
[9023]663Processed (finished) Files
664==========================
[4981]665
[9023]666    >>> browser.open('http://localhost/app/datacenter/processed')
[11460]667    >>> 'download?filename=finished/certificates_zope.mgr.create.finished.csv' in browser.contents
[9023]668    True
669
[6608]670Log Files
671=========
672
673    >>> browser.open('http://localhost/app/datacenter/logs')
674    >>> 'datacenter.log' in browser.contents
675    True
[6754]676    >>> browser.getControl('Show', index=0).click()
[6611]677    >>> browser.getControl('Back', index=0).click()
678    >>> browser.getControl('Back to Data Center').click()
679    >>> 'Storage path:' in browser.contents
680    True
[6608]681
682
[4857]683Clean up:
684
685    >>> import shutil
[6734]686    >>> shutil.rmtree(dc_path)
Note: See TracBrowser for help on using the repository browser.