Index: /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/batching.py
===================================================================
--- /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/batching.py	(revision 17405)
+++ /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/batching.py	(revision 17406)
@@ -55,5 +55,5 @@
             'title', 'credits', 'passmark', 'semester', 'ticket_session',
             'unlock_score', 'previous', 'carryover_score', 'in_progress',
-            'resumption_date', 'rst_grade', 'attempted_number'
+            'resumption_date', 'carryover_grade', 'attempts'
             ] + self.additional_fields
         return sorted(fields)
Index: /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser.py
===================================================================
--- /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser.py	(revision 17405)
+++ /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser.py	(revision 17406)
@@ -30,7 +30,9 @@
     StudyLevelEditFormPage, StudyLevelDisplayFormPage,
     StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
+    ExportPDFTranscriptSlip,
     CourseTicketDisplayFormPage,
     CourseTicketManageFormPage,
     StudyLevelDisplayFormPage,
+    StudyLevelManageFormPage,
     StudentTriggerTransitionFormPage,
     ExportPDFAdmissionSlip, StartClearancePage, PaymentsManageFormPage,
@@ -162,4 +164,8 @@
         return translated_values(self)
 
+class CustomStudyLevelManageFormPage(StudyLevelManageFormPage):
+    """ Page to edit the student study level data
+    """
+
 class CustomExportPDFCourseRegistrationSlip(NigeriaExportPDFCourseRegistrationSlip):
     """Deliver a PDF slip of the context.
@@ -177,6 +183,6 @@
         Cred = translate(_('Cred.'), 'waeup.kofa', target_language=portal_language)
         #Mand = translate(_('Requ.'), 'waeup.kofa', target_language=portal_language)
-        Score = translate(_('Score'), 'waeup.kofa', target_language=portal_language)
-        Grade = translate(_('Grade'), 'waeup.kofa', target_language=portal_language)
+        #Score = translate(_('Score'), 'waeup.kofa', target_language=portal_language)
+        #Grade = translate(_('Grade'), 'waeup.kofa', target_language=portal_language)
         studentview = StudentBasePDFFormPage(self.context.student,
             self.request, self.omit_fields)
@@ -194,7 +200,8 @@
                              (Cred, 'credits', 1.5),
                              #(Mand, 'mandatory', 1.5),
-                             (Score, 'score', 1.5),
-                             (Grade, 'grade', 1.5),
-                             ('RST', 'carryover_score', 1.5),
+                             ('Score', 'score', 1.5),
+                             ('Grade', 'grade', 1.5),
+                             ('RST Score', 'carryover_score', 1.5),
+                             ('RST Grade', 'carryover_grade', 1.5),
                              #('Auto', 'automatic', 1.5)
                              ])
@@ -225,2 +232,42 @@
     """
     form_fields = grok.AutoFields(ICustomCourseTicket)
+
+class ExportPDFTranscriptSlip(ExportPDFTranscriptSlip):
+    """Deliver a PDF slip of the context.
+    """
+
+    def render(self):
+        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+        Term = translate(_('Term'), 'waeup.kofa', target_language=portal_language)
+        Code = translate(_('Code'), 'waeup.kofa', target_language=portal_language)
+        Title = translate(_('Title'), 'waeup.kofa', target_language=portal_language)
+        Cred = translate(_('Credits'), 'waeup.kofa', target_language=portal_language)
+        Score = translate(_('Score'), 'waeup.kofa', 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)
+
+        tableheader = [(Code,'code', 2.5),
+                         (Title,'title', 7),
+                         (Term, 'semester', 1.5),
+                         (Cred, 'credits', 1.5),
+                         (Score, 'total_score', 1.5),
+                         (Grade, 'grade', 1.5),
+                         ('Attmpt', 'attempted_number', 1.5)
+                         ]
+
+        pdfstream = students_utils.renderPDFTranscript(
+            self, 'transcript.pdf',
+            self.context.student, studentview,
+            omit_fields=self.omit_fields,
+            tableheader=tableheader,
+            signatures=self._signatures(),
+            sigs_in_footer=self._sigsInFooter(),
+            digital_sigs=self._digital_sigs(),
+            save_file=self._save_file(),
+            )
+        if not pdfstream:
+            self.redirect(self.url(self.context.student))
+            return
+        return pdfstream
Index: /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser_templates/studylevelpage.pt
===================================================================
--- /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser_templates/studylevelpage.pt	(revision 17405)
+++ /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/browser_templates/studylevelpage.pt	(revision 17406)
@@ -30,5 +30,6 @@
       <th i18n:translate="">Score</th>
       <th i18n:translate="">Grade</th>
-      <th i18n:translate="">RST</th>
+      <th i18n:translate="">RST Score</th>
+      <th i18n:translate="">RST Grade</th>
       <th i18n:translate="">OS</th>
       <th i18n:translate="">Auto</th>
@@ -49,4 +50,5 @@
       <td tal:content="value/grade|nothing">GRADE</td>
       <td tal:content="value/carryover_score">RSTSCORE</td>
+      <td tal:content="value/carryover_grade">RSTGRADE</td>
       <td tal:content="value/outstanding">OS</td>
       <td tal:content="value/automatic">AUTO</td>
Index: /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/interfaces.py
===================================================================
--- /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/interfaces.py	(revision 17405)
+++ /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/interfaces.py	(revision 17406)
@@ -94,6 +94,18 @@
     """
 
+    automatic = schema.Bool(
+        title = _(u'Automatical Creation'),
+        default = False,
+        required = False,
+        )
+
+    carry_over = schema.Bool(
+        title = _(u'Carry-over Course'),
+        default = False,
+        required = False,
+        )
+
     carryover_score = schema.Int(
-        title = _(u'Carry-over Score'),
+        title = _(u'Carry-over (RST) Score'),
         default = None,
         required = False,
@@ -102,15 +114,15 @@
         )
 
-    attempted_number = schema.Int(
-        title = _(u'Attempted Number'),
+    carryover_grade = schema.TextLine(
+        title = _(u'Carry-over (RST) Grade'),
+        required = False,
+        )
+
+    attempts = schema.Int(
+        title = _(u'Number of Attempts'),
         default = None,
         required = False,
         missing_value = None,
         max = 5,
-        )
-
-    rst_grade = schema.TextLine(
-        title = _(u'RST Grade'),
-        required = False,
         )
 
@@ -127,5 +139,12 @@
         )
 
-ICustomCourseTicket['carryover_score'].order = ICustomCourseTicket['carry_over'].order
+    score = schema.Int(
+        title = _(u'(Final) Score'),
+        default = None,
+        required = False,
+        missing_value = None,
+        )
+
+#ICustomCourseTicket['carryover_score'].order = ICustomCourseTicket['carry_over'].order
 #ICustomCourseTicket['in_progress'].order = ICustomCourseTicket['grade'].order
 #ICustomCourseTicket['resumption_date'].order = ICustomCourseTicket['grade'].order
Index: /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/tests/test_browser.py
===================================================================
--- /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/tests/test_browser.py	(revision 17405)
+++ /main/kofacustom.edocons/trunk/src/kofacustom/edocons/students/tests/test_browser.py	(revision 17406)
@@ -68,3 +68,54 @@
         open(path, 'wb').write(self.browser.contents)
         print "Sample PDF UG admission_slip.pdf written to %s" % path
+
+    def test_transcripts(self):
+        studylevel = createObject(u'waeup.StudentStudyLevel')
+        studylevel.level = 100
+        studylevel.level_session = 2005
+        self.student['studycourse'].entry_mode = 'ug_ft'
+        self.student['studycourse'].addStudentStudyLevel(
+            self.certificate, studylevel)
+        studylevel2 = createObject(u'waeup.StudentStudyLevel')
+        studylevel2.level = 110
+        studylevel2.level_session = 2006
+        self.student['studycourse'].addStudentStudyLevel(
+            self.certificate, studylevel2)
+        # Add second course (COURSE has been added automatically)
+        courseticket = createObject('waeup.CourseTicket')
+        courseticket.code = 'ANYCODE'
+        courseticket.title = u'Any TITLE'
+        courseticket.credits = 13
+        courseticket.score = 66
+        courseticket.semester = 1
+        courseticket.attempted_number = 4
+        courseticket.dcode = u'ANYDCODE'
+        courseticket.fcode = u'ANYFCODE'
+        self.student['studycourse']['110']['COURSE2'] = courseticket
+        self.student['studycourse']['100']['COURSE1'].score = 55
+        self.assertEqual(self.student['studycourse']['100'].gpa_params_rectified[0], 2.5)
+        self.assertEqual(self.student['studycourse']['110'].gpa_params_rectified[0], 3.0)
+        # Get transcript data
+        td = self.student['studycourse'].getTranscriptData()
+        self.assertEqual(td[0][0]['level_key'], '100')
+        self.assertEqual(td[0][0]['sgpa'], 2.5)
+        self.assertEqual(td[0][0]['level'].level, 100)
+        self.assertEqual(td[0][0]['level'].level_session, 2005)
+        self.assertEqual(td[0][0]['tickets_1'][0].code, 'COURSE1')
+        self.assertEqual(td[0][1]['level_key'], '110')
+        self.assertEqual(td[0][1]['sgpa'], 3.0)
+        self.assertEqual(td[0][1]['level'].level, 110)
+        self.assertEqual(td[0][1]['level'].level_session, 2006)
+        self.assertEqual(td[0][1]['tickets_1'][0].code, 'ANYCODE')
+        self.assertEqual(td[1], 2.782608695652174)
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.student_path + '/studycourse/transcript')
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertTrue('Transcript' in self.browser.contents)
+        # Officers can open the pdf transcript
+        self.browser.open(self.student_path + '/studycourse/transcript.pdf')
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
+        path = os.path.join(samples_dir(), 'transcript.pdf')
+        open(path, 'wb').write(self.browser.contents)
+        print "Sample PDF transcript.pdf written to %s" % path
  
