Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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)
Example #7
0
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)
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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)
Example #14
0
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)
Example #15
0
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)
Example #16
0
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)
Example #17
0
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)
Example #18
0
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)
Example #19
0
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)
Example #20
0
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)
Example #21
0
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)
Example #22
0
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)