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 })
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 })
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} )
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 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
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})
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})
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 })
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
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
def get_object(self, request, event): event = viewutil.get_event(event) if event.locked: raise Http404 return event
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 })
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})
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())), }, )
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 })
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 }, )
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)})
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, }, )
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 }, )
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)
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)
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, }, )
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 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 })
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)
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'], })
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)
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 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 })
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 })
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
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 }, )
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 })
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)
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}, )
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 })
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.")
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.")
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 )
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)
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} )
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
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, }, )
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} )
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})
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 })
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 })
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})