Improve right management

This commit is contained in:
Gregory Trullemans 2024-02-11 09:25:20 +01:00
parent 2a462b0112
commit 872fc873cb
24 changed files with 272 additions and 117 deletions

View File

@ -115,7 +115,7 @@
<table class="table table-striped table-condensed mb-0" data-sort="table" id="gymnast_table">
{% for gymnast in waiting_update_gymnast %}
<tr>
<td class="text-left"><a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast }}</a></td>
<td class="text-left">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast }}</a></td>
<td class="text-right">{{ gymnast.club.acronym }}</td>
</tr>
{% endfor %}
@ -137,7 +137,7 @@
<table class="table tablesorter table-striped table-condensed" data-sort="table" id="gymnast_table">
{% for gymnast in last_updated_gymnasts %}
<tr>
<td class="text-left"><a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast }}</a></td>
<td class="text-left">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast }}</a></td>
<td class="text-right">{{ gymnast.club.acronym }}</td>
</tr>
{% endfor %}
@ -159,7 +159,7 @@
<table class="table table-striped table-condensed mb-0" data-sort="table" id="gymnast_table">
{% for gymnast in birthday_list %}
<tr>
<td class="text-left"><a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast.first_name }}</a></td>
<td class="text-left">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast.first_name }}</a></td>
<td class="">{{ gymnast.birthdate | date:"j M"}}</td>
<td class="text-right">{{ gymnast.next_age }} years</td>
</tr>

View File

@ -26,10 +26,10 @@
{% for gymnast in gymnast_list %}
<tr role="row" class="{% cycle 'odd' 'even' %}">
<td class="text-left">
<a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast.first_name }}</a>
{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast.first_name }}</a>
</td>
<td class="text-left">
<a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast.last_name }}</a>
{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast.last_name }}</a>
</td>
<td class="text-left">{{ gymnast.get_gender_display }}</td>
<td class="text-left">{{ gymnast.age }}</td>

View File

@ -51,6 +51,19 @@ def login(request):
request.session["is_sidebar_minified"] = profile.is_sidebar_minified
except Exception:
pass
try:
available_gymnast = []
gymnast_list = user.gymnasts.all()
for gymnast in gymnast_list:
available_gymnast.append(gymnast.id)
if user.gymnast:
available_gymnast.append(user.gymnast.id)
request.session["available_gymnast"] = available_gymnast
except Exception:
pass
# request.session["clubid"] = request.POST.get("clubid", None)
return HttpResponseRedirect(reverse("home"))
@ -196,7 +209,6 @@ def search(request):
if pattern:
name = clean_name(pattern)
print(name)
gymnast_list = Gymnast.objects.filter(
Q(cleaned_last_name__icontains=name) | Q(cleaned_first_name__icontains=name)
)

View File

@ -739,19 +739,13 @@ class Intensity(Markdownizable, Seasonisable):
(90 + pow(100, 1 / self.number_of_gymnast)) * self.number_of_gymnast
) / 60
print(self.mean_time_by_passe)
print(average_passe_time)
if self.mean_time_by_passe <= average_passe_time:
print("1")
return 1
if self.mean_time_by_passe <= (average_passe_time * 1.05):
print("2")
return 2
if self.mean_time_by_passe >= (average_passe_time * 1.05):
print("3")
return 3
# Human readeable scores

View File

@ -53,7 +53,7 @@
<td>{% if chrono.details.all %}<a href="{% url 'jump_chrono_details' chrono.id %}">{% endif %}{{ chrono.date | date:"j-n-Y" }}{% if chrono.details.all %}</a>{% endif %}</td>
{% if not gymnast %}
<td class="text-left">
<a href="{% url 'gymnast_details_tab' chrono.gymnast.id 'scores' %}">
{% if chrono.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' chrono.gymnast.id 'scores' %}">{% endif %}
{{ chrono.gymnast }}
</a>
</td>

View File

@ -47,7 +47,7 @@
</td>
<td class="text-left">{{ heightweight.date | date:"j-n-Y" }}</td>
{% if not gymnast %}
<td class="text-left"><a href="{% url 'gymnast_details' heightweight.gymnast.id %}">{{ heightweight.gymnast }}</a></td>
<td class="text-left">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' heightweight.gymnast.id %}">{% endif %}{{ heightweight.gymnast }}</a></td>
{% endif %}
<td class="text-right">{{ heightweight.height }}</td>
<td class="text-right">{% if heightweight.hips_height == None %}-{% else %}{{ heightweight.hips_height }}{% endif %}</td>

View File

@ -43,7 +43,7 @@
</a>
</td>
<td class="text-left"><a href="{% url 'injury_details' injury.id %}">{{ injury.date | date:"j-n-Y" }}</a></td>
<td class="text-left"><a href="{% url 'gymnast_details_tab' injury.gymnast.id 'physiological' %}">{{ injury.gymnast }}</a></td>
<td class="text-left">{% if injury.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' injury.gymnast.id 'physiological' %}">{% endif %}{{ injury.gymnast }}</a></td>
<td class="text-left">{{ injury.get_mechanism_display }}</td>
<td class="text-left">{{ injury.get_location_display }}</td>
<td class="text-left">{{ injury.get_body_side_display }}</td>

View File

@ -56,7 +56,7 @@
<td><a href="{% url 'intensity_details' intensity.id %}">{{ intensity.date | date:"d-m-Y" }}</a></td>
{% if not gymnast %}
<td class="text-left">
<a href="{% url 'gymnast_details_tab' intensity.gymnast.id 'routine' %}">
{% if intensity.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' intensity.gymnast.id 'routine' %}">{% endif %}
{{ intensity.gymnast }}
</a>
</td>

View File

@ -40,8 +40,7 @@
<td>
<a href="{% url 'note_details' note.id %}">{{ note.created_at | date:"d-m-Y" }}</a>
</td>
<td class="text-left"><a href="{% url 'gymnast_details' note.gymnast.id %}">{{ note.gymnast
}}</a></td>
<td class="text-left">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' note.gymnast.id %}">{% endif %}{{ note.gymnast}}</a></td>
<td class="text-left">{{ note.coach }}</td>
</tr>
{% endfor %}

View File

@ -52,7 +52,7 @@
</a>
</td>
{% if not gymnast %}
<td><a href="{% url 'gymnast_details' score.gymnast.id %}">{{ score.gymnast }}</a></td>
<td>{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' score.gymnast.id %}">{% endif %}{{ score.gymnast }}</a></td>
{% endif %}
<td><a href="{% url 'event_details' score.event.id %}">{{ score.event.name }}</a></td>
<td>{{ score.event.date_begin | date:"j-n-Y" }}</td>

View File

@ -8,7 +8,7 @@
<div class="card-header row">
<div class="col-8">
<h4 class="">
{% if gymnast %}<i><a href="{% url 'gymnast_details' gymnast.id %}"><i>{{ gymnast }}</i></a>'s{% endif %} Season informations listing
{% if gymnast %}<i>{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}<i>{{ gymnast }}</i></a>'s{% endif %} Season informations listing
</h4>
</div>
<div class="col-1 ml-auto">
@ -47,7 +47,7 @@
<span class="tim-icons icon-pencil text-warning"></span>
</a>
</td>
<td><a href="{% url 'gymnast_details' season_information.gymnast.id %}">{{ season_information.gymnast }}</a></td>
<td>{% if season_information.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' season_information.gymnast.id %}">{% endif %}{{ season_information.gymnast }}</a></td>
<td>{{ season_information.season }}</td>
<td>{{ season_information.number_of_training_sessions_per_week }}</td>
<td>{{ season_information.number_of_hours_per_week }}</td>

View File

@ -8,7 +8,7 @@
<div class="card-header row">
<div class="col-10 pr-0">
<h4 class="">
{% if gymnast %}<i><a href="{% url 'gymnast_details_tab' gymnast.id 'physiological' %}"><i>{{ gymnast }}</i></a>'s {% endif %} Well being list
{% if gymnast %}<i>{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' gymnast.id 'physiological' %}"><i>{% endif %}{{ gymnast }}</i></a>'s {% endif %} Well being list
</h4>
</div>
<div class="col-2 ml-auto pl-0">
@ -49,11 +49,11 @@
</a>
</td>
<td class="text-left">
<a href="{% url 'wellbeing_details' wellbeing.id %}">{{ wellbeing.date | date:"j-n-Y" }}</a>
{% if wellbeing.gymnast.id in request.session.available_gymnast %}<a href="{% url 'wellbeing_details' wellbeing.id %}">{% endif %}{{ wellbeing.date | date:"j-n-Y" }}</a>
</td>
{% if not gymnast %}
<td class="text-left">
<a href="{% url 'gymnast_details_tab' wellbeing.gymnast.id 'physiological' %}">
{% if wellbeing.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' wellbeing.gymnast.id 'physiological' %}">{% endif %}
{{ wellbeing.gymnast }}
</a>
</td>

View File

@ -171,7 +171,7 @@ urlpatterns = [
views.injury_create_or_update,
name="injury_update",
),
path(r"injury/<int:injury_id>/", views.injury_detail, name="injury_details"),
path(r"injury/<int:injury_id>/", views.injury_details, name="injury_details"),
#
#
# WELLBEING
@ -194,7 +194,7 @@ urlpatterns = [
),
path(
r"wellbeing/<int:wellbeing_id>/",
views.wellbeing_detail,
views.wellbeing_details,
name="wellbeing_details",
),
#

View File

@ -130,6 +130,10 @@ def jump_chrono_details(request, chrono_id):
"""
chrono = get_object_or_404(Chrono, pk=chrono_id)
if chrono.gymnast.id not in request.session["available_gymnast"]:
return chrono_listing(request)
sum_value = chrono.details.all().aggregate(total=Sum("value"))
if chrono.score != sum_value["total"]:
@ -443,26 +447,23 @@ def average_jump_chrono_details_for_season_and_week(
@require_http_methods(["GET"])
def chrono_listing(request, gymnast_id=None):
"""
Si la personne connectée est un entraîneur, la fonction récupère la liste des chronos d'un
gymnaste précis ou de tout le monde.
Si la personne connectée est un gymnaste, la fonction récupère la liste de ses chronos.
Récupère les chronos des gymnastes autorisé(e)s.
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
gymnast = None
if request.user.groups.filter(name="trainer").exists():
if gymnast_id:
chrono_list = Chrono.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
chrono_list = Chrono.objects.all()
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
chrono_list = Chrono.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
chrono_list = Chrono.objects.filter(
Q(gymnast__last_name=request.user.last_name)
& Q(gymnast__first_name=request.user.first_name)
)
if request.user.is_superuser:
chrono_list = Chrono.objects.all()
else:
chrono_list = Chrono.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"chrono_list": chrono_list, "gymnast": gymnast}
return render(request, "chronos/list.html", context)
@ -472,27 +473,23 @@ def chrono_listing(request, gymnast_id=None):
@require_http_methods(["GET"])
def note_listing(request, gymnast_id=None):
"""
Si la personne connectée est un entraîneur, la fonction récupère la liste des notes d'un
gymnaste précis ou de tout le monde.
Si la personne connectée est un gymnaste, la fonction récupère la liste de ses notes à
lui/elle.
Récupère les notes des gymnastes autorisé(e)s
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
gymnast = None
if request.user.groups.filter(name="trainer").exists():
if gymnast_id:
note_list = Note.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
note_list = Note.objects.all()
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
note_list = Note.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
note_list = Note.objects.filter(
Q(gymnast__last_name=request.user.last_name)
& Q(gymnast__first_name=request.user.first_name)
)
if request.user.is_superuser:
note_list = Note.objects.all()
else:
note_list = Note.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"note_list": note_list, "gymnast": gymnast}
return render(request, "notes/list.html", context)
@ -502,12 +499,17 @@ def note_listing(request, gymnast_id=None):
@require_http_methods(["GET"])
def note_details(request, note_id):
"""
Récupère toutes les informations d'un note.
Récupère toutes les informations d'un note et vérifie si le demandeur peut avoir accès à la
note. S'il ne peut pas il est redirigé vers le listing des notes.
Args:
note_id (int) identifiant d'une note
"""
note = get_object_or_404(Note, pk=note_id)
if note.gymnast.id not in request.session["available_gymnast"]:
return note_listing(request)
return render(request, "notes/details.html", {"note": note})
@ -846,18 +848,24 @@ def score_listing(request, gymnast_id=None):
gymnast_id (int) identifiant d'un gymnaste
"""
pattern = request.GET.get("pattern", None)
# pattern = request.GET.get("pattern", None)
# JE NE SAIS PLUS POURQUOI JE GERE UN PATTERN -> code commenté.
# if pattern:
# score_list = Point.objects.filter(
# Q(event__icontains=pattern) | Q(gymnast__icontains=pattern)
# )
# el
gymnast = None
if pattern:
score_list = Point.objects.filter(
Q(event__icontains=pattern) | Q(gymnast__icontains=pattern)
)
elif gymnast_id:
score_list = Point.objects.filter(gymnast=gymnast_id)
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
score_list = Point.objects.filter(gymnast=gymnast_id)
else:
score_list = Point.objects.all()
if request.user.is_superuser:
score_list = Point.objects.all()
else:
score_list = Point.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"score_list": score_list, "gymnast": gymnast}
return render(request, "scores/list.html", context)
@ -865,7 +873,7 @@ def score_listing(request, gymnast_id=None):
@login_required
@require_http_methods(["GET"])
def injuries_listing(request):
def injuries_listing(request, gymnast_id=None):
"""
Récupère la liste des bessures.
Si c'est un gymnaste qui est connecté, il ne peut récupérer que la liste de ses blessures.
@ -873,20 +881,17 @@ def injuries_listing(request):
définit.
"""
if request.user.groups.filter(name="trainer").exists():
pattern = request.GET.get("pattern", None)
if pattern:
injuries_list = Injury.objects.filter(
Q(gymnast__last_name__icontains=pattern)
| Q(gymnast__first_name__icontains=pattern)
)
else:
injuries_list = Injury.objects.all()
gymnast = None
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
injury_list = Injury.objects.filter(gymnast=gymnast_id)
else:
injuries_list = Injury.objects.filter(
Q(gymnast__last_name=request.user.last_name)
& Q(gymnast__first_name=request.user.first_name)
)
if request.user_is_superuser:
injuries_list = Injury.objects.all()
else:
injuries_list = Injury.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"injuries_list": injuries_list}
return render(request, "injuries/list.html", context)
@ -962,7 +967,7 @@ def injury_create_or_update(request, injury_id=None, gymnast_id=None):
@login_required
@require_http_methods(["GET"])
def injury_detail(request, injury_id):
def injury_details(request, injury_id):
"""
Récupère toutes les informations d'une blessure.
@ -970,6 +975,10 @@ def injury_detail(request, injury_id):
injury_id (int) identifiant d'une blessure
"""
injury = get_object_or_404(Injury, pk=injury_id)
if injury.gymnast.id not in request.session["available_gymnast"]:
return injuries_listing(request)
return render(request, "injuries/details.html", {"injury": injury})
@ -977,17 +986,26 @@ def injury_detail(request, injury_id):
@require_http_methods(["GET"])
def wellbeing_listing(request, gymnast_id=None):
"""
Récupère la liste des évaluations mentales suivant (d'un gymnaste si définit en paramètre).
Récupère la liste des évaluations de bien-être.
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
gymnast = None
if gymnast_id:
wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id)
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
# wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id)
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
wellbeing_list = gymnast.wellbeings.all()
else:
wellbeing_list = WellBeing.objects.all()
if request.user.is_superuser:
# les super user peuvent voir tout le monde.
wellbeing_list = WellBeing.objects.all()
else:
# les autres entraîneurs ne peuvent voir que certains élèves.
wellbeing_list = WellBeing.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"wellbeing_list": wellbeing_list, "gymnast": gymnast}
return render(request, "wellbeing/list.html", context)
@ -1070,7 +1088,7 @@ def wellbeing_create_or_update(
@login_required
@require_http_methods(["GET"])
def wellbeing_detail(request, wellbeing_id):
def wellbeing_details(request, wellbeing_id):
"""
Récupère toutes les informations d'une évaluation psychologique.
@ -1078,6 +1096,10 @@ def wellbeing_detail(request, wellbeing_id):
wellbeing_id (int) identifiant d'une évaluation psycho
"""
wellbeing = get_object_or_404(WellBeing, pk=wellbeing_id)
if wellbeing.gymnast.id not in request.session["available_gymnast"]:
return wellbeing_listing(request)
return render(request, "wellbeing/details.html", {"wellbeing": wellbeing})
@ -1090,12 +1112,18 @@ def heightweight_listing(request, gymnast_id=None):
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
gymnast = None
if gymnast_id:
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
heightweight_list = HeightWeight.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
heightweight_list = HeightWeight.objects.all()
if request.user.is_superuser:
heightweight_list = HeightWeight.objects.all()
else:
heightweight_list = HeightWeight.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"heightweight_list": heightweight_list, "gymnast": gymnast}
return render(request, "heightweight/list.html", context)
@ -1189,12 +1217,18 @@ def routine_done_listing(request, gymnast_id=None):
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
if gymnast_id:
gymnast = None
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
routine_done_list = gymnast.number_of_routine_done.all()
else:
gymnast = None
routine_done_list = NumberOfRoutineDone.objects.all()
if request.user.is_superuser:
routine_done_list = NumberOfRoutineDone.objects.all()
else:
routine_done_list = NumberOfRoutineDone.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"routine_done_list": routine_done_list, "gymnast": gymnast}
return render(request, "routinedone/list.html", context)
@ -1403,6 +1437,10 @@ def intensity_details(request, intensity_id):
intensity_id (int) identifiant d'une intensité
"""
intensity = get_object_or_404(Intensity, pk=intensity_id)
if intensity.gymnast.id not in request.session["available_gymnast"]:
return intensity_listing(request)
return render(request, "intensities/details.html", {"intensity": intensity})
@ -1412,25 +1450,23 @@ def intensity_listing(request, gymnast_id=None):
"""
Si la personne connectée est un entraîneur, la fonction récupère la liste des intensités d'un
gymnaste précis ou de tout le monde.
Si la personne connectée est un gymnaste, la fonction récupère la liste de ses intensités à
lui/elle.
Si la personne connectée est un gymnaste, la fonction récupère la liste de ses intensités.
Args:
gymnast_id (int) identifiant d'un gymnaste
"""
gymnast = None
if request.user.groups.filter(name="trainer").exists():
if gymnast_id:
intensity_list = Intensity.objects.filter(gymnast=gymnast_id)
gymnast = Gymnast.objects.get(pk=gymnast_id)
else:
intensity_list = Intensity.objects.all()
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
intensity_list = Intensity.objects.filter(gymnast=gymnast_id)
else:
intensity_list = Intensity.objects.filter(
Q(gymnast__last_name=request.user.last_name)
& Q(gymnast__first_name=request.user.first_name)
)
if request.user.is_superuser:
intensity_list = Intensity.objects.all()
else:
intensity_list = Intensity.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"intensity_list": intensity_list, "gymnast": gymnast}
return render(request, "intensities/list.html", context)
@ -1613,11 +1649,16 @@ def season_information_listing(request, gymnast_id=None):
gymnast_id (int) identifiant d'un gymnaste
"""
if gymnast_id is not None:
gymnast = Gymnast.objects.get(pk=gymnast_id)
if gymnast_id and gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
season_information_list = SeasonInformation.objects.filter(gymnast=gymnast_id)
else:
season_information_list = SeasonInformation.objects.all()
if request.user.is_superuser:
season_information_list = SeasonInformation.objects.all()
else:
season_information_list = SeasonInformation.objects.filter(
gymnast__in=request.session["available_gymnast"]
)
context = {"season_information_list": season_information_list, "gymnast": gymnast}
return render(request, "seasoninformations/list.html", context)

View File

@ -53,7 +53,7 @@ def country_lookup(request):
"""
country_list = []
pattern = request.POST.get("pattern", None)
print(pattern)
if pattern is not None and len(pattern) >= 3:
results = Country.objects.filter(
Q(name__icontains=pattern) | Q(nationality__icontains=pattern)

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2 on 2024-02-10 13:11
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("profiles", "0003_trainergymnast"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
(
"people",
"0010_gymnast_cleaned_first_name_gymnast_cleaned_last_name_and_more",
),
]
operations = [
migrations.AddField(
model_name="gymnast",
name="trainers",
field=models.ManyToManyField(
related_name="gymnasts",
through="profiles.TrainerGymnast",
to=settings.AUTH_USER_MODEL,
),
),
]

View File

@ -7,6 +7,8 @@ from django.db import models
import pendulum
from jarvis.objective.models import Skill
# from jarvis.profiles.models import TrainerGymnast
from jarvis.tools.models import Markdownizable
from jarvis.objective.tools import (
nb_skill_by_type,
@ -55,6 +57,12 @@ class Gymnast(Markdownizable):
max_length=254, null=True, blank=True, verbose_name="Trainer's email"
)
created_at = models.DateTimeField(auto_now_add=True)
trainers = models.ManyToManyField(
User,
through="profiles.TrainerGymnast",
through_fields=("gymnast", "user"),
related_name="gymnasts",
)
def save(self, *args, **kwargs):
"""Sauve les informations de la personne et initialise les champs nettoyés."""

View File

@ -48,8 +48,8 @@
</a>
</td>
{% endif %}
<td class="text-left"><a href="{% url 'gymnast_details' season_information.gymnast.id %}">{{ season_information.gymnast.last_name }}</a></td>
<td class="text-left"><a href="{% url 'gymnast_details' season_information.gymnast.id %}">{{ season_information.gymnast.first_name }}</a></td>
<td class="text-left">{% if season_information.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' season_information.gymnast.id %}">{% endif %}{{ season_information.gymnast.last_name }}</a></td>
<td class="text-left">{% if season_information.gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' season_information.gymnast.id %}">{% endif %}{{ season_information.gymnast.first_name }}</a></td>
<td class="text-left">{{ season_information.gymnast.get_gender_display }}</td>
<td class="text-left">{{ season_information.gymnast.age }}</td>
<td class="text-left">{{ season_information.get_category_display }}</td>

View File

@ -5,7 +5,7 @@
{% block content %}
<div class="card mb-0">
<div class="card-header">
<h3 class="mb-0"><a href="{% url 'gymnast_details' gymnast.id %}">{{ gymnast }}</a></h3>
<h3 class="mb-0">{% if gymnast.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details' gymnast.id %}">{% endif %}{{ gymnast }}</a></h3>
</div>
<div class="card-body">
<form class="form-horizontal" id="form" name="form">

View File

@ -88,10 +88,12 @@ def gymnast_lookup(request):
@require_http_methods(["GET"])
def gymnast_listing(request):
"""
Si la personne connectée est un entraîneur : liste tous les gymnasts ACTIFS connus.
Si la personne connectée est un gymnaste : renvoie sa fiche détaillée.
Si la personne connectée est un entraîneur : liste tous les gymnasts actifs connus mais n'aura
accès qu'aux gymnastes autorisé(e)s.
Si la personne connectée est un gymnaste : renvoie directement sa fiche détaillée.
"""
season = Season()
# if "trainer" in request.user.groups:
if request.user.groups.filter(name="trainer").exists():
season_information_list = SeasonInformation.objects.filter(
season=season.label
@ -115,10 +117,10 @@ def gymnast_details(request, gymnast_id, tab=None):
tab (str) <string> de l'onglet désiré
"""
if request.user.groups.filter(name="trainer").exists():
if gymnast_id in request.session["available_gymnast"]:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
else:
gymnast = Gymnast.objects.get(user=request.user)
return gymnast_listing(request)
last_season_information = gymnast.season_informations.order_by("-season").first()

View File

@ -49,7 +49,7 @@
</td>
{% endif %}
<td class="text-left col-9">
<a href="{% url 'gymnast_details_tab' gymnast.0.id 'event' %}">{{ gymnast.0 }}</a>
{% if gymnast.0.id in request.session.available_gymnast %}<a href="{% url 'gymnast_details_tab' gymnast.0.id 'event' %}">{% endif %}{{ gymnast.0 }}</a>
</td>
</tr>
{% endfor %}

View File

@ -1,6 +1,6 @@
from django.contrib import admin
from django_admin_listfilter_dropdown.filters import RelatedDropdownFilter
from .models import Profile, Notification
from .models import Profile, Notification, TrainerGymnast
class ProfileAdmin(admin.ModelAdmin):
@ -9,9 +9,6 @@ class ProfileAdmin(admin.ModelAdmin):
autocomplete_fields = ("user",)
admin.site.register(Profile, ProfileAdmin)
class NotificationAdmin(admin.ModelAdmin):
model = Notification
list_display = ("user", "gymnast", "functionality")
@ -23,4 +20,16 @@ class NotificationAdmin(admin.ModelAdmin):
)
class TrainerGymnastAdmin(admin.ModelAdmin):
model = TrainerGymnast
list_display = ("user", "gymnast")
autocomplete_fields = ("user", "gymnast")
list_filter = (
("user", RelatedDropdownFilter),
("gymnast", RelatedDropdownFilter),
)
admin.site.register(Profile, ProfileAdmin)
admin.site.register(Notification, NotificationAdmin)
admin.site.register(TrainerGymnast, TrainerGymnastAdmin)

View File

@ -0,0 +1,49 @@
# Generated by Django 4.2 on 2024-02-09 12:51
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
(
"people",
"0010_gymnast_cleaned_first_name_gymnast_cleaned_last_name_and_more",
),
("profiles", "0002_notification"),
]
operations = [
migrations.CreateModel(
name="TrainerGymnast",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"gymnast",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="can_be_viewed_by",
to="people.gymnast",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View File

@ -62,3 +62,16 @@ class Notification(models.Model):
def __str__(self):
return f"{self.user} will be notified for add/update {self.functionality} to {self.gymnast}"
class TrainerGymnast(models.Model):
"""Classe de liaison entre un entraîneur et des gymnastes. Cette classe permet de définir quels
gymnastes peuvent être vus par quels entraîneur."""
user = models.ForeignKey(User, on_delete=models.CASCADE)
gymnast = models.ForeignKey(
Gymnast, on_delete=models.CASCADE, related_name="can_be_viewed_by"
)
def __str__(self):
return f"{self.user} can view {self.gymnast}"