Improve right management
This commit is contained in:
parent
2a462b0112
commit
872fc873cb
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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",
|
||||
),
|
||||
#
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
]
|
|
@ -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."""
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
|
@ -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}"
|
||||
|
|
Loading…
Reference in New Issue