Index: main/waeup.kofa/trunk/src/waeup/kofa/university/export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/university/export.py	(revision 12857)
+++ main/waeup.kofa/trunk/src/waeup/kofa/university/export.py	(revision 12858)
@@ -24,6 +24,7 @@
 from waeup.kofa.utils.batching import ExporterBase
 
+
 class FacultyExporter(grok.GlobalUtility, ExporterBase):
-    """The FacultyExporter exports all faculties in the 'faculties'
+    """The Faculty Exporter exports all faculties in the 'faculties'
     container. This is the only place where faculties are stored.
     """
@@ -36,5 +37,6 @@
 
     def mangle_value(self, value, name, context=None):
-        """The users_with_local_roles column contains Python expression like:
+        """The mangler computes the users_with_local_roles value which
+        is a Python expression like:
 
         ``[{'user_name': u'bob', 'local_role': u'bobsrole'},
@@ -66,11 +68,13 @@
         return self.export(faculties.values(), filepath)
 
+
 class DepartmentExporter(FacultyExporter, grok.GlobalUtility):
-    """Exporter for departments.
+    """The Department Exporter exports all departments stored in the faculty
+    containers. The exporter iterates over all faculties and then over all
+    departments inside each faculty container.
     """
     grok.implements(ICSVExporter)
     grok.name('departments')
 
-    #: Fieldnames considered by this exporter
     fields = ('code', 'faculty_code', 'title', 'title_prefix',
         'users_with_local_roles')
@@ -79,5 +83,7 @@
 
     def mangle_value(self, value, name, context=None):
-        """Hook for mangling values in derived classes
+        """The mangler additionally computes the faculty_code value
+        which is the code (= object id) of the faculty that hosts
+        the department.
         """
         if name == 'faculty_code':
@@ -101,18 +107,18 @@
 
 class CourseExporter(FacultyExporter, grok.GlobalUtility):
-    """Exporter for courses.
+    """The Course Exporter exports all courses in the database. It iterates
+    over all departments and faculties.
     """
     grok.implements(ICSVExporter)
     grok.name('courses')
 
-    #: Fieldnames considered by this exporter
     fields = ('code', 'faculty_code', 'department_code', 'title', 'credits',
               'passmark', 'semester', 'users_with_local_roles', 'former_course')
 
-    #: The title under which this exporter will be displayed
     title = _(u'Courses')
 
     def mangle_value(self, value, name, context=None):
-        """
+        """The mangler additionally computes the department_code value
+        which is the code of the department that offers the course.
         """
         if name == 'users_with_local_roles':
@@ -137,5 +143,4 @@
     def export_all(self, site, filepath=None):
         """Export courses into filepath as CSV data.
-
         If `filepath` is ``None``, a raw string with CSV data is returned.
         """
@@ -148,11 +153,12 @@
         return self.close_outfile(filepath, outfile)
 
+
 class CertificateExporter(CourseExporter, grok.GlobalUtility):
-    """Exporter for courses.
+    """The Certificate Exporter exports all certificates in the database.
+    It iterates over all departments and faculties.
     """
     grok.implements(ICSVExporter)
     grok.name('certificates')
 
-    #: Fieldnames considered by this exporter
     fields = ('code', 'faculty_code', 'department_code', 'title', 'study_mode',
               'start_level', 'end_level', 'application_category', 'ratio',
@@ -162,10 +168,15 @@
               'users_with_local_roles')
 
-    #: The title under which this exporter will be displayed
     title = _(u'Certificates')
 
+    def mangle_value(self, value, name, context=None):
+        """The mangler additionally computes the department_code value
+        which is the code of the department that offers the certificate.
+        """
+        return super(CertificateExporter, self).mangle_value(
+            value, name, context)
+
     def export_all(self, site, filepath=None):
         """Export certificates into filepath as CSV data.
-
         If `filepath` is ``None``, a raw string with CSV data is returned.
         """
@@ -178,19 +189,26 @@
         return self.close_outfile(filepath, outfile)
 
+
 class CertificateCourseExporter(CourseExporter, grok.GlobalUtility):
-    """Exporter for courses.
+    """The Certificate Course Exporter exports all certificate courses
+    (:class:`CertificateCourse
+    <waeup.kofa.university.certificate.CertificateCourse>` instances) in
+    the database. It iterates over all departments and faculties.
     """
     grok.implements(ICSVExporter)
     grok.name('certificate_courses')
 
-    #: Fieldnames considered by this exporter
     fields = ('course', 'faculty_code', 'department_code', 'certificate_code',
               'level', 'mandatory')
 
-    #: The title under which this exporter will be displayed
     title = _(u'Courses in Certificates')
 
     def mangle_value(self, value, name, context=None):
-        """Hook for mangling values in derived classes
+        """The mangler computes the codes of the faculty, the department and
+        the certificate which require the course. It also exports the
+        course code.
+
+        .. note:: The course must not necessarily be offered by the same
+                  department.
         """
         if name == 'faculty_code':
@@ -214,5 +232,4 @@
     def export_all(self, site, filepath=None):
         """Export certificate courses into filepath as CSV data.
-
         If `filepath` is ``None``, a raw string with CSV data is returned.
         """
