Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/reports.py	(revision 9671)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/reports.py	(revision 9672)
@@ -48,9 +48,20 @@
             self.context.delete_report_entry(entry)
             self.flash('Report discarded: %s' % job_id)
-        self.entries = self.context.get_report_jobs_description()
+        self.entries = self._generate_entries(user_id=None)
+        #self.entries = self.context.get_report_jobs_description()
         if job_id and DOWNLOAD:
             self.redirect(self._report_url(job_id))
             return
         return
+
+    def _generate_entries(self, user_id=None):
+        entries = []
+        for entry in self.context.get_running_report_jobs(user_id=user_id):
+            job_id, gen_name, user = entry
+            job = getUtility(IJobManager).get(job_id)
+            descr = '%r, %r' % (job.args, job.kwargs)
+            new_entry = (job_id, descr, job.status, job.finished, job.finished and not job.failed, not job.finished, job.begin_after, user)
+            entries.append(new_entry)
+        return entries
 
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/reports.py	(revision 9671)
+++ main/waeup.kofa/trunk/src/waeup/kofa/reports.py	(revision 9672)
@@ -22,6 +22,5 @@
 from persistent.list import PersistentList
 from zope import schema
-from zope.component import (
-    getUtility, getUtilitiesFor, queryUtility)
+from zope.component import getUtility, getUtilitiesFor
 from zope.component.hooks import setSite
 from zope.interface import implementer
@@ -29,20 +28,7 @@
 from waeup.kofa.async import AsyncJob
 from waeup.kofa.interfaces import (
-    IJobManager, JOB_STATUS_MAP, IKofaPluggable, IKofaObject, IKofaUtils)
+    IJobManager, JOB_STATUS_MAP, IKofaPluggable, IKofaObject)
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.utils.helpers import now
-
-#: A status map that reflects the really interesting types of status
-#: for reports.
-#:
-#: For reports we want to know whether a job was finished
-#: and/or whether it failed. All the other possible states ('new',
-#: etc.) are not really interesting in that regard.
-STATUS_MAP = {
-    'unknown': _('unknown'),
-    'running': _('running'),
-    'finished': _('finished'),
-    'failed': _('FAILED'),
-    }
 
 class IReport(Interface):
@@ -58,14 +44,4 @@
         """not when any output was created.""")
 
-    title = schema.TextLine(
-        title = u"A human readable short description for a report.",
-        default = u'Untitled',
-        )
-
-    description = schema.Text(
-        title = u"A human readable text describing a report.",
-        default = u'No description'
-        )
-
     def create_pdf():
         """Generate a PDF copy.
@@ -93,14 +69,4 @@
         title = u"`True` iff the job finished and didn't provide a report.",
         default = None,
-        )
-
-    description = schema.TextLine(
-        title = u"""Textual representation of arguments and keywords.""",
-        default = u"",
-        )
-
-    report_status = schema.TextLine(
-        title = u"""Translated status string.""",
-        default = STATUS_MAP['unknown'],
         )
 
@@ -150,42 +116,4 @@
         """
 
-    def get_report_jobs_description(user_id=None):
-        """Get running/completed report jobs for `user_id` as list of tuples.
-
-        The results contain enough information to render a status page
-        or similar. Each tuple holds::
-
-          (``<job_id>, <description>, <status_translated>,
-          <discardable>, <downloadable>, <starttime>, <user_name>``)
-
-        in that order, with
-
-        ``<job_id>``
-            The job id of the represented job. A string.
-
-        ``<description>``
-            A human readable description of the report run.
-
-        ``<status_translated>``
-            The status of report jobs' status (translated)
-
-        ``<discardable>``
-            Boolean indicating whether the job can be discarded.
-            Only completed jobs can be discarded.
-
-        ``<downloadable>``
-            Boolean indicating whether the job result can be
-            downloaded. This is only true if the job finished and
-            didn't raised exceptions.
-
-        ``<starttime>``
-            String indicating when the job was started.
-
-        ``<user_name>``
-            Name of user that started the job.
-
-        If ``user_id`` is ``None``, all jobs are returned.
-        """
-
     def delete_report_entry(entry):
         """Delete the report job denoted by `entry`.
@@ -233,8 +161,4 @@
     def title(self):
         return _(u'A report')
-
-    @property
-    def description(self):
-        return _(u'A dummy report')
 
     def __init__(self, args=[], kwargs={}):
@@ -245,8 +169,4 @@
     def create_pdf(self):
         raise NotImplementedError()
-
-    def __repr__(self):
-        return 'Report(args=%r, kwargs=%r)' % (self.args, self.kwargs)
-
 
 @implementer(IReportGenerator)
@@ -324,41 +244,4 @@
             return True
         return False
-
-    @property
-    def report_status(self):
-        """The status of a report as translated string.
-        """
-        if not self.finished:
-            return STATUS_MAP['running']
-        if self.failed:
-            return STATUS_MAP['failed']
-        return STATUS_MAP['finished']
-
-    @property
-    def description(self):
-        """A description gives a representation of the report to generate.
-
-        The description contains the name of the report generator
-        (trying to fetch the `name` attribute of the requested report
-        generator) and the arguments and keywords passed in.
-
-        Please note that this method is expensive!
-        """
-        args = self.kwargs.get('args', [])
-        kw = self.kwargs.get('kw', dict())
-        args = ', '.join(["%r" % x for x in args])
-        kw = ', '.join(['%s' % val for val in kw.values()])
-        if len(args) and len(kw):
-            str_repr = args + ', ' + kw
-        else:
-            str_repr = args + kw
-        str_repr = '(' + str_repr + ')'
-        try:
-            generator = getUtility(
-                IReportGenerator, name=self._generator_name)
-            name = generator.title
-        except:
-            name = _('Unregistered Report Generator')
-        return name + ' ' + str_repr
 
 @implementer(IReportJobContainer)
@@ -439,61 +322,4 @@
         return result
 
-    def get_report_jobs_description(self, user_id=None):
-        """Get running/completed report jobs fur `user_id` as list of tuples.
-
-        The results contain enough information to render a status page
-        or similar. Each tuple holds::
-
-          (``<job_id>, <description>, <status_translated>,
-          <discardable>, <downloadable>, <starttime>, <user_name>``)
-
-        in that order, with
-
-        ``<job_id>``
-            The job id of the represented job. A string.
-
-        ``<description>``
-            A human readable description of the report run.
-
-        ``<status_translated>``
-            The status of report jobs' status (translated)
-
-        ``<discardable>``
-            Boolean indicating whether the job can be discarded.
-            Only completed jobs can be discarded.
-
-        ``<downloadable>``
-            Boolean indicating whether the job result can be
-            downloaded. This is only true if the job finished and
-            didn't raised exceptions.
-
-        ``<starttime>``
-            String indicating when the job was started.
-
-        ``<user_name>``
-            Name of user that started the job.
-
-        If ``user_id`` is ``None``, all jobs are returned.
-        """
-        entries = self.get_running_report_jobs(user_id)
-        result = []
-        for (job_id, gen_name, user_name) in entries:
-            manager = getUtility(IJobManager)
-            job = manager.get(job_id)
-            status = job.report_status
-            discardable = job.finished
-            downloadable = job.finished and not job.failed
-            running = not (downloadable or discardable)
-            starttime = getattr(job, 'begin_after', None)
-            if starttime:
-                starttime = starttime.astimezone(getUtility(IKofaUtils).tzinfo)
-                starttime = starttime.strftime("%Y-%m-%d %H:%M:%S %Z")
-            if not hasattr(job, 'description'):
-                continue
-            result.append((job_id, job.description, status,
-                           discardable, downloadable, running,
-                           starttime, user_name),)
-        return result
-
     def delete_report_entry(self, entry):
         """Delete the report job denoted by `entry`.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py	(revision 9671)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/reports.py	(revision 9672)
@@ -128,18 +128,4 @@
         self.data = get_students_by(session, mode)
 
-    def __repr__(self):
-        """Creates an executable representation of a StudentsReport object.
-        """
-        return 'StudentsReport(%r, %r, author=%r)' % (
-            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 ' % (
-    #        self.session, self.mode, self._creation_dt_string)
-
     @property
     def title(self):
@@ -169,8 +155,4 @@
     title = _('Students')
     grok.name('students_by')
-
-    @property
-    def description(self):
-        return self.title
 
     def generate(self, site, session=None, mode=None, author=None):
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 9671)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_reports.py	(revision 9672)
@@ -20,25 +20,4 @@
         verifyObject(IStudentsReport, obj)
         return
-
-    def test_repr(self):
-        # exec(students_report.__repr__()) <=> students_report
-        obj1 = StudentsReport(2010, 'Undergraduate Full-Time', author='Bob')
-        self.assertEqual(
-            obj1.__repr__(),
-            "StudentsReport(2010, 'Undergraduate Full-Time', author='Bob')")
-        obj_from_str = eval(obj1.__repr__())
-        self.assertEqual(obj_from_str.session, '2010/2011')
-        self.assertEqual(obj_from_str.mode, 'Undergraduate Full-Time')
-        self.assertEqual(obj_from_str.author, 'Bob')
-        return
-
-    #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):
Index: main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py	(revision 9671)
+++ main/waeup.kofa/trunk/src/waeup/kofa/tests/test_reports.py	(revision 9672)
@@ -211,76 +211,4 @@
         return
 
-    def test_description(self):
-        # IReportJobs provide a description of the started job
-        self.register_generator('report1')
-        args, kw = ['a', 'b'], dict(a=1, b=2)
-        job = AsyncReportJob(self.root_folder, 'report1', args=args, kw=kw)
-        self.assertEqual(
-            job.description,
-            "Report 1 ('a', 'b', 1, 2)")
-        # w/o args nor kwargs
-        job = AsyncReportJob(self.root_folder, 'report1')
-        self.assertEqual(
-            job.description,
-            'Report 1 ()')
-        # with args only
-        job = AsyncReportJob(self.root_folder, 'report1', args=args)
-        self.assertEqual(
-            job.description, "Report 1 ('a', 'b')")
-        # with keywords only
-        job = AsyncReportJob(self.root_folder, 'report1', kw=kw)
-        self.assertEqual(
-            job.description, "Report 1 (1, 2)")
-        return
-
-    def test_description_invalid_generator(self):
-        # We can get a description even with an invalid generator
-        job = AsyncReportJob(self.root_folder, 'NOT EXISTENT')
-        self.assertEqual(
-            job.description, u'Unregistered Report Generator ()')
-        # with args set (no kws)
-        job = AsyncReportJob(
-            self.root_folder, 'NOT EXISTENT', args=['a', 'b'])
-        self.assertEqual(
-            job.description, u"Unregistered Report Generator ('a', 'b')")
-        # with kw set (no args)
-        job = AsyncReportJob(
-            self.root_folder, 'NOT_EXISTENT', kw=dict(a=1, b=2))
-        self.assertEqual(
-            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', 2)")
-        return
-
-    def test_report_status(self):
-        # We can get a report status apart from the job status
-        job = AsyncReportJob(self.root_folder, 'report1')
-        self.assertEqual(job.report_status, u'running')
-        return
-
-    def test_report_status_failed(self):
-        # A failed job is reflected in report_status
-        job = AsyncReportJob(self.root_folder, None) # no report generator
-        setSite(self.root_folder)
-        self.assertTrue(job.failed is None)
-        manager = getUtility(IJobManager)
-        manager.put(job)
-        wait_for_result(job)
-        self.assertEqual(job.report_status, u'FAILED')
-        return
-
-    def test_report_status_finished(self):
-        # A finished report is reflected in report_status
-        job = AsyncReportJob(self.root_folder, 'report1')
-        setSite(self.root_folder)
-        manager = getUtility(IJobManager)
-        manager.put(job)
-        wait_for_result(job)
-        self.assertEqual(job.report_status, u'finished')
-        return
-
 class FakeJobWithResult(FakeJob):
 
@@ -383,17 +311,4 @@
             [('new', u'new', u'Report 1'),
              ('completed', u'completed', u'Report 1')]
-            )
-        return
-
-    def test_get_report_job_description(self):
-        # we can get the descriptions of jobs...
-        container = ReportJobContainer()
-        container.start_report_job('report1', 'alice')
-        container.start_report_job('report1', 'bob')
-        result = container.get_report_jobs_description(user_id='bob')
-        # we'll get the job id, a description and the status
-        self.assertEqual(
-            result,
-            [('2', 'Report 1 ()', u'running', False, False, True, None, 'bob'),]
             )
         return
