from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_http_methods from django.http import HttpResponse, HttpResponseRedirect from django.db.models import Q from people.models import Gymnast from planning.models import Event from .models import Chrono, MindState, Point, Accident from .forms import ChronoForm, LearnedSkillForm, ScoreForm, AccidentForm, MindStateForm import simplejson @login_required @require_http_methods(["GET"]) def chrono_listing(request): """ Récupère la liste des chronos """ chrono_list = Chrono.objects.all() context = {'chrono_list': chrono_list} return render(request, "followup/chronos/list.html", context) @login_required @require_http_methods(["GET", "POST"]) def chrono_create_or_update(request, chronoid=None, gymnastid=None): """ Création ou modification d'un chrono """ if chronoid: chrono = get_object_or_404(Chrono, pk=chronoid) data = { "gymnast": chrono.gymnast.id, "gymnast_related": str(chrono.gymnast), } else: chrono = None data = None if request.method == "POST": form = ChronoForm(request.POST, instance=chrono) if form.is_valid(): new_chrono = form.save(commit=False) # Calcul du ToF if new_chrono.score_type == 1: new_chrono.tof = new_chrono.score else: tof = round(( new_chrono.score * 13 ) / 15, 3) * 1000 tof = tof - (tof % 5) new_chrono.tof = tof / 1000 new_chrono.save() return HttpResponseRedirect("/gymnast/details/" + str(new_chrono.gymnast.id) + "/") else: if data is None and gymnastid is not None: gymnast = get_object_or_404(Gymnast, pk=gymnastid) data = {"gymnast": gymnastid, "gymnast_related": gymnast} form = ChronoForm(instance=chrono, initial=data) context = {"form": form, "chronoid": chronoid} return render(request, "followup/chronos/create.html", context) @login_required @require_http_methods(["GET", "POST"]) def learnedskill_create_or_update(request, gymnastid=None): """ Formulaire de creation et modification d'un lien skill/gymnaste. """ if gymnastid: gymnast = get_object_or_404(Gymnast, pk=gymnastid) data = { "gymnast": gymnast.id, "gymnast_related": str(gymnast), } else: data = {} if request.method == "POST": learnedskill_form = LearnedSkillForm(request.POST) if learnedskill_form.is_valid(): learnedskill_form.save() return HttpResponseRedirect("/gymnast/details/" + str(learnedskill_form.cleaned_data['gymnast'].id)) else: print(learnedskill_form.errors) form = LearnedSkillForm(initial=data) context = {"form": form, "gymnastid": gymnastid} return render(request, "followup/learnedskills/create.html", context) @login_required @require_http_methods(["GET", "POST"]) def score_create_or_update(request, scoreid=None, gymnastid=None): """ Formulaire de création d'un nouveau score. """ if scoreid: score = get_object_or_404(Point, pk=scoreid) data = { "gymnast_related": str(score.gymnast), "event_related": str(score.event), } else: score = None data = {} if gymnastid is not None: gymnast = get_object_or_404(Gymnast, pk=gymnastid) data["gymnast"] = gymnastid data["gymnast_related"] = str(gymnast) if request.method == "POST": form = ScoreForm(request.POST, instance=score) if form.is_valid(): # print(form.cleaned_data) form.save() return HttpResponseRedirect( # "/gymnast/" + str(form.cleaned_data["gymnast"].id) + "/tab/scores/" "/gymnast/details/" + str(form.cleaned_data["gymnast"].id) + "/" ) # return HttpResponseRedirect("/score/") else: print(form.errors) else: form = ScoreForm(instance=score, initial=data) context = {"form": form, "scoreid": scoreid} return render(request, "followup/scores/create.html", context) @login_required @require_http_methods(["GET"]) def score_listing(request): """ Revoie la liste des scores """ pattern = request.GET.get("pattern", None) if pattern: score_list = Point.objects.filter( Q(event__icontains=pattern) | Q(gymnast__icontains=pattern) ) else: score_list = Point.objects.all() context = {"score_list": score_list} return render(request, "followup/scores/list.html", context) @login_required @require_http_methods(["GET"]) def accident_listing(request): """ Récupère la liste des accidents suivant un pattern si celui-ci est définit. """ pattern = request.GET.get("pattern", None) if pattern: accident_list = Accident.objects.filter( Q(gymnast__lastname__icontains=pattern) | Q(gymnast__firstname__icontains=pattern) ) else: accident_list = Accident.objects.all() context = {"accident_list": accident_list} return render(request, "followup/accidents/list.html", context) @login_required @require_http_methods(["GET", "POST"]) def accident_create_or_update(request, accidentid=None): """ Formulaire de création d'un nouvel accident. """ if accidentid: accident = get_object_or_404(Accident, pk=accidentid) data = { "gymnast_related": accident.gymnast, "skill_related": accident.skill, } else: accident = None data = {} if request.method == "POST": form = AccidentForm(request.POST, instance=accident) if form.is_valid(): form.save() if accidentid: return HttpResponseRedirect("/accident/" + str(accidentid) + "/") else: return HttpResponseRedirect("/accident/") else: form = AccidentForm(instance=accident, initial=data) context = {"form": form, "accidentid": accidentid} return render(request, "followup/accidents/create.html", context) @login_required @require_http_methods(["GET"]) def accident_detail(request, accidentid): """ Récupère toutes les informations d'un accident. """ accident = get_object_or_404(Accident, pk=accidentid) context = {"accident": accident} return render(request, "followup/accidents/details.html", context) @login_required @require_http_methods(["GET"]) def mindstate_listing(request, gymnastid=None): """ Récupère la liste des evaluations mentales suivant (d'un gymnast si définit en paramètre). """ if gymnastid: mindstate_list = MindState.objects.filter(gymnast=gymnastid) else: mindstate_list = MindState.objects.all() context = {"mindstate_list": mindstate_list} return render(request, "followup/mindstates/list.html", context) @login_required @require_http_methods(["GET", "POST"]) def mindstate_create_or_update(request, mindstateid=None, gymnastid=None, eventid=None): """ Formulaire de création d'un nouvel accident. """ if mindstateid: mindstate = get_object_or_404(MindState, pk=mindstateid) data = { "gymnast_related": mindstate.gymnast, "event_related": mindstate.event } else: mindstate = None data = {} if gymnastid is not None: gymnast = get_object_or_404(Gymnast, pk=gymnastid) data['gymnast'] = gymnastid data['gymnast_related'] = str(gymnast) if eventid is not None: event = get_object_or_404(Event, pk=eventid) data['event'] = eventid data['event_related'] = str(event) if request.method == "POST": form = MindStateForm(request.POST, instance=mindstate) if form.is_valid(): form.save() if mindstateid: return HttpResponseRedirect("/mindstate/" + str(mindstateid) + "/") else: return HttpResponseRedirect("/mindstate/") else: form = MindStateForm(instance=mindstate, initial=data) context = {"form": form, "mindstateid": mindstateid} return render(request, "followup/mindstates/create.html", context) @login_required @require_http_methods(["GET"]) def mindstate_detail(request, mindstateid): """ Récupère toutes les informations d'une évaluation psychologique. """ mindstate = get_object_or_404(MindState, pk=mindstateid) context = {"mindstate": mindstate} return render(request, "followup/mindstates/details.html", context)