Index: main/waeup.kofa/trunk/src/waeup/kofa/students/export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 9743)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 9744)
@@ -391,2 +391,36 @@
             StudentsExporter, self).mangle_value(
             value, name, context=context)
+
+class StudentStudyLevelsOverviewExporter(StudentsExporter):
+    """Exporter for students with study level overview.
+    """
+    grok.name('studylevelsoverview')
+
+    levels = ['10',]
+    levels += [str(level) for level in range(100,1000,10) if level % 100 < 30]
+    levels.append('999')
+    level_range_tuple = tuple(levels)
+
+    #: Fieldnames considered by this exporter
+    fields = ('student_id', ) + (
+        'state', 'certcode', 'faccode', 'depcode', 'is_postgrad',
+        'current_level', 'current_session',
+        ) + level_range_tuple
+
+    #: The title under which this exporter will be displayed
+    title = _(u'Student Study Levels Overview')
+
+    def mangle_value(self, value, name, context=None):
+        if name in self.level_range_tuple and context is not None:
+            value = ''
+            for level in context['studycourse'].values():
+                if level.level == int(name):
+                    value = '%s|%s|%s|%s' % (
+                        level.level_session,
+                        len(level),
+                        level.validated_by,
+                        level.level_verdict)
+                    break
+        return super(
+            StudentsExporter, 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 9743)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 9744)
@@ -8,5 +8,6 @@
     StudentsExporter, StudentStudyCourseExporter, StudentStudyLevelExporter,
     CourseTicketExporter, PaymentsExporter, BedTicketsExporter,
-    StudentPaymentsOverviewExporter, get_students, StudentsExportFilter)
+    StudentPaymentsOverviewExporter, StudentStudyLevelsOverviewExporter,
+    get_students, StudentsExportFilter)
 from waeup.kofa.students.accommodation import BedTicket
 from waeup.kofa.students.interfaces import ICSVStudentExporter
@@ -643,2 +644,54 @@
             )
         return
+
+class StudentStudyLevelsOverviewExporterTest(StudentImportExportSetup):
+
+    layer = FunctionalLayer
+
+    def setUp(self):
+        super(StudentStudyLevelsOverviewExporterTest, self).setUp()
+        self.setup_for_export()
+        return
+
+    def test_ifaces(self):
+        obj = StudentStudyLevelsOverviewExporter()
+        verifyObject(ICSVExporter, obj)
+        verifyClass(ICSVExporter, StudentStudyLevelsOverviewExporter)
+        return
+
+    def test_get_as_utility(self):
+        result = queryUtility(ICSVExporter, name="studylevelsoverview")
+        self.assertTrue(result is not None)
+        return
+
+    def test_export(self):
+        self.setup_student(self.student)
+        exporter = StudentStudyLevelsOverviewExporter()
+        exporter.export([self.student], self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertEqual(
+             'student_id,state,certcode,faccode,depcode,is_postgrad,'
+             'current_level,current_session,'
+             '10,100,110,120,200,210,220,300,310,320,400,410,420,500,'
+             '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999\r\n'
+             'A111111,created,CERT1,NA,NA,0,200,2012,,2012|1|None|A'
+             ',,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
+            result
+            )
+        return
+
+    def test_export_all(self):
+        self.setup_student(self.student)
+        exporter = StudentStudyLevelsOverviewExporter()
+        exporter.export_all(self.app, self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertEqual(
+            'student_id,state,certcode,faccode,depcode,is_postgrad,'
+            'current_level,current_session,'
+            '10,100,110,120,200,210,220,300,310,320,400,410,420,500,'
+            '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999\r\n'
+            'A111111,created,CERT1,NA,NA,0,200,2012,,2012|1|None|A'
+            ',,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
+            result
+            )
+        return
