From 13f3b5439344458be3051c060b94603d76ecd9c4 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 9 Aug 2018 17:56:05 +0200 Subject: [PATCH] Refactor order overview and hide empty fees section --- src/pretix/base/services/stats.py | 150 +++++++----------- .../pretixcontrol/orders/overview.html | 48 +++--- src/pretix/plugins/reports/exporters.py | 46 +++--- 3 files changed, 98 insertions(+), 146 deletions(-) diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index 2129f6f082..e95a3273df 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -88,53 +88,40 @@ def order_overview(event: Event, subevent: SubEvent=None) -> Tuple[List[Tuple[It 'item', 'variation', 'order__status' ).annotate(cnt=Count('id'), price=Sum('price'), tax_value=Sum('tax_value')).order_by() - num_canceled = { - (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) - for p in counters if p['order__status'] == Order.STATUS_CANCELED + states = { + 'canceled': Order.STATUS_CANCELED, + 'refunded': Order.STATUS_REFUNDED, + 'paid': Order.STATUS_PAID, + 'pending': Order.STATUS_PENDING, + 'expired': Order.STATUS_EXPIRED, } - num_refunded = { - (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) - for p in counters if p['order__status'] == Order.STATUS_REFUNDED - } - num_paid = { - (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) - for p in counters if p['order__status'] == Order.STATUS_PAID - } - num_pending = { - (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) - for p in counters if p['order__status'] == Order.STATUS_PENDING - } - num_expired = { - (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) - for p in counters if p['order__status'] == Order.STATUS_EXPIRED - } - num_total = dictsum(num_pending, num_paid) + num = {} + for l, s in states.items(): + num[l] = { + (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value']) + for p in counters if p['order__status'] == s + } + + num['total'] = dictsum(num['pending'], num['paid']) for item in items: item.all_variations = list(item.variations.all()) item.has_variations = (len(item.all_variations) > 0) + item.num = {} if item.has_variations: for var in item.all_variations: variid = var.id - var.num_total = num_total.get((item.id, variid), (0, 0, 0)) - var.num_pending = num_pending.get((item.id, variid), (0, 0, 0)) - var.num_expired = num_expired.get((item.id, variid), (0, 0, 0)) - var.num_canceled = num_canceled.get((item.id, variid), (0, 0, 0)) - var.num_refunded = num_refunded.get((item.id, variid), (0, 0, 0)) - var.num_paid = num_paid.get((item.id, variid), (0, 0, 0)) - item.num_total = tuplesum(var.num_total for var in item.all_variations) - item.num_pending = tuplesum(var.num_pending for var in item.all_variations) - item.num_expired = tuplesum(var.num_expired for var in item.all_variations) - item.num_canceled = tuplesum(var.num_canceled for var in item.all_variations) - item.num_refunded = tuplesum(var.num_refunded for var in item.all_variations) - item.num_paid = tuplesum(var.num_paid for var in item.all_variations) + var.num = {} + 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)) + for l in states.keys(): + item.num[l] = num[l].get((item.id, variid), (0, 0, 0)) + item.num['total'] = num['total'].get((item.id, variid), (0, 0, 0)) else: - item.num_total = num_total.get((item.id, None), (0, 0, 0)) - item.num_pending = num_pending.get((item.id, None), (0, 0, 0)) - item.num_expired = num_expired.get((item.id, None), (0, 0, 0)) - item.num_canceled = num_canceled.get((item.id, None), (0, 0, 0)) - item.num_refunded = num_refunded.get((item.id, None), (0, 0, 0)) - item.num_paid = num_paid.get((item.id, None), (0, 0, 0)) + 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)) nonecat = ItemCategory(name=_('Uncategorized')) # Regroup those by category @@ -151,12 +138,10 @@ def order_overview(event: Event, subevent: SubEvent=None) -> Tuple[List[Tuple[It ) for c in items_by_category: - c[0].num_total = tuplesum(item.num_total for item in c[1]) - c[0].num_pending = tuplesum(item.num_pending for item in c[1]) - c[0].num_expired = tuplesum(item.num_expired for item in c[1]) - c[0].num_canceled = tuplesum(item.num_canceled for item in c[1]) - c[0].num_refunded = tuplesum(item.num_refunded for item in c[1]) - c[0].num_paid = tuplesum(item.num_paid for item in c[1]) + c[0].num = {} + for l in states.keys(): + c[0].num[l] = tuplesum(item.num[l] for item in c[1]) + c[0].num['total'] = tuplesum(item.num['total'] for item in c[1]) # Payment fees payment_cat_obj = DummyObject() @@ -170,27 +155,12 @@ def order_overview(event: Event, subevent: SubEvent=None) -> Tuple[List[Tuple[It 'fee_type', 'internal_type', 'order__status' ).annotate(cnt=Count('id'), value=Sum('value'), tax_value=Sum('tax_value')).order_by() - num_canceled = { - (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) - for o in counters if o['order__status'] == Order.STATUS_CANCELED - } - num_refunded = { - (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) - for o in counters if o['order__status'] == Order.STATUS_REFUNDED - } - num_pending = { - (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) - for o in counters if o['order__status'] == Order.STATUS_PENDING - } - num_expired = { - (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) - for o in counters if o['order__status'] == Order.STATUS_EXPIRED - } - num_paid = { - (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) - for o in counters if o['order__status'] == Order.STATUS_PAID - } - num_total = dictsum(num_pending, num_paid) + for l, s in states.items(): + num[l] = { + (o['fee_type'], o['internal_type']): (o['cnt'], o['value'], o['value'] - o['tax_value']) + for o in counters if o['order__status'] == s + } + num['total'] = dictsum(num['pending'], num['paid']) provider_names = { k: v.verbose_name @@ -198,7 +168,7 @@ def order_overview(event: Event, subevent: SubEvent=None) -> Tuple[List[Tuple[It } names = dict(OrderFee.FEE_TYPES) - for pprov, total in sorted(num_total.items(), key=lambda i: i[0]): + for pprov, total in sorted(num['total'].items(), key=lambda i: i[0]): ppobj = DummyObject() if pprov[0] == OrderFee.FEE_TYPE_PAYMENT: ppobj.name = '{} - {}'.format(names[pprov[0]], provider_names.get(pprov[1], pprov[1])) @@ -212,43 +182,29 @@ def order_overview(event: Event, subevent: SubEvent=None) -> Tuple[List[Tuple[It ppobj.name = '{} - {}'.format(names[pprov[0]], name) ppobj.provider = pprov[1] ppobj.has_variations = False - ppobj.num_total = total - ppobj.num_canceled = num_canceled.get(pprov, (0, 0, 0)) - ppobj.num_refunded = num_refunded.get(pprov, (0, 0, 0)) - ppobj.num_expired = num_expired.get(pprov, (0, 0, 0)) - ppobj.num_pending = num_pending.get(pprov, (0, 0, 0)) - ppobj.num_paid = num_paid.get(pprov, (0, 0, 0)) + ppobj.num = {} + for l in states.keys(): + ppobj.num[l] = num[l].get(pprov, (0, 0, 0)) + ppobj.num['total'] = total payment_items.append(ppobj) - payment_cat_obj.num_total = ( - Dontsum(''), sum(i.num_total[1] for i in payment_items), sum(i.num_total[2] for i in payment_items) - ) - payment_cat_obj.num_canceled = ( - Dontsum(''), sum(i.num_canceled[1] for i in payment_items), sum(i.num_canceled[2] for i in payment_items) - ) - payment_cat_obj.num_refunded = ( - Dontsum(''), sum(i.num_refunded[1] for i in payment_items), sum(i.num_refunded[2] for i in payment_items) - ) - payment_cat_obj.num_expired = ( - Dontsum(''), sum(i.num_expired[1] for i in payment_items), sum(i.num_expired[2] for i in payment_items) - ) - payment_cat_obj.num_pending = ( - Dontsum(''), sum(i.num_pending[1] for i in payment_items), sum(i.num_pending[2] for i in payment_items) - ) - payment_cat_obj.num_paid = ( - Dontsum(''), sum(i.num_paid[1] for i in payment_items), sum(i.num_paid[2] for i in payment_items) + payment_cat_obj.num = {} + for l in states.keys(): + payment_cat_obj.num[l] = ( + Dontsum(''), sum(i.num[l][1] for i in payment_items), sum(i.num[l][2] for i in payment_items) + ) + payment_cat_obj.num['total'] = ( + Dontsum(''), sum(i.num['total'][1] for i in payment_items), sum(i.num['total'][2] for i in payment_items) ) payment_cat = (payment_cat_obj, payment_items) - - items_by_category.append(payment_cat) + any_payment = any(payment_cat_obj.num[s][1] for s in states.keys()) + if any_payment: + items_by_category.append(payment_cat) total = { - 'num_total': tuplesum(c.num_total for c, i in items_by_category), - 'num_pending': tuplesum(c.num_pending for c, i in items_by_category), - 'num_expired': tuplesum(c.num_expired for c, i in items_by_category), - 'num_canceled': tuplesum(c.num_canceled for c, i in items_by_category), - 'num_refunded': tuplesum(c.num_refunded for c, i in items_by_category), - 'num_paid': tuplesum(c.num_paid for c, i in items_by_category) + 'num': {'total': tuplesum(c.num['total'] for c, i in items_by_category)} } + for l in states.keys(): + total['num'][l] = tuplesum(c.num[l] for c, i in items_by_category) return items_by_category, total diff --git a/src/pretix/control/templates/pretixcontrol/orders/overview.html b/src/pretix/control/templates/pretixcontrol/orders/overview.html index f472390904..9732a0f3bd 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/overview.html +++ b/src/pretix/control/templates/pretixcontrol/orders/overview.html @@ -50,12 +50,12 @@ {% if tup.0 %} {{ tup.0 }} - {{ tup.0.num_canceled|togglesum:request.event.currency }} - {{ tup.0.num_refunded|togglesum:request.event.currency }} - {{ tup.0.num_expired|togglesum:request.event.currency }} - {{ tup.0.num_pending|togglesum:request.event.currency }} - {{ tup.0.num_paid|togglesum:request.event.currency }} - {{ tup.0.num_total|togglesum:request.event.currency }} + {{ tup.0.num.canceled|togglesum:request.event.currency }} + {{ tup.0.num.refunded|togglesum:request.event.currency }} + {{ tup.0.num.expired|togglesum:request.event.currency }} + {{ tup.0.num.pending|togglesum:request.event.currency }} + {{ tup.0.num.paid|togglesum:request.event.currency }} + {{ tup.0.num.total|togglesum:request.event.currency }} {% endif %} {% for item in tup.1 %} @@ -63,43 +63,43 @@ {{ item }} - {{ item.num_canceled|togglesum:request.event.currency }} + {{ item.num.canceled|togglesum:request.event.currency }} - {{ item.num_refunded|togglesum:request.event.currency }} + {{ item.num.refunded|togglesum:request.event.currency }} - {{ item.num_expired|togglesum:request.event.currency }} + {{ item.num.expired|togglesum:request.event.currency }} - {{ item.num_pending|togglesum:request.event.currency }} + {{ item.num.pending|togglesum:request.event.currency }} - {{ item.num_paid|togglesum:request.event.currency }} + {{ item.num.paid|togglesum:request.event.currency }} - {{ item.num_total|togglesum:request.event.currency }} + {{ item.num.total|togglesum:request.event.currency }} {% if item.has_variations %} {% for var in item.all_variations %} {{ var }} - {{ var.num_canceled|togglesum:request.event.currency }} - {{ var.num_refunded|togglesum:request.event.currency }} - {{ var.num_expired|togglesum:request.event.currency }} - {{ var.num_pending|togglesum:request.event.currency }} - {{ var.num_paid|togglesum:request.event.currency }} - {{ var.num_total|togglesum:request.event.currency }} + {{ var.num.canceled|togglesum:request.event.currency }} + {{ var.num.refunded|togglesum:request.event.currency }} + {{ var.num.expired|togglesum:request.event.currency }} + {{ var.num.pending|togglesum:request.event.currency }} + {{ var.num.paid|togglesum:request.event.currency }} + {{ var.num.total|togglesum:request.event.currency }} {% endfor %} {% endif %} @@ -109,12 +109,12 @@ {% trans "Total" %} - {{ total.num_canceled|togglesum:request.event.currency }} - {{ total.num_refunded|togglesum:request.event.currency }} - {{ total.num_expired|togglesum:request.event.currency }} - {{ total.num_pending|togglesum:request.event.currency }} - {{ total.num_paid|togglesum:request.event.currency }} - {{ total.num_total|togglesum:request.event.currency }} + {{ total.num.canceled|togglesum:request.event.currency }} + {{ total.num.refunded|togglesum:request.event.currency }} + {{ total.num.expired|togglesum:request.event.currency }} + {{ total.num.pending|togglesum:request.event.currency }} + {{ total.num.paid|togglesum:request.event.currency }} + {{ total.num.total|togglesum:request.event.currency }} diff --git a/src/pretix/plugins/reports/exporters.py b/src/pretix/plugins/reports/exporters.py index b189581ed9..4919f62699 100644 --- a/src/pretix/plugins/reports/exporters.py +++ b/src/pretix/plugins/reports/exporters.py @@ -205,50 +205,46 @@ class OverviewReport(Report): items_by_category, total = order_overview(self.event, subevent=self.form_data.get('subevent')) places = settings.CURRENCY_PLACES.get(self.event.currency, 2) + states = ( + ('canceled', Order.STATUS_CANCELED), + ('refunded', Order.STATUS_REFUNDED), + ('expired', Order.STATUS_EXPIRED), + ('pending', Order.STATUS_PENDING), + ('paid', Order.STATUS_PAID), + ('total', None), + ) for tup in items_by_category: if tup[0]: tstyledata.append(('FONTNAME', (0, len(tdata)), (-1, len(tdata)), 'OpenSansBd')) tdata.append([ tup[0].name, - str(tup[0].num_canceled[0]), floatformat(tup[0].num_canceled[1], places), - str(tup[0].num_refunded[0]), floatformat(tup[0].num_refunded[1], places), - str(tup[0].num_expired[0]), floatformat(tup[0].num_expired[1], places), - str(tup[0].num_pending[0]), floatformat(tup[0].num_pending[1], places), - str(tup[0].num_paid[0]), floatformat(tup[0].num_paid[1], places), - str(tup[0].num_total[0]), floatformat(tup[0].num_total[1], places), ]) + for l, s in states: + tdata[-1].append(str(tup[0].num[l][0])) + tdata[-1].append(floatformat(tup[0].num[l][1], places)) for item in tup[1]: tdata.append([ - " " + str(item.name), - str(item.num_canceled[0]), floatformat(item.num_canceled[1], places), - str(item.num_refunded[0]), floatformat(item.num_refunded[1], places), - str(item.num_expired[0]), floatformat(item.num_expired[1], places), - str(item.num_pending[0]), floatformat(item.num_pending[1], places), - str(item.num_paid[0]), floatformat(item.num_paid[1], places), - str(item.num_total[0]), floatformat(item.num_total[1], places), + str(item) ]) + for l, s in states: + tdata[-1].append(str(item.num[l][0])) + tdata[-1].append(floatformat(item.num[l][1], places)) if item.has_variations: for var in item.all_variations: tdata.append([ " " + str(var), - str(var.num_canceled[0]), floatformat(var.num_canceled[1], places), - str(var.num_refunded[0]), floatformat(var.num_refunded[1], places), - str(var.num_expired[0]), floatformat(var.num_expired[1], places), - str(var.num_pending[0]), floatformat(var.num_pending[1], places), - str(var.num_paid[0]), floatformat(var.num_paid[1], places), - str(var.num_total[0]), floatformat(var.num_total[1], places), ]) + for l, s in states: + tdata[-1].append(str(var.num[l][0])) + tdata[-1].append(floatformat(var.num[l][1], places)) tdata.append([ _("Total"), - str(total['num_canceled'][0]), floatformat(total['num_canceled'][1], places), - str(total['num_refunded'][0]), floatformat(total['num_refunded'][1], places), - str(total['num_expired'][0]), floatformat(total['num_expired'][1], places), - str(total['num_pending'][0]), floatformat(total['num_pending'][1], places), - str(total['num_paid'][0]), floatformat(total['num_paid'][1], places), - str(total['num_total'][0]), floatformat(total['num_total'][1], places), ]) + for l, s in states: + tdata[-1].append(str(total['num'][l][0])) + tdata[-1].append(floatformat(total['num'][l][1], places)) table = Table(tdata, colWidths=colwidths, repeatRows=3) table.setStyle(TableStyle(tstyledata))