Skip to content

Commit aed9262

Browse files
committed
Merge branch 'release/v0.4'
2 parents af94af4 + 9cfe669 commit aed9262

File tree

13 files changed

+66
-57
lines changed

13 files changed

+66
-57
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [0.4.0] - 2020-11-24 [BREAKING]
5+
6+
- Renamed `SampleReportView` to `SlickReportView`
7+
- Renamed `BaseReportField` to `SlickReportField`
8+
- Added `SlickReportViewBase` leaving sanity checks for the `SlickReportView`
9+
410
## [0.3.0] - 2020-11-23
511

612
- Add Sanity checks against incorrect entries in columns or date_field

README.rst

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ You can simply use a code like this
5555
5656
# in views.py
5757
from django.db.models import Sum
58-
from slick_reporting.views import SampleReportView
58+
from slick_reporting.views import SlickReportView
5959
from .models import MySalesItems
6060
61-
class TotalProductSales(SampleReportView):
61+
class TotalProductSales(SlickReportView):
6262
6363
report_model = MySalesItems
6464
date_field = 'date_placed'
6565
group_by = 'product'
6666
columns = ['title',
67-
BaseReportField.create(Sum, 'quantity') ,
68-
BaseReportField.create(Sum, 'value', name='sum__value) ]
67+
SlickReportField.create(Sum, 'quantity') ,
68+
SlickReportField.create(Sum, 'value', name='sum__value) ]
6969
7070
chart_settings = [{
7171
'type': 'column',
@@ -90,10 +90,10 @@ You can do a monthly time series :
9090
.. code-block:: python
9191
9292
# in views.py
93-
from slick_reporting.views import SampleReportView
93+
from slick_reporting.views import SlickReportView
9494
from .models import MySalesItems
9595
96-
class MonthlyProductSales(SampleReportView):
96+
class MonthlyProductSales(SlickReportView):
9797
report_model = MySalesItems
9898
date_field = 'date_placed'
9999
group_by = 'product'
@@ -124,7 +124,7 @@ This would return a table looking something like this:
124124
125125
**On a low level**
126126
127-
You can interact with the `ReportGenerator` using same syntax as used with the `SampleReportView` .
127+
You can interact with the `ReportGenerator` using same syntax as used with the `SlickReportView` .
128128
129129
.. code-block:: python
130130

docs/source/computation_field.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ Let's see how it's written in `slick_reporting.fields`
1616

1717
.. code-block:: python
1818
19-
from slick_reporting.fields import BaseReportField
19+
from slick_reporting.fields import SlickReportField
2020
from slick_reporting.decorators import report_field_register
2121
2222
2323
@report_field_register
24-
class TotalQTYReportField(BaseReportField):
24+
class TotalQTYReportField(SlickReportField):
2525
2626
# The name to use when using this field in the generator
2727
name = '__total_quantity__'
@@ -43,7 +43,7 @@ If you want AVG to the field `price` then the ReportField would look like this
4343
from django.db.models import Avg
4444
4545
@report_field_register
46-
class TotalQTYReportField(BaseReportField):
46+
class TotalQTYReportField(SlickReportField):
4747
4848
name = '__avg_price__'
4949
calculation_field = 'price'
@@ -91,10 +91,10 @@ Two side calculation
9191
# Document how a single field can be computed like a debit and credit.
9292

9393

94-
BaseReportField API
94+
SlickReportField API
9595
-------------------
9696

97-
.. autoclass:: slick_reporting.fields.BaseReportField
97+
.. autoclass:: slick_reporting.fields.SlickReportField
9898

9999
.. autoattribute:: name
100100
.. autoattribute:: calculation_field

docs/source/customization.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ then for each report_model record, the ReportGenerator again asks each Computati
1515

1616
1. View Customization
1717
---------------------
18-
The SampleReportView is a wrapper around FormView. It
18+
The SlickReportView is a wrapper around FormView. It
1919

2020
1. Passes the needed reporting attributes to the ReportGenerator and get the results into the context.
2121
2. Work on GET as well as on POST.

docs/source/index.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ To install django-slick-reporting:
1919
Quickstart
2020
----------
2121
22-
You can start by using ``SampleReportView`` which is a subclass of ``django.views.generic.FormView``
22+
You can start by using ``SlickReportView`` which is a subclass of ``django.views.generic.FormView``
2323

2424
.. code-block:: python
2525
2626
# in views.py
27-
from slick_reporting.views import SampleReportView
27+
from slick_reporting.views import SlickReportView
2828
from .models import MySalesItems
2929
30-
class MonthlyProductSales(SampleReportView):
30+
class MonthlyProductSales(SlickReportView):
3131
# The model where you have the data
3232
report_model = MySalesItems
3333

docs/source/tour.rst

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ This can be written like this
4343
.. code-block:: python
4444
4545
# in your views.py
46-
from slick_reporting.views import SampleReportView
46+
from slick_reporting.views import SlickReportView
4747
48-
class TransactionsReport(SampleReportView):
48+
class TransactionsReport(SlickReportView):
4949
report_model = MySalesItem
5050
columns = ['order_date', 'product__name' , 'client__name', 'quantity', 'price', 'value]
5151
5252
# in your urls.py
5353
path('to-report', TransactionsReport.as_view())
5454
55-
Worth Noting here that the ``SampleReportView`` calls a form generator which return a form containing
55+
Worth Noting here that the ``SlickReportView`` calls a form generator which return a form containing
5656
all foreign keys in the report_model + start and end date filter.
5757
5858
2. Group By report
@@ -72,7 +72,7 @@ which can be written like this:
7272
7373
.. code-block:: python
7474
75-
class TotalQuanAndValueReport(SampleReportView):
75+
class TotalQuanAndValueReport(SlickReportView):
7676
report_model = MySalesItem
7777
group_by = 'product'
7878
columns = ['name', '__total_quantity__', '__total__' ]
@@ -99,7 +99,7 @@ can be written like this
9999
100100
.. code-block:: python
101101
102-
class TotalQuantityMonthly(SampleReportView):
102+
class TotalQuantityMonthly(SlickReportView):
103103
report_model = MySalesItem
104104
group_by = 'product'
105105
columns = ['name', 'sku']
@@ -128,7 +128,7 @@ Which can be written like this
128128
129129
.. code-block:: python
130130
131-
class CrosstabProductClientValue(SampleReportView):
131+
class CrosstabProductClientValue(SlickReportView):
132132
report_model = MySalesItem
133133
group_by = 'product'
134134
columns = ['name', 'sku']
@@ -150,11 +150,11 @@ Which can be written like this
150150
Charts
151151
-------
152152
153-
To create a report we need to a dictionary to a ``chart_settings`` to the SampleReportView.
153+
To create a report we need to a dictionary to a ``chart_settings`` to the SlickReportView.
154154
155155
.. code-block:: python
156156
157-
class MonthlySalesReport(SampleReportView):
157+
class MonthlySalesReport(SlickReportView):
158158
# ....
159159
160160
charts_settings = [{

slick_reporting/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
default_app_config = 'slick_reporting.apps.ReportAppConfig'
33

4-
VERSION = (0, 3, 0)
4+
VERSION = (0, 4, 0)
55

6-
__version__ = '0.3.0'
6+
__version__ = '0.4.0'

slick_reporting/decorators.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ class AuthorAdmin(admin.ModelAdmin):
1010
A kwarg of `site` can be passed as the admin site, otherwise the default
1111
admin site will be used.
1212
"""
13-
from .fields import BaseReportField
13+
from .fields import SlickReportField
1414
from .registry import field_registry
1515

1616
def _model_admin_wrapper(admin_class):
17-
if not issubclass(admin_class, BaseReportField):
18-
raise ValueError('Wrapped class must subclass BaseReportField.')
17+
if not issubclass(admin_class, SlickReportField):
18+
raise ValueError('Wrapped class must subclass SlickReportField.')
1919

2020
field_registry.register(report_field)
2121

slick_reporting/fields.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .registry import field_registry
99

1010

11-
class BaseReportField(object):
11+
class SlickReportField(object):
1212
"""
1313
Computation field responsible for making the calculation unit
1414
"""
@@ -63,7 +63,7 @@ def create(cls, method, field, name=None, verbose_name=None, is_summable=True):
6363
assert name not in cls._field_registry.get_all_report_fields_names()
6464

6565
verbose_name = verbose_name or f'{method.name} {field}'
66-
report_klass = type(f'ReportField_{name}', (BaseReportField,), {
66+
report_klass = type(f'ReportField_{name}', (SlickReportField,), {
6767
'name': name,
6868
'verbose_name': verbose_name,
6969
'calculation_field': field,
@@ -76,7 +76,7 @@ def __init__(self, plus_side_q=None, minus_side_q=None,
7676
report_model=None,
7777
qs=None,
7878
calculation_field=None, calculation_method=None, date_field='', group_by=None):
79-
super(BaseReportField, self).__init__()
79+
super(SlickReportField, self).__init__()
8080
self.date_field = date_field
8181
self.report_model = self.report_model or report_model
8282
self.calculation_field = calculation_field if calculation_field else self.calculation_field
@@ -296,7 +296,7 @@ def get_time_series_field_verbose_name(cls, date_period):
296296
return f'{cls.verbose_name} {date_period[0].strftime(dt_format)} - {date_period[1].strftime(dt_format)}'
297297

298298

299-
class FirstBalanceField(BaseReportField):
299+
class FirstBalanceField(SlickReportField):
300300
name = '__fb__'
301301
verbose_name = _('first balance')
302302

@@ -312,7 +312,7 @@ def prepare(self, q_filters=None, extra_filters=None, **kwargs):
312312
field_registry.register(FirstBalanceField)
313313

314314

315-
class TotalReportField(BaseReportField):
315+
class TotalReportField(SlickReportField):
316316
name = '__total__'
317317
verbose_name = _('Sum of value')
318318
requires = ['__debit__', '__credit__']
@@ -321,7 +321,7 @@ class TotalReportField(BaseReportField):
321321
field_registry.register(TotalReportField)
322322

323323

324-
class BalanceReportField(BaseReportField):
324+
class BalanceReportField(SlickReportField):
325325
name = '__balance__'
326326
verbose_name = _('Cumulative Total')
327327
requires = ['__fb__']
@@ -337,7 +337,7 @@ def final_calculation(self, debit, credit, dep_dict):
337337
field_registry.register(BalanceReportField)
338338

339339

340-
class CreditReportField(BaseReportField):
340+
class CreditReportField(SlickReportField):
341341
name = '__credit__'
342342
verbose_name = _('Credit')
343343

@@ -348,7 +348,7 @@ def final_calculation(self, debit, credit, dep_dict):
348348
field_registry.register(CreditReportField)
349349

350350

351-
class DebitReportField(BaseReportField):
351+
class DebitReportField(SlickReportField):
352352
name = '__debit__'
353353
verbose_name = _('Debit')
354354

@@ -359,7 +359,7 @@ def final_calculation(self, debit, credit, dep_dict):
359359
field_registry.register(DebitReportField)
360360

361361

362-
class TotalQTYReportField(BaseReportField):
362+
class TotalQTYReportField(SlickReportField):
363363
name = '__total_quantity__'
364364
verbose_name = _('Total QTY')
365365
calculation_field = 'quantity'
@@ -379,7 +379,7 @@ class FirstBalanceQTYReportField(FirstBalanceField):
379379
field_registry.register(FirstBalanceQTYReportField)
380380

381381

382-
class BalanceQTYReportField(BaseReportField):
382+
class BalanceQTYReportField(SlickReportField):
383383
name = '__balance_quantity__'
384384
verbose_name = _('Cumulative QTY')
385385
calculation_field = 'quantity'

slick_reporting/generator.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.core.exceptions import ImproperlyConfigured, FieldDoesNotExist
88
from django.db.models import Q
99

10-
from .fields import BaseReportField
10+
from .fields import SlickReportField
1111
from .helpers import get_field_from_query_text
1212
from .registry import field_registry
1313

@@ -266,7 +266,7 @@ def _construct_crosstab_filter(self, col_data):
266266
return filters
267267

268268
def _prepare_report_dependencies(self):
269-
from .fields import BaseReportField
269+
from .fields import SlickReportField
270270
all_columns = (
271271
('normal', self._parsed_columns),
272272
('time_series', self._time_series_parsed_columns),
@@ -276,7 +276,7 @@ def _prepare_report_dependencies(self):
276276
for col_data in window_cols:
277277
klass = col_data['ref']
278278

279-
if isclass(klass) and issubclass(klass, BaseReportField):
279+
if isclass(klass) and issubclass(klass, SlickReportField):
280280
dependencies_names = klass.get_full_dependency_list()
281281

282282
# check if any of this dependencies is on the report
@@ -291,7 +291,7 @@ def _prepare_report_dependencies(self):
291291
name = col_data['name']
292292

293293
# if column has a dependency then skip it
294-
if not (isclass(klass) and issubclass(klass, BaseReportField)):
294+
if not (isclass(klass) and issubclass(klass, SlickReportField)):
295295
continue
296296
if self._report_fields_dependencies[window].get(name, False):
297297
continue
@@ -389,7 +389,7 @@ def check_columns(cls, columns, group_by, report_model, ):
389389

390390
if type(col) is str:
391391
attr = getattr(cls, col, None)
392-
elif issubclass(col, BaseReportField):
392+
elif issubclass(col, SlickReportField):
393393
magic_field_class = col
394394

395395
try:
@@ -491,7 +491,7 @@ def get_time_series_parsed_columns(self):
491491

492492
if type(col) is str:
493493
magic_field_class = field_registry.get_field_by_name(col)
494-
elif issubclass(col, BaseReportField):
494+
elif issubclass(col, SlickReportField):
495495
magic_field_class = col
496496

497497
_values.append({
@@ -576,7 +576,7 @@ def get_crosstab_parsed_columns(self):
576576
magic_field_class = None
577577
if type(col) is str:
578578
magic_field_class = field_registry.get_field_by_name(col)
579-
elif issubclass(col, BaseReportField):
579+
elif issubclass(col, SlickReportField):
580580
magic_field_class = col
581581

582582
output_cols.append({

slick_reporting/views.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from .generator import ReportGenerator
1313

1414

15-
class SampleReportView(FormView):
15+
class SlickReportViewBase(FormView):
1616
group_by = None
1717
columns = None
1818

@@ -223,6 +223,9 @@ def get_initial(self):
223223
'end_date': SLICK_REPORTING_DEFAULT_END_DATE
224224
}
225225

226+
227+
class SlickReportView(SlickReportViewBase):
228+
226229
def __init_subclass__(cls) -> None:
227230
date_field = getattr(cls, 'date_field', '')
228231
if not date_field:

0 commit comments

Comments
 (0)