source: main/waeup.sirp/trunk/src/waeup/sirp/accesscodes/browser.txt @ 5127

Last change on this file since 5127 was 5125, checked in by uli, 15 years ago

Update docs.

File size: 7.3 KB
Line 
1:mod:`waeup.sirp.accesscodes.browser` -- UI components for access-codes
2***********************************************************************
3
4.. module:: waeup.sirp.accesscodes.browser
5
6Here we visit the access-code related parts of a WAeUP SIRP site using
7a virtual browser.
8
9:Test-Layer: functional
10
11Preliminaries
12=============
13
14Before we can do anything, we have to create a university site:
15
16    >>> from zope.testbrowser.testing import Browser
17    >>> browser = Browser()
18    >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
19    >>> browser.handleErrors = False
20    >>> root = getRootFolder()
21
22    >>> from waeup.sirp.app import University
23    >>> u = University()
24    >>> root['myuniversity'] = u
25
26We set a new datacenter storage path:
27
28  >>> import os
29  >>> browser.open('http://localhost/myuniversity')
30  >>> browser.getLink('Data Center').click()
31  >>> browser.getLink('Edit settings').click()
32  >>> pathsetting = browser.getControl(name='newpath')
33
34  >>> cwd = os.getcwd()
35  >>> uploadpath = os.path.join(cwd, 'ac_testfiles')
36  >>> os.mkdir(uploadpath)
37  >>> pathsetting.value = uploadpath
38  >>> browser.getControl(name='save').click()
39
40We remove any existing 'accesscodes' dir from datacenter dir:
41
42  >>> import shutil
43  >>> if os.path.exists(os.path.join(uploadpath, 'accesscodes')):
44  ...   shutil.rmtree(os.path.join(uploadpath, 'accesscodes'))
45
46
47Access-code management screen
48=============================
49
50For users that have the right to manage access-code related stuff, the
51home page of a `University` instance provides a link to the
52access-code management screen. In the beginning, there are naturally
53no batches available:
54
55    >>> browser.open('http://localhost/myuniversity')
56    >>> browser.getLink('Manage access-codes').click()
57    >>> print browser.contents
58    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
59    ...
60    <h2>Access Code Batches</h2>
61    ...
62    ... The following batches are available:
63    ...No batches yet...
64    ...
65
66Adding batches
67==============
68
69We can add a batch of access-codes using a button displayed in the
70action bar:
71
72    >>> browser.getLink('Add Scratch Card Batch').click()
73
74The add screen shows a form where we have to enter a prefix, the
75number of access codes to be generated and the costs for each card.
76
77    >>> browser.getControl(name='form.batch_prefix').value = 'APP'
78    >>> browser.getControl(name='form.entry_num').value = '5'
79    >>> browser.getControl(name='form.cost').value = '12.12'
80
81If we click 'cancel' afterwards, the whole process will be cancelled
82and we'll be redirected to the management screen:
83
84    >>> browser.getControl('Cancel').click()
85    >>> browser.url
86    'http://localhost/myuniversity/accesscodes'
87
88    >>> 'Batch creation cancelled' in browser.contents
89    True
90
91Now let's try again and this time we finish the procedure by clicking
92'Create batch' in the form:
93
94    >>> browser.getLink('Add Scratch Card Batch').click()
95    >>> browser.getControl(name='form.batch_prefix').value = 'APP'
96    >>> browser.getControl(name='form.entry_num').value = '5'
97    >>> browser.getControl(name='form.cost').value = '12.12'
98    >>> browser.getControl('Create batch').click()
99
100We're also redirected to the management screen, with a notice about
101the freshly created batch:
102
103    >>> print browser.contents
104    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
105    ...
106    <h2>Access Code Batches</h2>
107    ...
108    ... The following batches are available:
109    ...APP
110    ...-
111    ...1
112    ...
113    ...5
114    .../
115    ...0
116    ...
117    ...12.12...
118    ...zope.mgr...
119    ...
120
121which means: there exists a batch named ``APP-1`` with 5 entries of
122which 0 have been devalidated, each one costs ``12.12`` and the batch
123was created by ``zope.mgr``.
124
125We create a second batch to see whether searching and related stuff
126works:
127
128    >>> browser.getLink('Add Scratch Card Batch').click()
129    >>> browser.getControl(name='form.batch_prefix').value = 'APP'
130    >>> browser.getControl(name='form.entry_num').value = '5'
131    >>> browser.getControl(name='form.cost').value = '10.12'
132    >>> browser.getControl('Create batch').click()
133
134And a third one that can be deleted afterwards:
135
136    >>> browser.getLink('Add Scratch Card Batch').click()
137    >>> browser.getControl(name='form.batch_prefix').value = 'BLA'
138    >>> browser.getControl(name='form.entry_num').value = '3'
139    >>> browser.getControl(name='form.cost').value = '19.12'
140    >>> browser.getControl('Create batch').click()
141
142Creating Archive Files
143======================
144
145Once a batch is created, we can archive it. To do so we have to tick
146the respective checkbox and click on 'Archive':
147
148    >>> ctrl = browser.getControl(name='batches')
149    >>> ctrl.getControl(value='APP-2').selected = True
150    >>> browser.getControl(name='archive').click()
151    >>> print browser.contents
152    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
153    ...
154    <li ...>Archived APP-2 (APP-2_archive-...-zope.mgr.csv)</li>
155    ...
156
157If we do not select a batch and try to archive or delete, the system
158will complain:
159
160    >>> browser.getControl(name='archive').click()
161    >>> print browser.contents
162    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
163    ...
164    <li ...>No batch selected.</li>
165    ...
166
167Deleting Batches
168================
169
170We can delete batches. They are automatically archived when doing so:
171
172    >>> ctrl = browser.getControl(name='batches')
173    >>> ctrl.getControl(value='BLA-1').selected = True
174    >>> browser.getControl('Archive and Delete').click()
175    >>> print browser.contents
176    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
177    ...Archived BLA-1 (BLA-1_archive-...-zope.mgr.csv)...
178    ...Deleted batch BLA-1...
179    ...
180
181
182Log- and Archive Files
183======================
184
185We store log- and archive-files inside the storage managed by the
186local datacenter. Access-code related files are placed inside an
187``accesscode`` subdir:
188
189    >>> ac_storage = os.path.join(uploadpath, 'accesscodes')
190
191Log files for access-code batches
192---------------------------------
193
194Whenever a batch is created, there is also a log file with all entries
195created:
196
197    >>> sorted(os.listdir(ac_storage))
198    ['APP-1-...-zope.mgr.csv', 'APP-2-...-zope.mgr.csv', ...]
199
200Each logfile name contains the prefix, batch number, date of creation
201and userid of creator.
202
203    >>> logfile1 = os.path.join(ac_storage,
204    ...                         sorted(os.listdir(ac_storage))[0])
205    >>> print open(logfile1, 'rb').read()
206    "serial","ac","cost"
207    "APP","1","12.12"
208    "0","APP-1-<10-DIGITS>"
209    "1","APP-1-<10-DIGITS>"
210    "2","APP-1-<10-DIGITS>"
211    "3","APP-1-<10-DIGITS>"
212    "4","APP-1-<10-DIGITS>"
213
214
215Archive files
216-------------
217
218We created an archive file above. An archive file name consists of the
219batch prefix, batch number, the string ``_archive``, creation datetime of
220the archive file and userid of batch creator:
221
222    >>> sorted(os.listdir(ac_storage))
223    [..., 'BLA-1_archive-...-zope.mgr.csv']
224
225Archive files eventually also contain infos about invalidation dates
226and have a slightly different format therefore.
227
228    >>> archive_file = os.path.join(ac_storage, os.listdir(ac_storage)[-1])
229    >>> print open(archive_file, 'rb').read()
230    "prefix","serial","ac","student","date"
231    "BLA","19.12","1","3"
232    "BLA","0","BLA-1-<10-DIGITS>","",""
233    "BLA","1","BLA-1-<10-DIGITS>","",""
234    "BLA","2","BLA-1-<10-DIGITS>","",""
235
236Clean up:
237
238    >>> shutil.rmtree(uploadpath)
Note: See TracBrowser for help on using the repository browser.