source: main/waeup.uniben/trunk/src/waeup/uniben/students/tests/test_browser.py @ 9513

Last change on this file since 9513 was 9513, checked in by Henrik Bettermann, 12 years ago

In Uniben students can pay for next session in all states > cleared.

  • Property svn:keywords set to Id
File size: 28.3 KB
Line 
1## $Id: test_browser.py 9513 2012-11-02 16:58:01Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18import os
19import shutil
20import tempfile
21from StringIO import StringIO
22from hurry.workflow.interfaces import IWorkflowState, IWorkflowInfo
23from zope.securitypolicy.interfaces import IPrincipalRoleManager
24from zope.component.hooks import setSite, clearSite
25from zope.component import getUtility, createObject
26from zope.interface import verify
27from zope.event import notify
28from waeup.kofa.authentication import LocalRoleSetEvent
29from waeup.kofa.app import University
30from waeup.kofa.students.tests.test_browser import StudentsFullSetup
31from waeup.kofa.students.accommodation import BedTicket
32from waeup.kofa.testing import FunctionalTestCase
33from waeup.kofa.interfaces import (
34    IExtFileStore, IFileStoreNameChooser)
35from waeup.kofa.students.interfaces import IStudentsUtils
36from waeup.uniben.testing import FunctionalLayer
37
38
39class StudentProcessorTest(FunctionalTestCase):
40    """Perform some batching tests.
41    """
42
43    layer = FunctionalLayer
44
45    def setUp(self):
46        super(StudentProcessorTest, self).setUp()
47        # Setup a sample site for each test
48        app = University()
49        self.dc_root = tempfile.mkdtemp()
50        app['datacenter'].setStoragePath(self.dc_root)
51
52        # Prepopulate the ZODB...
53        self.getRootFolder()['app'] = app
54        # we add the site immediately after creation to the
55        # ZODB. Catalogs and other local utilities are not setup
56        # before that step.
57        self.app = self.getRootFolder()['app']
58        # Set site here. Some of the following setup code might need
59        # to access grok.getSite() and should get our new app then
60        setSite(app)
61
62
63    def tearDown(self):
64        super(StudentProcessorTest, self).tearDown()
65        shutil.rmtree(self.workdir)
66        shutil.rmtree(self.dc_root)
67        clearSite()
68        return
69
70class StudentUITests(StudentsFullSetup):
71    """Tests for customized student class views and pages
72    """
73
74    layer = FunctionalLayer
75
76    def setUp(self):
77        super(StudentUITests, self).setUp()
78
79        bedticket = BedTicket()
80        bedticket.booking_session = 2004
81        bedticket.bed_type = u'any bed type'
82        bedticket.bed = self.app['hostels']['hall-1']['hall-1_A_101_A']
83        bedticket.bed_coordinates = u'My bed coordinates'
84        self.student['accommodation'].addBedTicket(bedticket)
85
86    def test_next_session_allowed(self):
87        # Let's see if next_session_allowed works as expected
88        # A, ug_ft, 100
89        IWorkflowState(self.student).setState('returning')
90        self.assertTrue(self.student['studycourse'].next_session_allowed)
91        # Uniben special PG programmes have the same workflow
92        # as UG students
93        self.certificate.study_mode = 'special_pg_pt'
94        self.assertTrue(self.student['studycourse'].next_session_allowed)
95        IWorkflowState(self.student).setState('school fee paid')
96        self.assertFalse(self.student['studycourse'].next_session_allowed)
97        # Now we convert the certificate into a 'regular
98        # postgraduate certificate ...
99        self.certificate.study_mode = 'pg_ft'
100        # ... and voila next session registration is allowed
101        self.assertTrue(self.student['studycourse'].next_session_allowed)
102
103    def test_manage_access(self):
104        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
105        # The student created in the base package is a ug student
106        self.browser.open(self.manage_clearance_path)
107        self.assertMatches('...First Sitting Record...',
108                           self.browser.contents)
109        # There is no pg field in the clearance form
110        self.assertFalse('Second Higher Education Record'
111            in self.browser.contents)
112        # Now we change the study mode ...
113        self.certificate.study_mode = 'pg_ft'
114        self.browser.open(self.clearance_path)
115        # ... and additional pg clearance fields appear
116        self.assertMatches('...Second Higher Education Record...',
117                           self.browser.contents)
118        # But also fields from the ug form are displayed
119        self.assertMatches('...First Sitting Record...',
120                           self.browser.contents)
121        # The same holds for Uniben's special pg students
122        self.certificate.study_mode = 'special_pg_ft'
123        self.browser.open(self.clearance_path)
124        self.assertMatches('...Second Higher Education Record...',
125                           self.browser.contents)
126        self.assertMatches('...First Sitting Record...',
127                           self.browser.contents)
128        self.browser.open(self.student_path + '/clearance_slip.pdf')
129        self.assertEqual(self.browser.headers['Status'], '200 Ok')
130        self.assertEqual(self.browser.headers['Content-Type'],
131                         'application/pdf')
132
133    def test_student_access(self):
134        # Students can edit clearance data
135        IWorkflowState(self.student).setState('clearance started')
136        self.student.clearance_locked = False
137        self.student.nationality = u'NG'
138        file_store = getUtility(IExtFileStore)
139        self.browser.open(self.login_path)
140        self.browser.getControl(name="form.login").value = self.student_id
141        self.browser.getControl(name="form.password").value = 'spwd'
142        self.browser.getControl("Login").click()
143        self.browser.open(self.edit_clearance_path)
144
145        # Clearance can only be requested if all required documents
146        # have been uploaded.
147        self.browser.getControl("Save and request clearance").click()
148        self.assertTrue('No birth certificate uploaded'
149            in self.browser.contents)
150        birth_certificate = 'My birth certificate'
151        file_id = IFileStoreNameChooser(self.student).chooseName(
152            attr="birth_certificate.jpg")
153        file_store.createFile(file_id, StringIO(birth_certificate))
154        self.browser.open(self.edit_clearance_path)
155        self.browser.getControl("Save and request clearance").click()
156
157        self.assertTrue('No guarantor/referee letter uploaded'
158            in self.browser.contents)
159        ref_let = 'My ref let'
160        file_id = IFileStoreNameChooser(self.student).chooseName(
161            attr="ref_let.jpg")
162        file_store.createFile(file_id, StringIO(ref_let))
163        self.browser.open(self.edit_clearance_path)
164        self.browser.getControl("Save and request clearance").click()
165
166        self.assertTrue('No acceptance letter uploaded'
167            in self.browser.contents)
168        acc_let = 'My acc let'
169        file_id = IFileStoreNameChooser(self.student).chooseName(
170            attr="acc_let.jpg")
171        file_store.createFile(file_id, StringIO(acc_let))
172        self.browser.open(self.edit_clearance_path)
173        self.browser.getControl("Save and request clearance").click()
174
175        self.assertTrue('No first sitting result uploaded'
176            in self.browser.contents)
177        fst_sit_scan = 'My first sitting result'
178        file_id = IFileStoreNameChooser(self.student).chooseName(
179            attr="fst_sit_scan.jpg")
180        file_store.createFile(file_id, StringIO(fst_sit_scan))
181        self.browser.open(self.edit_clearance_path)
182        self.browser.getControl("Save and request clearance").click()
183
184        #self.assertTrue('No second sitting result uploaded'
185        #    in self.browser.contents)
186        #scd_sit_scan = 'My second sitting result'
187        #file_id = IFileStoreNameChooser(self.student).chooseName(
188        #    attr="scd_sit_scan.jpg")
189        #file_store.createFile(file_id, StringIO(scd_sit_scan))
190        #self.browser.open(self.edit_clearance_path)
191        #self.browser.getControl("Save and request clearance").click()
192
193        self.assertTrue('No affidavit of non-menbership of secret cults uploaded'
194            in self.browser.contents)
195        secr_cults = 'My non-membership scan'
196        file_id = IFileStoreNameChooser(self.student).chooseName(
197            attr="secr_cults.jpg")
198        file_store.createFile(file_id, StringIO(secr_cults))
199        self.browser.open(self.edit_clearance_path)
200        self.browser.getControl("Save and request clearance").click()
201
202        self.assertTrue('Clearance has been requested'
203            in self.browser.contents)
204
205    def test_manage_payments(self):
206        # Add missing configuration data
207        self.app['configuration']['2004'].gown_fee = 150.0
208        self.app['configuration']['2004'].transfer_fee = 90.0
209        #self.app['configuration']['2004'].clearance_fee = 120.0
210        self.app['configuration']['2004'].booking_fee = 150.0
211        self.app['configuration']['2004'].maint_fee = 180.0
212
213        # Managers can add online payment tickets
214        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
215        self.browser.open(self.payments_path)
216        self.browser.getControl("Add online payment ticket").click()
217        self.browser.getControl("Create ticket").click()
218        self.assertMatches('...Amount could not be determined...',
219                           self.browser.contents)
220        IWorkflowState(self.student).setState('cleared')
221        self.student.nationality = u'NG'
222        self.browser.open(self.payments_path + '/addop')
223        self.browser.getControl("Create ticket").click()
224        self.assertMatches('...ticket created...',
225                           self.browser.contents)
226        ctrl = self.browser.getControl(name='val_id')
227        value = ctrl.options[0]
228        self.browser.getLink(value).click()
229        self.assertMatches('...Amount Authorized...',
230                           self.browser.contents)
231        # Managers can open payment slip
232        self.browser.getLink("Download payment slip").click()
233        self.assertEqual(self.browser.headers['Status'], '200 Ok')
234        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
235        # Set ticket paid
236        ticket = self.student['payments'].items()[0][1]
237        ticket.p_state = 'paid'
238        self.browser.open(self.payments_path + '/addop')
239        self.browser.getControl("Create ticket").click()
240        self.assertMatches('...This type of payment has already been made...',
241                           self.browser.contents)
242        # Remove all payments so that we can add a school fee payment again
243        keys = [i for i in self.student['payments'].keys()]
244        for payment in keys:
245            del self.student['payments'][payment]
246        self.browser.open(self.payments_path + '/addop')
247        self.browser.getControl("Create ticket").click()
248        self.assertMatches('...ticket created...',
249                           self.browser.contents)
250        self.browser.open(self.payments_path + '/addop')
251        self.browser.getControl(name="form.p_category").value = ['gown']
252        self.browser.getControl("Create ticket").click()
253        self.assertMatches('...ticket created...',
254                           self.browser.contents)
255        self.browser.open(self.payments_path + '/addop')
256        self.browser.getControl(name="form.p_category").value = ['transfer']
257        self.browser.getControl("Create ticket").click()
258        self.assertMatches('...ticket created...',
259                           self.browser.contents)
260        self.browser.open(self.payments_path + '/addop')
261        self.browser.getControl(
262            name="form.p_category").value = ['bed_allocation']
263        self.browser.getControl("Create ticket").click()
264        self.assertMatches('...ticket created...',
265                           self.browser.contents)
266        self.browser.open(self.payments_path + '/addop')
267        self.browser.getControl(
268            name="form.p_category").value = ['hostel_maintenance']
269        self.browser.getControl("Create ticket").click()
270        self.assertMatches('...ticket created...',
271                           self.browser.contents)
272        self.browser.open(self.payments_path + '/addop')
273        self.browser.getControl(name="form.p_category").value = ['clearance']
274        self.browser.getControl("Create ticket").click()
275        self.assertMatches('...ticket created...',
276                           self.browser.contents)
277        self.browser.open(self.payments_path + '/addop')
278        self.browser.getControl(name="form.p_category").value = ['schoolfee']
279        self.browser.getControl("Create ticket").click()
280        self.assertMatches('...ticket created...',
281                           self.browser.contents)
282        # In state returning we can add a new school fee ticket since
283        # p_session and p_level is different
284        IWorkflowState(self.student).setState('returning')
285        self.browser.open(self.payments_path + '/addop')
286        self.browser.getControl(name="form.p_category").value = ['schoolfee']
287        self.browser.getControl("Create ticket").click()
288        self.assertMatches('...Session configuration object is not...',
289                           self.browser.contents)
290        # Uups, we forgot to add a session configuration for next session
291        configuration = createObject('waeup.SessionConfiguration')
292        configuration.academic_session = 2005
293        self.app['configuration'].addSessionConfiguration(configuration)
294        self.browser.open(self.payments_path + '/addop')
295        self.browser.getControl(name="form.p_category").value = ['schoolfee']
296        self.browser.getControl("Create ticket").click()
297        self.assertMatches('...ticket created...',
298                           self.browser.contents)
299        # In state admitted school fee can't be determined
300        IWorkflowState(self.student).setState('admitted')
301        self.browser.open(self.payments_path + '/addop')
302        self.browser.getControl(name="form.p_category").value = ['schoolfee']
303        self.browser.getControl("Create ticket").click()
304        self.assertMatches('...Amount could not be determined...',
305                           self.browser.contents)
306
307        # If the session configuration doesn't exist an error message will
308        # be shown. No other requirement is being checked.
309        del self.app['configuration']['2004']
310        self.browser.open(self.payments_path)
311        self.browser.getControl("Add online payment ticket").click()
312        self.browser.getControl("Create ticket").click()
313        self.assertMatches('...Session configuration object is not...',
314                           self.browser.contents)
315
316    def test_get_returning_data(self):
317        # Student is in level 100, session 2004 with verdict A
318        utils = getUtility(IStudentsUtils)
319        self.assertEqual(utils.getReturningData(self.student),(2005, 200))
320        self.student['studycourse'].current_verdict = 'C'
321        self.assertEqual(utils.getReturningData(self.student),(2005, 110))
322        self.student['studycourse'].current_verdict = 'D'
323        self.assertEqual(utils.getReturningData(self.student),(2005, 100))
324        return
325
326    def test_set_returning_data(self):
327        # Student is in level 100, session 2004 with verdict A
328        utils = getUtility(IStudentsUtils)
329
330        utils.setReturningData(self.student)
331        self.assertEqual(self.student['studycourse'].current_session, 2005)
332        self.assertEqual(self.student['studycourse'].current_level, 200)
333
334        self.student['studycourse'].current_session = 2004
335        self.student['studycourse'].current_level = 100
336        self.student['studycourse'].current_verdict = 'C'
337        utils.setReturningData(self.student)
338        self.assertEqual(self.student['studycourse'].current_session, 2005)
339        self.assertEqual(self.student['studycourse'].current_level, 110)
340
341        self.student['studycourse'].current_session = 2004
342        self.student['studycourse'].current_level = 100
343        self.student['studycourse'].current_verdict = 'D'
344        utils.setReturningData(self.student)
345        self.assertEqual(self.student['studycourse'].current_session, 2005)
346        self.assertEqual(self.student['studycourse'].current_level, 100)
347        return
348
349    def test_set_payment_details(self):
350        self.app['configuration']['2004'].gown_fee = 150.0
351        self.app['configuration']['2004'].transfer_fee = 90.0
352        self.app['configuration']['2004'].booking_fee = 150.0
353        self.app['configuration']['2004'].maint_fee = 180.0
354
355        configuration = createObject('waeup.SessionConfiguration')
356        configuration.academic_session = 2000
357        self.app['configuration'].addSessionConfiguration(configuration)
358        configuration2 = createObject('waeup.SessionConfiguration')
359        configuration2.academic_session = 2002
360        self.app['configuration'].addSessionConfiguration(configuration2)
361        configuration3 = createObject('waeup.SessionConfiguration')
362        configuration3.academic_session = 2003
363        self.app['configuration'].addSessionConfiguration(configuration3)
364
365        utils = getUtility(IStudentsUtils)
366
367        self.student['studycourse'].entry_session = 2002
368        self.student.nationality = u'NG'
369
370        configuration = createObject('waeup.SessionConfiguration')
371        configuration.academic_session = 2005
372        self.app['configuration'].addSessionConfiguration(configuration)
373
374        error, payment = utils.setPaymentDetails('schoolfee',
375            self.student, None, None)
376        self.assertEqual(payment, None)
377        self.assertTrue(u'Amount could not be determined.' in error)
378
379        # Previous session must be valid.
380        error, payment = utils.setPaymentDetails('schoolfee',
381            self.student, 2000, 300)
382        self.assertEqual(payment, None)
383        self.assertTrue(u'The previous session must not fall below' in error)
384        error, payment = utils.setPaymentDetails('schoolfee',
385            self.student, 2004, 300)
386        self.assertEqual(payment, None)
387        self.assertTrue(u'This is not a previous session' in error)
388
389        # Previous session payment; fresh and returning
390        # are distinguished by their entry_level
391        error, payment = utils.setPaymentDetails('schoolfee',
392            self.student, 2002, 300)
393        self.assertEqual(payment.amount_auth, 40000.0)
394        self.assertEqual(payment.p_session, 2002)
395        self.assertEqual(payment.p_level, 300)
396        self.assertFalse(payment.p_current)
397        error, payment = utils.setPaymentDetails('schoolfee',
398            self.student, 2003, 300)
399        self.assertEqual(payment.amount_auth, 20000.0)
400        self.assertEqual(payment.p_session, 2003)
401        self.assertEqual(payment.p_level, 300)
402        self.assertFalse(payment.p_current)
403
404        # Current payment; fresh and returning
405        # are distinguished by their state
406        IWorkflowState(self.student).setState('cleared')
407        error, payment = utils.setPaymentDetails('schoolfee',
408            self.student, None, None)
409        self.assertEqual(payment.p_level, 100)
410        self.assertEqual(payment.p_session, 2004)
411        self.assertEqual(payment.amount_auth, 40000.0)
412        self.assertEqual(payment.p_item, u'CERT1')
413        self.assertEqual(error, None)
414        self.assertTrue(payment.p_current)
415
416        # Add penalty fee ...
417        # ... for cleared
418        self.app['configuration']['2004'].penalty_ug = 99.0
419        # ... for returning
420        self.app['configuration']['2005'].penalty_ug = 88.0
421        error, payment = utils.setPaymentDetails('schoolfee',
422            self.student, None, None)
423        self.assertEqual(payment.amount_auth, 40099.0)
424
425        IWorkflowState(self.student).setState('returning')
426        error, payment = utils.setPaymentDetails('schoolfee',
427            self.student, None, None)
428        self.assertEqual(payment.p_level, 200)
429        self.assertEqual(payment.p_session, 2005)
430        self.assertEqual(payment.amount_auth, 20088.0)
431        self.assertEqual(payment.p_item, u'CERT1')
432        self.assertEqual(error, None)
433        self.student.is_staff = True
434        error, payment = utils.setPaymentDetails('schoolfee',
435            self.student, None, None)
436        self.assertEqual(payment.p_level, 200)
437        self.assertEqual(payment.p_session, 2005)
438        self.assertEqual(payment.amount_auth, 10088.0)
439        self.assertEqual(payment.p_item, u'CERT1')
440        self.assertEqual(error, None)
441
442        IWorkflowState(self.student).setState('cleared')
443        self.student.is_staff = False
444        self.student.nationality = u'DE'
445        self.certificate.school_fee_3 = 60000.0
446        error, payment = utils.setPaymentDetails(
447            'schoolfee', self.student, None, None)
448        self.assertEqual(payment.p_level, 100)
449        self.assertEqual(payment.p_session, 2004)
450        self.assertEqual(payment.amount_auth, 60099.0)
451        self.assertEqual(payment.p_item, u'CERT1')
452        self.assertEqual(error, None)
453
454        IWorkflowState(self.student).setState('returning')
455        self.student.is_staff = False
456        self.student.nationality = u'DE'
457        self.certificate.school_fee_4 = 20000.0
458        error, payment = utils.setPaymentDetails(
459            'schoolfee', self.student, None, None)
460        self.assertEqual(payment.p_level, 200)
461        self.assertEqual(payment.p_session, 2005)
462        self.assertEqual(payment.amount_auth, 20088.0)
463        self.assertEqual(payment.p_item, u'CERT1')
464        self.assertEqual(error, None)
465
466        # In Uniben students can pay school fee in all states no matter
467        # if they are ug or pg students.
468        IWorkflowState(self.student).setState('school fee paid')
469        self.certificate.study_mode = 'special_pg_pt'
470        self.student.is_staff = False
471        self.student.nationality = u'NG'
472        self.certificate.school_fee_2 = 10000.0
473
474        error, payment = utils.setPaymentDetails(
475            'schoolfee', self.student, None, None)
476        self.assertEqual(payment.p_level, None)
477        self.assertEqual(payment.p_session, 2005)
478        self.assertEqual(payment.amount_auth, 10000.0)
479        self.assertEqual(payment.p_item, u'CERT1')
480        self.assertEqual(error, None)
481
482        IWorkflowState(self.student).setState('courses registered')
483        error, payment = utils.setPaymentDetails(
484            'schoolfee', self.student, None, None)
485        self.assertEqual(payment.p_level, None)
486        self.assertEqual(payment.p_session, 2005)
487        self.assertEqual(payment.amount_auth, 10000.0)
488        self.assertEqual(payment.p_item, u'CERT1')
489        self.assertEqual(error, None)
490
491        IWorkflowState(self.student).setState('courses validated')
492        error, payment = utils.setPaymentDetails(
493            'schoolfee', self.student, None, None)
494        self.assertEqual(payment.p_level, None)
495        self.assertEqual(payment.p_session, 2005)
496        self.assertEqual(payment.amount_auth, 10000.0)
497        self.assertEqual(payment.p_item, u'CERT1')
498        self.assertEqual(error, None)
499
500        error, payment = utils.setPaymentDetails('clearance',
501            self.student, None, None)
502        self.assertEqual(payment.p_level, 100)
503        self.assertEqual(payment.p_session, 2004)
504        self.assertEqual(payment.amount_auth, 45000.0)
505        self.assertEqual(payment.p_item, u'CERT1')
506        self.assertEqual(error, None)
507
508        error, payment = utils.setPaymentDetails('gown',
509            self.student, None, None)
510        self.assertEqual(payment.p_level, 100)
511        self.assertEqual(payment.p_session, 2004)
512        self.assertEqual(payment.amount_auth, 150.0)
513        self.assertEqual(payment.p_item, u'')
514        self.assertEqual(error, None)
515
516        error, payment = utils.setPaymentDetails('hostel_maintenance',
517            self.student, None, None)
518        self.assertEqual(payment.p_level, 100)
519        self.assertEqual(payment.p_session, 2004)
520        self.assertEqual(payment.amount_auth, 180.0)
521        self.assertEqual(payment.p_item, u'')
522        self.assertEqual(error, None)
523
524        error, payment = utils.setPaymentDetails('bed_allocation',
525            self.student, None, None)
526        self.assertEqual(payment.p_level, 100)
527        self.assertEqual(payment.p_session, 2004)
528        self.assertEqual(payment.amount_auth, 150.0)
529        self.assertEqual(payment.p_item, u'')
530        self.assertEqual(error, None)
531
532        error, payment = utils.setPaymentDetails('transfer',
533            self.student, None, None)
534        self.assertEqual(payment.p_level, 100)
535        self.assertEqual(payment.p_session, 2004)
536        self.assertEqual(payment.amount_auth, 90.0)
537        self.assertEqual(payment.p_item, u'')
538        self.assertEqual(error, None)
539        return
540
541    def test_edit_level_by_co(self):
542        # Create clearance officer
543        self.app['users'].addUser('mrclear', 'mrclearsecret')
544        self.app['users']['mrclear'].email = 'mrclear@foo.ng'
545        self.app['users']['mrclear'].title = 'Carlo Pitter'
546        # Assign local ClearanceOfficer role
547        department = self.app['faculties']['fac1']['dep1']
548        prmlocal = IPrincipalRoleManager(department)
549        prmlocal.assignRoleToPrincipal('waeup.local.ClearanceOfficer', 'mrclear')
550        notify(LocalRoleSetEvent(
551            department, 'waeup.local.ClearanceOfficer', 'mrclear', granted=True))
552        IWorkflowState(self.student).setState('clearance started')
553        # Login as clearance officer
554        self.browser.open(self.login_path)
555        self.browser.getControl(name="form.login").value = 'mrclear'
556        self.browser.getControl(name="form.password").value = 'mrclearsecret'
557        self.browser.getControl("Login").click()
558        self.assertMatches('...You logged in...', self.browser.contents)
559        # Only in state clearance requested the CO does see the
560        # 'Edit level' button ...
561        self.browser.open(self.studycourse_path)
562        self.assertFalse('Edit level' in self.browser.contents)
563        # ... and can open the edit_level view
564        self.browser.open(self.studycourse_path + '/edit_level')
565        self.assertMatches('...is locked...', self.browser.contents)
566        self.assertEqual(self.browser.url, self.studycourse_path)
567        IWorkflowInfo(self.student).fireTransition('request_clearance')
568        self.browser.open(self.studycourse_path)
569        self.assertTrue('Edit level' in self.browser.contents)
570        self.browser.getLink("Edit level").click()
571        self.browser.getControl(name="form.current_level").value = ['200']
572        self.browser.getControl("Save").click()
573        self.assertMatches('...has been saved...', self.browser.contents)
574        self.assertEqual(self.student.current_level, 200)
575
576    def test_postgraduate_student_access(self):
577        self.certificate.study_mode = 'special_pg_pt'
578        self.certificate.start_level = 700
579        self.certificate.end_level = 800
580        self.student['studycourse'].current_level = 700
581        IWorkflowState(self.student).setState('school fee paid')
582        self.browser.open(self.login_path)
583        self.browser.getControl(name="form.login").value = self.student_id
584        self.browser.getControl(name="form.password").value = 'spwd'
585        self.browser.getControl("Login").click()
586        self.assertTrue(
587            'You logged in.' in self.browser.contents)
588        # Now students can add the current study level
589        self.browser.getLink("Study Course").click()
590        self.browser.getLink("Add course list").click()
591        self.assertMatches('...Add current level 700...',
592                           self.browser.contents)
593        self.browser.getControl("Create course list now").click()
594        # A level with one course ticket was created
595        self.assertEqual(self.student['studycourse']['700'].number_of_tickets, 0)
596        self.browser.getLink("700").click()
597        self.browser.getLink("Edit course list").click()
598        self.browser.getControl("Add course ticket").click()
599        self.browser.getControl(name="form.course").value = ['COURSE1']
600        self.browser.getControl("Add course ticket").click()
601        self.assertMatches('...Successfully added COURSE1...',
602                           self.browser.contents)
603        # Special postgraduate students can register course lists
604        self.browser.getControl("Register course list").click()
605        self.assertMatches('...Course list has been registered...',
606            self.browser.contents)
607        self.assertEqual(self.student.state, 'courses registered')
608        return
Note: See TracBrowser for help on using the repository browser.