django-slick-reporting icon indicating copy to clipboard operation
django-slick-reporting copied to clipboard

Reporting engine for Django, Create dashboards, reports and charts effectively and effortlessly.

.. image:: https://img.shields.io/pypi/v/django-slick-reporting.svg :target: https://pypi.org/project/django-slick-reporting

.. image:: https://img.shields.io/pypi/pyversions/django-slick-reporting.svg :target: https://pypi.org/project/django-slick-reporting

.. image:: https://img.shields.io/readthedocs/django-slick-reporting :target: https://django-slick-reporting.readthedocs.io/

.. image:: https://api.travis-ci.com/ra-systems/django-slick-reporting.svg?branch=master :target: https://app.travis-ci.com/github/ra-systems/django-slick-reporting

.. image:: https://img.shields.io/codecov/c/github/ra-systems/django-slick-reporting :target: https://codecov.io/gh/ra-systems/django-slick-reporting

Django Slick Reporting

A one stop reports engine with batteries included.

Features

  • Effortlessly create Simple, Grouped, Time series and Crosstab reports in a handful of code lines.
  • Create your Custom Calculation easily, which will be integrated with the above reports types
  • Optimized for speed.
  • Batteries included! Chart.js , DataTable.net & a Bootstrap form.

Installation

Use the package manager pip <https://pip.pypa.io/en/stable/>_ to install django-slick-reporting.

.. code-block:: console

    pip install django-slick-reporting

Usage

So you have a model that contains data, let's call it MySalesItems

You can simply use a code like this

.. code-block:: python

# in your urls.py
path('path-to-report', TotalProductSales.as_view())


# in views.py
from django.db.models import Sum
from slick_reporting.views import SlickReportView
from slick_reporting.fields import SlickReportField
from .models import MySalesItems

class TotalProductSales(SlickReportView):

    report_model = MySalesItems
    date_field = 'date_placed'
    group_by = 'product'
    columns = ['title',
                SlickReportField.create(Sum, 'quantity') ,
                SlickReportField.create(Sum, 'value', name='sum__value') ]

    chart_settings = [{
        'type': 'column',
        'data_source': ['sum__value'],
        'plot_total': False,
        'title_source': 'title',
        'title': _('Detailed Columns'),

    }, ]

To get something like this

.. image:: https://i.ibb.co/SvxTM23/Selection-294.png :target: https://i.ibb.co/SvxTM23/Selection-294.png :alt: Shipped in View Page

You can do a monthly time series :

.. code-block:: python

# in views.py
from slick_reporting.views import SlickReportView
from slick_reporting.fields import SlickReportField
from .models import MySalesItems

class MonthlyProductSales(SlickReportView):
    report_model = MySalesItems
    date_field = 'date_placed'
    group_by = 'product'
    columns = ['name', 'sku']

    # Analogy for time series
    time_series_pattern = 'monthly'
    time_series_columns = [SlickReportField.create(Sum, 'quantity', name='sum__quantity') ]

This would return a table looking something like this:

+--------------+----------------------+-----------------+----------------+-----------------------+-------------------------------+ | Product Name | SKU | Total Quantity | Total Quantity | Total Quantity in ... | Total Quantity in December 20 | | | | in Jan 20 | in Feb 20 | | | +--------------+----------------------+-----------------+----------------+-----------------------+-------------------------------+ | Product 1 | | 10 | 15 | ... | 14 | +--------------+----------------------+-----------------+----------------+-----------------------+-------------------------------+ | Product 2 | | 11 | 12 | ... | 12 | +--------------+----------------------+-----------------+----------------+-----------------------+-------------------------------+ | Product 3 | | 17 | 12 | ... | 17 | +--------------+----------------------+-----------------+----------------+-----------------------+-------------------------------+

This example code assumes your "MySalesItems" model contains the fields product as foreign key, quantity as number , and date_placed as a date field. It also assumes your Product model has an SKU field.. Change those to better suit your structure.

--

On a low level

You can interact with the ReportGenerator using same syntax as used with the SlickReportView .

.. code-block:: python

from slick_reporting.generator import ReportGenerator
from . models import MySalesModel

report = ReportGenerator(report_model=MySalesModel,
                        group_by='product',
                        columns=['title', '__total__']
)
report.get_report_data() #-> [{'title':'Product 1', '__total__: 56}, {'title':'Product 2', '__total__: 43}, ]

This is just a scratch, for more please visit the documentation

Batteries Included

Slick Reporting comes with

  • A Bootstrap Filter Form
  • Charting support Chart.js <https://www.chartjs.org/>_
  • Powerful tables datatables.net <https://datatables.net/>_

A Preview:

.. image:: https://i.ibb.co/SvxTM23/Selection-294.png :target: https://i.ibb.co/SvxTM23/Selection-294.png :alt: Shipped in View Page

Demo site

Available on Django Slick Reporting <https://django-slick-reporting.com/>_

Documentation

Available on Read The Docs <https://django-slick-reporting.readthedocs.io/en/latest/>_

Road Ahead

This project is young and can use your support.

Some of the ideas / features that ought be added

  • Support Other backends like SQL Alchemy & Pandas
  • Support Time Series and Crosstab at the same time

Running tests

Create a virtual environment (maybe with virtual slick_reports_test), activate it; Then ,

.. code-block:: console

$ git clone [email protected]:ra-systems/django-slick-reporting.git
$ cd tests
$ python -m pip install -e ..

$ python runtests.py
#     Or for Coverage report
$ coverage run --include=../* runtests.py [-k]
$ coverage html

Support & Contributing

Please consider star the project to keep an eye on it. Your PRs, reviews are most welcome and needed.

We honor the well formulated Django's guidelines <https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/>_ to serve as contribution guide here too.

Authors

  • Ramez Ashraf - Initial work - RamezIssac <https://github.com/RamezIssac>_

Cross Reference

If you like this package, chances are you may like those packages too!

Django Tabular Permissions <https://github.com/RamezIssac/django-tabular-permissions>_ Display Django permissions in a HTML table that is translatable and easy customized.

Django Ra ERP Framework <https://github.com/ra-systems/RA>_ A framework to build business solutions with ease.

If you find this project useful or promising , You can support us by a github ⭐