Ultron/objective/views.py

175 lines
5.0 KiB
Python
Raw Normal View History

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 .models import Skill, Routine
import simplejson
@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, 'objectives/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, "objectives/skills/details.html", context)
@login_required
@require_http_methods(["GET"])
def routine_listing(request):
"""
Récupère la liste des routines (série) suivant un pattern si celui-ci est définit.
"""
pattern = request.GET.get("pattern", None)
if pattern:
routine_list = Routine.objects.filter(
Q(longLabel__icontains=pattern) | Q(shortLabel__icontains=pattern)
)
else:
routine_list = Routine.objects.all()
context = {"routine_list": routine_list}
return render(request, "routine_list.html", context)
@login_required
@require_http_methods(["GET"])
def routine_lookup(request):
"""
Récupère la liste des lieux à la volée suivant des caractères de recherche entrés.
"""
pattern = request.GET.get("pattern", 0)
if pattern is not None and len(pattern) >= 3:
results = Routine.objects.filter(
Q(longLabel__icontains=pattern) | Q(shortLabel__icontains=pattern)
)
place_list = [{"id": x.id, "label": str(x)} for x in results]
json = simplejson.dumps(place_list)
return HttpResponse(json, content_type="application/json")
@login_required
def routine_details(request, routineid):
"""
Récupère toutes les informations d'une routine (série).
:param routineid: id d'une `routine`
:type routineid: int
:return: routineid
"""
routine = get_object_or_404(Routine, pk=routineid)
rank = 0
level = 0
difficulty = 0
age_boy = 0
age_girl = 0
is_competitive = True
for skill_link in routine.skill_links.all():
difficulty += skill_link.skill.difficulty
if skill_link.skill.level > level:
level = skill_link.skill.level
if skill_link.skill.rank > rank:
rank = skill_link.skill.rank + 1
if not skill_link.skill.is_competitive:
is_competitive = False
if skill_link.skill.age_boy is not None and skill_link.skill.age_boy > age_boy:
age_boy = skill_link.skill.age_boy
if skill_link.skill.age_girl is not None and skill_link.skill.age_girl > age_girl:
age_girl = skill_link.skill.age_girl
if routine.skill_links.all().count() != 10:
is_competitive = False
routine.difficulty = difficulty
if routine.level < level:
routine.level = level
if routine.rank is None or routine.rank < rank:
routine.rank = rank
if routine.age_boy is None or routine.age_boy < age_boy:
routine.age_boy = age_boy
if routine.age_girl is None or routine.age_girl < age_girl:
routine.age_girl = age_girl
routine.is_competitive = is_competitive
routine.save()
context = {"routine": routine, "skill_link_list": routine.skill_links.all()}
return render(request, "objectives/routines/details.html", context)