Private
Public Access
1
0
Files
rowsandall/boatmovers/views.py
Sander Roosendaal 726e1a652f fixing race form
2022-06-29 21:45:23 +02:00

201 lines
5.8 KiB
Python

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.contrib import messages
import collections
# Create your views here.
from django.views.generic.edit import CreateView
from boatmovers.models import Athlete, Crew, Race, Result
import boatmovers.tasks as tasks
from boatmovers.forms import CsvForm
from boatmovers.scrapers import *
#from rowers.rows import handle_uploaded_file
import django_rq
queue = django_rq.get_queue('high')
class AthleteCreateView(CreateView):
model = Athlete
fields = [
'first_name',
'last_name',
'birth_year',
'gender',
'club',
]
success_url = '/boatmovers/'
class CrewCreateView(CreateView):
model = Crew
fields = [
'name',
'athletes'
]
success_url = '/boatmovers/'
class RaceCreateView(CreateView):
model = Race
fields = [
'name',
'resulturl',
'date',
'crew_size',
'gender',
#'resultlist',
]
success_url = '/boatmovers/'
class ResultCreateView(CreateView):
model = Result
fields = [
'crew',
'race',
'order'
]
success_url = '/boatmovers/'
def athlete_view(request,id=0):
athlete = get_object_or_404(Athlete, pk=id)
crews = athlete.athlete_crews
resultslist = []
for crew in crews.values():
c = Crew.objects.get(id=crew['id'])
results = Result.objects.filter(crew=c)
for result in results:
resultslist.append(result)
return render(request,
'athlete.html',
{
'athlete':athlete,
'results':resultslist,
})
def boatmovers_view(request):
athletes = Athlete.objects.filter(trueskill_exposed__gt=0,
dummy=False).order_by('-trueskill_exposed','-birth_year','last_name','first_name')
filter = request.GET.get('filter','all')
if filter == 'm':
athletes = athletes.exclude(gender='f')
elif filter == 'f':
athletes = athletes.exclude(gender='m')
races = Race.objects.filter(verified=True,processed=True).order_by('-date')
new_races = Race.objects.filter(processed=False).order_by('date')
return render(request,
'boatmovers.html',
{'athletes':athletes,
'races': races,
'new_races': new_races}
)
def race_view(request,id=0):
race = get_object_or_404(Race, pk=id)
results = race.results.all().order_by('order')
crews = []
athletes = []
for result in results:
crews.append(result.crew.id)
for athlete in result.crew.athletes.all():
athletes.append(athlete.id)
# duplicates
duplicate_athletes = [item for item, count in collections.Counter(athletes).items() if count>1]
duplicate_crews = [item for item, count in collections.Counter(crews).items() if count>1]
duplicate_athletes_crews = []
for athlete_id in duplicate_athletes:
athlete = Athlete.objects.get(id=athlete_id)
crews = [crew.id for crew in athlete.athlete_crews.all()]
for crew in crews:
duplicate_athletes_crews.append(crew)
return render(request,
'race.html',
{
'race':race,
'results':results,
'duplicate_athletes':duplicate_athletes,
'duplicate_crews':duplicate_crews,
'duplicate_athletes_crews':duplicate_athletes_crews
}
)
def race_verify(request, id=0):
race = get_object_or_404(Race, pk=id)
outcome = race.validate()
return HttpResponseRedirect(reverse('race_view',kwargs={'id':race.id}))
def handle_uploaded_file(f):
with open('media/results.csv', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
def race_add_csv(request, id=0):
race = get_object_or_404(Race, pk=id)
if race.verified or race.processed:
messages.error(request,"Cannot upload CSV file for processed or verified race")
url = reverse("race_view",kwargs={'id':id})
return HttpResponseRedirect(url)
form = CsvForm()
if request.method == 'POST':
form = CsvForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
if race.crew_size == 1:
bankjes = ['Slag']
elif race.crew_size == 2:
bankjes = ['Slag','Boeg']
elif race.crew_size == 4:
bankjes = ['Slag','2','3','Boeg']
elif race.crew_size == 8:
bankjes = ['Slag','2','3','4','5','6','7','Boeg']
csv_reader('media/results.csv',race.id,bankjes=bankjes,gender=race.gender)
url = reverse('race_view',kwargs={'id':race.id})
return HttpResponseRedirect(url)
return render(request,
'csvform.html',
{
'race':race,
'form':form,
})
def race_process(request, id=0):
race = get_object_or_404(Race, pk=id)
job = queue.enqueue(tasks.race_process,race.id)
#outcome = race.process()
messages.info(request,"Your race is being processed. Reload to get the new status.")
return HttpResponseRedirect(reverse('race_view',kwargs={'id':race.id}))
def crew_view(request, id=0):
crew = get_object_or_404(Crew, pk=id)
athletes = crew.athletes.all().order_by("-trueskill_exposed")
return render(request,
'crew.html',
{
'crew':crew,
'athletes':athletes
})