def auto_complete_search(request): query = get_param(request, 'q', '') search_for = get_param(request, 'search_for', 'players,teams,events') search_for = search_for.split(',') results = tools_search(query, search_for, strict=True) data = {} if results is None: return JsonResponse(data) players, teams, events = results if players is not None: players = players.extra(select=EXTRA_NULL_SELECT)\ .order_by("-null_curr", "-current_rating__rating") num = 5 if teams is not None or events is not None else 10 data['players'] = [{ "id": p.id, "tag": p.tag, "race": p.race, "country": p.country, "aliases": [a.name for a in p.alias_set.all()], "teams": [ (t.group.name, t.group.shortname) for t in p.groupmembership_set.filter( current=True, group__is_team=True )] } for p in players[:num]] if teams is not None: teams = teams.order_by('name') num = 5 if players is not None or events is not None else 10 data['teams'] = [{ "id": t.id, "name": t.name } for t in teams[:num]] if events is not None: events = events.order_by("fullname") num = 5 if players is not None or teams is not None else 10 data['events'] = [{ "id": e.id, "fullname": e.fullname } for e in events[:num]] return JsonResponse(data)
def auto_complete_search(request): query = get_param(request, 'q', '') search_for = get_param(request, 'search_for', 'players,teams,events') search_for = search_for.split(',') results = tools_search(query, search_for, strict=True) data = {} if results is None: return JsonResponse(data) players, teams, events = results if players is not None: players = players.extra(select=EXTRA_NULL_SELECT)\ .order_by("-null_curr", "-current_rating__rating") num = 5 if teams is not None or events is not None else 10 data['players'] = [{ "id": p.id, "tag": p.tag, "race": p.race, "country": p.country, "aliases": [a.name for a in p.alias_set.all()], "teams": [(t.group.name, t.group.shortname) for t in p.groupmembership_set.filter(current=True, group__is_team=True)] } for p in players[:num]] if teams is not None: teams = teams.order_by('name') num = 5 if players is not None or events is not None else 10 data['teams'] = [{"id": t.id, "name": t.name} for t in teams[:num]] if events is not None: events = events.order_by("fullname") num = 5 if players is not None or teams is not None else 10 data['events'] = [{ "id": e.id, "fullname": e.fullname } for e in events[:num]] return JsonResponse(data)
def search(request): base = base_ctx(request=request) query = get_param(request, "q", "") results = tools_search(query) if results is None: return redirect("/") players, teams, events = results # {{{ Redirect if only one hit if players.count() == 1 and teams.count() == 0 and events.count() == 0: return redirect("/players/%i-%s/" % (players.first().id, urlfilter(players.first().tag))) elif players.count() == 0 and teams.count() == 1 and events.count() == 0: return redirect("/teams/%i-%s/" % (teams.first().id, urlfilter(teams.first().name))) elif players.count() == 0 and teams.count() == 0 and events.count() == 1: return redirect("/results/events/%i-%s/" % (events.first().id, urlfilter(events.first().fullname))) # }}} base.update( { "results": zip_longest(players, teams, events, fillvalue=None), "players": players, "teams": teams, "events": events, "query": query, } ) return render_to_response("search.djhtml", base)
def race(request): race = get_param(request, 'race', 'all') if race not in 'PTZ': race = 'all' sub = ['All','Protoss','Terran','Zerg'][['all','P','T','Z'].index(race)] base = base_ctx('Records', sub, request) def sift(lst, num=5): ret, pls = [], set() for r in lst: if not r.player_id in pls: pls.add(r.player_id) ret.append(r) if len(ret) == num: return ret return ret high = ( filter_active(total_ratings(Rating.objects.all())) .filter(period__id__gt=16).select_related('player', 'period') ) if race != 'all': high = high.filter(player__race=race) base.update({ 'hightot': sift(high.order_by('-rating')[:200]), 'highp': sift(high.order_by('-tot_vp')[:200]), 'hight': sift(high.order_by('-tot_vt')[:200]), 'highz': sift(high.order_by('-tot_vz')[:200]), 'race': race if race != 'all' else '', }) return render_to_response('records.djhtml', base)
def results(request): base = base_ctx('Results', 'By Date', request) try: day = datetime.strptime(get_param(request, 'd', None), '%Y-%m-%d').date() except: day = date.today() bounds = Match.objects.aggregate(Min('date'), Max('date')) day = min(max(bounds['date__min'], day), bounds['date__max']) base.update({ 'mindate': bounds['date__min'], 'maxdate': bounds['date__max'], 'td': day, }) matches = ( Match.objects.filter(date=day).order_by('eventobj__idx', 'eventobj__latest', 'event', 'id') .prefetch_related('message_set', 'rta', 'rtb', 'pla', 'plb', 'eventobj') .annotate(Count('eventobj__match')) ) add_links = request.user.is_authenticated() and request.user.is_staff base['matches'] = display_matches(matches, date=False, ratings=True, messages=True, eventcount=True, add_links=add_links) return render_to_response('results.djhtml', base)
def search(request): base = base_ctx(request=request) query = get_param(request, 'q', '') results = tools_search(query) if results is None: return redirect('/') players, teams, events = results # {{{ Redirect if only one hit if players.count() == 1 and teams.count() == 0 and events.count() == 0: return redirect('/players/%i-%s/' % (players.first().id, urlfilter(players.first().tag))) elif players.count() == 0 and teams.count() == 1 and events.count() == 0: return redirect('/teams/%i-%s/' % (teams.first().id, urlfilter(teams.first().name))) elif players.count() == 0 and teams.count() == 0 and events.count() == 1: return redirect( '/results/events/%i-%s/' % (events.first().id, urlfilter(events.first().fullname))) # }}} base.update({ 'results': zip_longest(players, teams, events, fillvalue=None), 'players': players, 'teams': teams, 'events': events, 'query': query, }) return render_to_response('search.djhtml', base)
def search(request): base = base_ctx(request=request) query = get_param(request, 'q', '') results = tools_search(query) if results is None: return redirect('/') players, teams, events = results # {{{ Redirect if only one hit if players.count() == 1 and teams.count() == 0 and events.count() == 0: return redirect('/players/%i-%s/' % (players.first().id, urlfilter(players.first().tag))) elif players.count() == 0 and teams.count() == 1 and events.count() == 0: return redirect('/teams/%i-%s/' % (teams.first().id, urlfilter(teams.first().name))) elif players.count() == 0 and teams.count() == 0 and events.count() == 1: return redirect('/results/events/%i-%s/' % (events.first().id, urlfilter(events.first().fullname))) # }}} base.update({ 'players': players, 'teams': teams, 'events': events, 'query': query, }) base.update({'title': _('Search results')}) return render_to_response('search.html', base)
def race(request): race = get_param(request, 'race', 'all') if race not in 'PTZ': race = 'all' sub = ['All', 'Protoss', 'Terran', 'Zerg'][['all', 'P', 'T', 'Z'].index(race)] base = base_ctx('Records', sub, request) def sift(lst, num=5): ret, pls = [], set() for r in lst: if not r.player_id in pls: pls.add(r.player_id) ret.append(r) if len(ret) == num: return ret return ret high = (filter_active(total_ratings(Rating.objects.all())).filter( period__id__gt=16).select_related('player', 'period')) if race != 'all': high = high.filter(player__race=race) base.update({ 'hightot': sift(high.order_by('-rating')[:200]), 'highp': sift(high.order_by('-tot_vp')[:200]), 'hight': sift(high.order_by('-tot_vt')[:200]), 'highz': sift(high.order_by('-tot_vz')[:200]), 'race': race if race != 'all' else '', }) return render_to_response('records.djhtml', base)
def results(request): base = base_ctx('Results', 'By Date', request) try: day = datetime.strptime(get_param(request, 'd', None), '%Y-%m-%d').date() except: day = date.today() bounds = Match.objects.aggregate(Min('date'), Max('date')) day = min(max(bounds['date__min'], day), bounds['date__max']) base.update({ 'mindate': bounds['date__min'], 'maxdate': bounds['date__max'], 'td': day, }) matches = (Match.objects.filter(date=day).order_by( 'eventobj__idx', 'eventobj__latest', 'event', 'id').prefetch_related('message_set', 'rta', 'rtb', 'pla', 'plb', 'eventobj').annotate(Count('eventobj__match'))) add_links = request.user.is_authenticated() and request.user.is_staff base['matches'] = display_matches(matches, date=False, ratings=True, messages=True, eventcount=True, add_links=add_links) return render_to_response('results.djhtml', base)
def history(request): base = base_ctx('Records', 'History', request) # {{{ Filtering (appears faster with custom SQL) nplayers = int(get_param(request, 'nplayers', '5')) race = get_param_choice(request, 'race', ['ptzrs', 'p', 't', 'z', 'ptrs', 'tzrs', 'pzrs'], 'ptzrs') nats = get_param_choice(request, 'nats', ['all', 'foreigners'] + list(data.ccn_to_cca2.values()), 'all') query = '''SELECT player.id, player.tag, player.race, player.country, MAX(rating.rating) AS high FROM player JOIN rating ON player.id=rating.player_id''' if race != 'ptzrs' or nats != 'all': query += ' WHERE ' ands = [] if race != 'ptzrs': ands.append( '(' + ' OR '.join(["player.race='%s'" % r.upper() for r in race]) + ')') if nats == 'foreigners': ands.append("(player.country!='KR')") elif nats != 'all': ands.append("(player.country='%s')" % nats) query += ' AND '.join(ands) query += ' GROUP BY player.id, player.tag, player.race, player.country ORDER BY high DESC LIMIT %i' % nplayers players = Player.objects.raw(query) # }}} base.update({ 'race': race, 'nats': nats, 'nplayers': nplayers, 'players': [(p, p.rating_set.select_related('period')) for p in players], 'countries': country_list(Player.objects.all()), 'charts': True, 'patches': PATCHES, }) return render_to_response('history.djhtml', base)
def earnings(request, player_id): player = get_object_or_404(Player, id=player_id) base = base_ctx('Ranking', 'Earnings', request, context=player) year = get_param(request, 'year', 'all') # {{{ Gather data earnings = player.earnings_set if year != 'all': earnings = earnings.filter(event__latest__year=year) earnings = earnings.prefetch_related('event__earnings_set').order_by( '-event__latest') totalearnings = earnings.aggregate(Sum('earnings'))['earnings__sum'] years = range(2010, datetime.now().year + 1) def year_is_valid(y): return player.earnings_set.filter(event__latest__year=y).exists() valid_years = filter(year_is_valid, years) # Get placement range for each prize for e in earnings: placements = get_placements(e.event) for prize, rng in placements.items(): if rng[0] <= e.placement <= rng[1]: e.rng = rng # }}} # {{{ Sum up earnings by currency currencies = {e.currency for e in earnings} by_currency = { cur: sum([e.origearnings for e in earnings if e.currency == cur]) for cur in currencies } if len(by_currency) == 1 and 'USD' in by_currency: by_currency = None # }}} base.update({ 'player': player, 'earnings': earnings, 'totalearnings': totalearnings, 'by_currency': by_currency, 'year': year, 'valid_years': reversed(list(valid_years)) }) return render_to_response('player_earnings.djhtml', base)
def earnings(request, player_id): player = get_object_or_404(Player, id=player_id) base = base_ctx("Ranking", "Earnings", request, context=player) year = get_param(request, "year", "all") # {{{ Gather data earnings = player.earnings_set if year != "all": earnings = earnings.filter(event__latest__year=year) earnings = earnings.prefetch_related("event__earnings_set").order_by("-event__latest") totalearnings = earnings.aggregate(Sum("earnings"))["earnings__sum"] years = range(2010, datetime.now().year + 1) def year_is_valid(y): return player.earnings_set.filter(event__latest__year=y).exists() valid_years = filter(year_is_valid, years) # Get placement range for each prize for e in earnings: placements = get_placements(e.event) for prize, rng in placements.items(): if rng[0] <= e.placement <= rng[1]: e.rng = rng # }}} # {{{ Sum up earnings by currency currencies = {e.currency for e in earnings} by_currency = {cur: sum([e.origearnings for e in earnings if e.currency == cur]) for cur in currencies} if len(by_currency) == 1 and "USD" in by_currency: by_currency = None # }}} base.update( { "player": player, "earnings": earnings, "totalearnings": totalearnings, "by_currency": by_currency, "year": year, "valid_years": reversed(list(valid_years)), } ) return render_to_response("player_earnings.djhtml", base)
def earnings(request, player_id): player = get_object_or_404(Player, id=player_id) base = base_ctx('Ranking', 'Earnings', request, context=player) year = get_param(request, 'year', 'all') # {{{ Gather data earnings = player.earnings_set if year != 'all': earnings = earnings.filter(event__latest__year=year) earnings = earnings.prefetch_related('event__earnings_set').order_by('-event__latest') totalearnings = earnings.aggregate(Sum('earnings'))['earnings__sum'] years = range(2010, datetime.now().year + 1) def year_is_valid(y): return player.earnings_set.filter(event__latest__year=y).exists() valid_years = filter(year_is_valid, years) # Get placement range for each prize for e in earnings: placements = get_placements(e.event) for prize, rng in placements.items(): if rng[0] <= e.placement <= rng[1]: e.rng = rng # }}} # {{{ Sum up earnings by currency currencies = {e.currency for e in earnings} by_currency = {cur: sum([e.origearnings for e in earnings if e.currency == cur]) for cur in currencies} if len(by_currency) == 1 and 'USD' in by_currency: by_currency = None # }}} base.update({ 'player': player, 'earnings': earnings, 'totalearnings': totalearnings, 'by_currency': by_currency, 'year': year, 'valid_years': reversed(list(valid_years)) }) return render_to_response('player_earnings.djhtml', base)
def search(request): base = base_ctx(request=request) # {{{ Split query query = get_param(request, 'q', '') terms = [s.strip() for s in shlex.split(query) if s.strip() != ''] if len(terms) == 0: return redirect('/') # }}} # {{{ Search for players, teams and events players = find_player(lst=terms, make=False, soft=True) teams = Group.objects.filter(is_team=True) events = Event.objects.filter(type__in=[TYPE_CATEGORY, TYPE_EVENT]).order_by('idx') for term in terms: teams = teams.filter(Q(name__icontains=term) | Q(alias__name__icontains=term)) events = events.filter(Q(fullname__icontains=term)) teams = teams.distinct() # }}} # {{{ Redirect if only one hit if players.count() == 1 and teams.count() == 0 and events.count() == 0: return redirect('/players/%i-%s/' % (players.first().id, urlfilter(players.first().tag))) elif players.count() == 0 and teams.count() == 1 and events.count() == 0: return redirect('/teams/%i-%s/' % (teams.first().id, urlfilter(teams.first().name))) elif players.count() == 0 and teams.count() == 0 and events.count() == 1: return redirect('/results/events/%i-%s/' % (events.first().id, urlfilter(events.first().fullname))) # }}} base.update({ 'players': players, 'teams': teams, 'events': events, 'query': query, }) base.update({"title": "Search results"}) return render_to_response('search.html', base)
def history(request): base = base_ctx('Records', 'History', request) # {{{ Filtering (appears faster with custom SQL) nplayers = int(get_param(request, 'nplayers', '5')) race = get_param_choice(request, 'race', ['ptzrs','p','t','z','ptrs','tzrs','pzrs'], 'ptzrs') nats = get_param_choice(request, 'nats', ['all','foreigners'] + list(data.ccn_to_cca2.values()), 'all') query = '''SELECT player.id, player.tag, player.race, player.country, MAX(rating.rating) AS high FROM player JOIN rating ON player.id=rating.player_id''' if race != 'ptzrs' or nats != 'all': query += ' WHERE ' ands = [] if race != 'ptzrs': ands.append('(' + ' OR '.join(["player.race='%s'" % r.upper() for r in race]) + ')') if nats == 'foreigners': ands.append("(player.country!='KR')") elif nats != 'all': ands.append("(player.country='%s')" % nats) query += ' AND '.join(ands) query += ' GROUP BY player.id, player.tag, player.race, player.country ORDER BY high DESC LIMIT %i' % nplayers players = Player.objects.raw(query) # }}} base.update({ 'race': race, 'nats': nats, 'nplayers': nplayers, 'players': [(p, p.rating_set.select_related('period')) for p in players], 'countries': country_list(Player.objects.all()), 'charts': True, 'patches': PATCHES, }) base.update({"title": _("History")}) return render_to_response('history.html', base)
def match(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') result = MatchPredictionResult( dbpl=form.cleaned_data['ps'], bos=form.cleaned_data['bo'], s1=get_param(request, 's1', 0), s2=get_param(request, 's2', 0), ) # }}} # {{{ Postprocessing base.update({ 'form': form, 'dbpl': result.dbpl, 'rta': result.rta, 'rtb': result.rtb, 'proba': result.proba, 'probb': result.probb, 'match': result.obj, }) base.update({ 'max': max(base['proba'], base['probb']), 'fav': result.dbpl[0] if base['proba'] > base['probb'] else result.dbpl[1], }) resa = [oc for oc in result.outcomes if oc['sca'] > oc['scb']] resb = [oc for oc in result.outcomes if oc['scb'] > oc['sca']] if len(resa) < len(resb): resa = [None] * (len(resb) - len(resa)) + resa else: resb = [None] * (len(resa) - len(resb)) + resb base['res'] = list(zip(resa, resb)) # }}} # {{{ Scores and other data dbpl = result.dbpl thr = date.today() - relativedelta(months=2) pla_matches = dbpl[0].get_matchset() plb_matches = dbpl[1].get_matchset() base['tot_w_a'], base['tot_l_a'] = count_winloss_player(pla_matches, dbpl[0]) base['frm_w_a'], base['frm_l_a'] = count_winloss_player(pla_matches.filter(date__gte=thr), dbpl[0]) base['tot_w_b'], base['tot_l_b'] = count_winloss_player(plb_matches, dbpl[1]) base['frm_w_b'], base['frm_l_b'] = count_winloss_player(plb_matches.filter(date__gte=thr), dbpl[1]) if dbpl[1].race in 'PTZ': base['mu_w_a'], base['mu_l_a'] = count_matchup_player(pla_matches, dbpl[0], dbpl[1].race) base['fmu_w_a'], base['fmu_l_a'] = count_matchup_player( pla_matches.filter(date__gte=thr), dbpl[0], dbpl[1].race ) if dbpl[0].race in 'PTZ': base['mu_w_b'], base['mu_l_b'] = count_matchup_player(plb_matches, dbpl[1], dbpl[0].race) base['fmu_w_b'], base['fmu_l_b'] = count_matchup_player( plb_matches.filter(date__gte=thr), dbpl[1], dbpl[0].race ) wa_a, wb_a = count_winloss_games(Match.objects.filter(pla=dbpl[0], plb=dbpl[1])) wb_b, wa_b = count_winloss_games(Match.objects.filter(pla=dbpl[1], plb=dbpl[0])) base['vs_a'] = wa_a + wa_b base['vs_b'] = wb_a + wb_b base['matches'] = display_matches( Match.objects.filter(Q(pla=dbpl[0], plb=dbpl[1]) | Q(plb=dbpl[0], pla=dbpl[1])) .select_related('period', 'pla', 'plb') .order_by('-date', 'id'), fix_left=dbpl[0], ) # }}} postable_match(base, request) return render_to_response('pred_match.djhtml', base)
def earnings(request): base = base_ctx('Ranking', 'Earnings', request) # {{{ Build country and currency list all_players = Player.objects.filter(earnings__player__isnull=False).distinct() base['countries'] = country_list(all_players) base['currencies'] = currency_list(Earnings.objects) # }}} # {{{ Initial filtering of earnings preranking = Earnings.objects.filter(earnings__isnull=False) # Filtering by year year = get_param(request, 'year', 'all') if year != 'all': preranking = preranking.filter(event__latest__year=int(year)) # Country filter nats = get_param(request, 'country', 'all') if nats == 'foreigners': preranking = preranking.exclude(player__country='KR') elif nats != 'all': preranking = preranking.filter(player__country=nats) # Currency filter curs = get_param(request, 'currency', 'all') if curs != 'all': preranking = preranking.filter(currency=curs) base['filters'] = {'year': year, 'country': nats, 'currency': curs} ranking = ( preranking.values('player') .annotate(totalorigearnings=Sum('origearnings')) .annotate(totalearnings=Sum('earnings')) .order_by('-totalearnings', 'player') ) # }}} # {{{ Calculate total earnings base.update({ 'totalorigprizepool': preranking.aggregate(Sum('origearnings'))['origearnings__sum'], 'totalprizepool': preranking.aggregate(Sum('earnings'))['earnings__sum'], }) # }}} # {{{ Pages, etc. pagesize = SHOW_PER_LIST_PAGE page = int(get_param(request, 'page', 1)) nitems = ranking.count() npages = nitems//pagesize + (1 if nitems % pagesize > 0 else 0) page = min(max(page, 1), npages) base.update({ 'page': page, 'npages': npages, 'startcount': (page-1)*pagesize, }) if nitems > 0: ranking = ranking[(page-1)*pagesize : page*pagesize] else: base['empty'] = True # }}} # {{{ Populate with player and team objects ids = [p['player'] for p in ranking] players = Player.objects.in_bulk(ids) for p in ranking: p['playerobj'] = players[p['player']] p['teamobj'] = p['playerobj'].get_current_team() base['ranking'] = ranking # }}} base.update({"title": _("Earnings ranking")}) return render_to_response('earnings.html', base)
def match(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') result = MatchPredictionResult( dbpl=form.cleaned_data['ps'], bos=form.cleaned_data['bo'], s1=get_param(request, 's1', 0), s2=get_param(request, 's2', 0), ) # }}} # {{{ Postprocessing base.update({ 'form': form, 'dbpl': result.dbpl, 'rta': result.rta, 'rtb': result.rtb, 'proba': result.proba, 'probb': result.probb, 'match': result.obj, }) base.update({ 'max': max(base['proba'], base['probb']), 'fav': result.dbpl[0] if base['proba'] > base['probb'] else result.dbpl[1], }) resa = [oc for oc in result.outcomes if oc['sca'] > oc['scb']] resb = [oc for oc in result.outcomes if oc['scb'] > oc['sca']] if len(resa) < len(resb): resa = [None] * (len(resb) - len(resa)) + resa else: resb = [None] * (len(resa) - len(resb)) + resb base['res'] = list(zip(resa, resb)) # }}} # {{{ Scores and other data dbpl = result.dbpl thr = date.today() - relativedelta(months=2) pla_matches = dbpl[0].get_matchset() plb_matches = dbpl[1].get_matchset() base['tot_w_a'], base['tot_l_a'] = count_winloss_player( pla_matches, dbpl[0]) base['frm_w_a'], base['frm_l_a'] = count_winloss_player( pla_matches.filter(date__gte=thr), dbpl[0]) base['tot_w_b'], base['tot_l_b'] = count_winloss_player( plb_matches, dbpl[1]) base['frm_w_b'], base['frm_l_b'] = count_winloss_player( plb_matches.filter(date__gte=thr), dbpl[1]) if dbpl[1].race in 'PTZ': base['mu_w_a'], base['mu_l_a'] = count_matchup_player( pla_matches, dbpl[0], dbpl[1].race) base['fmu_w_a'], base['fmu_l_a'] = count_matchup_player( pla_matches.filter(date__gte=thr), dbpl[0], dbpl[1].race) if dbpl[0].race in 'PTZ': base['mu_w_b'], base['mu_l_b'] = count_matchup_player( plb_matches, dbpl[1], dbpl[0].race) base['fmu_w_b'], base['fmu_l_b'] = count_matchup_player( plb_matches.filter(date__gte=thr), dbpl[1], dbpl[0].race) wa_a, wb_a = count_winloss_games( Match.objects.filter(pla=dbpl[0], plb=dbpl[1])) wb_b, wa_b = count_winloss_games( Match.objects.filter(pla=dbpl[1], plb=dbpl[0])) base['vs_a'] = wa_a + wa_b base['vs_b'] = wb_a + wb_b base['matches'] = display_matches( Match.objects.filter( Q(pla=dbpl[0], plb=dbpl[1]) | Q(plb=dbpl[0], pla=dbpl[1])).select_related( 'period', 'pla', 'plb').order_by('-date', 'id'), fix_left=dbpl[0], ) # }}} postable_match(base, request) return render_to_response('pred_match.djhtml', base)
def period(request, period_id=None): base = base_ctx('Ranking', 'Current', request) # {{{ Get period object if not period_id: period = base['curp'] else: period = get_object_or_404(Period, id=period_id, computed=True) if period.is_preview(): base['messages'].append( Message(msg_preview % django_date_filter(period.end, 'F jS'), type=Message.INFO)) base['period'] = period if period.id != base['curp'].id: base['curpage'] = '' # }}} # {{{ Best and most specialised players qset = total_ratings(filter_active( Rating.objects.filter(period=period))).select_related('player') qsetp = qset.filter(player__race=P) qsett = qset.filter(player__race=T) qsetz = qset.filter(player__race=Z) base.update({ 'best': qset.latest('rating'), 'bestvp': qset.latest('tot_vp'), 'bestvt': qset.latest('tot_vt'), 'bestvz': qset.latest('tot_vz'), 'bestp': qsetp.latest('rating'), 'bestpvp': qsetp.latest('tot_vp'), 'bestpvt': qsetp.latest('tot_vt'), 'bestpvz': qsetp.latest('tot_vz'), 'bestt': qsett.latest('rating'), 'besttvp': qsett.latest('tot_vp'), 'besttvt': qsett.latest('tot_vt'), 'besttvz': qsett.latest('tot_vz'), 'bestz': qsetz.latest('rating'), 'bestzvp': qsetz.latest('tot_vp'), 'bestzvt': qsetz.latest('tot_vt'), 'bestzvz': qsetz.latest('tot_vz'), 'specvp': qset.extra(select={ 'd': 'rating_vp/dev_vp*(rating+1.5)' }).latest('d'), 'specvt': qset.extra(select={ 'd': 'rating_vt/dev_vt*(rating+1.5)' }).latest('d'), 'specvz': qset.extra(select={ 'd': 'rating_vz/dev_vz*(rating+1.5)' }).latest('d'), 'specpvp': qsetp.extra(select={ 'd': 'rating_vp/dev_vp*(rating+1.5)' }).latest('d'), 'specpvt': qsetp.extra(select={ 'd': 'rating_vt/dev_vt*(rating+1.5)' }).latest('d'), 'specpvz': qsetp.extra(select={ 'd': 'rating_vz/dev_vz*(rating+1.5)' }).latest('d'), 'spectvp': qsett.extra(select={ 'd': 'rating_vp/dev_vp*(rating+1.5)' }).latest('d'), 'spectvt': qsett.extra(select={ 'd': 'rating_vt/dev_vt*(rating+1.5)' }).latest('d'), 'spectvz': qsett.extra(select={ 'd': 'rating_vz/dev_vz*(rating+1.5)' }).latest('d'), 'speczvp': qsetz.extra(select={ 'd': 'rating_vp/dev_vp*(rating+1.5)' }).latest('d'), 'speczvt': qsetz.extra(select={ 'd': 'rating_vt/dev_vt*(rating+1.5)' }).latest('d'), 'speczvz': qsetz.extra(select={ 'd': 'rating_vz/dev_vz*(rating+1.5)' }).latest('d'), }) # }}} # {{{ Highest gainer and biggest losers # TODO: Fix these queries, highly dependent on the way django does things. gainers = filter_active(Rating.objects.filter(period=period))\ .filter(prev__isnull=False)\ .select_related('prev', 'player')\ .extra(select={'diff': 'rating.rating - T3.rating'})\ .order_by('-diff') losers = filter_active(Rating.objects.filter(period=period))\ .filter(prev__isnull=False)\ .select_related('prev', 'player')\ .extra(select={'diff': 'rating.rating - T3.rating'})\ .order_by('diff') base.update({'updown': zip(gainers[:5], losers[:5])}) # }}} # {{{ Matchup statistics qset = period.match_set base['pvt_wins'], base['pvt_loss'] = count_matchup_games(qset, 'P', 'T') base['pvz_wins'], base['pvz_loss'] = count_matchup_games(qset, 'P', 'Z') base['tvz_wins'], base['tvz_loss'] = count_matchup_games(qset, 'T', 'Z') base.update({ 'pvp_games': count_mirror_games(qset, 'P'), 'tvt_games': count_mirror_games(qset, 'T'), 'zvz_games': count_mirror_games(qset, 'Z'), }) base['tot_mirror'] = base['pvp_games'] + base['tvt_games'] + base[ 'zvz_games'] # }}} # {{{ Build country list all_players = Player.objects.filter(rating__period_id=period.id, rating__decay__lt=INACTIVE_THRESHOLD) base['countries'] = country_list(all_players) # }}} # {{{ Initial filtering of ratings entries = filter_active(period.rating_set).select_related('player') # Race filter race = get_param(request, 'race', 'ptzrs') q = Q() for r in race: q |= Q(player__race=r.upper()) entries = entries.filter(q) # Country filter nats = get_param(request, 'nats', 'all') if nats == 'foreigners': entries = entries.exclude(player__country='KR') elif nats != 'all': entries = entries.filter(player__country=nats) # Sorting sort = get_param(request, 'sort', '') if sort not in ['vp', 'vt', 'vz']: entries = entries.order_by('-rating', 'player__tag') else: entries = entries.extra(select={ 'd': 'rating+rating_' + sort }).order_by('-d', 'player__tag') entries = entries.prefetch_related('prev') base.update({ 'race': race, 'nats': nats, 'sort': sort, }) # }}} # {{{ Pages etc. pagesize = SHOW_PER_LIST_PAGE page = int(get_param(request, 'page', 1)) nitems = entries.count() npages = nitems // pagesize + (1 if nitems % pagesize > 0 else 0) page = min(max(page, 1), npages) entries = entries[(page - 1) * pagesize:page * pagesize] if page > 0 else [] pn_start, pn_end = page - 2, page + 2 if pn_start < 1: pn_end += 1 - pn_start pn_start = 1 if pn_end > npages: pn_start -= pn_end - npages pn_end = npages if pn_start < 1: pn_start = 1 base.update({ 'page': page, 'npages': npages, 'startcount': (page - 1) * pagesize, 'entries': populate_teams(entries), 'nperiods': Period.objects.filter(computed=True).count(), 'pn_range': range(pn_start, pn_end + 1), }) # }}} base.update({ 'sortable': True, 'localcount': True, }) fmt_date = django_date_filter(period.end, "F jS, Y") return render_to_response('period.djhtml', base)
def earnings(request): base = base_ctx('Ranking', 'Earnings', request) # {{{ Build country and currency list all_players = Player.objects.filter( earnings__player__isnull=False).distinct() base['countries'] = country_list(all_players) base['currencies'] = currency_list(Earnings.objects) # }}} # {{{ Initial filtering of earnings preranking = Earnings.objects.filter(earnings__isnull=False) # Filtering by year year = get_param(request, 'year', 'all') if year != 'all': preranking = preranking.filter(event__latest__year=int(year)) # Country filter nats = get_param(request, 'country', 'all') if nats == 'foreigners': preranking = preranking.exclude(player__country='KR') elif nats != 'all': preranking = preranking.filter(player__country=nats) # Currency filter curs = get_param(request, 'currency', 'all') if curs != 'all': preranking = preranking.filter(currency=curs) base['filters'] = {'year': year, 'country': nats, 'currency': curs} ranking = (preranking.values('player').annotate( totalorigearnings=Sum('origearnings')).annotate( totalearnings=Sum('earnings')).order_by('-totalearnings', 'player')) # }}} # {{{ Calculate total earnings base.update({ 'totalorigprizepool': preranking.aggregate(Sum('origearnings'))['origearnings__sum'], 'totalprizepool': preranking.aggregate(Sum('earnings'))['earnings__sum'], }) # }}} # {{{ Pages, etc. pagesize = SHOW_PER_LIST_PAGE page = int(get_param(request, 'page', 1)) nitems = ranking.count() npages = nitems // pagesize + (1 if nitems % pagesize > 0 else 0) page = min(max(page, 1), npages) pn_start, pn_end = page - 2, page + 2 if pn_start < 1: pn_end += 1 - pn_start pn_start = 1 if pn_end > npages: pn_start -= pn_end - npages pn_end = npages if pn_start < 1: pn_start = 1 base.update({ 'page': page, 'npages': npages, 'startcount': (page - 1) * pagesize, 'pn_range': range(pn_start, pn_end + 1) }) if nitems > 0: ranking = ranking[(page - 1) * pagesize:page * pagesize] else: base['empty'] = True # }}} # {{{ Populate with player and team objects ids = [p['player'] for p in ranking] players = Player.objects.in_bulk(ids) for p in ranking: p['playerobj'] = players[p['player']] p['teamobj'] = p['playerobj'].get_current_team() base['ranking'] = ranking # }}} return render_to_response('earnings.djhtml', base)
def period(request, period_id=None): base = base_ctx('Ranking', 'Current', request) # {{{ Get period object if not period_id: period = base['curp'] else: period = get_object_or_404(Period, id=period_id, computed=True) if period.is_preview(): base['messages'].append(Message(msg_preview % cdate(period.end, _('F jS')), type=Message.INFO)) base['period'] = period if period.id != base['curp'].id: base['curpage'] = '' # }}} # {{{ Best and most specialised players qset = total_ratings(filter_active(Rating.objects.filter(period=period))).select_related('player') qsetp = qset.filter(player__race=P) qsett = qset.filter(player__race=T) qsetz = qset.filter(player__race=Z) base.update({ 'best': qset.latest('rating'), 'bestvp': qset.latest('tot_vp'), 'bestvt': qset.latest('tot_vt'), 'bestvz': qset.latest('tot_vz'), 'bestp': qsetp.latest('rating'), 'bestpvp': qsetp.latest('tot_vp'), 'bestpvt': qsetp.latest('tot_vt'), 'bestpvz': qsetp.latest('tot_vz'), 'bestt': qsett.latest('rating'), 'besttvp': qsett.latest('tot_vp'), 'besttvt': qsett.latest('tot_vt'), 'besttvz': qsett.latest('tot_vz'), 'bestz': qsetz.latest('rating'), 'bestzvp': qsetz.latest('tot_vp'), 'bestzvt': qsetz.latest('tot_vt'), 'bestzvz': qsetz.latest('tot_vz'), 'specvp': qset.extra(select={'d': 'rating_vp/dev_vp*(rating+1.5)'}).latest('d'), 'specvt': qset.extra(select={'d': 'rating_vt/dev_vt*(rating+1.5)'}).latest('d'), 'specvz': qset.extra(select={'d': 'rating_vz/dev_vz*(rating+1.5)'}).latest('d'), 'specpvp': qsetp.extra(select={'d': 'rating_vp/dev_vp*(rating+1.5)'}).latest('d'), 'specpvt': qsetp.extra(select={'d': 'rating_vt/dev_vt*(rating+1.5)'}).latest('d'), 'specpvz': qsetp.extra(select={'d': 'rating_vz/dev_vz*(rating+1.5)'}).latest('d'), 'spectvp': qsett.extra(select={'d': 'rating_vp/dev_vp*(rating+1.5)'}).latest('d'), 'spectvt': qsett.extra(select={'d': 'rating_vt/dev_vt*(rating+1.5)'}).latest('d'), 'spectvz': qsett.extra(select={'d': 'rating_vz/dev_vz*(rating+1.5)'}).latest('d'), 'speczvp': qsetz.extra(select={'d': 'rating_vp/dev_vp*(rating+1.5)'}).latest('d'), 'speczvt': qsetz.extra(select={'d': 'rating_vt/dev_vt*(rating+1.5)'}).latest('d'), 'speczvz': qsetz.extra(select={'d': 'rating_vz/dev_vz*(rating+1.5)'}).latest('d'), }) # }}} # {{{ Highest gainer and biggest losers # TODO: Fix these queries, highly dependent on the way django does things. gainers = filter_active(Rating.objects.filter(period=period))\ .filter(prev__isnull=False)\ .select_related('prev', 'player')\ .extra(select={'diff': 'rating.rating - T3.rating'})\ .order_by('-diff') losers = filter_active(Rating.objects.filter(period=period))\ .filter(prev__isnull=False)\ .select_related('prev', 'player')\ .extra(select={'diff': 'rating.rating - T3.rating'})\ .order_by('diff') base.update({ 'gainers': gainers[:5], 'losers': losers[:5] }) # }}} # {{{ Matchup statistics qset = period.match_set base['pvt_wins'], base['pvt_loss'] = count_matchup_games(qset, 'P', 'T') base['pvz_wins'], base['pvz_loss'] = count_matchup_games(qset, 'P', 'Z') base['tvz_wins'], base['tvz_loss'] = count_matchup_games(qset, 'T', 'Z') base.update({ 'pvp_games': count_mirror_games(qset, 'P'), 'tvt_games': count_mirror_games(qset, 'T'), 'zvz_games': count_mirror_games(qset, 'Z'), }) base['tot_mirror'] = base['pvp_games'] + base['tvt_games'] + base['zvz_games'] # }}} # {{{ Build country list all_players = Player.objects.filter(rating__period_id=period.id, rating__decay__lt=INACTIVE_THRESHOLD) base['countries'] = country_list(all_players) # }}} # {{{ Initial filtering of ratings entries = filter_active(period.rating_set).select_related('player') # Race filter race = get_param(request, 'race', 'ptzrs') q = Q() for r in race: q |= Q(player__race=r.upper()) entries = entries.filter(q) # Country filter nats = get_param(request, 'nats', 'all') if nats == 'foreigners': entries = entries.exclude(player__country='KR') elif nats != 'all': entries = entries.filter(player__country=nats) # Sorting sort = get_param(request, 'sort', '') if sort not in ['vp', 'vt', 'vz']: entries = entries.order_by('-rating', 'player__tag') else: entries = entries.extra(select={'d':'rating+rating_'+sort}).order_by('-d', 'player__tag') entries = entries.prefetch_related('prev') base.update({ 'race': race, 'nats': nats, 'sort': sort, }) # }}} # {{{ Pages etc. pagesize = SHOW_PER_LIST_PAGE page = int(get_param(request, 'page', 1)) nitems = entries.count() npages = nitems//pagesize + (1 if nitems % pagesize > 0 else 0) page = min(max(page, 1), npages) entries = entries[(page-1)*pagesize : page*pagesize] if page > 0 else [] base.update({ 'page': page, 'npages': npages, 'startcount': (page-1)*pagesize, 'entries': populate_teams(entries), 'nperiods': Period.objects.filter(computed=True).count(), }) # }}} base.update({ 'sortable': True, 'localcount': True, }) fmt_date = django_date_filter(period.end, "F jS, Y") # Translators: List (number): (date) base.update({"title": _("List {num}: {date}").format(num=period.id, date=fmt_date)}) return render_to_response('period.html', base)
def period(request, period_id): base = base_ctx('Ranking', 'Current', request) # {{{ Get period object period = get_object_or_404(Period, id=period_id, computed=True) if period.is_preview(): base['messages'].append(Message(msg_preview % period.end.strftime('%B %d'), type=Message.INFO)) base['period'] = period if period.id != base['curp'].id: base['curpage'] = '' # }}} # {{{ Best and most specialised players qset = total_ratings(filter_active(Rating.objects.filter(period=period))).select_related('player') qsetp = qset.filter(player__race=P) qsett = qset.filter(player__race=T) qsetz = qset.filter(player__race=Z) base.update({ 'best': qset.latest('rating'), 'bestvp': qset.latest('tot_vp'), 'bestvt': qset.latest('tot_vt'), 'bestvz': qset.latest('tot_vz'), 'bestp': qsetp.latest('rating'), 'bestpvp': qsetp.latest('tot_vp'), 'bestpvt': qsetp.latest('tot_vt'), 'bestpvz': qsetp.latest('tot_vz'), 'bestt': qsett.latest('rating'), 'besttvp': qsett.latest('tot_vp'), 'besttvt': qsett.latest('tot_vt'), 'besttvz': qsett.latest('tot_vz'), 'bestz': qsetz.latest('rating'), 'bestzvp': qsetz.latest('tot_vp'), 'bestzvt': qsetz.latest('tot_vt'), 'bestzvz': qsetz.latest('tot_vz'), 'specvp': qset.extra(select={'d': 'rating_vp/dev_vp*rating'}).latest('d'), 'specvt': qset.extra(select={'d': 'rating_vt/dev_vt*rating'}).latest('d'), 'specvz': qset.extra(select={'d': 'rating_vz/dev_vz*rating'}).latest('d'), 'specpvp': qsetp.extra(select={'d': 'rating_vp/dev_vp*rating'}).latest('d'), 'specpvt': qsetp.extra(select={'d': 'rating_vt/dev_vt*rating'}).latest('d'), 'specpvz': qsetp.extra(select={'d': 'rating_vz/dev_vz*rating'}).latest('d'), 'spectvp': qsett.extra(select={'d': 'rating_vp/dev_vp*rating'}).latest('d'), 'spectvt': qsett.extra(select={'d': 'rating_vt/dev_vt*rating'}).latest('d'), 'spectvz': qsett.extra(select={'d': 'rating_vz/dev_vz*rating'}).latest('d'), 'speczvp': qsetz.extra(select={'d': 'rating_vp/dev_vp*rating'}).latest('d'), 'speczvt': qsetz.extra(select={'d': 'rating_vt/dev_vt*rating'}).latest('d'), 'speczvz': qsetz.extra(select={'d': 'rating_vz/dev_vz*rating'}).latest('d'), }) # }}} # {{{ Matchup statistics qset = period.match_set base['pvt_wins'], base['pvt_loss'] = count_matchup_games(qset, 'P', 'T') base['pvz_wins'], base['pvz_loss'] = count_matchup_games(qset, 'P', 'Z') base['tvz_wins'], base['tvz_loss'] = count_matchup_games(qset, 'T', 'Z') base.update({ 'pvp_games': count_mirror_games(qset, 'P'), 'tvt_games': count_mirror_games(qset, 'T'), 'zvz_games': count_mirror_games(qset, 'Z'), }) base['tot_mirror'] = base['pvp_games'] + base['tvt_games'] + base['zvz_games'] # }}} # {{{ Build country list all_players = Player.objects.filter(rating__period_id=period.id, rating__decay__lt=INACTIVE_THRESHOLD) base['countries'] = country_list(all_players) # }}} # {{{ Initial filtering of ratings entries = filter_active(period.rating_set).select_related('player') # Race filter race = get_param(request, 'race', 'ptzrs') q = Q() for r in race: q |= Q(player__race=r.upper()) entries = entries.filter(q) # Country filter nats = get_param(request, 'nats', 'all') if nats == 'foreigners': entries = entries.exclude(player__country='KR') elif nats != 'all': entries = entries.filter(player__country=nats) # Sorting sort = get_param(request, 'sort', '') if sort not in ['vp', 'vt', 'vz']: entries = entries.order_by('-rating', 'player__tag') else: entries = entries.extra(select={'d':'rating+rating_'+sort}).order_by('-d', 'player__tag') base.update({ 'race': race, 'nats': nats, 'sort': sort, }) # }}} # {{{ Pages etc. pagesize = 40 page = int(get_param(request, 'page', 1)) nitems = entries.count() npages = nitems//pagesize + (1 if nitems % pagesize > 0 else 0) page = min(max(page, 1), npages) entries = entries[(page-1)*pagesize : page*pagesize] base.update({ 'page': page, 'npages': npages, 'startcount': (page-1)*pagesize, 'entries': populate_teams(entries), 'nperiods': Period.objects.filter(computed=True).count(), }) # }}} base.update({ 'sortable': True, 'localcount': True, }) fmt_date = django_date_filter(period.end, "F jS, Y") base.update({"title": "List {}: {}".format(period.id, fmt_date)}) return render_to_response('period.html', base)