Index: /main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py
===================================================================
--- /main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 9280)
+++ /main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py	(revision 9281)
@@ -19,12 +19,15 @@
 from zope.i18n import translate
 from zope.schema.interfaces import ConstraintNotSatisfied
+from hurry.workflow.interfaces import IWorkflowInfo
 from waeup.kofa.interfaces import REQUESTED
 from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
 from waeup.kofa.browser.layout import KofaEditFormPage
 from waeup.kofa.browser.viewlets import ManageActionButton
-from waeup.kofa.browser.layout import action
+from waeup.kofa.browser.layout import action, jsaction
 from waeup.kofa.students.browser import (
     StudentClearPage, StudentRejectClearancePage,
-    StudyCourseDisplayFormPage, msave, emit_lock_message)
+    StudyCourseDisplayFormPage,
+    StudyLevelEditFormPage,
+    msave, emit_lock_message)
 from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS
 from kofacustom.nigeria.students.browser import (
@@ -32,5 +35,6 @@
     NigeriaStudentBaseManageFormPage,
     NigeriaOnlinePaymentAddFormPage,
-    NigeriaExportPDFPaymentSlipPage)
+    NigeriaExportPDFPaymentSlipPage,
+    )
 #from waeup.uniben.students.interfaces import ICustomStudent
 
@@ -117,5 +121,5 @@
 
 class StudyCourseCOEditFormPage(KofaEditFormPage):
-    """ Page to edit the student study course data by clearance officers
+    """ Page to edit the student study course data by clearance officers.
 
     This form page is available only in Uniben.
@@ -147,2 +151,28 @@
         #notify(grok.ObjectModifiedEvent(self.context.__parent__))
         return
+
+class CustomStudyLevelEditFormPage(StudyLevelEditFormPage):
+    """ Page to edit the student study level data by students.
+
+    """
+
+    def _registerCourses(self, **data):
+        """ This customized version does allow 'special postgraduate'
+        students to register their courses.
+        """
+        if self.context.student.is_postgrad and \
+            not self.context.student.is_special_postgrad:
+            self.flash(_(
+                "You are a postgraduate student, "
+                "your course list can't bee registered."))
+            self.redirect(self.url(self.context))
+            return
+        if self.total_credits > self.max_credits:
+            self.flash(_('Maximum credits of ${a} exceeded.',
+                mapping = {'a':self.max_credits}))
+            return
+        IWorkflowInfo(self.context.student).fireTransition(
+            'register_courses')
+        self.flash(_('Course list has been registered.'))
+        self.redirect(self.url(self.context))
+        return
Index: /main/waeup.uniben/trunk/src/waeup/uniben/students/tests/test_browser.py
===================================================================
--- /main/waeup.uniben/trunk/src/waeup/uniben/students/tests/test_browser.py	(revision 9280)
+++ /main/waeup.uniben/trunk/src/waeup/uniben/students/tests/test_browser.py	(revision 9281)
@@ -487,2 +487,36 @@
         self.assertMatches('...has been saved...', self.browser.contents)
         self.assertEqual(self.student.current_level, 200)
+
+    def test_postgraduate_student_access(self):
+        self.certificate.study_mode = 'special_pg_pt'
+        self.certificate.start_level = 700
+        self.certificate.end_level = 800
+        self.student['studycourse'].current_level = 700
+        IWorkflowState(self.student).setState('school fee paid')
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = self.student_id
+        self.browser.getControl(name="form.password").value = 'spwd'
+        self.browser.getControl("Login").click()
+        self.assertTrue(
+            'You logged in.' in self.browser.contents)
+        # Now students can add the current study level
+        self.browser.getLink("Study Course").click()
+        self.browser.getLink("Add course list").click()
+        self.assertMatches('...Add current level 700...',
+                           self.browser.contents)
+        self.browser.getControl("Create course list now").click()
+        # A level with one course ticket was created
+        self.assertEqual(self.student['studycourse']['700'].number_of_tickets, 0)
+        self.browser.getLink("700").click()
+        self.browser.getLink("Edit course list").click()
+        self.browser.getControl("Add course ticket").click()
+        self.browser.getControl(name="form.course").value = ['COURSE1']
+        self.browser.getControl("Add course ticket").click()
+        self.assertMatches('...Successfully added COURSE1...',
+                           self.browser.contents)
+        # Special postgraduate students can register course lists
+        self.browser.getControl("Register course list").click()
+        self.assertMatches('...Course list has been registered...',
+            self.browser.contents)
+        self.assertEqual(self.student.state, 'courses registered')
+        return
