예제 #1
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()

  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, 'event' : event, 'pageinfo' : pageinfo, 'page' : page, 'sort' : sort, 'order' : order })
예제 #2
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')

  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(amount=Sum('amount'), count=Count('amount'), max=Max('amount'), avg=Avg('amount'))
  donations = donations.select_related('donor')
  pages = paginator.Paginator(donations,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
  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 })
예제 #3
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

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

    agg = Donation.objects.filter(
        transactionstate='COMPLETED', testdonation=False, **eventParams
    ).aggregate(
        amount=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['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:
        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}
    )
예제 #4
0
def donate(request, event):
    event = viewutil.get_event(event)
    if event.locked:
        raise Http404
    commentform, bidsform, prizesform = process_form(request, event)
    if not bidsform:  # redirect
        return commentform

    def bid_parent_info(bid):
        if bid != None:
            return {'name': bid.name, 'description': bid.description, 'parent': bid_parent_info(bid.parent)}
        else:
            return None

    def bid_info(bid):
        result = {
            'id': bid.id,
            'name': bid.name,
            'description': bid.description,
            'label': bid.full_label(not bid.allowuseroptions),
            'count': bid.count,
            'amount': bid.total,
            'goal': Decimal(bid.goal or '0.00'),
            'parent': bid_parent_info(bid.parent)
        }
        if bid.speedrun:
            result['runname'] = bid.speedrun.name
        if bid.suggestions.exists():
            result['suggested'] = list(
                map(lambda x: x.name, bid.suggestions.all()))
        if bid.allowuseroptions:
            result['custom'] = ['custom']
            result['label'] += ' (select and add a name next to "New Option Name")'
        return result

    bids = filters.run_model_query('bidtarget', {'state': 'OPENED', 'event': event.id}, user=request.user).distinct(
    ).select_related('parent').prefetch_related('suggestions')

    allPrizes = filters.run_model_query(
        'prize', {'feed': 'current', 'event': event.id})

    prizes = allPrizes.filter(ticketdraw=False)

    dumpArray = [bid_info(o) for o in bids]

    bidsJson = json.dumps(dumpArray, ensure_ascii=False,
                          cls=serializers.json.DjangoJSONEncoder)

    ticketPrizes = allPrizes.filter(ticketdraw=True)

    def prize_info(prize):
        result = {'id': prize.id, 'name': prize.name, 'description': prize.description,
                  'minimumbid': prize.minimumbid, 'maximumbid': prize.maximumbid, 'sumdonations': prize.sumdonations}
        return result

    dumpArray = [prize_info(o) for o in ticketPrizes.all()]
    ticketPrizesJson = json.dumps(
        dumpArray, ensure_ascii=False, cls=serializers.json.DjangoJSONEncoder)

    return views_common.tracker_response(request, "tracker/donate.html", {'event': event, 'bidsform': bidsform, 'prizesform': prizesform, 'commentform': commentform, 'hasBids': bids.count() > 0, 'bidsJson': bidsJson, 'hasTicketPrizes': ticketPrizes.count() > 0, 'ticketPrizesJson': ticketPrizesJson, 'prizes': prizes})
예제 #5
0
def donor(request, id, event=None):
    try:
        event = viewutil.get_event(event)
        cache = DonorCache.objects.get(donor=id,
                                       event=event.id if event.id else None)
        if cache.visibility == 'ANON':
            return views_common.tracker_response(
                request, template='tracker/badobject.html', status=404)
        donations = cache.donation_set.filter(transactionstate='COMPLETED')

        if event.id:
            donations = donations.filter(event=event)

        comments = 'comments' in request.GET

        return views_common.tracker_response(
            request, 'tracker/donor.html', {
                'cache': cache,
                'donations': donations,
                'comments': comments,
                'event': event
            })
    except DonorCache.DoesNotExist:
        return views_common.tracker_response(request,
                                             template='tracker/badobject.html',
                                             status=404)
def tracker_response(request=None, template='tracker/index.html', qdict=None, status=200):
  starttime = datetime.datetime.now()
  language = translation.get_language_from_request(request)
  translation.activate(language)
  request.LANGUAGE_CODE = translation.get_language()
  profile = None
  qdict = qdict or {}
  qdict.update({
    'djangoversion' : dv(),
    'pythonversion' : pv(),
    'user' : request.user,
    'profile' : profile,
    'next' : request.POST.get('next', request.GET.get('next', request.path)),
    'starttime' : starttime,
    'events': tracker.models.Event.objects.all(),
    })
  qdict.setdefault('event',viewutil.get_event(None))
  try:
    resp = render(request, template, dictionary=qdict, status=status)
    if 'queries' in request.GET and request.user.has_perm('tracker.view_queries'):
      return HttpResponse(json.dumps(connection.queries, ensure_ascii=False, indent=1),content_type='application/json;charset=utf-8')
    return resp
  except Exception,e:
    if request.user.is_staff and not settings.DEBUG:
      return HttpResponse(unicode(type(e)) + '\n\n' + unicode(e), mimetype='text/plain', status=500)
    raise
예제 #7
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')

    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(amount=Sum('amount'), count=Count(
        'amount'), max=Max('amount'), avg=Avg('amount'))
    donations = donations.select_related('donor')
    pages = paginator.Paginator(donations, 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
    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})
예제 #8
0
    def get(self, request, event, *args, **kwargs):
        # Get the upcoming bids and their options + totals.
        event = viewutil.get_event(event)
        now = timezone.now()
        params = {
            'event': event.id,
            'state': 'OPENED',
        }
        bids = filters.run_model_query(
            'bid', params).filter(speedrun__endtime__gte=now).select_related(
                'speedrun').prefetch_related('options')
        results = []

        for bid in bids:
            result = {
                'game': bid.speedrun.name,
                'bid': bid.name,
                'goal': bid.goal,
                'amount_raised': bid.total,
                'options': [],
            }
            for option in bid.options.all():
                result['options'].append({
                    'name': option.name,
                    'amount_raised': option.total,
                })
                result['amount_raised'] += option.total

            results.append(result)

        return JsonResponse({'results': results})
예제 #9
0
def bidindex(request, event=None):
    event = viewutil.get_event(event)

    if not event.id:
        return HttpResponseRedirect(
            reverse('tracker:bidindex', args=(Event.objects.latest().short, )))

    bids = Bid.objects.filter(state__in=('OPENED', 'CLOSED')).annotate(
        speedrun_name=F('speedrun__name'), event_name=F('event__name'))
    if event.id:
        bids = bids.filter(event=event)

    toplevel = [b for b in bids if b.parent_id == None]
    total = sum((b.total for b in toplevel), 0)
    choiceTotal = sum((b.total for b in toplevel if not b.goal), 0)
    challengeTotal = sum((b.total for b in toplevel if b.goal), 0)

    bids = [bid_info(bid, bids) for bid in bids if bid.parent_id == None]

    if event.id:
        bidNameSpan = 2
    else:
        bidNameSpan = 1

    return views_common.tracker_response(
        request, 'tracker/bidindex.html', {
            'bids': bids,
            'total': total,
            'event': event,
            'bidNameSpan': bidNameSpan,
            'choiceTotal': choiceTotal,
            'challengeTotal': challengeTotal
        })
예제 #10
0
def tracker_context(request, qdict=None):
    starttime = datetime.datetime.now()
    language = translation.get_language_from_request(request)
    translation.activate(language)
    request.LANGUAGE_CODE = translation.get_language()
    profile = None
    qdict = qdict or {}
    qdict.update(
        {
            'djangoversion': dv(),
            'pythonversion': pv(),
            'user': request.user,
            'profile': profile,
            'next': request.POST.get('next', request.GET.get('next', request.path)),
            'starttime': starttime,
            'events': tracker.models.Event.objects.all(),
            'settings': {
                'GOOGLE_ANALYTICS': False,
                'SWEEPSTAKES_URL': getattr(settings, 'SWEEPSTAKES_URL', ''),
                'TRACKER_LOGO': getattr(settings, 'TRACKER_LOGO', ''),
            },
        }
    )
    qdict.setdefault('event', viewutil.get_event(None))
    qdict.setdefault('user', request.user)
    return qdict
예제 #11
0
def tracker_context(request, qdict=None):
    starttime = datetime.datetime.now()
    language = translation.get_language_from_request(request)
    translation.activate(language)
    request.LANGUAGE_CODE = translation.get_language()
    profile = None
    qdict = qdict or {}
    qdict.update({
        'djangoversion':
        dv(),
        'pythonversion':
        pv(),
        'user':
        request.user,
        'profile':
        profile,
        'next':
        request.POST.get('next', request.GET.get('next', request.path)),
        'starttime':
        starttime,
        'events':
        tracker.models.Event.objects.all(),
    })
    qdict.setdefault('event', viewutil.get_event(None))
    qdict.setdefault('user', request.user)
    return qdict
예제 #12
0
    def get_object(self, request, event):
        event = viewutil.get_event(event)

        if event.locked:
            raise Http404

        return event
예제 #13
0
def submit_prize(request, event):
    event = viewutil.get_event(event)

    if request.method == 'POST':
        prizeForm = forms.PrizeSubmissionForm(data=request.POST)
        if prizeForm.is_valid():
            prize = prizeForm.save(event, request.user)
            return views_common.tracker_response(
                request, "tracker/submit_prize_success.html", {'prize': prize})
    else:
        prizeForm = forms.PrizeSubmissionForm()

    runs = filters.run_model_query('run', {'event': event}, request.user)

    def run_info(run):
        return {
            'id': run.id,
            'name': run.name,
            'description': run.description,
            'runners': run.deprecated_runners,
            'starttime': run.starttime.isoformat(),
            'endtime': run.endtime.isoformat()
        }

    dumpArray = [run_info(o) for o in runs.all()]
    runsJson = json.dumps(dumpArray)

    return views_common.tracker_response(request, "tracker/submit_prize.html",
                                         {
                                             'event': event,
                                             'form': prizeForm,
                                             'runs': runsJson
                                         })
예제 #14
0
 def get(self, request, event, *args, **kwargs):
     event = viewutil.get_event(event)
     params = {
         'event': event.id,
         'state': 'ACCEPTED',
     }
     prizes = filters.run_model_query('prize', params).select_related(
         'startrun', 'endrun')
     results = []
     for prize in prizes:
         result = {
             'name': prize.name,
             'provider': prize.provider,
             'image': prize.image,
             'starttime': None,
             'endtime': None,
             'minDonation': float(prize.minimumbid),
         }
         if prize.starttime:
             result['starttime'] = prize.starttime
             result['endtime'] = prize.endtime
         elif prize.startrun:
             result['starttime'] = prize.startrun.starttime
             result['endtime'] = prize.endrun.endtime
         results.append(result)
     return JsonResponse({'results': results})
예제 #15
0
    def process_donations(request, event=None):
        event = viewutil.get_event(event)

        if not event.id:
            return render(
                request,
                'tracker/eventlist.html',
                {
                    'events': models.Event.objects.all(),
                    'pattern': 'admin:process_donations',
                    'subheading': 'Process Pending Bids',
                },
            )

        user_can_approve = (
            event and event.use_one_step_screening
        ) or request.user.has_perm('tracker.send_to_reader')
        user_can_edit_donors = request.user.has_perm('tracker.change_donor')
        return render(
            request,
            'admin/tracker/process_donations.html',
            {
                'user_can_approve': user_can_approve,
                'user_can_edit_donors': user_can_edit_donors,
                'currentEvent': event,
                'apiUrls': mark_safe(json.dumps(api_urls())),
            },
        )
예제 #16
0
def donate(request, event):
    event = viewutil.get_event(event)
    if event.locked:
        raise Http404
    commentform, bidsform, prizesform = process_form(request, event)
    if not bidsform:  # redirect
        return commentform

    def bid_parent_info(bid):
        if bid != None:
            return {'name': bid.name, 'description': bid.description, 'parent': bid_parent_info(bid.parent)}
        else:
            return None

    def bid_info(bid):
        result = {
            'id': bid.id,
            'name': bid.name,
            'description': bid.description,
            'label': bid.full_label(not bid.allowuseroptions),
            'count': bid.count,
            'amount': bid.total,
            'goal': Decimal(bid.goal or '0.00'),
            'parent': bid_parent_info(bid.parent)
        }
        if bid.speedrun:
            result['runname'] = bid.speedrun.name
        if bid.suggestions.exists():
            result['suggested'] = list(
                map(lambda x: x.name, bid.suggestions.all()))
        if bid.allowuseroptions:
            result['custom'] = ['custom']
            result['label'] += ' (select and add a name next to "New Option Name")'
        return result

    bids = filters.run_model_query('bidtarget', {'state': 'OPENED', 'event': event.id}, user=request.user).distinct(
    ).select_related('parent').prefetch_related('suggestions')

    allPrizes = filters.run_model_query(
        'prize', {'feed': 'current', 'event': event.id})

    prizes = allPrizes.filter(ticketdraw=False)

    dumpArray = [bid_info(o) for o in bids]

    bidsJson = json.dumps(dumpArray, ensure_ascii=False,
                          cls=serializers.json.DjangoJSONEncoder)

    ticketPrizes = allPrizes.filter(ticketdraw=True)

    def prize_info(prize):
        result = {'id': prize.id, 'name': prize.name, 'description': prize.description,
                  'minimumbid': prize.minimumbid, 'maximumbid': prize.maximumbid, 'sumdonations': prize.sumdonations}
        return result

    dumpArray = [prize_info(o) for o in ticketPrizes.all()]
    ticketPrizesJson = json.dumps(
        dumpArray, ensure_ascii=False, cls=serializers.json.DjangoJSONEncoder)

    return views_common.tracker_response(request, "tracker/donate.html", {'event': event, 'bidsform': bidsform, 'prizesform': prizesform, 'commentform': commentform, 'hasBids': bids.count() > 0, 'bidsJson': bidsJson, 'hasTicketPrizes': ticketPrizes.count() > 0, 'ticketPrizesJson': ticketPrizesJson, 'prizes': prizes})
def bidindex(request, event=None):
  event = viewutil.get_event(event)
  searchForm = BidSearchForm(request.GET)
  
  if not searchForm.is_valid():
    return HttpResponse('Invalid filter form', status=400)
    
  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)
  
  if event.id:
    searchParams['event'] = event.id
  else:
    return HttpResponseRedirect(reverse('tracker.views.bidindex', args=(Event.objects.latest().id,)))
    
  bids = filters.run_model_query('bid', searchParams, user=request.user)
  bids = bids.filter(parent=None)
  total = bids.aggregate(Sum('total'))['total__sum'] or Decimal('0.00')
  choiceTotal = bids.filter(goal=None).aggregate(Sum('total'))['total__sum'] or Decimal('0.00')
  challengeTotal = bids.exclude(goal=None).aggregate(Sum('total'))['total__sum'] or Decimal('0.00')
  bids = viewutil.get_tree_queryset_descendants(Bid, bids, include_self=True).prefetch_related('options')
  bids = bids.filter(parent=None)
  
  if event.id:
    bidNameSpan = 2
  else:
    bidNameSpan = 1
    
  return views_common.tracker_response(request, 'tracker/bidindex.html', { 'searchForm': searchForm, 'bids': bids, 'total': total, 'event': event, 'bidNameSpan' : bidNameSpan, 'choiceTotal': choiceTotal, 'challengeTotal': challengeTotal })
예제 #18
0
def prizeindex(request, event=None):
    if not getattr(settings, 'SWEEPSTAKES_URL', None):
        raise Http404

    event = viewutil.get_event(event)

    if not event.id:
        return views_common.tracker_response(
            request,
            'tracker/eventlist.html',
            {
                'pattern': 'tracker:prizeindex',
                'subheading': 'Prizes'
            },
        )

    searchParams = {}
    searchParams['event'] = event.id

    prizes = filters.run_model_query('prize', searchParams)
    prizes = prizes.select_related(
        'startrun', 'endrun', 'category').prefetch_related('prizewinner_set')
    return views_common.tracker_response(
        request,
        'tracker/prizeindex.html',
        {
            'prizes': prizes,
            'event': event
        },
    )
예제 #19
0
def password_reset(request):
  return auth_views.password_reset(request, 
    template_name='tracker/password_reset.html', 
    email_template_name='password_reset_template',
    password_reset_form=PostOfficePasswordResetForm,
    from_email=settings.EMAIL_FROM_USER, 
    extra_context={'event': viewutil.get_event(None), 'csrftoken': get_csrf_token(request)})
예제 #20
0
def bidindex(request, event=None):
    event = viewutil.get_event(event)

    if not event.id:
        return views_common.tracker_response(
            request,
            'tracker/eventlist.html',
            {'pattern': 'tracker:bidindex', 'subheading': 'Bids'},
        )

    bids = Bid.objects.filter(state__in=('OPENED', 'CLOSED'), event=event).annotate(
        speedrun_name=F('speedrun__name'), event_name=F('event__name')
    )

    toplevel = [b for b in bids if b.parent_id is None]
    total = sum((b.total for b in toplevel), 0)
    choiceTotal = sum((b.total for b in toplevel if not b.goal), 0)
    challengeTotal = sum((b.total for b in toplevel if b.goal), 0)

    bids = [get_bid_info(bid, bids) for bid in bids if bid.parent_id is None]

    return views_common.tracker_response(
        request,
        'tracker/bidindex.html',
        {
            'bids': bids,
            'total': total,
            'event': event,
            'choiceTotal': choiceTotal,
            'challengeTotal': challengeTotal,
        },
    )
예제 #21
0
def runindex(request, event=None):
    event = viewutil.get_event(event)

    if not event.id:
        return views_common.tracker_response(
            request,
            'tracker/eventlist.html',
            {
                'pattern': 'tracker:runindex',
                'subheading': 'Runs'
            },
        )

    searchParams = {}
    searchParams['event'] = event.id

    runs = filters.run_model_query('run', searchParams)
    runs = runs.annotate(hasbids=Sum('bids'))

    return views_common.tracker_response(
        request,
        'tracker/runindex.html',
        {
            'runs': runs,
            'event': event
        },
    )
예제 #22
0
def donor_detail(request, pk, event=None):
    try:
        event = viewutil.get_event(event)
        cache = DonorCache.objects.get(donor=pk, event=event.id if event.id else None)
        if cache.visibility == 'ANON':
            return views_common.tracker_response(
                request, template='tracker/badobject.html', status=404
            )
        donations = cache.donation_set.filter(transactionstate='COMPLETED')

        # TODO: double check that this is(n't) needed
        if event.id:
            donations = donations.filter(event=event)

        comments = False
        # comments = 'comments' in request.GET # TODO: restore this

        return views_common.tracker_response(
            request,
            'tracker/donor.html',
            {
                'cache': cache,
                'donations': donations,
                'comments': comments,
                'event': event,
            },
        )
    except DonorCache.DoesNotExist:
        return views_common.tracker_response(
            request, template='tracker/badobject.html', status=404
        )
def password_reset(request):
  return djauth_views.password_reset(request,
    template_name='tracker/password_reset.html',
    email_template_name='password_reset_template',
    password_reset_form=forms.PostOfficePasswordResetForm,
    from_email=viewutil.get_default_email_from_user(),
    extra_context={'event': viewutil.get_event(None), 'csrftoken': get_csrf_token(request)})
def password_reset_confirm(request):
  uidb64 = request.GET['uidb64']
  token = request.GET['token']
  return djauth_views.password_reset_confirm(request,
    uidb64,
    token,
    template_name='tracker/password_reset_confirm.html',
    extra_context={'event': viewutil.get_event(None), 'csrftoken': get_csrf_token(request)})
 def handle(self, *args, **options):
     event = viewutil.get_event(options['event'])
     prizes = prizemail.prizes_with_submission_email_pending(event)
     emailTemplate = options['template'] or event.prizecontributoremailtemplate
     
     if emailTemplate == None:
         print("No default prize accept/deny email template specified on event {0}, cannot send e-mails.".format(event.short))
     else:
         prizemail.automail_prize_contributors(event, prizes, emailTemplate)
예제 #26
0
def donorindex(request, event=None):
    event = viewutil.get_event(event)
    orderdict = {
        "name": ("donor__lastname", "donor__firstname"),
        "total": ("donation_total",),
        "max": ("donation_max",),
        "avg": ("donation_avg",),
    }
    page = request.GET.get("page", 1)
    sort = request.GET.get("sort", "name")

    if sort not in orderdict:
        sort = "name"

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

    donors = DonorCache.objects.filter(event=event.id if event.id else None).order_by(*orderdict[sort])
    if order == -1:
        donors = donors.reverse()

    fulllist = request.user.has_perm("tracker.view_full_list") and page == "full"
    pages = paginator.Paginator(donors, 50)

    if fulllist:
        pageinfo = {
            "paginator": pages,
            "has_previous": False,
            "has_next": False,
            "paginator.num_pages": pages.num_pages,
        }
        page = 0
    else:
        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,
            "event": event,
            "pageinfo": pageinfo,
            "page": page,
            "fulllist": fulllist,
            "sort": sort,
            "order": order,
        },
    )
 def handle(self, *args, **options):
     event = viewutil.get_event(options['event'])
     prizeWinners = prizemail.prizes_with_winner_accept_email_pending(event)
     emailTemplate = options['template'] or event.prizewinneracceptemailtemplate
     
     if emailTemplate == None:
         print("No default prize winner accepted email template specified on event {0}, cannot send e-mails.".format(event.short))
     else:
         prizemail.automail_winner_accepted_prize(event, prizeWinners, emailTemplate)
예제 #28
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,
        },
    )
예제 #29
0
def donorindex(request, event=None):
    event = viewutil.get_event(event)
    orderdict = {
        'name': ('donor__lastname', 'donor__firstname'),
        'total': ('donation_total', ),
        'max': ('donation_max', ),
        'avg': ('donation_avg', )
    }
    page = request.GET.get('page', 1)
    sort = request.GET.get('sort', 'name')

    if sort not in orderdict:
        sort = 'name'

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

    donors = DonorCache.objects.filter(
        event=event.id if event.id else None).order_by(*orderdict[sort])
    if order == -1:
        donors = donors.reverse()

    fulllist = request.user.has_perm(
        'tracker.view_full_list') and page == 'full'
    pages = paginator.Paginator(donors, 50)

    if fulllist:
        pageinfo = {
            'paginator': pages,
            'has_previous': False,
            'has_next': False,
            'paginator.num_pages': pages.num_pages
        }
        page = 0
    else:
        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,
            'event': event,
            'pageinfo': pageinfo,
            'page': page,
            'fulllist': fulllist,
            'sort': sort,
            'order': order
        })
예제 #30
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

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

    agg = filters.run_model_query('donation',
                                  eventParams,
                                  user=request.user,
                                  mode='user').aggregate(amount=Sum('amount'),
                                                         count=Count('amount'),
                                                         max=Max('amount'),
                                                         avg=Avg('amount'))
    agg['target'] = event.targetamount
    count = {
        'runs':
        filters.run_model_query('run', eventParams, user=request.user).count(),
        'prizes':
        filters.run_model_query('prize', eventParams,
                                user=request.user).count(),
        'bids':
        filters.run_model_query('bid', eventParams, user=request.user).count(),
        'donors':
        filters.run_model_query(
            'donorcache', eventParams,
            user=request.user).values('donor').distinct().count(),
    }

    if 'json' in request.GET:
        return HttpResponse(json.dumps({
            'count': count,
            'agg': agg
        },
                                       ensure_ascii=False,
                                       cls=serializers.json.DjangoJSONEncoder),
                            content_type='application/json;charset=utf-8')
    elif 'jsonp' in request.GET:
        callback = request.GET['jsonp']
        return HttpResponse(
            '%s(%s);' % (callback,
                         json.dumps({
                             'count': count,
                             'agg': agg
                         },
                                    ensure_ascii=False,
                                    cls=serializers.json.DjangoJSONEncoder)),
            content_type='text/javascript;charset=utf-8')

    return views_common.tracker_response(request, 'tracker/index.html', {
        'agg': agg,
        'count': count,
        'event': event
    })
예제 #31
0
def donor(request,id,event=None):
  try:
    event = viewutil.get_event(event)
    donor = DonorCache.objects.get(donor=id,event=event.id if event.id else None)
    donations = donor.donation_set.filter(transactionstate='COMPLETED')
    if event.id:
      donations = donations.filter(event=event)
    comments = 'comments' in request.GET
    return tracker_response(request, 'tracker/donor.html', { 'donor' : donor, 'donations' : donations, 'comments' : comments, 'event' : event })
  except DonorCache.DoesNotExist:
    return tracker_response(request, template='tracker/badobject.html', status=404)
예제 #32
0
    def get(self, request, event, *args, **kwargs):
        event = viewutil.get_event(event)
        params = {
            'event': event.id,
        }
        agg = filters.run_model_query(
            'donation',
            params).aggregate(amount=Coalesce(Sum('amount'), Decimal('0.00')))

        return JsonResponse({
            'total': agg['amount'],
        })
예제 #33
0
    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options)

        event = viewutil.get_event(options['event'])
        prizeWinners = prizemail.prizes_with_winner_accept_email_pending(event)
        emailTemplate = options['template'] or event.prizewinneracceptemailtemplate
        dryRun = options['dry_run']

        if emailTemplate == None:
            self.message("No default prize winner accepted email template specified on event {0}, cannot send e-mails.".format(event.short))
        else:
            prizemail.automail_winner_accepted_prize(event, prizeWinners, emailTemplate, verbosity=self.verbosity, dry_run=dryRun)
예제 #34
0
def donor(request,id,event=None):
  try:
    event = viewutil.get_event(event)
    donor = Donor.objects.get(pk=id)
    donations = donor.donation_set.filter(transactionstate='COMPLETED');
    if event.id:
      donations = donations.filter(event=event)
    comments = 'comments' in request.GET
    agg = donations.aggregate(amount=Sum('amount'), count=Count('amount'), max=Max('amount'), avg=Avg('amount'))
    return tracker_response(request, 'tracker/donor.html', { 'donor' : donor, 'donations' : donations, 'agg' : agg, 'comments' : comments, 'event' : event })
  except Donor.DoesNotExist:
    return tracker_response(request, template='tracker/badobject.html', status=404)
    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options)

        event = viewutil.get_event(options['event'])
        prizeWinners = prizemail.prizes_with_winner_accept_email_pending(event)
        emailTemplate = options['template'] or event.prizewinneracceptemailtemplate
        dryRun = options['dry_run']

        if emailTemplate == None:
            self.message("No default prize winner accepted email template specified on event {0}, cannot send e-mails.".format(event.short))
        else:
            prizemail.automail_winner_accepted_prize(event, prizeWinners, emailTemplate, verbosity=self.verbosity, dry_run=dryRun)
예제 #36
0
def runindex(request,event=None):
  event = viewutil.get_event(event)
  searchForm = RunSearchForm(request.GET)
  if not searchForm.is_valid():
    return HttpResponse('Invalid Search Data', status=400)
  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)
  if event.id:
    searchParams['event'] = event.id
  runs = filters.run_model_query('run', searchParams, user=request.user)
  runs = runs.select_related('runners').annotate(hasbids=Sum('bids'))
  return tracker_response(request, 'tracker/runindex.html', { 'searchForm': searchForm, 'runs' : runs, 'event': event })
예제 #37
0
def prizeindex(request,event=None):
  event = viewutil.get_event(event)
  searchForm = PrizeSearchForm(request.GET)
  if not searchForm.is_valid():
    return HttpResponse('Invalid Search Data', status=400)
  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)
  if event.id:
    searchParams['event'] = event.id
  prizes = filters.run_model_query('prize', searchParams, user=request.user)
  prizes = prizes.select_related('startrun','endrun','category').prefetch_related('prizewinner_set')
  return tracker_response(request, 'tracker/prizeindex.html', { 'searchForm': searchForm, 'prizes' : prizes, 'event': event })
예제 #38
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # Get event
        event = viewutil.get_event(context['event'])
        if event.locked:
            raise Http404
        context['event'] = event

        # Base donation info form.
        context['commentform'] = forms.DonationEntryFormV2(
            event=event, data=self.request.POST or None)

        # Get donation amount if form is valid.
        if self.request.method == 'POST' and context['commentform'].is_valid():
            amount = context['commentform'].cleaned_data['amount']
        else:
            amount = Decimal('0.00')

        # Bid selection form
        bids = filters.run_model_query(
            'bid', {
                'state': 'OPENED',
                'event': event.id
            },
            user=self.request.user).select_related(
                'speedrun').prefetch_related('options')
        context['bidsform'] = forms.DonationBidFormV2(amount=amount,
                                                      bids=bids,
                                                      data=self.request.POST
                                                      or None)
        context['hasBids'] = bids.count() > 0
        context['bids'] = bids

        # Group bids by run for the revamped donate page display.
        bids_by_run = collections.OrderedDict()
        for bid in bids:
            if bid.speedrun not in bids_by_run:
                bids_by_run[bid.speedrun] = []

            bid.options_list = list(
                bid.options.filter(state='OPENED').order_by('-total', 'name'))
            bids_by_run[bid.speedrun].append(bid)

        context['bids_by_run'] = []
        for run, bids in bids_by_run.items():
            run.bid_list = bids
            context['bids_by_run'].append(run)

        return context
예제 #39
0
    def automail_prize_contributors(request, event=None):
        if not hasattr(settings, 'EMAIL_HOST'):
            return HttpResponse('Email not enabled on this server.')
        event = viewutil.get_event(event)

        if not event.id:
            return render(
                request,
                'tracker/eventlist.html',
                {
                    'events': models.Event.objects.all(),
                    'pattern': 'admin:automail_prize_contributors',
                    'subheading': 'Mail Prize Contributors',
                },
            )

        prizes = prizemail.prizes_with_submission_email_pending(event)
        if request.method == 'POST':
            form = forms.AutomailPrizeContributorsForm(prizes=prizes,
                                                       data=request.POST)
            if form.is_valid():
                prizemail.automail_prize_contributors(
                    event,
                    form.cleaned_data['prizes'],
                    form.cleaned_data['emailtemplate'],
                    sender=form.cleaned_data['fromaddress'],
                    replyTo=form.cleaned_data['replyaddress'],
                )
                viewutil.tracker_log(
                    'prize',
                    'Mailed prize contributors',
                    event=event,
                    user=request.user,
                )
                return render(
                    request,
                    'admin/tracker/automail_prize_contributors_post.html',
                    {'prizes': form.cleaned_data['prizes']},
                )
        else:
            form = forms.AutomailPrizeContributorsForm(prizes=prizes)
        return render(
            request,
            'admin/tracker/automail_prize_contributors.html',
            {
                'form': form,
                'event': event
            },
        )
예제 #40
0
def submit_prize(request, event):
    event = viewutil.get_event(event)
    if request.method == 'POST':
        prizeForm = forms.PrizeSubmissionForm(data=request.POST)
        if prizeForm.is_valid():
            prize = models.Prize.objects.create(
                event=event,
                name=prizeForm.cleaned_data['name'],
                description=prizeForm.cleaned_data['description'],
                maxwinners=prizeForm.cleaned_data['maxwinners'],
                extrainfo=prizeForm.cleaned_data['extrainfo'],
                estimatedvalue=prizeForm.cleaned_data['estimatedvalue'],
                minimumbid=prizeForm.cleaned_data['suggestedamount'],
                maximumbid=prizeForm.cleaned_data['suggestedamount'],
                image=prizeForm.cleaned_data['imageurl'],
                provided=prizeForm.cleaned_data['providername'],
                provideremail=prizeForm.cleaned_data['provideremail'],
                creator=prizeForm.cleaned_data['creatorname'],
                creatoremail=prizeForm.cleaned_data['creatoremail'],
                creatorwebsite=prizeForm.cleaned_data['creatorwebsite'],
                startrun=prizeForm.cleaned_data['startrun'],
                endrun=prizeForm.cleaned_data['endrun'])
            prize.save()
            return views_common.tracker_response(
                request, "tracker/submit_prize_success.html", {'prize': prize})
    else:
        prizeForm = forms.PrizeSubmissionForm()

    runs = filters.run_model_query('run', {'event': event}, request.user)

    def run_info(run):
        return {
            'id': run.id,
            'name': run.name,
            'description': run.description,
            'runners': run.deprecated_runners,
            'starttime': run.starttime.isoformat(),
            'endtime': run.endtime.isoformat()
        }

    dumpArray = [run_info(o) for o in runs.all()]
    runsJson = json.dumps(dumpArray)

    return views_common.tracker_response(request,
                                         "tracker/submit_prize_form.html", {
                                             'event': event,
                                             'form': prizeForm,
                                             'runs': runsJson
                                         })
def donationindex(request,event=None):
  event = viewutil.get_event(event)
  orderdict = {
    'name'   : ('donor__lastname', 'donor__firstname'),
    '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
    
  searchForm = DonationSearchForm(request.GET)
  
  if not searchForm.is_valid():
    return HttpResponse('Invalid Search Data', status=400)
    
  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)
  
  if event.id:
    searchParams['event'] = event.id
    
  donations = filters.run_model_query('donation', searchParams, user=request.user)
  donations = views_common.fixorder(donations, orderdict, sort, order)
  fulllist = request.user.has_perm('tracker.view_full_list') and page == 'full'
  agg = donations.aggregate(amount=Sum('amount'), count=Count('amount'), max=Max('amount'), avg=Avg('amount'))
  pages = paginator.Paginator(donations,50)
  if fulllist:
    pageinfo = { 'paginator' : pages, 'has_previous' : False, 'has_next' : False, 'paginator.num_pages' : pages.num_pages }
    page = 0
  else:
    try:
      pageinfo = pages.page(page)
    except paginator.PageNotAnInteger:
      pageinfo = pages.page(1)
    except paginator.EmptyPage:
      pageinfo = pages.page(paginator.num_pages)
      page = pages.num_pages
    donations = pageinfo.object_list
    
  return views_common.tracker_response(request, 'tracker/donationindex.html', { 'searchForm': searchForm, 'donations' : donations, 'pageinfo' :  pageinfo, 'page' : page, 'fulllist' : fulllist, 'agg' : agg, 'sort' : sort, 'order' : order, 'event': event })
예제 #42
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

    allEvents = Event.objects.all()
    eventCount = len(allEvents)

    if not event.id:
        if eventCount >= 1:
            event = allEvents.reverse()[0]

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

    agg = filters.run_model_query('donation',
                                  eventParams).aggregate(amount=Sum('amount'),
                                                         count=Count('amount'),
                                                         max=Max('amount'),
                                                         avg=Avg('amount'))
    agg['target'] = 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:
        return HttpResponse(json.dumps({
            'count': count,
            'agg': agg
        },
                                       ensure_ascii=False,
                                       cls=serializers.json.DjangoJSONEncoder),
                            content_type='application/json;charset=utf-8')

    return views_common.tracker_response(request, 'tracker/index.html', {
        'agg': agg,
        'count': count,
        'event': event,
        'event_count': eventCount
    })
    def handle(self, *args, **options):
        hasPrize = 'prize' in options
        hasEvent = 'event' in options

        if hasPrize and hasEvent:
            print("Error, cannot specify both a single prize and event.")
        if not hasPrize and not hasEvent:
            print("Error, must specify either a prize or an event.")

        if hasPrize:
            prizeId = int(options['prize'])
            prize = models.Prize(pk=prizeId)
            self.draw_prize(prize)
        elif hasEvent:
            event = viewutil.get_event(options['event'])
            for prize in models.Prize.objects.filter(event=event, state='ACCEPTED'):
                self.draw_prize(prize)
예제 #44
0
def runindex(request, event=None):
    event = viewutil.get_event(event)

    if not event.id:
        return HttpResponseRedirect(
            reverse('tracker:runindex', args=(Event.objects.latest().short,))
        )

    searchParams = {}
    searchParams['event'] = event.id

    runs = filters.run_model_query('run', searchParams)
    runs = runs.annotate(hasbids=Sum('bids'))

    return views_common.tracker_response(
        request, 'tracker/runindex.html', {'runs': runs, 'event': event},
    )
예제 #45
0
def prizeindex(request,event=None):
  event = viewutil.get_event(event)
  searchForm = PrizeSearchForm(request.GET)

  if not searchForm.is_valid():
    return HttpResponse('Invalid Search Data', status=400)

  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)

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

  prizes = filters.run_model_query('prize', searchParams)
  prizes = prizes.select_related('startrun','endrun','category').prefetch_related('prizewinner_set')
  return views_common.tracker_response(request, 'tracker/prizeindex.html', { 'searchForm': searchForm, 'prizes' : prizes, 'event': event })
예제 #46
0
    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options)

        hasPrize = options['prize'] != None
        hasEvent = options['event'] != None
        dryRun = options['dry_run']

        prizeSet = None

        if hasPrize:
            prizeId = int(options['prize'])
            prizeSet = models.Prize.objects.filter(pk=prizeId)
            if not prizeSet.exists():
                self.message("No prize with id {0} found.".format(prizeId))
                sys.exit(1)
            elif prizeSet[0].state != 'ACCEPTED':
                self.message(
                    "Prize {0} is not in an accepted state".format(prizeId))
                sys.exit(1)
        elif hasEvent:
            event = viewutil.get_event(options['event'])
            prizeSet = models.Prize.objects.filter(
                event=event, state='ACCEPTED')

        seed = options['seed']

        if seed:
            self.message("Using supplied seed {0}".format(seed))

        self.rand = random.Random(seed)

        if not prizeSet.exists():
            self.message("No prizes match the given query.")
        else:
            try:
                with transaction.atomic():
                    for prize in prizeSet:
                        self.draw_prize(prize)
                    if dryRun:
                        self.message("Rolling back operations...")
                        raise Exception("Cancelled due to dry run.")
            except:
                self.message("Rollback complete.")

        self.message("Completed.")
예제 #47
0
    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options)

        hasPrize = options['prize'] != None
        hasEvent = options['event'] != None
        dryRun = options['dry_run']

        prizeSet = None

        if hasPrize:
            prizeId = int(options['prize'])
            prizeSet = models.Prize.objects.filter(pk=prizeId)
            if not prizeSet.exists():
                self.message("No prize with id {0} found.".format(prizeId))
                sys.exit(1)
            elif prizeSet[0].state != 'ACCEPTED':
                self.message(
                    "Prize {0} is not in an accepted state".format(prizeId))
                sys.exit(1)
        elif hasEvent:
            event = viewutil.get_event(options['event'])
            prizeSet = models.Prize.objects.filter(event=event,
                                                   state='ACCEPTED')

        seed = options['seed']

        if seed:
            self.message("Using supplied seed {0}".format(seed))

        self.rand = random.Random(seed)

        if not prizeSet.exists():
            self.message("No prizes match the given query.")
        else:
            try:
                with transaction.atomic():
                    for prize in prizeSet:
                        self.draw_prize(prize)
                    if dryRun:
                        self.message("Rolling back operations...")
                        raise Exception("Cancelled due to dry run.")
            except:
                self.message("Rollback complete.")

        self.message("Completed.")
예제 #48
0
def runindex(request,event=None):
  event = viewutil.get_event(event)
  searchForm = RunSearchForm(request.GET)

  if not searchForm.is_valid():
    return HttpResponse('Invalid Search Data', status=400)

  searchParams = {}
  searchParams.update(request.GET)
  searchParams.update(searchForm.cleaned_data)

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

  runs = filters.run_model_query('run', searchParams)
  runs = runs.annotate(hasbids=Sum('bids'))

  return views_common.tracker_response(request, 'tracker/runindex.html', { 'searchForm': searchForm, 'runs' : runs, 'event': event })
    def handle(self, *args, **options):
        super(Command, self).handle(*args, **options)

        event = viewutil.get_event(options["event"])
        prizes = prizemail.prizes_with_submission_email_pending(event)
        emailTemplate = options["template"] or event.prizecontributoremailtemplate
        dryRun = options["dry_run"]

        if emailTemplate == None:
            self.message(
                "No default prize accept/deny email template specified on event {0}, cannot send e-mails.".format(
                    event.short
                )
            )
        else:
            prizemail.automail_prize_contributors(
                event, prizes, emailTemplate, verbosity=self.verbosity, dry_run=dryRun
            )
예제 #50
0
def donor(request, id, event=None):
    try:
        event = viewutil.get_event(event)
        donor = DonorCache.objects.get(donor=id, event=event.id if event.id else None)
        donations = donor.donation_set.filter(transactionstate="COMPLETED")

        if event.id:
            donations = donations.filter(event=event)

        comments = "comments" in request.GET

        return views_common.tracker_response(
            request,
            "tracker/donor.html",
            {"donor": donor, "donations": donations, "comments": comments, "event": event},
        )
    except DonorCache.DoesNotExist:
        return views_common.tracker_response(request, template="tracker/badobject.html", status=404)
예제 #51
0
def prizeindex(request, event=None):
    event = viewutil.get_event(event)
    searchForm = PrizeSearchForm(request.GET)

    if not searchForm.is_valid():
        return HttpResponse("Invalid Search Data", status=400)

    searchParams = {}
    searchParams.update(request.GET)
    searchParams.update(searchForm.cleaned_data)

    if event.id:
        searchParams["event"] = event.id

    prizes = filters.run_model_query("prize", searchParams, user=request.user)
    prizes = prizes.select_related("startrun", "endrun", "category").prefetch_related("prizewinner_set")
    return views_common.tracker_response(
        request, "tracker/prizeindex.html", {"searchForm": searchForm, "prizes": prizes, "event": event}
    )
예제 #52
0
def tracker_context(request, qdict=None):
    starttime = datetime.datetime.now()
    language = translation.get_language_from_request(request)
    translation.activate(language)
    request.LANGUAGE_CODE = translation.get_language()
    profile = None
    qdict = qdict or {}
    qdict.update({
        'djangoversion': dv(),
        'pythonversion': pv(),
        'user': request.user,
        'profile': profile,
        'next': request.POST.get('next', request.GET.get('next', request.path)),
        'starttime': starttime,
        'events': tracker.models.Event.objects.all(),
    })
    qdict.setdefault('event', viewutil.get_event(None))
    qdict.setdefault('user', request.user)
    return qdict
예제 #53
0
def tracker_response(request=None, template='tracker/index.html', qdict={}, status=200):
  starttime = datetime.datetime.now()
  context = RequestContext(request)
  language = translation.get_language_from_request(request)
  translation.activate(language)
  request.LANGUAGE_CODE = translation.get_language()
  profile = None
  if request.user.is_authenticated():
    try:
      profile = request.user.get_profile()
    except UserProfile.DoesNotExist:
      profile = UserProfile()
      profile.user = request.user
      profile.save()
  if profile:
    template = profile.prepend + template
    prepend = profile.prepend
  else:
    prepend = ''
  authform = AuthenticationForm(request.POST)
  qdict.update({
    'djangoversion' : dv(),
    'pythonversion' : pv(),
    'user' : request.user,
    'profile' : profile,
    'prepend' : prepend,
    'next' : request.REQUEST.get('next', request.path),
    'starttime' : starttime,
    'events': Event.objects.all(),
    'authform' : authform })
  qdict.setdefault('event',viewutil.get_event(None))
  try:
    if request.user.username[:10]=='openiduser':
      qdict.setdefault('usernameform', UsernameForm())
      return render(request, 'tracker/username.html', dictionary=qdict)
    resp = render(request, template, dictionary=qdict, status=status)
    if 'queries' in request.GET and request.user.has_perm('tracker.view_queries'):
      return HttpResponse(json.dumps(connection.queries, ensure_ascii=False, indent=1),content_type='application/json;charset=utf-8')
    return resp
  except Exception,e:
    if request.user.is_staff and not settings.DEBUG:
      return HttpResponse(unicode(type(e)) + '\n\n' + unicode(e), mimetype='text/plain', status=500)
    raise
예제 #54
0
def bidindex(request, event=None):
    event = viewutil.get_event(event)
    searchForm = BidSearchForm(request.GET)

    if not searchForm.is_valid():
        return HttpResponse("Invalid filter form", status=400)

    searchParams = {}
    searchParams.update(request.GET)
    searchParams.update(searchForm.cleaned_data)

    if event.id:
        searchParams["event"] = event.id
    else:
        return HttpResponseRedirect(reverse("tracker.views.bidindex", args=(Event.objects.latest().id,)))

    bids = filters.run_model_query("bid", searchParams, user=request.user)
    bids = bids.filter(parent=None)
    total = bids.aggregate(Sum("total"))["total__sum"] or Decimal("0.00")
    choiceTotal = bids.filter(goal=None).aggregate(Sum("total"))["total__sum"] or Decimal("0.00")
    challengeTotal = bids.exclude(goal=None).aggregate(Sum("total"))["total__sum"] or Decimal("0.00")
    bids = viewutil.get_tree_queryset_descendants(Bid, bids, include_self=True).prefetch_related("options")
    bids = bids.filter(parent=None)

    if event.id:
        bidNameSpan = 2
    else:
        bidNameSpan = 1

    return views_common.tracker_response(
        request,
        "tracker/bidindex.html",
        {
            "searchForm": searchForm,
            "bids": bids,
            "total": total,
            "event": event,
            "bidNameSpan": bidNameSpan,
            "choiceTotal": choiceTotal,
            "challengeTotal": challengeTotal,
        },
    )
예제 #55
0
def runindex(request, event=None):
    event = viewutil.get_event(event)
    searchForm = RunSearchForm(request.GET)

    if not searchForm.is_valid():
        return HttpResponse("Invalid Search Data", status=400)

    searchParams = {}
    searchParams.update(request.GET)
    searchParams.update(searchForm.cleaned_data)

    if event.id:
        searchParams["event"] = event.id

    runs = filters.run_model_query("run", searchParams, user=request.user)
    runs = runs.annotate(hasbids=Sum("bids"))

    return views_common.tracker_response(
        request, "tracker/runindex.html", {"searchForm": searchForm, "runs": runs, "event": event}
    )
예제 #56
0
def submit_prize(request, event):
    event = viewutil.get_event(event)

    if request.method == 'POST':
        prizeForm = forms.PrizeSubmissionForm(data=request.POST)
        if prizeForm.is_valid():
            prize = prizeForm.save(event, request.user)
            return views_common.tracker_response(request, "tracker/submit_prize_success.html", {'prize': prize})
    else:
        prizeForm = forms.PrizeSubmissionForm()

    runs = filters.run_model_query('run', {'event': event}, request.user)

    def run_info(run):
        return {'id': run.id, 'name': run.name, 'description': run.description, 'runners': run.deprecated_runners, 'starttime': run.starttime.isoformat(), 'endtime': run.endtime.isoformat()}

    dumpArray = [run_info(o) for o in runs.all()]
    runsJson = json.dumps(dumpArray)

    return views_common.tracker_response(request, "tracker/submit_prize.html", {'event': event, 'form': prizeForm, 'runs': runsJson})
예제 #57
0
def index(request,event=None):
  event = viewutil.get_event(event)
  eventParams = {}
  if event.id:
    eventParams['event'] = event.id
  agg = filters.run_model_query('donation', eventParams, user=request.user, mode='user').aggregate(amount=Sum('amount'), count=Count('amount'), max=Max('amount'), avg=Avg('amount'))
  agg['target'] = event.targetamount
  count = {
    'runs' : filters.run_model_query('run', eventParams, user=request.user).count(),
    'prizes' : filters.run_model_query('prize', eventParams, user=request.user).count(),
    'bids' : filters.run_model_query('bid', eventParams, user=request.user).count(),
    'donors' : filters.run_model_query('donorcache', eventParams, user=request.user).values('donor').distinct().count(),
  }

  if 'json' in request.GET:
    return HttpResponse(json.dumps({'count':count,'agg':agg},ensure_ascii=False),content_type='application/json;charset=utf-8')
  elif 'jsonp' in request.GET:
    callback = request.GET['jsonp']
    return HttpResponse('%s(%s);' % (callback, json.dumps({'count':count,'agg':agg},ensure_ascii=False)), content_type='text/javascript;charset=utf-8')
  return tracker_response(request, 'tracker/index.html', { 'agg' : agg, 'count' : count, 'event': event })
예제 #58
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

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

    agg = filters.run_model_query('donation', eventParams).aggregate(amount=Sum(
        'amount'), count=Count('amount'), max=Max('amount'), avg=Avg('amount'))
    agg['target'] = 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:
        return HttpResponse(json.dumps({'count': count, 'agg': agg}, ensure_ascii=False, cls=serializers.json.DjangoJSONEncoder), content_type='application/json;charset=utf-8')

    return views_common.tracker_response(request, 'tracker/index.html', {'agg': agg, 'count': count, 'event': event})
def donorindex(request,event=None):
  event = viewutil.get_event(event)
  orderdict = {
    'name'  : ('donor__lastname', 'donor__firstname'),
    'total' : ('donation_total',    ),
    'max'   : ('donation_max',      ),
    'avg'   : ('donation_avg',      )
  }
  page = request.GET.get('page', 1)
  sort = request.GET.get('sort', 'name')
  
  if sort not in orderdict:
    sort = 'name'
    
  try:
    order = int(request.GET.get('order', 1))
  except ValueError:
    order = 1

  donors = DonorCache.objects.filter(event=event.id if event.id else None).order_by(*orderdict[sort])
  if order == -1:
    donors = donors.reverse()

  fulllist = request.user.has_perm('tracker.view_full_list') and page == 'full'
  pages = paginator.Paginator(donors,50)

  if fulllist:
    pageinfo = { 'paginator' : pages, 'has_previous' : False, 'has_next' : False, 'paginator.num_pages' : pages.num_pages }
    page = 0
  else:
    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, 'event' : event, 'pageinfo' : pageinfo, 'page' : page, 'fulllist' : fulllist, 'sort' : sort, 'order' : order })
예제 #60
0
def index(request, event=None):
    event = viewutil.get_event(event)
    eventParams = {}

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

    agg = filters.run_model_query("donation", eventParams, user=request.user, mode="user").aggregate(
        amount=Sum("amount"), count=Count("amount"), max=Max("amount"), avg=Avg("amount")
    )
    agg["target"] = event.targetamount
    count = {
        "runs": filters.run_model_query("run", eventParams, user=request.user).count(),
        "prizes": filters.run_model_query("prize", eventParams, user=request.user).count(),
        "bids": filters.run_model_query("bid", eventParams, user=request.user).count(),
        "donors": filters.run_model_query("donorcache", eventParams, user=request.user)
        .values("donor")
        .distinct()
        .count(),
    }

    if "json" in request.GET:
        return HttpResponse(
            json.dumps({"count": count, "agg": agg}, ensure_ascii=False, cls=serializers.json.DjangoJSONEncoder),
            content_type="application/json;charset=utf-8",
        )
    elif "jsonp" in request.GET:
        callback = request.GET["jsonp"]
        return HttpResponse(
            "%s(%s);"
            % (
                callback,
                json.dumps({"count": count, "agg": agg}, ensure_ascii=False, cls=serializers.json.DjangoJSONEncoder),
            ),
            content_type="text/javascript;charset=utf-8",
        )

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