Jarvis/jarvis/core/views.py

253 lines
8.5 KiB
Python

from datetime import timedelta
from django.db.models import Q
from django.shortcuts import render
from django.utils import timezone
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from django.template.loader import render_to_string
from django.urls import reverse
from jarvis.objective.models import Routine
from jarvis.profiles.models import Profile
from jarvis.followup.models import Skill, Point, Chrono
from jarvis.location.models import Place, Club
from jarvis.people.models import Gymnast
from jarvis.people.views import gymnast_details
from jarvis.planning.models import Event
from django.db.models import Max
from django.conf import settings
from .models import Citation
from jarvis.tools.models import from_date_to_week_number
from weasyprint import HTML, CSS
import pendulum
def login(request):
"""
Formulaire d'authentifictation.
"""
if request.method == "POST":
username = request.POST["login"]
password = request.POST["password"]
user = authenticate(username=username, password=password)
if user is not None: # Pq pas "if user:" ??
if user.is_active:
auth_login(request, user)
try:
profile = Profile.objects.get(user=user)
request.session["profileid"] = profile.id
request.session["template"] = profile.template_color
request.session["sidebar"] = profile.sidebar_color
request.session["is_sidebar_minified"] = profile.is_sidebar_minified
except Exception:
pass
# request.session["clubid"] = request.POST.get("clubid", None)
return HttpResponseRedirect(reverse("home"))
context = {"message": "Account disabled."}
else:
context = {"message": "Wrong login/password."}
else:
context = {}
return render(request, "login.html", context)
@login_required
@require_http_methods(["GET"])
def logout(request):
"""
Fonction de déconnexion
"""
auth_logout(request)
return HttpResponseRedirect(reverse("login"))
def next_birthdays(request, number_of_birthday):
"""
Renvoie la liste des `number_of_birthday` prochains anniversaires.
"""
birthday_list = sorted(
Gymnast.objects.all(), key=lambda t: t.next_birthday_in_days
)[:number_of_birthday]
return birthday_list
# @lru_cache()
# def get_last_updated_gymnasts(expiration_date):
# ...
@login_required
@require_http_methods(["GET"])
def home(request):
"""
Génère la page d'accueil du site basée sur la saison (si celle-ci est connue)
"""
event_list = Event.objects.filter(date_begin__gte=timezone.now()).order_by(
"date_begin"
)[:10]
quote = Citation.objects.order_by("?").first()
# print(quote)
# mettre tout ca en cache.
last_updated_gymnast = Gymnast.objects.filter(
Q(mindstate__created_at__gt=request.user.last_login)
| Q(points__created_at__gt=request.user.last_login)
| Q(chronos__created_at__gt=request.user.last_login)
| Q(accident__created_at__gt=request.user.last_login)
| Q(known_skills__created_at__gt=request.user.last_login)
).distinct()
limit_date = timezone.now() - timedelta(days=14)
waiting_update_gymnast = Gymnast.objects.exclude(
Q(is_active=False)
| Q(mindstate__created_at__gte=limit_date)
| Q(points__created_at__gte=limit_date)
| Q(chronos__created_at__gte=limit_date)
| Q(accident__created_at__gte=limit_date)
| Q(known_skills__created_at__gte=limit_date)
).distinct()
nb_active_gymnast = Gymnast.objects.filter(is_active=True).count()
nb_event = Event.objects.all().count()
nb_skill = Skill.objects.all().count()
nb_routine = Routine.objects.all().count()
nb_score = Point.objects.all().count()
nb_club = Club.objects.all().count()
# percentage_week = int(
# (get_number_of_weeks_between(datetime(2021, 9, 1), datetime.now()) / 52) * 100
# )
date_begin = pendulum.now().date()
season, week_number = from_date_to_week_number(date_begin)
percentage_week = (week_number / 52) * 100
birthday_list = next_birthdays(request, 10)
# check if gymnast have point
# ---------------------------
# 1. récupérer tous les évènements passés
# 2. pour chaque event, vérifier que tous les gymnastes renseignés
# dans les participants ont des points associés.
# S'il n'y a pas de point, faire une alerte à l'utilisateur qui se connecte.
# Check if gymnast have update
# -----------------------------
# lister tous les gymnastes qui n'ont pas eu d'update depuis... 2 semaines ?
# peut-être le paramètre (en jour) devrait être stocké en DB.
# S'il n'y a pas d'update, faire une alerte à l'utilisateur qui se connecte.
context = {
"quote": quote,
"event_list": event_list,
"last_updated_gymnast": last_updated_gymnast,
"waiting_update_gymnast": waiting_update_gymnast,
"nb_active_gymnast": nb_active_gymnast,
"nb_event": nb_event,
"nb_skill": nb_skill,
"nb_routine": nb_routine,
"nb_score": nb_score,
"nb_club": nb_club,
"percentage_week": percentage_week,
"birthday_list": birthday_list,
}
return render(request, "dashboard/dashboard.html", context)
@login_required
@require_http_methods(["GET"])
def search(request):
"""
Recherche globale au travers de toutes les applications.
"""
pattern = request.GET.get("pattern", None)
if pattern:
gymnast_list = Gymnast.objects.filter(
Q(last_name__icontains=pattern) | Q(first_name__icontains=pattern)
)
if gymnast_list.count() == 1:
gymnast = gymnast_list.first()
return gymnast_details(request, gymnast.id)
else:
skill_list = Skill.objects.filter(
Q(long_label__icontains=pattern) | Q(short_label__icontains=pattern)
)
event_list = Event.objects.filter(
Q(name__icontains=pattern) | Q(place__name__icontains=pattern)
)
place_list = Place.objects.filter(
Q(name__icontains=pattern) | Q(city__icontains=pattern)
)
club_list = Club.objects.filter(
Q(name__icontains=pattern)
| Q(place__name__icontains=pattern)
| Q(place__city__icontains=pattern)
)
context = {
"gymnast_list": gymnast_list,
"skill_list": skill_list,
"event_list": event_list,
"place_list": place_list,
"club_list": club_list,
"pattern": pattern,
}
else:
context = {}
return render(request, "search/results.html", context)
def generate_best_straightjump_listing(request):
""" """
date_begin = pendulum.now().date()
season, week_number = from_date_to_week_number(date_begin)
records_list = (
Chrono.objects.values("gymnast__last_name", "gymnast__first_name")
.annotate(score=Max("score"))
.order_by("-score") # [:16]
)
context = {
"SITE_TITLE": settings.SITE_TITLE,
"CLUB_NAME": settings.CLUB_NAME,
"ADDRESS": settings.ADDRESS,
"CITY": settings.CITY,
"ZIP": settings.ZIP,
"HEAD_COACH": settings.HEAD_COACH,
"MOBILE_PHONE": settings.MOBILE_PHONE,
"HEAD_COACH_EMAIL": settings.HEAD_COACH_EMAIL,
"week_number": week_number,
"today": date_begin,
"records_list": records_list,
}
# return render(request, "core/records_10.html", context)
response = HttpResponse(content_type="application/pdf")
response["Content-Disposition"] = "attachment; filename=report-top_straightjump.pdf"
html = render_to_string("jarvis/core/records_10.html", context)
# font_config = FontConfiguration()
HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(
response,
stylesheets=[
CSS(settings.STATICFILES_DIRS[0] + "/css/gymnast_report.css"),
CSS(settings.STATICFILES_DIRS[0] + "/css/black-dashboard_report.css"),
CSS(settings.STATICFILES_DIRS[0] + "/css/font_awesome_all_5.15.3.css"),
],
) # , font_config=font_config)
return response