Skip to content

Commit 71a9459

Browse files
author
Ramez Ashraf
committed
Fix a bug with requires , in case of time series and crosstab
1 parent c5d8f17 commit 71a9459

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

slick_reporting/fields.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ def init_preparation(self, q_filters=None, kwargs_filters=None, **kwargs):
130130

131131
debit_results, credit_results = self.prepare(q_filters, kwargs_filters, **kwargs)
132132
self._cache = debit_results, credit_results, dep_values
133+
return self._cache
133134

134135
def prepare(self, q_filters=None, kwargs_filters=None, **kwargs):
135136
"""
@@ -188,7 +189,8 @@ def _prepare_dependencies(self, q_filters=None, extra_filters=None, ):
188189
for dep_class in self._require_classes:
189190
dep = dep_class(self.plus_side_q, self.minus_side_q, self.report_model,
190191
date_field=self.date_field, group_by=self.group_by)
191-
values[dep.name] = {'results': dep.init_preparation(q_filters, extra_filters),
192+
results = dep.init_preparation(q_filters, extra_filters)
193+
values[dep.name] = {'results': results,
192194
'instance': dep}
193195
return values
194196

@@ -216,17 +218,19 @@ def get_dependency_value(self, current_obj, name=None):
216218
:return: a dict containing dependencies names as keys and their calculation as values
217219
or a specific value if name is specified.
218220
"""
219-
values = self._resolve_dependencies(current_obj)
221+
values = self._resolve_dependencies(current_obj, name=None)
220222
if name:
221223
return values.get(name)
222224
return values
223225

224-
def _resolve_dependencies(self, current_obj):
226+
def _resolve_dependencies(self, current_obj, name=None):
225227

226228
dep_results = {}
227229
cached_debit, cached_credit, dependencies_value = self._cache
228230
dependencies_value = dependencies_value or {}
229231
for d in dependencies_value.keys():
232+
if name and d != name:
233+
continue
230234
d_instance = dependencies_value[d]['instance']
231235
dep_results[d] = d_instance.resolve(current_obj)
232236
return dep_results
@@ -382,7 +386,7 @@ class PercentageToBalance(SlickReportField):
382386
def final_calculation(self, debit, credit, dep_dict):
383387
obj_balance = dep_dict.get('__balance__')
384388
total = debit - credit
385-
return (obj_balance/total) * 100
389+
return (obj_balance / total) * 100
386390

387391

388392
class CreditReportField(SlickReportField):

slick_reporting/generator.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,11 @@ def _prepare_report_dependencies(self):
306306
if isclass(klass) and issubclass(klass, SlickReportField):
307307
dependencies_names = klass.get_full_dependency_list()
308308

309-
# check if any of this dependencies is on the report
310-
fields_on_report = [x for x in window_cols if x['ref'] in dependencies_names]
309+
# check if any of these dependencies is on the report, if found we call the child to
310+
# resolve the value for its parent avoiding extra database call
311+
fields_on_report = [x for x in window_cols if x['ref'] in dependencies_names
312+
and ((window == 'time_series' and x.get('start_date', '') == col_data.get('start_date', '') and x.get('end_date') == col_data.get('end_date')) or
313+
window == 'crosstab' and x.get('id') == col_data.get('id'))]
311314
for field in fields_on_report:
312315
self._report_fields_dependencies[window][field['name']] = col_data['name']
313316
for col_data in window_cols:

tests/tests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,14 @@ def test_client_client_sales_monthly(self):
172172
self.assertEqual(data[0]['__total__TS%s0301' % year], 100)
173173
self.assertEqual(data[0]['__total__TS%s0201' % year], 100)
174174

175+
self.assertEqual(data[0]['__debit__TS%s0401' % year], 100)
176+
self.assertEqual(data[0]['__debit__TS%s0301' % year], 100)
177+
self.assertEqual(data[0]['__debit__TS%s0201' % year], 100)
178+
179+
self.assertEqual(data[2]['__debit__TS%s0401' % year], 300)
180+
self.assertEqual(data[2]['__debit__TS%s0301' % year], 300)
181+
self.assertEqual(data[2]['__debit__TS%s0201' % year], 300)
182+
175183
# todo add __fb__ to time series and check the balance
176184

177185
def test_client_statement_detail(self):

0 commit comments

Comments
 (0)