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 jumpers.models import Jumper from .models import Chrono, Skill from .forms import ChronoForm, LearnedSkillForm 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, "chronos/list.html", context) @login_required @require_http_methods(["GET", "POST"]) def chrono_create_or_update(request, chronoid=None, jumperid=None): """ Création ou modification d'un chrono """ if chronoid: chrono = get_object_or_404(Chrono, pk=chronoid) data = { "jumper": chrono.jumper.id, "jumper_related": str(chrono.jumper), } else: chrono = None data = None if request.method == "POST": form = ChronoForm(request.POST, instance=chrono) if form.is_valid(): # calculer ici le ToF # if form.score_type == 1: # form.tof = form.score # else: # form.tof = round(( form.score * 13 ) / 15, 3) # form.tof = ( form.tof * 1000 ) - (( form.tof * 1000 ) % 5) # form.tof = form.tof / 1000 form.save() if chronoid is not None: return HttpResponseRedirect("/chrono/") elif jumperid is not None: return HttpResponseRedirect( "/jumper/" + str(jumperid) ) else: return HttpResponseRedirect("/chrono/") else: if data is None and jumperid is not None: jumper = get_object_or_404(Jumper, pk=jumperid) data = {"jumper": jumperid, "jumper_related": jumper} form = ChronoForm(instance=chrono, initial=data) context = {"form": form, "chronoid": chronoid} return render(request, "chronos/create.html", context) @login_required @require_http_methods(["GET"]) def skill_lookup(request): """ Récupère la liste des skill à la volée suivant des caractères de recherche entrés. (min 3 caractères) """ results = [] pattern = request.GET.get("pattern", None) # Ignore queries shorter than length 3 if pattern is not None and len(pattern) > 3: model_results = Skill.objects.filter( Q(short_label__icontains=pattern) | Q(long_label__icontains=pattern) ) results = [{"ID": x.id, "Name": str(x)} for x in model_results] json = simplejson.dumps(results) return HttpResponse(json, content_type="application/json") @login_required @require_http_methods(["GET"]) def skill_listing(request, field=None, expression=None, value=None, level=None): """ Récupère la liste des skills suivant un pattern si celui-ci est définit. """ pattern = None if not field or not value or not expression: pattern = request.GET.get("pattern", None) if pattern: skill_list = Skill.objects.filter( Q(longLabel__icontains=pattern) | Q(shortLabel__icontains=pattern) ) elif field and expression and value: kwargs = {"{0}__{1}".format(field, expression): value} skill_list = Skill.objects.filter(**kwargs) elif level is not None: skill_list = Skill.objects.filter else: skill_list = Skill.objects.all() context = {'skill_list': skill_list} return render(request, 'skills/list.html', context) @login_required @require_http_methods(["GET"]) def skill_details(request, skillid): """ Récupère toutes les informations d'un skill. :param skillig: id d'un `skill` :type skillid: int :return: skill """ context = {"skill": get_object_or_404(Skill, pk=skillid)} return render(request, "skills/details.html", context) @login_required @require_http_methods(["GET", "POST"]) def learnedskill_create_or_update(request, jumperid=None): """ Formulaire de creation et modification d'un lien skill/gymnaste. """ if jumperid: jumper = get_object_or_404(Jumper, pk=jumperid) data = { "jumper": jumper.id, "jumper_related": str(jumper), } else: data = {} if request.method == "POST": learnedskill_form = LearnedSkillForm(request.POST) if learnedskill_form.is_valid(): learnedskill_form.save() return HttpResponseRedirect("/jumper/details/" + str(learnedskill_form.cleaned_data['jumper'].id)) else: print(learnedskill_form.errors) form = LearnedSkillForm(initial=data) context = {"form": form, "jumperid": jumperid} return render(request, "learnedskills/create.html", context)