Adding a Custom Report

We’ll start with a simple report which shows all departments and the number of products for each.

Each type of report has a “key” which uniquely identifies it. For this example we’ll use poser_dept_prod_counts for the key. Note that it’s a good idea to always use an app-specific prefix (e.g. poser_) in the key.

Typically you will create a new Python module which is named according to the key. Here we’ll create ~/src/poser/poser/reports/dept_prod_counts.py, and in it we’ll define the report:

from sqlalchemy import orm

from rattail.reporting import ExcelReport


class DepartmentProductCounts(ExcelReport):
    """
    Shows all departments and the number of products for each.
    """
    type_key = 'poser_dept_prod_counts'
    name = "Department Product Counts"
    output_fields = [
        'department_number',
        'department_name',
        'product_count',
    ]

    def make_data(self, session, params, progress=None, **kwargs):
        model = self.model

        # fetch all departments, with product lists pre-loaded
        departments = session.query(model.Department)\
                             .order_by(model.Department.number)\
                             .options(orm.joinedload(model.Department.products))\
                             .all()
        rows = []

        def add_row(department, i):
            rows.append({
                'department_number': department.number,
                'department_name': department.name,
                'product_count': len(department.products),
            })

        self.progress_loop(add_row, departments, progress,
                           message="Fetching data for report")
        return rows

Then you must register your new report type, to make it available to the app. This is done within your project’s setup.py file, for instance:

setup(
    name = "Poser",

    # ...

    entry_points = {

        'rattail.reports': [
            'poser_dept_prod_counts = poser.reports.dept_prod_counts:DepartmentProductCounts',
        ],
    },
)

Once you’ve added that you must re-install the app to your virtual environment, for instance:

cd /srv/envs/poser
source bin/activate
pip install -e ~/src/poser

At this point the report should be available for running within the app. See Generating a Report for more info.