Index: main/waeup.fceokene/trunk/src/waeup/fceokene/students/browser.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/students/browser.py	(revision 15976)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/students/browser.py	(revision 15977)
@@ -22,5 +22,5 @@
 from zope.security import checkPermission
 from hurry.workflow.interfaces import IWorkflowInfo
-from waeup.kofa.interfaces import ADMITTED, IKofaUtils
+from waeup.kofa.interfaces import ADMITTED, VALIDATED, IKofaUtils
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
@@ -30,5 +30,6 @@
     ExportPDFAdmissionSlip, StudyLevelDisplayFormPage,
     PaymentsManageFormPage,
-    OnlinePaymentApproveView)
+    OnlinePaymentApproveView,
+    StudentBasePDFFormPage)
 from kofacustom.nigeria.students.browser import (
     NigeriaOnlinePaymentDisplayFormPage,
@@ -205,4 +206,55 @@
     form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit('level')
 
+class ExportPDFExaminationClearanceSlip(CustomExportPDFCourseRegistrationSlip):
+    """Deliver a PDF slip of the context.
+    """
+
+    grok.name('examination_clearance_slip.pdf')
+
+    form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
+        'gpa', 'transcript_remark', 'total_credits', 'level_verdict')
+
+    @property
+    def label(self):
+        return 'Year %s Examination Clearance' % self.context.level_session
+
+    def update(self):
+        if self.context.student.state != VALIDATED \
+            or self.context.student.current_level != self.context.level:
+            self.flash(_('Forbidden'), type="warning")
+            self.redirect(self.url(self.context))
+
+    def render(self):
+        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
+        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
+        Dept = translate('Dept.', 'waeup.kofa', target_language=portal_language)
+        Faculty = translate('Faculty', 'waeup.kofa', target_language=portal_language)
+        Cred = translate(_('Credits'), 'waeup.uniben', target_language=portal_language)
+        Grade = translate('Grade', 'waeup.kofa', target_language=portal_language)
+        studentview = StudentBasePDFFormPage(self.context.student,
+            self.request, self.omit_fields)
+        students_utils = getUtility(IStudentsUtils)
+
+        tabledata = []
+        tableheader = []
+        for i in range(1,7):
+            tabledata.append(sorted(
+                [value for value in self.context.values() if value.semester == i],
+                key=lambda value: str(value.semester) + value.code))
+            tableheader.append([(Code,'code', 2.5),
+                             (Title,'title', 5),
+                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
+                             (Cred, 'credits', 1.5),
+                             ])
+        return students_utils.renderPDF(
+            self, 'examination_clearance_slip.pdf',
+            self.context.student, studentview,
+            tableheader=tableheader,
+            tabledata=tabledata,
+            omit_fields=self.omit_fields
+            )
+
+
 class CustomPaymentsManageFormPage(PaymentsManageFormPage):
     """ Page to manage the student payments. This manage form page is for
Index: main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_browser.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_browser.py	(revision 15976)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/students/tests/test_browser.py	(revision 15977)
@@ -442,5 +442,5 @@
                            self.browser.contents)
         self.browser.getControl("Create course list now").click()
-        # Students can't open the customized pdf course registration slip
+        # Students can open the customized pdf course registration slip
         self.browser.open(
             self.student_path + '/studycourse/100/course_registration_slip.pdf')
@@ -450,2 +450,13 @@
         open(path, 'wb').write(self.browser.contents)
         print "Sample PDF course_registration_slip.pdf written to %s" % path
+
+        # Students can open the examination clearance slip if they are
+        # in state courses validated
+        IWorkflowState(self.student).setState('courses validated')
+        self.browser.open(self.student_path + '/studycourse/100')
+        self.browser.getLink("Download examination clearance slip").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
+        path = os.path.join(samples_dir(), 'examination_clearance_slip.pdf')
+        open(path, 'wb').write(self.browser.contents)
+        print "Sample PDF examination_clearance_slip.pdf written to %s" % path
Index: main/waeup.fceokene/trunk/src/waeup/fceokene/students/viewlets.py
===================================================================
--- main/waeup.fceokene/trunk/src/waeup/fceokene/students/viewlets.py	(revision 15976)
+++ main/waeup.fceokene/trunk/src/waeup/fceokene/students/viewlets.py	(revision 15977)
@@ -18,9 +18,12 @@
 
 import grok
+from waeup.kofa.browser.viewlets import ManageActionButton
 from waeup.kofa.students.viewlets import (
     AdmissionSlipActionButton,
     AddPreviousPaymentActionButton, AddBalancePaymentActionButton,
     ApprovePaymentActionButton)
-from waeup.kofa.students.workflow import ADMITTED
+from waeup.kofa.students.interfaces import IStudentStudyLevel
+from waeup.kofa.students.browser import StudyLevelDisplayFormPage
+from waeup.kofa.students.workflow import ADMITTED, VALIDATED
 
 class AdmissionSlipActionButton(AdmissionSlipActionButton):
@@ -47,2 +50,21 @@
 
     grok.require('waeup.manageStudent')
+
+class CourseRegistrationSlipActionButton(ManageActionButton):
+    grok.order(6)
+    grok.context(IStudentStudyLevel)
+    grok.view(StudyLevelDisplayFormPage)
+    grok.require('waeup.viewStudent')
+    icon = 'actionicon_pdf.png'
+    text = 'Download examination clearance slip'
+    target = 'examination_clearance_slip.pdf'
+
+    @property
+    def target_url(self):
+        is_current = self.context.__parent__.is_current
+        if not is_current:
+            return ''
+        if self.context.student.state != VALIDATED \
+            or self.context.student.current_level != self.context.level:
+            return ''
+        return self.view.url(self.view.context, self.target)
