Exemplo n.º 1
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)

        if 'latest' in self.request.GET:
            clear_cache()

        cache = self.request.event.get_cache()

        # Orders by day
        ctx['obd_data'] = cache.get('statistics_obd_data')
        if not ctx['obd_data']:
            ordered_by_day = {}
            for o in Order.objects.filter(event=self.request.event).values('datetime'):
                day = o['datetime'].date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in Order.objects.filter(event=self.request.event,
                                          payment_date__isnull=False).values('payment_date'):
                day = o['payment_date'].date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(ordered_by_day.keys()) if ordered_by_day else datetime.date.today(),
                    until=max(
                        max(ordered_by_day.keys() if paid_by_day else [datetime.date.today()]),
                        max(paid_by_day.keys() if paid_by_day else [datetime.date(1970, 1, 1)])
                    )):
                d = d.date()
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'ordered': ordered_by_day.get(d, 0),
                    'paid': paid_by_day.get(d, 0)
                })

            ctx['obd_data'] = json.dumps(data)
            cache.set('statistics_obd_data', ctx['obd_data'])

        # Orders by product
        ctx['obp_data'] = cache.get('statistics_obp_data')
        if not ctx['obp_data']:
            num_ordered = {
                p['item']: p['cnt']
                for p in (OrderPosition.objects
                          .filter(order__event=self.request.event)
                          .values('item')
                          .annotate(cnt=Count('id')))
            }
            num_paid = {
                p['item']: p['cnt']
                for p in (OrderPosition.objects
                          .filter(order__event=self.request.event, order__status=Order.STATUS_PAID)
                          .values('item')
                          .annotate(cnt=Count('id')))
            }
            item_names = {
                i.id: str(i.name)
                for i in Item.objects.filter(event=self.request.event)
            }
            ctx['obp_data'] = json.dumps([
                {
                    'item': item_names[item],
                    'ordered': cnt,
                    'paid': num_paid.get(item, 0)
                } for item, cnt in num_ordered.items()
            ])
            cache.set('statistics_obp_data', ctx['obp_data'])

        ctx['rev_data'] = cache.get('statistics_rev_data')
        if not ctx['rev_data']:
            rev_by_day = {}
            for o in Order.objects.filter(event=self.request.event,
                                          status=Order.STATUS_PAID,
                                          payment_date__isnull=False).values('payment_date', 'total'):
                day = o['payment_date'].date()
                rev_by_day[day] = rev_by_day.get(day, 0) + o['total']

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(rev_by_day.keys() if rev_by_day else [datetime.date.today()]),
                    until=max(rev_by_day.keys() if rev_by_day else [datetime.date.today()])):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'revenue': round(total, 2),
                })
            ctx['rev_data'] = json.dumps(data)
            cache.set('statistics_rev_data', ctx['rev_data'])

        ctx['has_orders'] = self.request.event.orders.exists()

        return ctx
Exemplo n.º 2
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)

        if 'latest' in self.request.GET:
            clear_cache()

        cache = self.request.event.get_cache()

        # Orders by day
        ctx['obd_data'] = cache.get('statistics_obd_data')
        if not ctx['obd_data']:
            ordered_by_day = {}
            for o in Order.objects.filter(
                    event=self.request.event).values('datetime'):
                day = o['datetime'].date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in Order.objects.filter(
                    event=self.request.event,
                    payment_date__isnull=False).values('payment_date'):
                day = o['payment_date'].date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(ordered_by_day.keys())
                    if ordered_by_day else datetime.date.today(),
                    until=max(
                        max(ordered_by_day.keys(
                        ) if paid_by_day else [datetime.date.today()]),
                        max(paid_by_day.keys(
                        ) if paid_by_day else [datetime.date(1970, 1, 1)]))):
                d = d.date()
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'ordered': ordered_by_day.get(d, 0),
                    'paid': paid_by_day.get(d, 0)
                })

            ctx['obd_data'] = json.dumps(data)
            cache.set('statistics_obd_data', ctx['obd_data'])

        # Orders by product
        ctx['obp_data'] = cache.get('statistics_obp_data')
        if not ctx['obp_data']:
            num_ordered = {
                p['item']: p['cnt']
                for p in (OrderPosition.objects.filter(
                    order__event=self.request.event).values('item').annotate(
                        cnt=Count('id')))
            }
            num_paid = {
                p['item']: p['cnt']
                for p in (OrderPosition.objects.filter(
                    order__event=self.request.event,
                    order__status=Order.STATUS_PAID).values('item').annotate(
                        cnt=Count('id')))
            }
            item_names = {
                i.id: str(i.name)
                for i in Item.objects.filter(event=self.request.event)
            }
            ctx['obp_data'] = json.dumps([{
                'item': item_names[item],
                'ordered': cnt,
                'paid': num_paid.get(item, 0)
            } for item, cnt in num_ordered.items()])
            cache.set('statistics_obp_data', ctx['obp_data'])

        ctx['rev_data'] = cache.get('statistics_rev_data')
        if not ctx['rev_data']:
            rev_by_day = {}
            for o in Order.objects.filter(event=self.request.event,
                                          status=Order.STATUS_PAID,
                                          payment_date__isnull=False).values(
                                              'payment_date', 'total'):
                day = o['payment_date'].date()
                rev_by_day[day] = rev_by_day.get(day, 0) + o['total']

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(rev_by_day.keys(
                    ) if rev_by_day else [datetime.date.today()]),
                    until=max(rev_by_day.keys(
                    ) if rev_by_day else [datetime.date.today()])):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'revenue': round(total, 2),
                })
            ctx['rev_data'] = json.dumps(data)
            cache.set('statistics_rev_data', ctx['rev_data'])

        ctx['has_orders'] = self.request.event.orders.exists()

        return ctx
Exemplo n.º 3
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        tz = timezone.get_current_timezone()

        if 'latest' in self.request.GET:
            clear_cache(self.request.event)

        subevent = None
        if self.request.GET.get("subevent",
                                "") != "" and self.request.event.has_subevents:
            i = self.request.GET.get("subevent", "")
            try:
                subevent = self.request.event.subevents.get(pk=i)
            except SubEvent.DoesNotExist:
                pass

        cache = self.request.event.cache
        ckey = str(subevent.pk) if subevent else 'all'

        p_date = OrderPayment.objects.filter(
            order=OuterRef('pk'),
            state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED,
                       OrderPayment.PAYMENT_STATE_REFUNDED),
            payment_date__isnull=False).values('order').annotate(
                m=Max('payment_date')).values('m').order_by()
        op_date = OrderPayment.objects.filter(
            order=OuterRef('order'),
            state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED,
                       OrderPayment.PAYMENT_STATE_REFUNDED),
            payment_date__isnull=False).values('order').annotate(
                m=Max('payment_date')).values('m').order_by()

        # Orders by day
        ctx['obd_data'] = cache.get('statistics_obd_data' + ckey)
        if not ctx['obd_data']:
            oqs = Order.objects.annotate(
                payment_date=Subquery(p_date, output_field=DateTimeField()))
            if subevent:
                oqs = oqs.filter(all_positions__subevent_id=subevent,
                                 all_positions__canceled=False).distinct()

            ordered_by_day = {}
            for o in oqs.filter(event=self.request.event).values('datetime'):
                day = o['datetime'].astimezone(tz).date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in oqs.filter(
                    event=self.request.event,
                    payment_date__isnull=False).values('payment_date'):
                day = o['payment_date'].astimezone(tz).date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(ordered_by_day.keys())
                    if ordered_by_day else datetime.date.today(),
                    until=max(
                        max(ordered_by_day.keys(
                        ) if paid_by_day else [datetime.date.today()]),
                        max(paid_by_day.keys(
                        ) if paid_by_day else [datetime.date(1970, 1, 1)]))):
                d = d.date()
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'ordered': ordered_by_day.get(d, 0),
                    'paid': paid_by_day.get(d, 0)
                })

            ctx['obd_data'] = json.dumps(data)
            cache.set('statistics_obd_data' + ckey, ctx['obd_data'])

        # Orders by product
        ctx['obp_data'] = cache.get('statistics_obp_data' + ckey)
        if not ctx['obp_data']:
            opqs = OrderPosition.objects
            if subevent:
                opqs = opqs.filter(subevent=subevent)
            num_ordered = {
                p['item']: p['cnt']
                for p in (opqs.filter(
                    order__event=self.request.event).values('item').annotate(
                        cnt=Count('id')).order_by())
            }
            num_paid = {
                p['item']: p['cnt']
                for p in (opqs.filter(order__event=self.request.event,
                                      order__status=Order.STATUS_PAID).
                          values('item').annotate(cnt=Count('id')).order_by())
            }
            item_names = {
                i.id: str(i)
                for i in Item.objects.filter(event=self.request.event)
            }
            ctx['obp_data'] = json.dumps([{
                'item':
                item_names[item],
                'item_short':
                item_names[item] if len(item_names[item]) < 15 else
                (item_names[item][:15] + "…"),
                'ordered':
                cnt,
                'paid':
                num_paid.get(item, 0)
            } for item, cnt in num_ordered.items()])
            cache.set('statistics_obp_data' + ckey, ctx['obp_data'])

        ctx['rev_data'] = cache.get('statistics_rev_data' + ckey)
        if not ctx['rev_data']:
            rev_by_day = {}
            if subevent:
                for o in OrderPosition.objects.annotate(payment_date=Subquery(
                        op_date, output_field=DateTimeField())).filter(
                            order__event=self.request.event,
                            subevent=subevent,
                            order__status=Order.STATUS_PAID,
                            payment_date__isnull=False).values(
                                'payment_date', 'price'):
                    day = o['payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['price']
            else:
                for o in Order.objects.annotate(payment_date=Subquery(
                        p_date, output_field=DateTimeField())).filter(
                            event=self.request.event,
                            status=Order.STATUS_PAID,
                            payment_date__isnull=False).values(
                                'payment_date', 'total'):
                    day = o['payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['total']

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(rev_by_day.keys(
                    ) if rev_by_day else [datetime.date.today()]),
                    until=max(rev_by_day.keys(
                    ) if rev_by_day else [datetime.date.today()])):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'revenue': round(total, 2),
                })
            ctx['rev_data'] = json.dumps(data)
            cache.set('statistics_rev_data' + ckey, ctx['rev_data'])

        ctx['has_orders'] = self.request.event.orders.exists()

        ctx['seats'] = {}

        if not self.request.event.has_subevents or (ckey != "all"
                                                    and subevent):
            ev = subevent or self.request.event
            if ev.seating_plan_id is not None:
                seats_qs = ev.free_seats(sales_channel=None,
                                         include_blocked=True)
                ctx['seats']['blocked_seats'] = seats_qs.filter(
                    blocked=True).count()
                ctx['seats']['free_seats'] = seats_qs.filter(
                    blocked=False).count()
                ctx['seats']['purchased_seats'] = \
                    ev.seats.count() - ctx['seats']['blocked_seats'] - ctx['seats']['free_seats']

                seats_qs = seats_qs.values('product', 'blocked').annotate(count=Count('id'))\
                    .order_by('product__category__position', 'product__position', 'product', 'blocked')

                ctx['seats']['products'] = {}
                ctx['seats']['stats'] = {}
                item_cache = {
                    i.pk: i
                    for i in self.request.event.items.annotate(
                        has_variations=Count('variations')).filter(pk__in={
                            p['product']
                            for p in seats_qs if p['product']
                        })
                }
                item_cache[None] = None

                for item in seats_qs:
                    product = item_cache[item['product']]
                    if item_cache[
                            item['product']] not in ctx['seats']['products']:
                        price = None
                        if product and product.has_variations:
                            price = product.variations.filter(
                                active=True).aggregate(
                                    Min('default_price'))['default_price__min']
                        if product and not price:
                            price = product.default_price
                        if not price:
                            price = Decimal('0.00')

                        ctx['seats']['products'][product] = {
                            'free': {
                                'seats': 0,
                                'potential': Decimal('0.00'),
                            },
                            'blocked': {
                                'seats': 0,
                                'potential': Decimal('0.00'),
                            },
                            'price': price,
                        }
                    data = ctx['seats']['products'][product]

                    if item['blocked']:
                        data['blocked']['seats'] = item['count']
                        data['blocked'][
                            'potential'] = item['count'] * data['price']
                    else:
                        data['free']['seats'] = item['count']
                        data['free'][
                            'potential'] = item['count'] * data['price']

        return ctx
Exemplo n.º 4
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        tz = timezone.get_current_timezone()

        if 'latest' in self.request.GET:
            clear_cache(self.request.event)

        subevent = None
        if self.request.GET.get("subevent", "") != "" and self.request.event.has_subevents:
            i = self.request.GET.get("subevent", "")
            try:
                subevent = self.request.event.subevents.get(pk=i)
            except SubEvent.DoesNotExist:
                pass

        cache = self.request.event.cache
        ckey = str(subevent.pk) if subevent else 'all'

        # Orders by day
        ctx['obd_data'] = cache.get('statistics_obd_data' + ckey)
        if not ctx['obd_data']:
            oqs = Order.objects
            if subevent:
                oqs = oqs.filter(positions__subevent_id=subevent).distinct()

            ordered_by_day = {}
            for o in oqs.filter(event=self.request.event).values('datetime'):
                day = o['datetime'].astimezone(tz).date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in oqs.filter(event=self.request.event, payment_date__isnull=False).values('payment_date'):
                day = o['payment_date'].astimezone(tz).date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(ordered_by_day.keys()) if ordered_by_day else datetime.date.today(),
                    until=max(
                        max(ordered_by_day.keys() if paid_by_day else [datetime.date.today()]),
                        max(paid_by_day.keys() if paid_by_day else [datetime.date(1970, 1, 1)])
                    )):
                d = d.date()
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'ordered': ordered_by_day.get(d, 0),
                    'paid': paid_by_day.get(d, 0)
                })

            ctx['obd_data'] = json.dumps(data)
            cache.set('statistics_obd_data' + ckey, ctx['obd_data'])

        # Orders by product
        ctx['obp_data'] = cache.get('statistics_obp_data' + ckey)
        if not ctx['obp_data']:
            opqs = OrderPosition.objects
            if subevent:
                opqs = opqs.filter(subevent=subevent)
            num_ordered = {
                p['item']: p['cnt']
                for p in (opqs
                          .filter(order__event=self.request.event)
                          .values('item')
                          .annotate(cnt=Count('id')).order_by())
            }
            num_paid = {
                p['item']: p['cnt']
                for p in (opqs
                          .filter(order__event=self.request.event, order__status=Order.STATUS_PAID)
                          .values('item')
                          .annotate(cnt=Count('id')).order_by())
            }
            item_names = {
                i.id: str(i.name)
                for i in Item.objects.filter(event=self.request.event)
            }
            ctx['obp_data'] = json.dumps([
                {
                    'item': item_names[item],
                    'ordered': cnt,
                    'paid': num_paid.get(item, 0)
                } for item, cnt in num_ordered.items()
            ])
            cache.set('statistics_obp_data' + ckey, ctx['obp_data'])

        ctx['rev_data'] = cache.get('statistics_rev_data' + ckey)
        if not ctx['rev_data']:
            rev_by_day = {}
            if subevent:
                for o in OrderPosition.objects.filter(order__event=self.request.event,
                                                      subevent=subevent,
                                                      order__status=Order.STATUS_PAID,
                                                      order__payment_date__isnull=False).values('order__payment_date', 'price'):
                    day = o['order__payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['price']
            else:
                for o in Order.objects.filter(event=self.request.event,
                                              status=Order.STATUS_PAID,
                                              payment_date__isnull=False).values('payment_date', 'total'):
                    day = o['payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['total']

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(rev_by_day.keys() if rev_by_day else [datetime.date.today()]),
                    until=max(rev_by_day.keys() if rev_by_day else [datetime.date.today()])):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'revenue': round(total, 2),
                })
            ctx['rev_data'] = json.dumps(data)
            cache.set('statistics_rev_data' + ckey, ctx['rev_data'])

        ctx['has_orders'] = self.request.event.orders.exists()

        return ctx
Exemplo n.º 5
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        tz = timezone.get_current_timezone()

        if 'latest' in self.request.GET:
            clear_cache(self.request.event)

        subevent = None
        if self.request.GET.get("subevent", "") != "" and self.request.event.has_subevents:
            i = self.request.GET.get("subevent", "")
            try:
                subevent = self.request.event.subevents.get(pk=i)
            except SubEvent.DoesNotExist:
                pass

        cache = self.request.event.cache
        ckey = str(subevent.pk) if subevent else 'all'

        p_date = OrderPayment.objects.filter(
            order=OuterRef('pk'),
            state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED),
            payment_date__isnull=False
        ).values('order').annotate(
            m=Max('payment_date')
        ).values(
            'm'
        ).order_by()
        op_date = OrderPayment.objects.filter(
            order=OuterRef('order'),
            state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED),
            payment_date__isnull=False
        ).values('order').annotate(
            m=Max('payment_date')
        ).values(
            'm'
        ).order_by()

        # Orders by day
        ctx['obd_data'] = cache.get('statistics_obd_data' + ckey)
        if not ctx['obd_data']:
            oqs = Order.objects.annotate(payment_date=Subquery(p_date, output_field=DateTimeField()))
            if subevent:
                oqs = oqs.filter(all_positions__subevent_id=subevent, all_positions__canceled=False).distinct()

            ordered_by_day = {}
            for o in oqs.filter(event=self.request.event).values('datetime'):
                day = o['datetime'].astimezone(tz).date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in oqs.filter(event=self.request.event, payment_date__isnull=False).values('payment_date'):
                day = o['payment_date'].astimezone(tz).date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(ordered_by_day.keys()) if ordered_by_day else datetime.date.today(),
                    until=max(
                        max(ordered_by_day.keys() if paid_by_day else [datetime.date.today()]),
                        max(paid_by_day.keys() if paid_by_day else [datetime.date(1970, 1, 1)])
                    )):
                d = d.date()
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'ordered': ordered_by_day.get(d, 0),
                    'paid': paid_by_day.get(d, 0)
                })

            ctx['obd_data'] = json.dumps(data)
            cache.set('statistics_obd_data' + ckey, ctx['obd_data'])

        # Orders by product
        ctx['obp_data'] = cache.get('statistics_obp_data' + ckey)
        if not ctx['obp_data']:
            opqs = OrderPosition.objects
            if subevent:
                opqs = opqs.filter(subevent=subevent)
            num_ordered = {
                p['item']: p['cnt']
                for p in (opqs
                          .filter(order__event=self.request.event)
                          .values('item')
                          .annotate(cnt=Count('id')).order_by())
            }
            num_paid = {
                p['item']: p['cnt']
                for p in (opqs
                          .filter(order__event=self.request.event, order__status=Order.STATUS_PAID)
                          .values('item')
                          .annotate(cnt=Count('id')).order_by())
            }
            item_names = {
                i.id: str(i)
                for i in Item.objects.filter(event=self.request.event)
            }
            ctx['obp_data'] = json.dumps([
                {
                    'item': item_names[item],
                    'item_short': item_names[item] if len(item_names[item]) < 15 else (item_names[item][:15] + "…"),
                    'ordered': cnt,
                    'paid': num_paid.get(item, 0)
                } for item, cnt in num_ordered.items()
            ])
            cache.set('statistics_obp_data' + ckey, ctx['obp_data'])

        ctx['rev_data'] = cache.get('statistics_rev_data' + ckey)
        if not ctx['rev_data']:
            rev_by_day = {}
            if subevent:
                for o in OrderPosition.objects.annotate(
                        payment_date=Subquery(op_date, output_field=DateTimeField())
                ).filter(order__event=self.request.event,
                         subevent=subevent,
                         order__status=Order.STATUS_PAID,
                         payment_date__isnull=False).values('payment_date', 'price'):
                    day = o['payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['price']
            else:
                for o in Order.objects.annotate(
                        payment_date=Subquery(p_date, output_field=DateTimeField())
                ).filter(event=self.request.event,
                         status=Order.STATUS_PAID,
                         payment_date__isnull=False).values('payment_date', 'total'):
                    day = o['payment_date'].astimezone(tz).date()
                    rev_by_day[day] = rev_by_day.get(day, 0) + o['total']

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                    dateutil.rrule.DAILY,
                    dtstart=min(rev_by_day.keys() if rev_by_day else [datetime.date.today()]),
                    until=max(rev_by_day.keys() if rev_by_day else [datetime.date.today()])):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({
                    'date': d.strftime('%Y-%m-%d'),
                    'revenue': round(total, 2),
                })
            ctx['rev_data'] = json.dumps(data)
            cache.set('statistics_rev_data' + ckey, ctx['rev_data'])

        ctx['has_orders'] = self.request.event.orders.exists()

        return ctx
Exemplo n.º 6
0
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        tz = timezone.get_current_timezone()

        if "latest" in self.request.GET:
            clear_cache(self.request.event)

        cache = self.request.event.get_cache()

        # Orders by day
        ctx["obd_data"] = cache.get("statistics_obd_data")
        if not ctx["obd_data"]:
            ordered_by_day = {}
            for o in Order.objects.filter(event=self.request.event).values("datetime"):
                day = o["datetime"].astimezone(tz).date()
                ordered_by_day[day] = ordered_by_day.get(day, 0) + 1
            paid_by_day = {}
            for o in Order.objects.filter(event=self.request.event, payment_date__isnull=False).values("payment_date"):
                day = o["payment_date"].astimezone(tz).date()
                paid_by_day[day] = paid_by_day.get(day, 0) + 1

            data = []
            for d in dateutil.rrule.rrule(
                dateutil.rrule.DAILY,
                dtstart=min(ordered_by_day.keys()) if ordered_by_day else datetime.date.today(),
                until=max(
                    max(ordered_by_day.keys() if paid_by_day else [datetime.date.today()]),
                    max(paid_by_day.keys() if paid_by_day else [datetime.date(1970, 1, 1)]),
                ),
            ):
                d = d.date()
                data.append(
                    {"date": d.strftime("%Y-%m-%d"), "ordered": ordered_by_day.get(d, 0), "paid": paid_by_day.get(d, 0)}
                )

            ctx["obd_data"] = json.dumps(data)
            cache.set("statistics_obd_data", ctx["obd_data"])

        # Orders by product
        ctx["obp_data"] = cache.get("statistics_obp_data")
        if not ctx["obp_data"]:
            num_ordered = {
                p["item"]: p["cnt"]
                for p in (
                    OrderPosition.objects.filter(order__event=self.request.event)
                    .values("item")
                    .annotate(cnt=Count("id"))
                )
            }
            num_paid = {
                p["item"]: p["cnt"]
                for p in (
                    OrderPosition.objects.filter(order__event=self.request.event, order__status=Order.STATUS_PAID)
                    .values("item")
                    .annotate(cnt=Count("id"))
                )
            }
            item_names = {i.id: str(i.name) for i in Item.objects.filter(event=self.request.event)}
            ctx["obp_data"] = json.dumps(
                [
                    {"item": item_names[item], "ordered": cnt, "paid": num_paid.get(item, 0)}
                    for item, cnt in num_ordered.items()
                ]
            )
            cache.set("statistics_obp_data", ctx["obp_data"])

        ctx["rev_data"] = cache.get("statistics_rev_data")
        if not ctx["rev_data"]:
            rev_by_day = {}
            for o in Order.objects.filter(
                event=self.request.event, status=Order.STATUS_PAID, payment_date__isnull=False
            ).values("payment_date", "total"):
                day = o["payment_date"].astimezone(tz).date()
                rev_by_day[day] = rev_by_day.get(day, 0) + o["total"]

            data = []
            total = 0
            for d in dateutil.rrule.rrule(
                dateutil.rrule.DAILY,
                dtstart=min(rev_by_day.keys() if rev_by_day else [datetime.date.today()]),
                until=max(rev_by_day.keys() if rev_by_day else [datetime.date.today()]),
            ):
                d = d.date()
                total += float(rev_by_day.get(d, 0))
                data.append({"date": d.strftime("%Y-%m-%d"), "revenue": round(total, 2)})
            ctx["rev_data"] = json.dumps(data)
            cache.set("statistics_rev_data", ctx["rev_data"])

        ctx["has_orders"] = self.request.event.orders.exists()

        return ctx