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) base.update({"title": cdate(day, _("F jS, Y"))}) return render_to_response('results.html', 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=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({ '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)