Permet au gymnaste de voir les détails de ses Injury et de les modifier
This commit is contained in:
parent
2b5bd18ae5
commit
3a5b7ac420
|
@ -86,6 +86,8 @@ Ajoutez les lignes suivantes :
|
||||||
|
|
||||||
- Créer l'application sur Heroku
|
- Créer l'application sur Heroku
|
||||||
|
|
||||||
|
- Ajouter le Buildpacks : heroku/python
|
||||||
|
|
||||||
- Créer les variables d'environnement :
|
- Créer les variables d'environnement :
|
||||||
- ALLOWED_HOSTS : avengers-jarvis.herokuapp.com
|
- ALLOWED_HOSTS : avengers-jarvis.herokuapp.com
|
||||||
- DATABASE_NAME : ultron
|
- DATABASE_NAME : ultron
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
from django.test import TestCase, Client
|
|
||||||
from django.urls import reverse
|
|
||||||
from jarvis.people.models import Gymnast
|
|
||||||
from jarvis.followup.models import Chrono, ChronoDetails
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
|
|
||||||
class ChronoViewTests(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
# Create a user for authentication
|
|
||||||
self.user = User.objects.create_user(username='testuser', password='12345')
|
|
||||||
self.client = Client()
|
|
||||||
self.client.login(username='testuser', password='12345')
|
|
||||||
|
|
||||||
# Create a Chrono and ChronoDetails
|
|
||||||
self.gymnast = Gymnast.objects.create(
|
|
||||||
last_name="Pauchou", first_name="Fred", birthdate="1987-07-03", gender=0
|
|
||||||
)
|
|
||||||
self.chrono = Chrono.objects.create(
|
|
||||||
gymnast=self.gymnast, chrono_type=0, score_type=0, score=15, tof=13
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_remove_jump_chrono_value_success(self):
|
|
||||||
"""Test removing a chrono detail successfully."""
|
|
||||||
url = reverse('remove_jump_chrono_value') # Ensure you have named your URL in urls.py
|
|
||||||
self.chrono_detail = ChronoDetails.objects.create(chrono=self.chrono, order=1, value=9.5)
|
|
||||||
response = self.client.post(url, {'chrono_id': self.chrono.id, 'order': 1})
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertFalse(ChronoDetails.objects.filter(id=self.chrono_detail.id).exists())
|
|
||||||
|
|
||||||
def test_remove_jump_chrono_value_not_found(self):
|
|
||||||
"""Test removing a non-existing chrono detail."""
|
|
||||||
url = reverse('remove_jump_chrono_value') # Ensure you have named your URL in urls.py
|
|
||||||
self.chrono_detail = ChronoDetails.objects.create(chrono=self.chrono, order=1, value=9.5)
|
|
||||||
response = self.client.post(url, {'chrono_id': self.chrono.id, 'order': 999})
|
|
||||||
self.assertEqual(response.status_code, 404)
|
|
||||||
|
|
||||||
# def test_remove_jump_chrono_value_missing_parameters(self):
|
|
||||||
# """Test the response when required parameters are missing."""
|
|
||||||
# url = reverse('remove_jump_chrono_value')
|
|
||||||
# self.chrono_detail = ChronoDetails.objects.create(chrono=self.chrono, order=1, value=9.5)
|
|
||||||
# response = self.client.post(url, {'chrono_id': self.chrono.id}) # 'order' is missing
|
|
||||||
# self.assertEqual(response.status_code, 400)
|
|
||||||
|
|
||||||
def test_add_jump_chrono_value_success(self):
|
|
||||||
"""Test adding a new chrono detail successfully."""
|
|
||||||
url = reverse('add_jump_chrono_value')
|
|
||||||
response = self.client.post(url, {'chrono_id': self.chrono.id, 'order': 1, 'value': 9.5})
|
|
||||||
self.assertEqual(response.status_code, 201)
|
|
||||||
self.assertTrue(ChronoDetails.objects.filter(chrono=self.chrono, order=1, value=9.5).exists())
|
|
||||||
|
|
||||||
def test_add_jump_chrono_value_conflict(self):
|
|
||||||
"""Test adding a chrono detail that already exists."""
|
|
||||||
ChronoDetails.objects.create(chrono=self.chrono, order=1, value=9.5)
|
|
||||||
url = reverse('add_jump_chrono_value')
|
|
||||||
response = self.client.post(url, {'chrono_id': self.chrono.id, 'order': 1, 'value': 9.5})
|
|
||||||
self.assertEqual(response.status_code, 409)
|
|
||||||
|
|
||||||
# def test_add_jump_chrono_value_missing_parameters(self):
|
|
||||||
# """Test the response when required parameters are missing."""
|
|
||||||
# url = reverse('add_jump_chrono_value')
|
|
||||||
# response = self.client.post(url, {'chrono_id': self.chrono.id, 'order': 1}) # 'value' is missing
|
|
||||||
# self.assertEqual(response.status_code, 400)
|
|
|
@ -43,32 +43,26 @@ def jump_chrono_details(request, chrono_id):
|
||||||
Args:
|
Args:
|
||||||
chrono_id (int) identifiant chrono
|
chrono_id (int) identifiant chrono
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Using prefetch_related to optimize database access for related details
|
|
||||||
chrono = get_object_or_404(Chrono.objects.prefetch_related('details'), pk=chrono_id)
|
chrono = get_object_or_404(Chrono.objects.prefetch_related('details'), pk=chrono_id)
|
||||||
|
|
||||||
# Access control for non-superusers
|
|
||||||
if not request.user.is_superuser and (
|
if not request.user.is_superuser and (
|
||||||
request.session.has_key("available_gymnast") and
|
request.session.has_key("available_gymnast") and
|
||||||
chrono.gymnast.id not in request.session["available_gymnast"]
|
chrono.gymnast.id not in request.session["available_gymnast"]
|
||||||
):
|
):
|
||||||
return chrono_listing(request)
|
return chrono_listing(request)
|
||||||
|
|
||||||
# Aggregate values from details
|
|
||||||
details = chrono.details.all()
|
details = chrono.details.all()
|
||||||
sum_value = details.aggregate(total=Sum("value"))['total']
|
sum_value = details.aggregate(total=Sum("value"))['total']
|
||||||
mean_value = details.aggregate(mean=Avg("value"))['mean']
|
mean_value = details.aggregate(mean=Avg("value"))['mean']
|
||||||
min_value = details.aggregate(min=Min("value"))['min']
|
min_value = details.aggregate(min=Min("value"))['min']
|
||||||
max_value = details.aggregate(max=Max("value"))['max']
|
max_value = details.aggregate(max=Max("value"))['max']
|
||||||
|
|
||||||
# Update chrono score if different
|
|
||||||
if chrono.score != sum_value:
|
if chrono.score != sum_value:
|
||||||
chrono.score = sum_value
|
chrono.score = sum_value
|
||||||
if chrono.score_type == 0:
|
if chrono.score_type == 0:
|
||||||
chrono.tof = Chrono.compute_tof(sum_value)
|
chrono.tof = Chrono.compute_tof(sum_value)
|
||||||
chrono.save()
|
chrono.save()
|
||||||
|
|
||||||
# Calculate chart values
|
|
||||||
chart_min_value = mean_value - (min_value / 20)
|
chart_min_value = mean_value - (min_value / 20)
|
||||||
chart_max_value = mean_value + (max_value / 20)
|
chart_max_value = mean_value + (max_value / 20)
|
||||||
|
|
||||||
|
@ -153,7 +147,7 @@ def remove_jump_chrono_value(request):
|
||||||
order = request.POST.get("order")
|
order = request.POST.get("order")
|
||||||
|
|
||||||
if not chrono_id or not order:
|
if not chrono_id or not order:
|
||||||
return HttpResponse(400, "Missing required parameters.")
|
return HttpResponse(status=400)
|
||||||
|
|
||||||
chrono = get_object_or_404(Chrono, pk=chrono_id)
|
chrono = get_object_or_404(Chrono, pk=chrono_id)
|
||||||
deleted, _ = ChronoDetails.objects.filter(chrono=chrono, order=order).delete()
|
deleted, _ = ChronoDetails.objects.filter(chrono=chrono, order=order).delete()
|
||||||
|
@ -175,7 +169,7 @@ def add_jump_chrono_value(request):
|
||||||
value = request.POST.get("value")
|
value = request.POST.get("value")
|
||||||
|
|
||||||
if not chrono_id or not order or value is None:
|
if not chrono_id or not order or value is None:
|
||||||
return HttpResponse(400, "Missing required parameters.")
|
return HttpResponse(status=400)
|
||||||
|
|
||||||
chrono = get_object_or_404(Chrono, pk=chrono_id)
|
chrono = get_object_or_404(Chrono, pk=chrono_id)
|
||||||
row, created = ChronoDetails.objects.get_or_create(
|
row, created = ChronoDetails.objects.get_or_create(
|
||||||
|
@ -185,7 +179,7 @@ def add_jump_chrono_value(request):
|
||||||
if created:
|
if created:
|
||||||
return HttpResponse(status=201)
|
return HttpResponse(status=201)
|
||||||
|
|
||||||
return HttpResponse(status=409) # 409 Conflict
|
return HttpResponse(status=409)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
@ -274,6 +268,32 @@ def average_jump_chrono_details_between_two_date(
|
||||||
return render(request, "chronos/list_details.html", context)
|
return render(request, "chronos/list_details.html", context)
|
||||||
|
|
||||||
|
|
||||||
|
# @require_http_methods(["GET"])
|
||||||
|
# def get_chrono_detail_distinct(request, gymnast_id, season=None):
|
||||||
|
# """Retrieves all distinct seasons for which the gymnast has detailed chronos.
|
||||||
|
|
||||||
|
# Args:
|
||||||
|
# gymnast_id (int) Identifiant d'un gymnaste
|
||||||
|
# """
|
||||||
|
# get_object_or_404(Gymnast, pk=gymnast_id)
|
||||||
|
|
||||||
|
# if season:
|
||||||
|
# result_list = list(
|
||||||
|
# Chrono.objects.filter(gymnast_id=gymnast_id, season=season)
|
||||||
|
# .values_list("week_number", flat=True)
|
||||||
|
# .distinct()
|
||||||
|
# .order_by("week_number")
|
||||||
|
# )
|
||||||
|
# else:
|
||||||
|
# result_list = list(
|
||||||
|
# Chrono.objects.filter(gymnast_id=gymnast_id)
|
||||||
|
# .values_list("season", flat=True)
|
||||||
|
# .distinct()
|
||||||
|
# .order_by("season")
|
||||||
|
# )
|
||||||
|
# return JsonResponse(result_list, safe=False)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def get_chrono_detail_distinct_season(request, gymnast_id):
|
def get_chrono_detail_distinct_season(request, gymnast_id):
|
||||||
"""Retrieves all distinct seasons for which the gymnast has detailed chronos.
|
"""Retrieves all distinct seasons for which the gymnast has detailed chronos.
|
||||||
|
|
|
@ -80,6 +80,8 @@ def injury_create_or_update(request, injury_id=None, gymnast_id=None):
|
||||||
if not request.user.is_superuser and (
|
if not request.user.is_superuser and (
|
||||||
request.session.has_key("available_gymnast")
|
request.session.has_key("available_gymnast")
|
||||||
and injury.gymnast.id not in request.session["available_gymnast"]
|
and injury.gymnast.id not in request.session["available_gymnast"]
|
||||||
|
) and (
|
||||||
|
injury.gymnast.id != request.user.gymnast.id
|
||||||
):
|
):
|
||||||
return injury_listing(request)
|
return injury_listing(request)
|
||||||
data = {
|
data = {
|
||||||
|
@ -151,6 +153,8 @@ def injury_details(request, injury_id):
|
||||||
if not request.user.is_superuser and (
|
if not request.user.is_superuser and (
|
||||||
request.session.has_key("available_gymnast")
|
request.session.has_key("available_gymnast")
|
||||||
and injury.gymnast.id not in request.session["available_gymnast"]
|
and injury.gymnast.id not in request.session["available_gymnast"]
|
||||||
|
) and (
|
||||||
|
injury.gymnast.id != request.user.gymnast.id
|
||||||
):
|
):
|
||||||
return injury_listing(request)
|
return injury_listing(request)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue