Exemplo n.º 1
0
 def test_median(self):
     self.assertEqual(util.median(models.Donation.objects.all(), 'amount'), 0)
     event = models.Event.objects.create(datetime=today_noon)
     for i in [2, 3, 5, 8, 13]:
         models.Donation.objects.create(event=event, amount=i)
     self.assertEqual(util.median(models.Donation.objects.all(), 'amount'), 5)
     models.Donation.objects.create(event=event, amount=21)
     self.assertEqual(util.median(models.Donation.objects.all(), 'amount'), 6.5)
Exemplo n.º 2
0
def donorindex(request, event=None):
    event = viewutil.get_event(event)
    orderdict = {
        'total': ('donation_total',),
        'max': ('donation_max',),
        'avg': ('donation_avg',),
        'count': ('donation_count',),
    }
    page = request.GET.get('page', 1)
    sort = request.GET.get('sort', 'total')

    if sort not in orderdict:
        sort = 'total'

    try:
        order = int(request.GET.get('order', -1))
    except ValueError:
        order = -1

    donors = (
        DonorCache.objects.filter(event=event.id if event.id else None)
        .exclude(donor__visibility='ANON')
        .order_by(*orderdict[sort])
    )
    if order == -1:
        donors = donors.reverse()
    agg = donors.aggregate(
        max=Cast(Coalesce(Max('donation_total'), 0), output_field=FloatField()),
        avg=Cast(Coalesce(Avg('donation_total'), 0), output_field=FloatField()),
    )
    agg['median'] = util.median(donors, 'donation_total')

    pages = paginator.Paginator(donors, 50)

    try:
        pageinfo = pages.page(page)
    except paginator.PageNotAnInteger:
        pageinfo = pages.page(1)
    except paginator.EmptyPage:
        pageinfo = pages.page(pages.num_pages)
        page = pages.num_pages
    donors = pageinfo.object_list

    return views_common.tracker_response(
        request,
        'tracker/donorindex.html',
        {
            'donors': donors,
            'agg': agg,
            'event': event,
            'pageinfo': pageinfo,
            'page': page,
            'sort': sort,
            'order': order,
        },
    )
Exemplo n.º 3
0
def donationindex(request, event=None):
    event = viewutil.get_event(event)
    orderdict = {
        'amount': ('amount', ),
        'time': ('timereceived', ),
    }
    page = request.GET.get('page', 1)
    sort = request.GET.get('sort', 'time')

    if sort not in orderdict:
        sort = 'time'

    try:
        order = int(request.GET.get('order', -1))
    except ValueError:
        order = -1

    donations = Donation.objects.filter(transactionstate='COMPLETED')

    if event.id:
        donations = donations.filter(event=event)
    donations = views_common.fixorder(donations, orderdict, sort, order)

    agg = donations.aggregate(
        total=Sum('amount'),
        count=Count('amount'),
        max=Max('amount'),
        avg=Avg('amount'),
    )
    agg['median'] = util.median(donations, 'amount')
    donations = donations.select_related('donor')
    pages = paginator.Paginator(donations, 50)
    # TODO: these should really be errors
    try:
        pageinfo = pages.page(page)
    except paginator.PageNotAnInteger:
        pageinfo = pages.page(1)
    except paginator.EmptyPage:
        pageinfo = pages.page(pages.num_pages)
        page = pages.num_pages
    donations = pageinfo.object_list

    return views_common.tracker_response(
        request,
        'tracker/donationindex.html',
        {
            'donations': donations,
            'pageinfo': pageinfo,
            'page': page,
            'agg': agg,
            'sort': sort,
            'order': order,
            'event': event,
        },
    )
Exemplo n.º 4
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

    if event.id:
        eventParams['event'] = event.id

    donations = Donation.objects.filter(transactionstate='COMPLETED',
                                        testdonation=False,
                                        **eventParams)

    agg = donations.aggregate(
        total=Cast(Coalesce(Sum('amount'), 0), output_field=FloatField()),
        count=Count('amount'),
        max=Cast(Coalesce(Max('amount'), 0), output_field=FloatField()),
        avg=Cast(Coalesce(Avg('amount'), 0), output_field=FloatField()),
    )
    agg['median'] = float(util.median(donations, 'amount'))
    if event.targetamount:
        agg['target'] = float(event.targetamount)
    count = {
        'runs':
        filters.run_model_query('run', eventParams).count(),
        'prizes':
        filters.run_model_query('prize', eventParams).count(),
        'bids':
        filters.run_model_query('bid', eventParams).count(),
        'donors':
        filters.run_model_query(
            'donorcache', eventParams).values('donor').distinct().count(),
    }

    if 'json' in request.GET:
        agg['amount'] = agg['total']  # api compatibility
        del agg['total']
        return HttpResponse(
            json.dumps(
                {
                    'count': count,
                    'agg': agg
                },
                ensure_ascii=False,
            ),
            content_type='application/json;charset=utf-8',
        )

    return views_common.tracker_response(request, 'tracker/index.html', {
        'agg': agg,
        'count': count,
        'event': event
    })