diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index eef5ac4657..324f050eb6 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -112,7 +112,8 @@ def dictsum(*dicts) -> dict: def order_overview( event: Event, subevent: SubEvent=None, date_filter='', date_from=None, date_until=None, fees=False, - admission_only=False, base_qs=None, base_fees_qs=None, subevent_date_from=None, subevent_date_until=None + admission_only=False, base_qs=None, base_fees_qs=None, subevent_date_from=None, subevent_date_until=None, + skip_empty_lines=False, ) -> Tuple[List[Tuple[ItemCategory, List[Item]]], Dict[str, Tuple[Decimal, Decimal]]]: items = event.items.all().select_related( 'category', # for re-grouping @@ -205,13 +206,21 @@ def order_overview( for l in states.keys(): var.num[l] = num[l].get((item.id, variid), (0, 0, 0)) var.num['total'] = num['total'].get((item.id, variid), (0, 0, 0)) + var._skip = all(v[0] == 0 for v in var.num.values()) for l in states.keys(): item.num[l] = tuplesum(var.num[l] for var in item.all_variations) item.num['total'] = tuplesum(var.num['total'] for var in item.all_variations) + if skip_empty_lines: + item.all_variations = [v for v in item.all_variations if not v._skip] + item._skip = not item.all_variations else: for l in states.keys(): item.num[l] = num[l].get((item.id, None), (0, 0, 0)) item.num['total'] = num['total'].get((item.id, None), (0, 0, 0)) + item._skip = all(v[0] == 0 for v in item.num.values()) + + if skip_empty_lines: + items = [i for i in items if not i._skip] nonecat = ItemCategory(name=_('Uncategorized')) # Regroup those by category diff --git a/src/pretix/plugins/reports/exporters.py b/src/pretix/plugins/reports/exporters.py index 56df5682d2..6957ab396f 100644 --- a/src/pretix/plugins/reports/exporters.py +++ b/src/pretix/plugins/reports/exporters.py @@ -337,7 +337,8 @@ class OverviewReport(Report): date_until=d_end, subevent_date_from=sd_start, subevent_date_until=sd_end, - fees=True + fees=True, + skip_empty_lines=form_data.get("skip_empty_lines") ) def _table_story(self, doc, form_data, net=False): @@ -478,6 +479,10 @@ class OverviewReport(Report): 'Use the "Accounting report" in the export section instead.' )) ) + f.fields['skip_empty_lines'] = forms.BooleanField( + label=_("Skip empty lines"), + required=False, + ) return f.fields