181 lines
7.1 KiB
Python
181 lines
7.1 KiB
Python
import json
|
|
from itertools import izip_longest
|
|
from collections import defaultdict
|
|
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.db.models import Sum
|
|
from django.contrib.auth.decorators import login_required
|
|
from fowl.game.models import (Team, TeamPoints, Star, Event, League,
|
|
OUTCOMES, TITLES)
|
|
|
|
|
|
@login_required
|
|
def events(request, league_id):
|
|
league = get_object_or_404(League, pk = league_id)
|
|
leagues = League.objects.filter(teams__login=request.user)
|
|
events = {}
|
|
points = TeamPoints.objects.filter(team__league_id=league_id).order_by(
|
|
'match__id', 'team').select_related()
|
|
for tp in points:
|
|
event_id = tp.match.event_id
|
|
if event_id not in events:
|
|
events[event_id] = tp.match.event
|
|
events[event_id].scores = {}
|
|
events[event_id].match_list = {}
|
|
events[event_id].match_list.setdefault(tp.match, []).append(tp)
|
|
events[event_id].scores.setdefault(tp.team, 0)
|
|
events[event_id].scores[tp.team] += tp.points
|
|
events = sorted(events.values(), key=lambda x: x.date, reverse=True)
|
|
return render(request, "events.html",
|
|
{'events': events, 'view': 'events', 'league': league,
|
|
'leagues':leagues})
|
|
|
|
|
|
@login_required
|
|
def edit_event(request, event):
|
|
if event == 'new':
|
|
event = None
|
|
else:
|
|
event = get_object_or_404(Event, pk=event).to_dict()
|
|
|
|
if request.method == 'POST':
|
|
edict = {}
|
|
edict['id'] = request.POST.get('id')
|
|
edict['name'] = request.POST.get('name')
|
|
edict['date'] = request.POST.get('date')
|
|
edict['matches'] = []
|
|
|
|
outcomes = request.POST.getlist('outcome')
|
|
winners = request.POST.getlist('winner')
|
|
titles = request.POST.getlist('title')
|
|
notes = request.POST.getlist('notes')
|
|
for i, note in enumerate(notes):
|
|
edict['matches'].append({'outcome': outcomes[i],
|
|
'winner': winners[i],
|
|
'title_at_stake': titles[i],
|
|
'notes': notes[i],
|
|
'teams': [],
|
|
})
|
|
|
|
for k, team in request.POST.iterlists():
|
|
if k.startswith('members'):
|
|
_, match, _ = k.split('-')
|
|
# remove empty strings from team
|
|
team = [m for m in team if m]
|
|
if team:
|
|
edict['matches'][int(match)-1]['teams'].append(team)
|
|
|
|
event = Event.from_dict(edict)
|
|
# score the event for all active leagues
|
|
for league in League.objects.filter(active=True):
|
|
league.score_event(event)
|
|
# after event is scored, do title change on all matches
|
|
for match in event.matches.all():
|
|
match.do_title_change()
|
|
# TODO: title changes should take place inline somehow?
|
|
# (would fix for case if title changes twice)
|
|
|
|
return redirect('edit_event', event.id)
|
|
|
|
if event:
|
|
match_json = json.dumps(event['matches'])
|
|
else:
|
|
match_json = []
|
|
|
|
return render(request, "edit_event.html",
|
|
{'event': event,
|
|
'match_json': match_json,
|
|
'stars': Star.objects.all(),
|
|
'OUTCOMES': OUTCOMES,
|
|
'TITLES': TITLES}
|
|
)
|
|
|
|
|
|
@login_required
|
|
def league(request, league_id):
|
|
league = get_object_or_404(League, pk = league_id)
|
|
leagues = League.objects.filter(teams__login=request.user)
|
|
teams = {team.name: team for team in
|
|
Team.objects.filter(league__id=league_id)}
|
|
|
|
# grab the show totals for all shows
|
|
show_totals = TeamPoints.objects.all().values(
|
|
'match__event__id', 'match__event__name', 'team__name').annotate(
|
|
Sum('points'))
|
|
belts = {'us': {'name': None, 'points': 0, 'date': None,
|
|
'teams': {team: 0 for team in teams}},
|
|
'ic': {'name': None, 'points': 0, 'date': None,
|
|
'teams': {team: 0 for team in teams}},
|
|
'world': {'name': None, 'points': 0, 'date': None,
|
|
'teams': {team: 0 for team in teams}},
|
|
'wwe': {'name': None, 'points': 0, 'date': None,
|
|
'teams': {team: 0 for team in teams}},
|
|
}
|
|
belt_mapping = {'smackdown': 'ic', 'raw': 'us'}
|
|
|
|
# go over all events in order to determine belt holders
|
|
for event in Event.objects.all().order_by('date'):
|
|
# determine which belt is being competed for
|
|
belt_name = belt_mapping.get(event.name.lower(), 'world')
|
|
# get team scores for this event
|
|
team_points = TeamPoints.objects.filter(match__event=event
|
|
).values('team__name').annotate(points=Sum('points'))
|
|
# figure out who won event, also tally wwe belt points
|
|
max_points = 0
|
|
event_winner = []
|
|
for tp in team_points:
|
|
if tp['points'] > max_points:
|
|
max_points = tp['points']
|
|
event_winner = [tp['team__name']]
|
|
elif tp['points'] == max_points:
|
|
event_winner.append(tp['team__name'])
|
|
belts['wwe']['teams'][tp['team__name']] += tp['points']
|
|
|
|
# add a point to all event winners
|
|
for ew in event_winner:
|
|
belts[belt_name]['teams'][ew] += 1
|
|
# loop again after adding points to check for new holder
|
|
for ew in event_winner:
|
|
if belts[belt_name]['teams'][ew] > belts[belt_name]['points']:
|
|
belts[belt_name]['points'] = belts[belt_name]['teams'][ew]
|
|
if belts[belt_name]['name'] != ew:
|
|
belts[belt_name]['name'] = ew
|
|
belts[belt_name]['date'] = event.date
|
|
# do WWE belt check on PPVs
|
|
if belt_name == 'world':
|
|
belt_name = 'wwe'
|
|
if belts[belt_name]['teams'][ew] > belts[belt_name]['points']:
|
|
belts[belt_name]['points'] = belts[belt_name]['teams'][ew]
|
|
if belts[belt_name]['name'] != ew:
|
|
belts[belt_name]['name'] = ew
|
|
belts[belt_name]['date'] = event.date
|
|
|
|
context = {
|
|
'view': 'league',
|
|
'belts': belts,
|
|
'league': league,
|
|
'leagues': leagues
|
|
}
|
|
context['teams'] = teams.values()
|
|
context['star_sets'] = izip_longest(*(team.stars.all().order_by("division")
|
|
for team in teams.itervalues()))
|
|
return render(request, "league.html", context)
|
|
|
|
|
|
@login_required
|
|
def roster(request, league_id):
|
|
league = get_object_or_404(League, pk = league_id)
|
|
leagues = League.objects.filter(teams__login=request.user)
|
|
divisions = {'raw': [], 'smackdown': [], 'other': [], 'divas': []}
|
|
for star in Star.objects.all():
|
|
divisions[star.division].append(star)
|
|
star_sets = izip_longest(divisions['raw'], divisions['smackdown'],
|
|
divisions['divas'], fillvalue='')
|
|
context = {
|
|
'star_sets': star_sets,
|
|
'others': divisions['other'],
|
|
'view': 'roster',
|
|
'league': league,
|
|
'leagues': leagues
|
|
}
|
|
return render(request, "roster.html", context)
|