Index: main/waeup.kofa/trunk/src/waeup/kofa/reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/reports.py	(revision 9669)
+++ main/waeup.kofa/trunk/src/waeup/kofa/reports.py	(revision 9670)
@@ -151,5 +151,5 @@
 
     def get_report_jobs_description(user_id=None):
-        """Get running/completed report jobs fur `user_id` as list of tuples.
+        """Get running/completed report jobs for `user_id` as list of tuples.
 
         The results contain enough information to render a status page
@@ -348,5 +348,5 @@
         kw = self.kwargs.get('kw', dict())
         args = ', '.join(["%r" % x for x in args])
-        kw = ', '.join(['%s = %r' % (key, val) for key, val in kw.items()])
+        kw = ', '.join(['%s' % val for val in kw.values()])
         if len(args) and len(kw):
             str_repr = args + ', ' + kw
@@ -485,8 +485,6 @@
             downloadable = job.finished and not job.failed
             running = not (downloadable or discardable)
-            # XXX: starttime might be better included in description
             starttime = getattr(job, 'begin_after', None)
             if starttime:
-                # XXX is it really neccessary to get a localized time here?
                 starttime = starttime.astimezone(getUtility(IKofaUtils).tzinfo)
                 starttime = starttime.strftime("%Y-%m-%d %H:%M:%S %Z")
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py	(revision 9669)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py	(revision 9670)
@@ -134,11 +134,18 @@
             self.args[0], self.mode, self.author)
 
-    def __str__(self):
-        """A nice human readable representation of a StudentsReport.
-
-        Includes infos about session, mode and creation datetime.
-        """
-        return 'Students Report [session=%s, mode=%s] of %s ' % (
+    #def __str__(self):
+    #    """A nice human readable representation of a StudentsReport.
+
+    #    Includes infos about session, mode and creation datetime.
+    #    """
+    #    return 'Students Report [session=%s, mode=%s] of %s ' % (
+    #        self.session, self.mode, self._creation_dt_string)
+
+    @property
+    def title(self):
+        title = 'StudentsReport_%s_%s_%s' % (
             self.session, self.mode, self._creation_dt_string)
+        title = title.replace('/', '_').replace(' ','_')
+        return title
 
     def create_pdf(self):
@@ -234,5 +241,5 @@
 
     def render(self):
-        filename = "%s.pdf" % (self.context.__repr__())
+        filename = "%s.pdf" % (self.context.title)
         self.response.setHeader(
             'Content-Type', 'application/pdf')
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_reports.py	(revision 9669)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_reports.py	(revision 9670)
@@ -33,11 +33,18 @@
         return
 
-    def test_str(self):
-        # StudentsReport provide a nice string representation
+    #def test_str(self):
+    #    # StudentsReport provide a nice string representation
+    #    obj = StudentsReport(2010, 'Undergraduate Full-Time', author='Bob')
+    #    self.assertEqual(
+    #        obj.__str__()[:65],
+    #        'Students Report '
+    #        '[session=2010/2011, mode=Undergraduate Full-Time]')
+    #    return
+
+    def test_title(self):
         obj = StudentsReport(2010, 'Undergraduate Full-Time', author='Bob')
-        self.assertEqual(
-            obj.__str__()[:65],
-            'Students Report '
-            '[session=2010/2011, mode=Undergraduate Full-Time]')
+        self.assertTrue(
+            obj.title.startswith(
+            'StudentsReport_2010_2011_Undergraduate_Full-Time_'))
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py	(revision 9669)
+++ main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py	(revision 9670)
@@ -218,5 +218,5 @@
         self.assertEqual(
             job.description,
-            "Report 1 ('a', 'b', a = 1, b = 2)")
+            "Report 1 ('a', 'b', 1, 2)")
         # w/o args nor kwargs
         job = AsyncReportJob(self.root_folder, 'report1')
@@ -231,5 +231,5 @@
         job = AsyncReportJob(self.root_folder, 'report1', kw=kw)
         self.assertEqual(
-            job.description, "Report 1 (a = 1, b = 2)")
+            job.description, "Report 1 (1, 2)")
         return
 
@@ -248,10 +248,10 @@
             self.root_folder, 'NOT_EXISTENT', kw=dict(a=1, b=2))
         self.assertEqual(
-            job.description, u'Unregistered Report Generator (a = 1, b = 2)')
+            job.description, u'Unregistered Report Generator (1, 2)')
         # with args and kws set
         job = AsyncReportJob(
             self.root_folder, 'NOT_EXISTENT', args=['a'], kw=dict(b=2))
         self.assertEqual(
-            job.description, u"Unregistered Report Generator ('a', b = 2)")
+            job.description, u"Unregistered Report Generator ('a', 2)")
         return
 
