[WIP] Add strength functionnality

This commit is contained in:
Gregory Trullemans 2023-10-03 21:33:33 +02:00
parent 480f085686
commit 42d4e26aba
12 changed files with 724 additions and 13 deletions

View File

@ -21,18 +21,16 @@
<div class="card-body">
<div class="table-responsive">
{% if quality_of_movement_list %}
<table class="table tablesorter table-striped" data-sort="table" id="stability_table">
<table class="table tablesorter table-striped" data-sort="table" id="qom_table">
<thead class="text-primary">
<tr>
<th style="width: 3%"></th>
<th class="header text-left" style="width: 8%">Date</th>
<th class="header text-left" style="width: 20%">Gymnast</th>
<th class="header text-left">overhead_squat</th>
<th class="header text-left">sl_drop_jump</th>
<th class="header text-left">sl_stability_right</th>
<th class="header text-left">sl_stability_left</th>
<!-- <th class="header text-left">sl_bridge</th>
<th class="header text-left">side_plank_leg_raise</th> -->
<th class="header text-left">SL Drop Jump</th>
<th class="header text-left">SL Stability right</th>
<th class="header text-left">SL Stability left</th>
</tr>
</thead>
<tbody>
@ -45,12 +43,10 @@
</td>
<td class="text-left"><a href="{% url 'quality_of_movement_details' quality_of_movement.id %}">{{ quality_of_movement.date | date:"d-m-Y" }}</a></td>
<td class="text-left"><a href="{% url 'gymnast_details_tab' quality_of_movement.gymnast.id 'physiological' %}">{{ quality_of_movement.gymnast }}</a></td>
<!-- <td class="text-left">{{ quality_of_movement.overhead_squat.all }}</td>
<td class="text-left">{{ quality_of_movement.single_leg_drop_jump.all }}</td> -->
<!-- <td class="text-left">{{ quality_of_movement.overhead_squat.all }}</td> -->
<!-- <td class="text-left">{{ quality_of_movement.single_leg_drop_jump.all }}</td> -->
<td class="text-left">{{ quality_of_movement.single_leg_stability_right }}</td>
<td class="text-left">{{ quality_of_movement.single_leg_stability_left }}</td>
<!-- <td class="text-right">{{ quality_of_movement.sl_bridge }}</td>
<td class="text-right">{{ quality_of_movement.side_plank_leg_raise }}</td> -->
</tr>
{% endfor %}
</tbody>
@ -66,7 +62,7 @@
{% block footerscript %}
<script type="text/javascript">
$(document).ready(function () {
$('#stability_table').tablesorter({
$('#qom_table').tablesorter({
headers: {
0: { sorter: false }, // disable first column
},
@ -74,7 +70,7 @@
sortList: [[1, 1]]
});
$('#stability_table').DataTable({
$('#qom_table').DataTable({
scrollY: 500,
paging: false,
searching: false,

View File

@ -0,0 +1,91 @@
{% extends "base.html" %}
{% load static %}
{% load has_group %}
{% block content %}
<div class="row justify-content-center">
<div class="col-12 col-sm-12 col-md-8 col-lg-8 col-xl-6">
<div class="card">
<div class="card-header">
<h4 class="">{% if strength_id %}Edit{% else %}Add{% endif %} Strength</h4>
</div>
<div class="card-body">
<form action="{% if strength_id %}{% url 'strength_update' strength_id %}{% else %}{% url 'strength_create' %}{% endif %}" method="post" class="form-horizontal" id="formulaire" name="formulaire">
{% csrf_token %}
<div class="form-group row ">
<label for="id_date" class="col-4 col-sm-3 col-form-label">Gymnast <span class="text-danger"><b>*</b></span></label>
<div class="col-sm-8 col-md-6 col-lg-6 col-xl-6 {% if form.jumper.errors %}has-danger{% endif %}">
{% if request.user|has_group:"trainer" %}
{{ form.gymnast }}
{{ form.gymnast_related }}
{% if form.gymnast.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.gymnast.errors %}{{ error }}{% endfor %}</span>{% endif %}
{% else %}
<input type="text" class="form-control" value="{{ request.user.first_name }} {{ request.user.last_name }}" readonly="readonly" />
<input type="hidden" name="gymnast" id="gymnast" value="{{ request.user.gymnast.id }}" />
{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_date" class="col-4 col-sm-3 col-form-label">{{ form.date.label }} <span class="text-danger"><b>*</b></span></label>
<div class="col-sm-3 col-md-4 col-lg-4 col-xl-4 {% if form.date.errors %}has-danger{% endif %}">
{{ form.date }}
{% if form.date.errors %}<span class="btn btn-sm btn-danger-outline">{% for error in form.date.errors %}{{ error }}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_overhead_squat" class="col-4 col-sm-3 col-form-label">{{ form.overhead_squat.label }}<span class="text-danger"><b>*</b></span></label>
<div class="col-5 col-sm-3 col-md-2 col-lg-5 col-xl-5 {% if form.overhead_squat.errors %}has-danger{% endif %}">
{{ form.overhead_squat }}
{% if form.overhead_squat.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.overhead_squat.errors %}{{ error }}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_single_leg_drop_jump" class="col-4 col-sm-3 col-form-label">{{ form.single_leg_drop_jump.label }} <span class="text-danger"><b>*</b></span></label>
<div class="col-5 col-sm-3 col-md-2 col-lg-5 col-xl-5 {% if form.single_leg_drop_jump.errors %}has-danger{% endif %}">
{{ form.single_leg_drop_jump }}
{% if form.single_leg_drop_jump.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.single_leg_drop_jump.errors %}{{ error }}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_single_leg_stability_right" class="col-4 col-sm-3 col-form-label">{{ form.single_leg_stability_right.label }}<span class="text-danger"><b>*</b></span></label>
<div class="col-5 col-sm-3 col-md-2 col-lg-2 col-xl-2 {% if form.single_leg_stability_right.errors %}has-danger{% endif %}">
{{ form.single_leg_stability_right }}
{% if form.single_leg_stability_right.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.single_leg_stability_right.errors %}{{ error }}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_single_leg_stability_left" class="col-4 col-sm-3 col-form-label">{{ form.single_leg_stability_left.label }}<span class="text-danger"><b>*</b></span></label>
<div class="col-5 col-sm-3 col-md-2 col-lg-2 col-xl-2 {% if form.single_leg_stability_left.errors %}has-danger{% endif %}">
{{ form.single_leg_stability_left }}
{% if form.single_leg_stability_left.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.single_leg_stability_left.errors %}{{ error }}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group text-center">
<input type="submit" value="{% if stability_id %}Save{% else %}Add{% endif %}" class="btn btn-warning" />
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
{% block footerscript %}
<script type="text/javascript" >
$(function(){
blackDashboard.initDateTimePicker();
});
const csrf_token = "{{ csrf_token|escapejs }}";
const gymnast_lookup = "{% url 'gymnast_lookup' %}";
const skill_lookup = "{% url 'skill_lookup' %}";
</script>
<script src="{% static "js/template_users/datepicker_maxdate_today.js" %}"></script>
{% if request.session.template == 0 %}
<script src="{% static "js/template_users/gymnast_autocomplete_black.js" %}"></script>
<script src="{% static "js/template_users/skill_autocomplete_black.js" %}"></script>
{% else %}
<script src="{% static "js/template_users/gymnast_autocomplete.js" %}"></script>
<script src="{% static "js/template_users/skill_autocomplete.js" %}"></script>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,56 @@
{% extends "base.html" %}
{% block content %}
<div class="row justify-content-center">
<div class="col-12 col-sm-8 col-md-6">
<div class="card">
<div class="card-header">
<h4 class="mb-0">Quality of Movement on {{ quality_of_movement.date | date:"j N Y" }}</h4>
<a href="{% url 'gymnast_details_tab' quality_of_movement.gymnast.id 'physiological' %}">{{ quality_of_movement.gymnast }}</a>
</div>
<div class="card-body">
<table class="table table-striped">
<tr>
<td>overhead Squat</td>
<td>
{% for overhead_squat in qof_overhead_squat %}
{{ overhead_squat }}
{% endfor %}
</td>
</tr>
<tr>
<td>Single Leg Drop Jump</td>
<td>
{% for single_leg_drop_jump in qof_single_leg_drop_jump %}
{{ single_leg_drop_jump }}
{% endfor %}
</td>
</tr>
<tr>
<td>Single leg stability right</td>
<td>{{ quality_of_movement.single_leg_stability_right }}</td>
</tr>
<tr>
<td>Single leg stability left</td>
<td>{{ quality_of_movement.single_leg_stability_left }}</td>
</tr>
</table>
<div class="card-footer pl-0 pb-0">
<a href="{% url 'quality_of_movement_list' %}">
<button type="submit" value="add" class="btn btn-icon btn-warning ">
<i class="tim-icons icon-double-left"></i>
</button>
</a>
<a href="{% url 'quality_of_movement_create_for_gymnast' quality_of_movement.gymnast.id %}">
<button type="submit" value="add" class="btn btn-icon btn-warning ">
+
</button>
</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,104 @@
{% extends "listing.html" %}
{% block datacontent %}
<div class="card mb-0">
<div class="card-header">
<div class="row">
<div class="col-md-4">
<h4 class=""> Strength Listing</h4>
</div>
<div class="col-1 ml-auto">
<div class="text-right">
<a href="{% url 'strength_create' %}">
<button type="submit" value="add" class="btn btn-icon btn-warning">
<i class="fas fa-plus"></i>
</button>
</a>
</div>
</div>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
{% if strength_list %}
<table class="table tablesorter table-striped" data-sort="table" id="strength_table">
<thead class="text-primary">
<tr>
<th style="width: 3%"></th>
<th class="header text-left" style="width: 8%">Date</th>
<th class="header text-left" style="width: 20%">Gymnast</th>
<th class="header text-left">harmstring left</th>
<th class="header text-left">harmstring right</th>
<th class="header text-left">quadriceps left</th>
<th class="header text-left">quadriceps right</th>
<th class="header text-left">hip adductor left</th>
<th class="header text-left">hip adductor right</th>
<th class="header text-left">hip abductor left</th>
<th class="header text-left">hip abductor right</th>
<th class="header text-left">shoulder external rotator left</th>
<th class="header text-left">shoulder external rotator right</th>
<th class="header text-left">shoulder internal rotator left</th>
<th class="header text-left">shoulder internal rotator right</th>
</tr>
</thead>
<tbody>
{% for strength in strength_list %}
<tr role="row" class="{% cycle 'odd' 'even' %}">
<td>
<a href="{% url 'strength_update' strength.id %}">
<span class="tim-icons icon-pencil text-warning"></span>
</a>
</td>
<td class="text-left"><a href="{% url 'strength_details' strength.id %}">{{ strength.date | date:"d-m-Y" }}</a></td>
<td class="text-left"><a href="{% url 'gymnast_details_tab' strength.gymnast.id 'physiological' %}">{{ strength.gymnast }}</a></td>
<td class="text-left">{{ strength.harmstring_left_prone }}</td>
<td class="text-left">{{ strength.harmstring_right_prone }}</td>
<td class="text-left">{{ strength.quadriceps_left_seated }}</td>
<td class="text-left">{{ strength.quadriceps_right_seated }}</td>
<td class="text-left">{{ strength.hip_adductor_left }}</td>
<td class="text-left">{{ strength.hip_adductor_right }}</td>
<td class="text-left">{{ strength.hip_abductor_left }}</td>
<td class="text-left">{{ strength.hip_abductor_right }}</td>
<td class="text-left">{{ strength.shoulder_external_rotator_left }}</td>
<td class="text-left">{{ strength.shoulder_external_rotator_right }}</td>
<td class="text-left">{{ strength.shoulder_internal_rotator_left }}</td>
<td class="text-left">{{ strength.shoulder_internal_rotator_right }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p class="muted-text">There are no injury corresponding to your criterias.</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}
{% block footerscript %}
<script type="text/javascript">
$(document).ready(function () {
$('#strength_table').tablesorter({
headers: {
0: { sorter: false }, // disable first column
},
dateFormat: "uk",
sortList: [[1, 1]]
});
$('#strength_table').DataTable({
scrollY: 500,
paging: false,
searching: false,
ordering: false,
"bInfo": false,
});
});
</script>
{% endblock %}

View File

@ -179,6 +179,80 @@
</div>
</div>
</div>
<div class="row justify-content-center ml-1">
<div class="col-md-6">
<div class="card mb-4">
<div class="card-header">
<h4>Strength</h4>
</div>
<div class="card-body pt-0 pb-0 pr-0 pl-0">
{% if strength_list %}
<table class="table" id="previous_events">
<thead>
<tr>
<th></th>
<th class='header text-left'>Date</th>
<th class='header text-center'>???</th>
<th class='header text-center'>???</th>
</tr>
</thead>
<tbody>
{% for strength in strength_list %}
<tr>
<td class="text-left">
<a href="{% url 'strength_update' strength.id %}">
<span class="tim-icons icon-pencil text-warning"></span>
</a>
</td>
<td class="text-left">
<a href="{% url 'strength_details' strength.id %}">
{{ strength.date | date:"d-m-Y" }}
</a>
</td>
<td class="text-center">{{ strength.quadriceps_left_seated }}</td>
<td class="text-center">{{ strength.quadriceps_right_seated }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p class="pl-3 text-muted">No strength recorded for this gymnast.</p>
{% endif %}
</div>
<div class="card-footer text-right text-muted pt-0">
{% if strength_list %}
<a href="{% url 'strength_list_for_gymnast' gymnast_id %}">
<button type="submit" value="list" class="btn btn-icon btn-warning mr-2">
<i class="far fa-list-alt"></i>
</button>
</a>
{% endif %}
<a href="{% url 'strength_create_for_gymnast' gymnast_id %}">
<button type="submit" value="add" class="btn btn-icon btn-warning ">
<i class="fas fa-plus"></i>
</button>
</a>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-4">
<div class="card-header">
<h4>Mobility & Flexibility</h4>
</div>
<div class="card-body pt-0 pb-0 pr-0 pl-0">
(under construction)
</div>
<div class="card-footer text-right text-muted pt-0">
</div>
</div>
</div>
</div>
<div class="row justify-content-center ml-1">
<div class="col-md-12">
<div class="card">

View File

@ -2,7 +2,6 @@ from django.contrib import admin
from django_admin_listfilter_dropdown.filters import (
DropdownFilter,
ChoiceDropdownFilter,
RelatedDropdownFilter,
)
@ -12,6 +11,7 @@ from .models import (
Point,
Chrono,
Injury,
Strength,
SLBridge,
WellBeing,
Stability,
@ -347,11 +347,39 @@ class QualityOfMovementAdmin(admin.ModelAdmin):
autocomplete_fields = ("gymnast",)
class StrengthAdmin(admin.ModelAdmin):
model = Strength
list_display = (
"date",
"gymnast",
"harmstring_left_prone",
"harmstring_right_prone",
"quadriceps_left_seated",
"quadriceps_right_seated",
"hip_adductor_left",
"hip_adductor_right",
"hip_abductor_left",
"hip_abductor_right",
"shoulder_external_rotator_left",
"shoulder_external_rotator_right",
"shoulder_internal_rotator_left",
"shoulder_internal_rotator_right",
)
list_filter = (("gymnast", RelatedDropdownFilter),)
search_fields = (
"gymnast__firstname",
"gymnast__lastname",
)
autocomplete_fields = ("gymnast",)
admin.site.register(Plan, PlanAdmin)
admin.site.register(Note, NoteAdmin)
admin.site.register(Point, PointAdmin)
admin.site.register(Chrono, ChronoAdmin)
admin.site.register(Injury, InjuryAdmin)
admin.site.register(Strength, StrengthAdmin)
admin.site.register(WellBeing, WellBeingAdmin)
admin.site.register(InjuryType, InjuryTypeAdmin)
admin.site.register(LearnedSkill, LearnedSkillAdmin)

View File

@ -8,6 +8,7 @@ from .models import (
Point,
Chrono,
Injury,
Strength,
WellBeing,
Stability,
HeightWeight,
@ -365,6 +366,144 @@ class QualityOfMovementForm(forms.ModelForm):
)
class StrengthForm(forms.ModelForm):
class Meta:
model = Strength
fields = (
"gymnast",
"date",
"harmstring_left_prone",
"harmstring_right_prone",
"quadriceps_left_seated",
"quadriceps_right_seated",
"hip_adductor_left",
"hip_adductor_right",
"hip_abductor_left",
"hip_abductor_right",
"shoulder_external_rotator_left",
"shoulder_external_rotator_right",
"shoulder_internal_rotator_left",
"shoulder_internal_rotator_right",
)
widgets = {
"date": forms.DateInput(
attrs={
"class": "form-control datepicker",
"placeholder": date.today().strftime("%Y-%m-%d"),
"value": date.today().strftime("%Y-%m-%d"),
}
),
"gymnast": forms.HiddenInput(),
"harmstring_left_prone": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"harmstring_right_prone": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"quadriceps_left_seated": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"quadriceps_right_seated": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"hip_adductor_left": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"hip_adductor_right": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"hip_abductor_left": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"hip_abductor_right": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"shoulder_external_rotator_left": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"shoulder_external_rotator_right": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"shoulder_internal_rotator_left": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
"shoulder_internal_rotator_right": forms.NumberInput(
attrs={
"class": "form-control",
"placeholder": "x",
"min": "0",
"max": "10000",
}
),
}
gymnast_related = forms.CharField(
required=False,
widget=forms.TextInput(
attrs={
"class": "form-control",
"placeholder": "Searching gymnast…",
"data-ref": "#id_gymnast",
}
),
)
class WellBeingForm(forms.ModelForm):
class Meta:
model = WellBeing

View File

@ -0,0 +1,101 @@
# Generated by Django 4.2 on 2023-10-03 13:10
from django.db import migrations, models
import django.db.models.deletion
import ultron.tools.models
class Migration(migrations.Migration):
dependencies = [
("people", "0008_alter_gymnast_orientation"),
(
"followup",
"0048_rename_sl_drop_jump_qualityofmovement_single_leg_drop_jump_and_more",
),
]
operations = [
migrations.CreateModel(
name="Strength",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"date",
models.DateField(
default=ultron.tools.models.get_default_date,
verbose_name="Date",
),
),
("season", models.CharField(editable=False, max_length=9)),
("week_number", models.PositiveSmallIntegerField(editable=False)),
(
"harmstring_left_prone",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"harmstring_right_prone",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"quadriceps_left_seated",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"quadriceps_right_seated",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"hip_adductor_left",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"hip_adductor_right",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"hip_abductor_left",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"hip_abductor_right",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"shoulder_external_rotator_left",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"shoulder_external_rotator_right",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"shoulder_internal_rotator_left",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"shoulder_internal_rotator_right",
models.PositiveSmallIntegerField(blank=True, null=True),
),
(
"gymnast",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="strength",
to="people.gymnast",
),
),
],
options={
"verbose_name": "Strength",
"verbose_name_plural": "Strength",
},
),
]

View File

@ -675,3 +675,30 @@ class QualityOfMovement(Seasonisable):
def __str__(self):
return f"{self.gymnast} - {self.date}: {self.overhead_squat}"
class Strength(Seasonisable):
"""Classe représentant la Strength"""
class Meta:
verbose_name = "Strength"
verbose_name_plural = "Strength"
gymnast = models.ForeignKey(
Gymnast, on_delete=models.CASCADE, related_name="strength"
)
harmstring_left_prone = models.PositiveSmallIntegerField(null=True, blank=True)
harmstring_right_prone = models.PositiveSmallIntegerField(null=True, blank=True)
quadriceps_left_seated = models.PositiveSmallIntegerField(null=True, blank=True)
quadriceps_right_seated = models.PositiveSmallIntegerField(null=True, blank=True)
hip_adductor_left = models.PositiveSmallIntegerField(null=True, blank=True)
hip_adductor_right = models.PositiveSmallIntegerField(null=True, blank=True)
hip_abductor_left = models.PositiveSmallIntegerField(null=True, blank=True)
hip_abductor_right = models.PositiveSmallIntegerField(null=True, blank=True)
shoulder_external_rotator_left = models.PositiveSmallIntegerField(null=True, blank=True)
shoulder_external_rotator_right = models.PositiveSmallIntegerField(null=True, blank=True)
shoulder_internal_rotator_left = models.PositiveSmallIntegerField(null=True, blank=True)
shoulder_internal_rotator_right = models.PositiveSmallIntegerField(null=True, blank=True)
def __str__(self):
return f"{self.gymnast} - {self.date}"

View File

@ -162,6 +162,32 @@ urlpatterns = [
),
#
#
# Strength
path(r"strength/", views.strength_listing, name="strength_list"),
path(
r"strength/gymnast/<int:gymnast_id>/",
views.strength_listing,
name="strength_list_for_gymnast"
),
# path(r"stability/search/", views.injury_listing, name="quality_of_movement_search"),
path(r"strength/add/", views.quality_of_movement_create_or_update, name="strength_create"),
path(
r"strength/add/<int:gymnast_id>/",
views.strength_create_or_update,
name="strength_create_for_gymnast",
),
path(
r"strength/edit/<int:strength_id>/",
views.strength_create_or_update,
name="strength_update",
),
path(
r"strength/<int:strength_id>/",
views.strength_detail,
name="strength_details"
),
#
#
# HEIGH/WEIGHT
path(
r"heightweight/gymnast/<int:gymnast_id>/",

View File

@ -17,6 +17,7 @@ from .models import (
Point,
Chrono,
Injury,
Strength,
WellBeing,
Stability,
LearnedSkill,
@ -32,6 +33,7 @@ from .forms import (
ScoreForm,
ChronoForm,
InjuryForm,
StrengthForm,
StabilityForm,
WellBeingForm,
HeightWeightForm,
@ -883,3 +885,67 @@ def quality_of_movement_create_or_update(request, quality_of_movement_id=None, g
form = QualityOfMovementForm(instance=quality_of_movement, initial=data)
context = {"form": form, "quality_of_movement_id": quality_of_movement_id}
return render(request, "followup/quality_of_movement/create.html", context)
@login_required
@require_http_methods(["GET"])
def strength_listing(request, gymnast_id=None):
"""Liste toutes les records de la table Quality of Movement"""
if gymnast_id is not None:
gymnast = Gymnast.objects.get(pk=gymnast_id)
strength_list = Strength.objects.filter(gymnast=gymnast_id)
else:
strength_list = Strength.objects.all()
gymnast = None
context = {"strength_list": strength_list, "gymnast": gymnast}
return render(request, "followup/strength/list.html", context)
@login_required
@require_http_methods(["GET"])
def strength_detail(request, strength_id):
"""
Récupère toutes les informations d'une Quality of Movement.
"""
strength = get_object_or_404(Strength, pk=strength_id)
context = {
"strength": strength,
}
return render(request, "followup/strength/details.html", context)
@login_required
@require_http_methods(["GET", "POST"])
def strength_create_or_update(request, strength_id=None, gymnast_id=None):
"""
Récupère toutes les informations d'une stability.
"""
if strength_id:
strength = get_object_or_404(Strength, pk=strength_id)
data = {
"gymnast_related": strength.gymnast,
}
else:
strength = None
data = None
if gymnast_id is not None:
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast)}
if request.method == "POST":
form = StrengthForm(request.POST, instance=strength)
if form.is_valid():
strength = form.save()
return HttpResponseRedirect(
reverse("strength_details", args=(strength.pk,))
)
else:
return render(request, "followup/strength/create.html", {"form": form})
form = StrengthForm(instance=strength, initial=data)
context = {"form": form, "strength_id": strength_id}
return render(request, "followup/strength/create.html", context)

View File

@ -31,6 +31,7 @@ from ultron.followup.models import (
Point,
Chrono,
Injury,
Strength,
Stability,
WellBeing,
LearnedSkill,
@ -254,6 +255,7 @@ def gymnast_display_physiological(request, gymnast_id):
)[:10]
stability_list = Stability.objects.filter(gymnast=gymnast_id).order_by("date")[:10]
quality_of_movement_list = QualityOfMovement.objects.filter(gymnast=gymnast_id).order_by("date")[:10]
strength_list = Strength.objects.filter(gymnast=gymnast_id).order_by("date")[:10]
context = {
"injuries_list": injuries_list,
@ -261,6 +263,7 @@ def gymnast_display_physiological(request, gymnast_id):
"stability_list": stability_list,
"height_weight_list": height_weight_list,
"quality_of_movement_list": quality_of_movement_list,
"strength_list": strength_list,
"gymnast_id": gymnast_id,
}
return render(request, "people/gymnasts/tabs/tab_physiological.html", context)