reports – Report Generation Components Module

Components for report generation.

class waeup.kofa.reports.AsyncReportJob(site, generator_name, args=[], kw={})[source]

Bases: zc.async.job.Job

An IJob that creates reports.

AsyncReportJob instances are regular AsyncJob instances with a different constructor API. Instead of a callable to execute, you must pass a site, some generator_name, and additional args and keywords to create a report.

The real work is done when an instance of this class is put into a queue. See waeup.kofa.async to learn more about asynchronous jobs.

The generator_name must be the name under which an IReportGenerator utility was registered with the ZCA.

The site must be a valid site or None.

The result of an AsyncReportJob is an IReport object.

__doc__ = 'An IJob that creates reports.\n\n `AsyncReportJob` instances are regular `AsyncJob` instances with a\n different constructor API. Instead of a callable to execute, you\n must pass a `site`, some `generator_name`, and additional args and\n keywords to create a report.\n\n The real work is done when an instance of this class is put into a\n queue. See :mod:`waeup.kofa.async` to learn more about\n asynchronous jobs.\n\n The `generator_name` must be the name under which an IReportGenerator\n utility was registered with the ZCA.\n\n The `site` must be a valid site or ``None``.\n\n The result of an `AsyncReportJob` is an IReport object.\n '
__implemented__ = <implementedBy waeup.kofa.reports.AsyncReportJob>
__init__(site, generator_name, args=[], kw={})[source]
__module__ = 'waeup.kofa.reports'
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
failed

A report job is marked failed iff it is finished and the result does not provide IReport.

While a job is unfinished, the failed status is None.

Failed jobs normally provide a traceback to examine reasons.

finished

A job is marked finished if it is completed.

Please note: a finished report job does not neccessarily provide an IReport result. See meth:failed.

class waeup.kofa.reports.HandleReports(id, title='', description='')[source]

Bases: grokcore.security.components.Permission

The HandleReports permission allows to add any kind of report and to view and remove own reports, i.e. reports which were created by the logged-in user.

__doc__ = 'The HandleReports permission allows to add any kind of report\n and to view and remove own reports, i.e. reports which were created by\n the logged-in user.\n '
__module__ = 'waeup.kofa.reports'
interface waeup.kofa.reports.IReport[source]

A report.

args

The args passed to constructor

creation_dt

Datetime when a report was created. The datetime should reflect the point of time when the data was fetched, not when any output was created.

kwargs

The keywords passed to constructor

create_pdf(job_id)

Generate a PDF copy.

interface waeup.kofa.reports.IReportGenerator[source]

Extends: waeup.kofa.interfaces.IKofaObject

A report generator.

generate(site, args=[], kw={})

Generate a report.

args and kw are the parameters needed to create a specific report (if any).

title

Human readable description of report type.

interface waeup.kofa.reports.IReportJob[source]

Extends: zc.async.interfaces.IJob

failed

True iff the job finished and didn’t provide a report.

finished

True if the job finished.`

__init__(site, generator_name)

Create a report job via generator.

interface waeup.kofa.reports.IReportJobContainer[source]

A component that contains (maybe virtually) report jobs.

get_running_report_jobs(user_id=None)

Get report jobs for user with user_id as list of tuples.

Each tuples holds <job_id>, <generator_name>, <user_id> in that order. The <generator_name> is the utility name of the used report generator.

If user_id is None, all running report jobs are returned.

report_entry_from_job_id(job_id)

Get entry tuple for job_id.

Returns None if no such entry can be found.

start_report_job(report_generator_name, user_id, args=[], kw={})

Start asynchronous report job.

report_generator_name
is the name of a report generator utility to be used.
user_id
is the ID of the user that triggers the report generation.
args and kw
args and keywords passed to the generators generate() method.

The job_id is stored along with exporter name and user id in a persistent list.

Returns the job ID of the job started.

delete_report_entry(entry)

Delete the report job denoted by entry.

Removes entry from the local running_report_jobs list and also removes the regarding job via the local job manager.

entry is a tuple (<job id>, <generator name>, <user id>) as created by start_report_job() or returned by get_running_report_jobs().

get_report_jobs_status(user_id=None)

Get running/completed report jobs for user_id as list of tuples.

Each tuple holds <raw status>, <status translated>, <generator title> in that order, where <status translated> and <generator title> are translated strings representing the status of the job and the human readable title of the report generator used.

interface waeup.kofa.reports.IReportsContainer[source]

Extends: grok.interfaces.IContainer, waeup.kofa.reports.IReportJobContainer, waeup.kofa.interfaces.IKofaObject

A grok container that holds report jobs.

class waeup.kofa.reports.ManageReports(id, title='', description='')[source]

Bases: grokcore.security.components.Permission

The ManageReports permission allows to view, add and remove also the reports of other users. It requires the permission to handle reports.

__doc__ = 'The ManageReports permission allows to view, add and remove also\n the reports of other users. It requires the permission to handle reports.\n '
__module__ = 'waeup.kofa.reports'
class waeup.kofa.reports.Report(args=[], kwargs={})[source]

Bases: object

A base for reports.

__dict__ = dict_proxy({'__providedBy__': <_interface_coptimizations.ObjectSpecificationDescriptor object at 0x2ba7d007e2b0>, '__module__': 'waeup.kofa.reports', 'creation_dt': None, '__provides__': <zope.interface.declarations.ClassProvides object at 0x2ba7d70fc3d0>, '__dict__': <attribute '__dict__' of 'Report' objects>, 'create_pdf': <function create_pdf at 0x2ba7d7657848>, '__implemented__': <implementedBy waeup.kofa.reports.Report>, '__weakref__': <attribute '__weakref__' of 'Report' objects>, '__doc__': 'A base for reports.\n ', '__init__': <function __init__ at 0x2ba7d7657c80>})
__doc__ = 'A base for reports.\n '
__implemented__ = <implementedBy waeup.kofa.reports.Report>
__init__(args=[], kwargs={})[source]
__module__ = 'waeup.kofa.reports'
__providedBy__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__weakref__

list of weak references to the object (if defined)

create_pdf(job_id)[source]
creation_dt = None
class waeup.kofa.reports.ReportGenerator[source]

Bases: object

A base for report generators.

__dict__ = dict_proxy({'__providedBy__': <_interface_coptimizations.ObjectSpecificationDescriptor object at 0x2ba7d007e2b0>, '__module__': 'waeup.kofa.reports', 'title': u'Unnamed Report', '__provides__': <zope.interface.declarations.ClassProvides object at 0x2ba7d70fc650>, '__doc__': 'A base for report generators.\n ', '__dict__': <attribute '__dict__' of 'ReportGenerator' objects>, '__implemented__': <implementedBy waeup.kofa.reports.ReportGenerator>, '__weakref__': <attribute '__weakref__' of 'ReportGenerator' objects>, 'generate': <function generate at 0x2ba7d7657668>})
__doc__ = 'A base for report generators.\n '
__implemented__ = <implementedBy waeup.kofa.reports.ReportGenerator>
__module__ = 'waeup.kofa.reports'
__providedBy__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__weakref__

list of weak references to the object (if defined)

generate(site, args=[], kw={})[source]
title = u'Unnamed Report'
class waeup.kofa.reports.ReportJobContainer[source]

Bases: object

A mix-in that provides functionality for asynchronous report jobs.

__dict__ = dict_proxy({'__providedBy__': <_interface_coptimizations.ObjectSpecificationDescriptor object at 0x2ba7d007e2b0>, '__module__': 'waeup.kofa.reports', 'get_running_report_jobs': <function get_running_report_jobs at 0x2ba7d7657d70>, 'running_report_jobs': [], 'report_entry_from_job_id': <function report_entry_from_job_id at 0x2ba7d7657ed8>, 'start_report_job': <function start_report_job at 0x2ba7d7657cf8>, 'delete_report_entry': <function delete_report_entry at 0x2ba7d7657e60>, '__provides__': <zope.interface.declarations.ClassProvides object at 0x2ba7d6fc5090>, 'get_report_jobs_status': <function get_report_jobs_status at 0x2ba7d7657de8>, '__dict__': <attribute '__dict__' of 'ReportJobContainer' objects>, '__implemented__': <implementedBy waeup.kofa.reports.ReportJobContainer>, '__weakref__': <attribute '__weakref__' of 'ReportJobContainer' objects>, '__doc__': 'A mix-in that provides functionality for asynchronous report jobs.\n '})
__doc__ = 'A mix-in that provides functionality for asynchronous report jobs.\n '
__implemented__ = <implementedBy waeup.kofa.reports.ReportJobContainer>
__module__ = 'waeup.kofa.reports'
__providedBy__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
__weakref__

list of weak references to the object (if defined)

delete_report_entry(entry)[source]

Delete the report job denoted by entry.

Removes entry from the local running_report_jobs list and also removes the regarding job via the local job manager.

entry is a tuple (<job id>, <generator name>, <user id>) as created by start_report_job() or returned by get_running_report_jobs().

get_report_jobs_status(user_id=None)[source]

Get running/completed report jobs for user_id as list of tuples.

Each tuple holds <raw status>, <status translated>, <generator title> in that order, where <status translated> and <generator title> are translated strings representing the status of the job and the human readable title of the report generator used.

get_running_report_jobs(user_id=None)[source]

Get report jobs for user with user_id as list of tuples.

Each tuples holds <job_id>, <generator_name>, <user_id> in that order. The <generator_name> is the utility name of the used report generator.

If user_id is None, all running report jobs are returned.

report_entry_from_job_id(job_id)[source]

Get entry tuple for job_id.

Returns None if no such entry can be found.

running_report_jobs = []
start_report_job(generator_name, user_id, args=[], kw={})[source]

Start asynchronous export job.

generator_name
is the name of a report generator utility to be used.
user_id
is the ID of the user that triggers the report generation.
args and kw
args and keywords passed to the generators generate() method.

The job_id is stored along with exporter name and user id in a persistent list.

Returns the job ID of the job started, None if the job could not be started.

class waeup.kofa.reports.ReportsContainer[source]

Bases: grokcore.content.components.Container, waeup.kofa.reports.ReportJobContainer

A container for reports.

__doc__ = 'A container for reports.\n '
__implemented__ = <implementedBy waeup.kofa.reports.ReportsContainer>
__module__ = 'waeup.kofa.reports'
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
class waeup.kofa.reports.ReportsContainerPlugin[source]

Bases: grokcore.component.components.GlobalUtility

A plugin that updates sites to contain a reports container.

__doc__ = 'A plugin that updates sites to contain a reports container.\n '
__implemented__ = <implementedBy waeup.kofa.reports.ReportsContainerPlugin>
__module__ = 'waeup.kofa.reports'
__provides__

Special descriptor for class __provides__

The descriptor caches the implementedBy info, so that we can get declarations for objects without instance-specific interfaces a bit quicker.

For example:

>>> from zope.interface import Interface
>>> class IFooFactory(Interface):
...     pass
>>> class IFoo(Interface):
...     pass
>>> class C(object):
...     implements(IFoo)
...     classProvides(IFooFactory)
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
['IFoo']
deprecated_attributes = []
setup(site, name, logger)[source]

Add a reports container for site.

If there is such an object already, we install a fresh one.

update(site, name, logger)[source]

Install a reports container in site.

If one exists already, do nothing.

class waeup.kofa.reports.ReportsManager(id, title, description='')[source]

Bases: grok.components.Role

The Reports Manager has the permission to view, add and remove all reports.

__doc__ = 'The Reports Manager has the permission to view, add and remove\n **all** reports.\n '
__module__ = 'waeup.kofa.reports'
class waeup.kofa.reports.ReportsOfficer(id, title, description='')[source]

Bases: grok.components.Role

The Reports Officer has the permission to view, add and remove own reports.

__doc__ = 'The Reports Officer has the permission to view, add and remove\n **own** reports.\n '
__module__ = 'waeup.kofa.reports'
waeup.kofa.reports.get_generators()[source]

Get available report generators.

Returns an iterator of tuples <NAME, GENERATOR> with NAME being the name under which the respective generator was registered.

waeup.kofa.reports.report_job(site, generator_name, args=[], kw={})[source]

Get a generator and perform report creation.

site
is the site for which the report should be created.
generator_name
the global utility name under which the desired generator is registered.
args and kw
Arguments and keywords to be passed to the generate() method of the desired generator. While args should be a list, kw should be a dictionary.