238 lines
8.4 KiB
Python
238 lines
8.4 KiB
Python
from django.shortcuts import render, HttpResponse
|
|
from .models import Event, Team, Player, Positioning, Venue
|
|
from .forms import PositioningFormSet, TeamsnapEventForm
|
|
from django.contrib import messages
|
|
from django.db.models import F
|
|
from django.views.generic import ListView, DetailView
|
|
import csv
|
|
|
|
|
|
class BenchCoachListView(ListView):
|
|
title = None
|
|
|
|
class EventDetailView(DetailView):
|
|
model = Event
|
|
context_object_name = "event"
|
|
template_name = 'benchcoach/event-detail.html'
|
|
|
|
class EventListView(ListView):
|
|
model = Event
|
|
context_object_name = "events"
|
|
template_name = 'benchcoach/event-list.html'
|
|
|
|
class PlayerListView(ListView):
|
|
model = Player
|
|
template_name = 'benchcoach/player-list.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['page_title'] = "Players"
|
|
context['members_tab_active'] ='active'
|
|
return context
|
|
|
|
class TeamListView(ListView):
|
|
model = Team
|
|
template_name = 'benchcoach/list.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['page_title'] = "Teams"
|
|
context['opponents_tab_active'] ='active'
|
|
return context
|
|
|
|
class VenueListView(ListView):
|
|
model = Venue
|
|
template_name = 'benchcoach/list.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['page_title'] = "Venues"
|
|
context['venues_tab_active'] ='active'
|
|
return context
|
|
|
|
def lineup_edit(request, event_id, active_tab='details'):
|
|
|
|
if request.method == "POST":
|
|
# create a form instance and populate it with data from the request:
|
|
formset = PositioningFormSet(request.POST)
|
|
is_valid = [f.is_valid() for f in formset]
|
|
for form in formset:
|
|
if form.is_valid():
|
|
# process the data in form.cleaned_data as required
|
|
# ...
|
|
# redirect to a new URL:
|
|
|
|
if isinstance(form.cleaned_data["id"], Positioning):
|
|
positioning_id = form.cleaned_data.pop(
|
|
"id"
|
|
).id # FIXME this is a workaround, not sure why it is necessary
|
|
positioning = Positioning.objects.filter(id=positioning_id)
|
|
positioning.update(**form.cleaned_data)
|
|
did_create = False
|
|
else:
|
|
positioning = Positioning.objects.create(
|
|
**form.cleaned_data, event_id=event_id
|
|
)
|
|
did_create = True
|
|
else:
|
|
messages.error(
|
|
request, f"Error submitting lineup. {form.instance} {form.errors}"
|
|
)
|
|
pass
|
|
if (True in is_valid) and (False in is_valid):
|
|
messages.warning(request, "Lineup partially submitted.")
|
|
elif True in is_valid:
|
|
messages.success(request, "Lineup submitted successfully.")
|
|
elif True not in is_valid:
|
|
messages.error(request, f"Error submitting lineup.")
|
|
else:
|
|
messages.error(request, f"Error submitting lineup.")
|
|
# return HttpResponse(status=204)
|
|
# return render(request, 'success.html', {'call_back':'edit lineup','id':event_id, 'errors':[error for error in formset.errors if error]}, status=200)
|
|
previous_event = Event.objects.filter(id=event_id - 1).first()
|
|
|
|
event = Event.objects.get(id=event_id)
|
|
next_event = Event.objects.get(id=event_id + 1)
|
|
players = Player.objects.prefetch_related("availability_set", "positioning_set")
|
|
|
|
for player in players:
|
|
Positioning.objects.get_or_create(player_id=player.id, event_id=event_id)
|
|
|
|
qs = (
|
|
event.positioning_set.all()
|
|
.filter(player__availability__event=event_id, player__teamsnap_member__is_non_player=False)
|
|
.order_by("order", "-player__availability__available", "player__last_name")
|
|
.annotate(event_availability=F("player__availability__available"))
|
|
)
|
|
|
|
formset = PositioningFormSet(queryset=qs)
|
|
|
|
formset_lineup = [f for f in formset if f.instance.order]
|
|
formset_dhd = [f for f in formset if not f.instance.order and f.instance.position]
|
|
formset_bench = [
|
|
f for f in formset if f not in formset_lineup and f not in formset_dhd
|
|
]
|
|
|
|
details = {
|
|
"Away Team": event.away_team,
|
|
"Home Team": event.home_team,
|
|
"Date": event.start.date(),
|
|
"Time": event.start.time(),
|
|
"Venue": event.venue,
|
|
}
|
|
|
|
return render(
|
|
request,
|
|
"benchcoach/lineup.html",
|
|
{
|
|
"title": "Lineup",
|
|
"active_tab":active_tab,
|
|
"event": event,
|
|
"details": details,
|
|
"previous_event": previous_event,
|
|
"next_event": next_event,
|
|
"formset": formset,
|
|
"formset_lineup": formset_lineup,
|
|
"formset_bench": formset_bench,
|
|
"formset_dhd": formset_dhd,
|
|
},
|
|
)
|
|
|
|
def lineupcard(request, event_id):
|
|
previous_event = Event.objects.filter(id=event_id - 1).first()
|
|
|
|
event = Event.objects.get(id=event_id)
|
|
next_event = Event.objects.get(id=event_id + 1)
|
|
players = Player.objects.prefetch_related("availability_set", "positioning_set")
|
|
|
|
for player in players:
|
|
Positioning.objects.get_or_create(player_id=player.id, event_id=event_id)
|
|
|
|
qs = (
|
|
event.positioning_set.all()
|
|
.filter(player__availability__event=event_id, player__teamsnap_member__is_non_player=False)
|
|
.order_by("-player__availability__available", "player__last_name", "order")
|
|
.annotate(event_availability=F("player__availability__available"))
|
|
)
|
|
|
|
qs_starting = qs.filter(order__isnull=False).order_by("order")
|
|
|
|
details = {
|
|
"Away Team": event.away_team,
|
|
"Home Team": event.home_team,
|
|
"Date": event.start.date(),
|
|
"Time": event.start.time(),
|
|
"Venue": event.venue,
|
|
}
|
|
|
|
return render(
|
|
request,
|
|
"benchcoach/card.html",
|
|
{
|
|
"title": "Lineup",
|
|
"event": event,
|
|
"details": details,
|
|
"previous_event": previous_event,
|
|
"next_event": next_event,
|
|
"positionings": qs,
|
|
"positionings_starting": qs_starting,
|
|
"empty_lines": range(14)
|
|
},
|
|
)
|
|
|
|
def csv_export(request, event_id):
|
|
response = HttpResponse(
|
|
content_type='text/csv',
|
|
headers={'Content-Disposition': f'attachment; filename=lineup-event-{event_id}.csv'},
|
|
)
|
|
previous_event = Event.objects.filter(id=event_id - 1).first()
|
|
|
|
event = Event.objects.get(id=event_id)
|
|
players = Player.objects.prefetch_related("availability_set", "positioning_set")
|
|
|
|
for player in players:
|
|
Positioning.objects.get_or_create(player_id=player.id, event_id=event_id)
|
|
|
|
qs = (
|
|
event.positioning_set.all()
|
|
.filter(player__availability__event=event_id, player__teamsnap_member__is_non_player=False)
|
|
.order_by("-player__availability__available", "player__last_name", "order")
|
|
.annotate(event_availability=F("player__availability__available"))
|
|
)
|
|
|
|
rows = []
|
|
|
|
rows.append(event.teamsnap_event.csv_event_title) # 2
|
|
rows.append(event.venue.name) # 3
|
|
[rows.append('') for i in range(3)] #4-6
|
|
p = qs.filter(position='P').first()
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}") #7
|
|
[rows.append('') for i in range(3)] #8-10
|
|
for pos in ['C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF', 'DH']: #11-19
|
|
p = qs.filter(position=pos).first()
|
|
if p:
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}")
|
|
else:
|
|
rows.append('')
|
|
ehs = qs.filter(position='EH')
|
|
if len(ehs) > 0:
|
|
p=qs.filter(position='EH')[0]
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}") # 20
|
|
else:
|
|
rows.append('')
|
|
if len(ehs) > 1:
|
|
p=qs.filter(position='EH')[1]
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}") # 21
|
|
else:
|
|
rows.append('')
|
|
rows.append('') #22
|
|
p=qs.filter(position__isnull=False, order=0).first()
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}") # 23
|
|
rows.append('')
|
|
for p in qs.filter(order__gt=0).order_by('order'):
|
|
rows.append(f"{p.player.last_name}, {p.player.first_name}")
|
|
|
|
writer = csv.writer(response)
|
|
for row in rows:
|
|
writer.writerow([row])
|
|
return response |