Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14135)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 14136)
@@ -419,5 +419,5 @@
     def _signatures(self):
         return ([(
-            'Akhimien Felicia O. (MANUPA) <br /> Principal Assistant Registrar  <br /> '
+            'Mrs. Uniamikogbo, S.O., mnim, manupa <br /> Prin. Asst Registrar  <br /> '
             'Exams, Records and Data Processing Division <br /> For: Registrar')],)
 
@@ -429,5 +429,4 @@
         Cred = translate(_('Credits'), target_language=portal_language)
         Score = translate(_('Score'), target_language=portal_language)
-        #CA = translate(_('CA'), target_language=portal_language)
         Grade = translate(_('Grade'), target_language=portal_language)
         studentview = StudentBasePDFFormPage(self.context.student,
@@ -439,6 +438,5 @@
                          (Term, 'semester', 1.5),
                          (Cred, 'credits', 1.5),
-                         (Score, 'score', 1.5),
-                         #(CA, 'ca', 1.5),
+                         (Score, 'total_score', 1.5),
                          (Grade, 'grade', 1.5),
                          ]
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14135)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/studylevel.py	(revision 14136)
@@ -36,8 +36,7 @@
 
 
-def getGradeWeightFromScore(score, ca, student):
-    if None in (score, ca):
+def getGradeWeightFromScore(total, student):
+    if total is None:
         return (None, None)
-    total = score + ca
     if total >= 70:
         return ('A',5)
@@ -203,5 +202,5 @@
         """Returns the grade calculated from score.
         """
-        return getGradeWeightFromScore(self.score, self.ca, self.student)[0]
+        return getGradeWeightFromScore(self.total_score, self.student)[0]
 
     @property
@@ -209,5 +208,12 @@
         """Returns the weight calculated from score.
         """
-        return getGradeWeightFromScore(self.score, self.ca, self.student)[1]
+        return getGradeWeightFromScore(self.total_score, self.student)[1]
+
+    @property
+    def total_score(self):
+        """Returns ca + score.
+        """
+        if not None in (self.score, self.ca):
+            return self.score + self.ca
 
 CustomCourseTicket = attrs_to_fields(CustomCourseTicket)
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14135)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 14136)
@@ -367,4 +367,56 @@
         open(path, 'wb').write(self.browser.contents)
         print "Sample PDF coursetickets.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 = 200
+        studylevel2.level_session = 2006
+        self.student['studycourse']['100']['COURSE1'].score = 33 # no carry-over!
+        self.student['studycourse']['100']['COURSE1'].ca = 22
+        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 = 55
+        courseticket.ca = 11
+        courseticket.semester = 1
+        courseticket.dcode = u'ANYDCODE'
+        courseticket.fcode = u'ANYFCODE'
+        self.student['studycourse']['200']['COURSE2'] = courseticket
+        self.assertEqual(self.student['studycourse']['100'].gpa_params_rectified[0], 3.0)
+        self.assertEqual(self.student['studycourse']['200'].gpa_params_rectified[0], 4.0)
+        # Get transcript data
+        td = self.student['studycourse'].getTranscriptData()
+        self.assertEqual(td[0][0]['level_key'], '100')
+        self.assertEqual(td[0][0]['sgpa'], 3.0)
+        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'], '200')
+        self.assertEqual(td[0][1]['sgpa'], 4.0)
+        self.assertEqual(td[0][1]['level'].level, 200)
+        self.assertEqual(td[0][1]['level'].level_session, 2006)
+        self.assertEqual(td[0][1]['tickets_1'][0].code, 'ANYCODE')
+        self.assertEqual(td[1], 3.57)
+        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
 
 class StudentUITests(StudentsFullSetup):
