Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9821)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9822)
@@ -37,5 +37,5 @@
     KofaForm, NullValidator)
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
-from waeup.kofa.browser.pages import ContactAdminForm
+from waeup.kofa.browser.pages import ContactAdminForm, ExportCSVView, doll_up
 from waeup.kofa.browser.resources import (
     datepicker, datatable, tabs, warning, toggleall)
@@ -2661,38 +2661,4 @@
     pnav = 1
 
-    def doll_up(self):
-        job_entries = self.context.get_running_export_jobs(
-            self.request.principal.id)
-        job_manager = getUtility(IJobManager)
-        entries = []
-        for job_id, exporter_name, user_id in job_entries:
-            job = job_manager.get(job_id)
-            exporter = getUtility(ICSVExporter, name=exporter_name)
-            exporter_title = getattr(exporter, 'title', 'Unknown')
-            args = ', '.join([str(x) for x in job.kwargs.values()])
-            descr = '%s (%s)' % (exporter_title, args)
-            status = job.finished and 'ready' or 'running'
-            status = job.failed and 'FAILED' or status
-            start_time = getattr(job, 'begin_after', None)
-            if start_time:
-                start_time = start_time.astimezone(
-                    getUtility(
-                        IKofaUtils).tzinfo).strftime("%Y-%m-%d %H:%M:%S %Z")
-            download_url = self.url(self.context, 'download',
-                                    data=dict(job_id=job_id))
-            new_entry = dict(
-                job=job_id,
-                descr=descr,
-                creator=user_id,
-                status=status,
-                start_time=start_time,
-                download_url=download_url,
-                show_download_button = (job.finished and not job.failed),
-                show_refresh_button = not job.finished,
-                show_discard_button = job.finished,)
-            entries.append(new_entry)
-        self.entries = entries
-        pass
-
     def update(self, CREATE=None, DISCARD=None, job_id=None):
         if CREATE:
@@ -2703,5 +2669,5 @@
             self.context.delete_export_entry(entry)
             self.flash(_('Discarded export') + ' %s' % job_id)
-        self.doll_up()
+        self.entries = doll_up(self, user=self.request.principal.id)
         return
 
@@ -2771,21 +2737,7 @@
         return
 
-class ExportJobContainerDownload(grok.View):
+class ExportJobContainerDownload(ExportCSVView):
     """Page that configures a students export job.
     """
     grok.context(VirtualExportJobContainer)
     grok.require('waeup.showStudents')
-    grok.name('download')
-
-    def update(self, job_id=None):
-        self.job_id=job_id
-        return
-
-    def render(self):
-        job = getUtility(IJobManager).get(self.job_id)
-        self.response.setHeader(
-            'Content-Type', 'text/csv; charset=UTF-8')
-        self.response.setHeader(
-            'Content-Disposition:', 'attachment; filename="%s' % (
-                'students.csv',))
-        return open(job.result, 'rb')
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt	(revision 9821)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/exportjobsindex.pt	(revision 9822)
@@ -16,5 +16,5 @@
       </td>
       <td>
-        <span tal:replace="job/descr">DESCRIPTION</span>
+        <span tal:replace="structure job/descr">DESCRIPTION</span>
       </td>
       <td>
@@ -28,19 +28,19 @@
       </td>
       <td nowrap>
+        <a href="" class="btn" i18n:translate=""
+           tal:condition="job/show_refresh_button">
+          <img tal:attributes="src static/actionicon_reload.png" />
+          Reload
+        </a>
+        <a href="" class="btn primary"
+               tal:attributes="href job/download_url"
+               tal:condition="job/show_download_button">
+          Download</a>
         <form method="POST">
           <input type="hidden" name="job_id"
                  tal:attributes="value job/job" />
-          <a href="" class="btn primary"
-                 tal:attributes="href job/download_url"
-                 tal:condition="job/show_download_button">
-            Download</a>
           <input type="submit" class="btn secondary"
                  name="DISCARD" value="Discard"
                  tal:condition="job/show_discard_button" />
-          <a href="" class="btn" i18n:translate=""
-             tal:condition="job/show_refresh_button">
-            <img tal:attributes="src static/actionicon_reload.png" />
-            Reload
-          </a>
         </form>
       </td>
