Ultron/ultron/core/views.py

183 lines
6.2 KiB
Python
Raw Normal View History

from datetime import datetime, timedelta
2021-12-09 16:17:38 +01:00
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 HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
2022-02-01 11:08:02 +01:00
from django.urls import reverse
2021-12-09 16:51:54 +01:00
from ultron.objective.models import Routine
from ultron.profiles.models import Profile
2022-01-07 18:08:39 +01:00
from ultron.followup.models import Skill, Point
2021-12-09 16:51:54 +01:00
from ultron.location.models import Place, Club
from ultron.people.models import Gymnast
from ultron.planning.models import Event
from ultron.tools.models import get_number_of_weeks_between
2021-12-09 16:17:38 +01:00
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)
2022-02-01 11:08:02 +01:00
return HttpResponseRedirect(reverse("home"))
2022-01-07 18:08:39 +01:00
context = {"message": "Account disabled."}
2021-12-09 16:17:38 +01:00
else:
context = {"message": "Wrong login/password."}
else:
context = {}
return render(request, "ultron/login.html", context)
@login_required
@require_http_methods(["GET"])
def logout(request):
"""
Fonction de déconnexion
"""
auth_logout(request)
2022-02-01 11:08:02 +01:00
return HttpResponseRedirect(reverse("login"))
2021-12-09 16:17:38 +01:00
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
@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"
2022-02-03 12:08:12 +01:00
)[:10]
2021-12-09 16:17:38 +01:00
last_updated_gymnast = Gymnast.objects.filter(
2021-12-19 09:32:45 +01:00
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)
2021-12-09 16:17:38 +01:00
).distinct()
limit_date = timezone.now() - timedelta(days=14)
2022-01-09 19:29:51 +01:00
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()
2021-12-20 10:08:04 +01:00
nb_active_gymnast = Gymnast.objects.filter(is_active=True).count()
2021-12-09 16:17:38 +01:00
nb_event = Event.objects.all().count()
nb_skill = Skill.objects.all().count()
nb_routine = Routine.objects.all().count()
nb_score = Point.objects.all().count()
2021-12-20 10:08:04 +01:00
nb_club = Club.objects.all().count()
2021-12-19 09:32:45 +01:00
percentage_week = int(
(get_number_of_weeks_between(datetime(2021, 9, 1), datetime.now()) / 52) * 100
)
2021-12-09 16:17:38 +01:00
2022-02-03 12:08:12 +01:00
birthday_list = next_birthdays(request, 10)
2021-12-09 16:17:38 +01:00
2021-12-13 09:02:35 +01:00
# check if gymnast have point
# ---------------------------
# 1. récupérer tous les évènements passés
2022-01-07 18:08:39 +01:00
# 2. pour chaque event, vérifier que tous les gymnastes renseignés
# dans les participants ont des points associés.
2021-12-13 09:02:35 +01:00
# 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.
2021-12-09 16:17:38 +01:00
context = {
2021-12-19 09:32:45 +01:00
"event_list": event_list,
"last_updated_gymnast": last_updated_gymnast,
"waiting_update_gymnast": waiting_update_gymnast,
2021-12-20 10:08:04 +01:00
"nb_active_gymnast": nb_active_gymnast,
2021-12-19 09:32:45 +01:00
"nb_event": nb_event,
"nb_skill": nb_skill,
"nb_routine": nb_routine,
"nb_score": nb_score,
2021-12-20 10:08:04 +01:00
"nb_club": nb_club,
2021-12-19 09:32:45 +01:00
"percentage_week": percentage_week,
"birthday_list": birthday_list,
2021-12-09 16:17:38 +01:00
}
return render(request, "ultron/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)
)
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(
2021-12-19 09:32:45 +01:00
Q(name__icontains=pattern)
| Q(place__name__icontains=pattern)
| Q(place__city__icontains=pattern)
2021-12-09 16:17:38 +01:00
)
context = {
2021-12-19 09:32:45 +01:00
"gymnast_list": gymnast_list,
"skill_list": skill_list,
"event_list": event_list,
"place_list": place_list,
"club_list": club_list,
"pattern": pattern,
2021-12-09 16:17:38 +01:00
}
else:
context = {}
return render(request, "ultron/search/results.html", context)