Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 15918)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 15920)
@@ -4,4 +4,6 @@
 1.6.1.dev0 (unreleased)
 =======================
+
+* Add `TranscriptDataExporter` and reorganize exporter names.
 
 * Add `session_level`filter to `StudentStudyLevelExporter`.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt	(revision 15918)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportconfig.pt	(revision 15920)
@@ -155,5 +155,5 @@
           document.getElementById('exporter').value == 'studentpayments' ||
           document.getElementById('exporter').value == 'accommodationpayments' ||
-          document.getElementById('exporter').value == 'studentunpaidpayments') {
+          document.getElementById('exporter').value == 'unpaidpayments') {
           document.getElementById('payment_dates').style.display = 'block';
           document.getElementById('paycat').style.display = 'block';
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 15918)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 15920)
@@ -329,5 +329,5 @@
         'password', 'state', 'history', 'certcode', 'is_postgrad',
         'current_level', 'current_session')
-    title = _(u'Students')
+    title = _(u'Students (Data Backup)')
 
     def mangle_value(self, value, name, context=None):
@@ -355,5 +355,5 @@
 
     fields = tuple(sorted(iface_names(IStudentStudyCourse))) + ('student_id',)
-    title = _(u'Student Study Courses')
+    title = _(u'Student Study Courses (Data Backup)')
 
     def filter_func(self, x, **kw):
@@ -386,5 +386,5 @@
         IStudentStudyLevel))) + (
         'student_id', 'number_of_tickets','certcode')
-    title = _(u'Student Study Levels')
+    title = _(u'Student Study Levels (Data Backup)')
 
     def filter_func(self, x, **kw):
@@ -420,5 +420,5 @@
         ['level', 'code', 'level_session'])) + ('student_id',
         'certcode', 'display_fullname')
-    title = _(u'Course Tickets')
+    title = _(u'Course Tickets (Data Backup)')
 
     def filter_func(self, x, **kw):
@@ -474,9 +474,9 @@
     or nottaken (registered but not taken).
     """
-    grok.name('studentoutstandingcourses')
+    grok.name('outstandingcourses')
 
     fields = ('student_id', 'certcode', 'display_fullname','missed',
               'failed', 'nottaken')
-    title = _(u'Student Outstanding Courses')
+    title = _(u'Outstanding Courses')
 
     def filter_func(self, x, **kw):
@@ -514,5 +514,5 @@
             omit=['display_item', 'certificate', 'student']))) + (
             'student_id','state','current_session')
-    title = _(u'Student Payments')
+    title = _(u'Student Payments (Data Backup)')
 
     def filter_func(self, x, **kw):
@@ -538,7 +538,7 @@
     payment ticket.
     """
-    grok.name('studentunpaidpayments')
-
-    title = _(u'Student Unpaid Payments')
+    grok.name('unpaidpayments')
+
+    title = _(u'Unpaid Payment Tickets')
 
     def filter_func(self, x, **kw):
@@ -618,5 +618,5 @@
             omit=['display_coordinates', 'maint_payment_made']))) + (
             'student_id', 'actual_bed_type')
-    title = _(u'Bed Tickets')
+    title = _(u'Bed Tickets (Data Backup)')
 
     def filter_func(self, x, **kw):
@@ -655,5 +655,5 @@
         'entry_session', 'reg_number'
         ) + year_range_tuple
-    title = _(u'Student School Fee Payments Overview')
+    title = _(u'School Fee Payments Overview')
 
     def mangle_value(self, value, name, context=None):
@@ -768,5 +768,5 @@
         'entry_session', 'current_level', 'current_session',
         ) + avail_levels
-    title = _(u'Student Study Levels Overview')
+    title = _(u'Study Levels Overview')
 
     def mangle_value(self, value, name, context=None):
@@ -823,2 +823,33 @@
             ComboCardDataExporter, self).mangle_value(
             value, name, context=context)
+
+class StudentTranscriptDataExporter(StudentExporter):
+    """The Student Transcript Data Exporter first filters the set of
+    students by searching the students catalog. Then it exports student data
+    along with their transcript data.
+    """
+    grok.name('transcriptdata')
+
+    fields = ('student_id', ) + (
+        'state', 'certcode', 'faccode', 'depcode',
+        'entry_session', 'current_level', 'current_session',
+        'transcript_data')
+    title = _(u'Transcript Data')
+
+    def mangle_value(self, value, name, context=None):
+        """The mangler determines the trascript data.
+        """
+        if name == 'transcript_data':
+            value = {}
+            td = context['studycourse'].getTranscriptData()[0]
+            for level in td:
+                tickets_1 = ','.join(i.code for i in level['tickets_1'])
+                tickets_2 = ','.join(i.code for i in level['tickets_2'])
+                tickets_3 = ','.join(i.code for i in level['tickets_3'])
+                value = "Level %s; 1st: %s; 2nd: %s; 3rd: %s; sgpa: %s" % (
+                    level['level_key'], tickets_1, tickets_2,
+                    tickets_3, level['sgpa'],
+                    )
+        return super(
+            StudentTranscriptDataExporter, self).mangle_value(
+            value, name, context=context)
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 15918)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 15920)
@@ -36,5 +36,7 @@
     StudentUnpaidPaymentExporter, SessionPaymentsOverviewExporter,
     StudentOutstandingCoursesExporter,
-    AccommodationPaymentsExporter, get_students,)
+    AccommodationPaymentsExporter,
+    StudentTranscriptDataExporter,
+    get_students,)
 from waeup.kofa.students.accommodation import BedTicket
 from waeup.kofa.students.interfaces import ICSVStudentExporter
@@ -813,5 +815,5 @@
     def test_get_as_utility(self):
         # we can get an student exporter as utility
-        result = queryUtility(ICSVExporter, name="studentoutstandingcourses")
+        result = queryUtility(ICSVExporter, name="outstandingcourses")
         self.assertTrue(result is not None)
         return
@@ -1530,2 +1532,25 @@
             )
         return
+
+class StudentTranscriptDataExporterTest(StudentImportExportSetup):
+
+    layer = FunctionalLayer
+
+    def setUp(self):
+        super(StudentTranscriptDataExporterTest, self).setUp()
+        self.setup_for_export()
+        return
+
+    def test_export_all(self):
+        self.setup_student(self.student)
+        exporter = StudentTranscriptDataExporter()
+        exporter.export_all(self.app, self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertTrue(
+            'student_id,state,certcode,faccode,depcode,entry_session,'
+            'current_level,current_session,transcript_data\r\n'
+            'A111111,created,CERT1,NA,NA,2010,200,2012,'
+            'Level 100; 1st: ; 2nd: CRS1; 3rd: ; sgpa: 0.0\r\n'
+            in result
+            )
+        return
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 15918)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/utils.py	(revision 15920)
@@ -1150,11 +1150,20 @@
     #: A tuple containing all exporter names referring to students or
     #: subobjects thereof.
-    STUDENT_EXPORTER_NAMES = ('students', 'studentstudycourses',
-            'studentstudylevels', 'coursetickets','studentoutstandingcourses',
-            'studentpayments', 'studentunpaidpayments',
-            'sfpaymentsoverview', 'sessionpaymentsoverview',
-            'studylevelsoverview','bedtickets',
-            'combocard', 'bursary',
-            'accommodationpayments',)
+    STUDENT_EXPORTER_NAMES = (
+            'students',
+            'studentstudycourses',
+            'studentstudylevels',
+            'coursetickets',
+            'studentpayments',
+            'bedtickets',
+            'outstandingcourses',
+            'unpaidpayments',
+            'sfpaymentsoverview',
+            'sessionpaymentsoverview',
+            'studylevelsoverview',
+            'combocard',
+            'bursary',
+            'accommodationpayments',
+            'transcriptdata')
 
     #: A tuple containing all exporter names needed for backing
