Re-Add Injury model

This commit is contained in:
Gregory Trullemans 2023-10-11 16:32:09 +02:00
parent 5ca298cec6
commit 981ac77a05
6 changed files with 300 additions and 161 deletions

View File

@ -11,13 +11,12 @@ from .models import (
Note, Note,
Point, Point,
Chrono, Chrono,
# Injury, Injury,
WellBeing, WellBeing,
Intensity, Intensity,
HeightWeight, HeightWeight,
LearnedSkill, LearnedSkill,
ChronoDetails, ChronoDetails,
# InjuryLocation,
GymnastHasRoutine, GymnastHasRoutine,
SeasonInformation, SeasonInformation,
NumberOfRoutineDone, NumberOfRoutineDone,
@ -91,38 +90,32 @@ class PointAdmin(admin.ModelAdmin):
autocomplete_fields = ("gymnast", "event") autocomplete_fields = ("gymnast", "event")
# class InjuryLocationAdmin(admin.ModelAdmin): class InjuryAdmin(admin.ModelAdmin):
# model = InjuryLocation model = Injury
# list_display = ("label",) fields = (
# fields = ("label",) "date",
# search_fields = ("label",) "gymnast",
"skill",
"injury_type",
# class InjuryAdmin(admin.ModelAdmin): "location",
# model = Injury "body_side",
"mechanism",
# fields = ( "nb_week_off",
# "date", "informations",
# "gymnast", ) # educative
# "skill", # readonly_fields = ("season", "week_number", "created_at", "updated_at")
# "location", list_display = ("date", "gymnast", "skill") # educative
# "body_side", list_filter = (
# "mechanism", ("gymnast", RelatedDropdownFilter),
# "nb_week_off", ("injury_type", DropdownFilter),
# "informations", ("location", DropdownFilter),
# ) # educative ("body_side", DropdownFilter),
# readonly_fields = ("season", "week_number", "created_at", "updated_at") ("mechanism", DropdownFilter),
# list_display = ("date", "gymnast", "skill") # educative )
# list_filter = ( date_hierarchy = "date"
# ("gymnast", RelatedDropdownFilter), search_fields = ("date", "gymnast") # educative
# ("location", RelatedDropdownFilter), autocomplete_fields = ("gymnast", "skill")
# ("body_side", DropdownFilter),
# ("mechanism", DropdownFilter),
# )
# date_hierarchy = "date"
# search_fields = ("date", "gymnast") # educative
# autocomplete_fields = ("gymnast", "skill")
class WellBeingAdmin(admin.ModelAdmin): class WellBeingAdmin(admin.ModelAdmin):
@ -298,13 +291,12 @@ admin.site.register(Plan, PlanAdmin)
admin.site.register(Note, NoteAdmin) admin.site.register(Note, NoteAdmin)
admin.site.register(Point, PointAdmin) admin.site.register(Point, PointAdmin)
admin.site.register(Chrono, ChronoAdmin) admin.site.register(Chrono, ChronoAdmin)
# admin.site.register(Injury, InjuryAdmin) admin.site.register(Injury, InjuryAdmin)
admin.site.register(WellBeing, WellBeingAdmin) admin.site.register(WellBeing, WellBeingAdmin)
admin.site.register(Intensity, IntensityAdmin) admin.site.register(Intensity, IntensityAdmin)
admin.site.register(LearnedSkill, LearnedSkillAdmin) admin.site.register(LearnedSkill, LearnedSkillAdmin)
admin.site.register(HeightWeight, HeightWeightAdmin) admin.site.register(HeightWeight, HeightWeightAdmin)
admin.site.register(ChronoDetails, ChronoDetailsAdmin) admin.site.register(ChronoDetails, ChronoDetailsAdmin)
# admin.site.register(InjuryLocation, InjuryLocationAdmin)
admin.site.register(SeasonInformation, SeasonInformationAdmin) admin.site.register(SeasonInformation, SeasonInformationAdmin)
admin.site.register(GymnastHasRoutine, GymnastHasRoutineAdmin) admin.site.register(GymnastHasRoutine, GymnastHasRoutineAdmin)
admin.site.register(NumberOfRoutineDone, NumberOfRoutineDoneAdmin) admin.site.register(NumberOfRoutineDone, NumberOfRoutineDoneAdmin)

View File

@ -7,7 +7,7 @@ from .models import (
Note, Note,
Point, Point,
Chrono, Chrono,
# Injury, Injury,
WellBeing, WellBeing,
Intensity, Intensity,
HeightWeight, HeightWeight,
@ -181,65 +181,65 @@ class ScoreForm(forms.ModelForm):
) )
# class InjuryForm(forms.ModelForm): class InjuryForm(forms.ModelForm):
# class Meta: class Meta:
# model = Injury model = Injury
# fields = ( fields = (
# "gymnast", "gymnast",
# "date", "date",
# "mechanism", "mechanism",
# "injury_type", "injury_type",
# "location", "location",
# "body_side", "body_side",
# "nb_week_off", "nb_week_off",
# "informations", "informations",
# ) )
# widgets = { widgets = {
# "date": forms.DateInput( "date": forms.DateInput(
# attrs={ attrs={
# "class": "form-control datepicker", "class": "form-control datepicker",
# "placeholder": date.today().strftime("%Y-%m-%d"), "placeholder": date.today().strftime("%Y-%m-%d"),
# "value": date.today().strftime("%Y-%m-%d"), "value": date.today().strftime("%Y-%m-%d"),
# } }
# ), ),
# "gymnast": forms.HiddenInput(), "gymnast": forms.HiddenInput(),
# "skill": forms.HiddenInput(), "skill": forms.HiddenInput(),
# "injury_type": forms.Select(attrs={"class": "form-control selectpicker"}), "injury_type": forms.Select(attrs={"class": "form-control selectpicker"}),
# "mechanism": forms.Select(attrs={"class": "form-control selectpicker"}), "mechanism": forms.Select(attrs={"class": "form-control selectpicker"}),
# "location": forms.Select(attrs={"class": "form-control selectpicker"}), "location": forms.Select(attrs={"class": "form-control selectpicker"}),
# "body_side": forms.Select(attrs={"class": "form-control selectpicker"}), "body_side": forms.Select(attrs={"class": "form-control selectpicker"}),
# "nb_week_off": forms.NumberInput( "nb_week_off": forms.NumberInput(
# attrs={"class": "form-control", "placeholder": "xx"} attrs={"class": "form-control", "placeholder": "xx"}
# ), ),
# "informations": forms.Textarea( "informations": forms.Textarea(
# attrs={ attrs={
# "class": "form-control", "class": "form-control",
# "placeholder": "Informations about injury: context (why, where, …), consequencies, re-education exercices, …", # pylint: disable=line-too-long "placeholder": "Informations about injury: context (why, where, …), consequencies, re-education exercices, …", # pylint: disable=line-too-long
# } }
# ), ),
# } }
# gymnast_related = forms.CharField( gymnast_related = forms.CharField(
# required=False, required=False,
# widget=forms.TextInput( widget=forms.TextInput(
# attrs={ attrs={
# "class": "form-control", "class": "form-control",
# "placeholder": "Searching gymnast…", "placeholder": "Searching gymnast…",
# "data-ref": "#id_gymnast", "data-ref": "#id_gymnast",
# } }
# ), ),
# ) )
# skill_related = forms.CharField( skill_related = forms.CharField(
# required=False, required=False,
# widget=forms.TextInput( widget=forms.TextInput(
# attrs={ attrs={
# "class": "form-control", "class": "form-control",
# "placeholder": "Searching skill…", "placeholder": "Searching skill…",
# "data-ref": "#id_skill", "data-ref": "#id_skill",
# } }
# ), ),
# ) )
class WellBeingForm(forms.ModelForm): class WellBeingForm(forms.ModelForm):

View File

@ -0,0 +1,146 @@
# Generated by Django 4.2 on 2023-10-11 14:24
from django.db import migrations, models
import django.db.models.deletion
import jarvis.tools.models
class Migration(migrations.Migration):
dependencies = [
("people", "0008_alter_gymnast_orientation"),
("objective", "0016_routine_is_routine"),
("followup", "0056_delete_injury_delete_injurylocation"),
]
operations = [
migrations.CreateModel(
name="Injury",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"date",
models.DateField(
default=jarvis.tools.models.get_default_date,
verbose_name="Date",
),
),
("season", models.CharField(editable=False, max_length=9)),
("week_number", models.PositiveSmallIntegerField(editable=False)),
(
"informations",
models.TextField(
blank=True,
help_text="Only MarkDown is authorized",
null=True,
verbose_name="Comments",
),
),
(
"location",
models.SmallIntegerField(
choices=[
(0, "Abdomen"),
(1, "Ankle"),
(2, "Elbow"),
(3, "Foot / Toe"),
(4, "Hand / Finger / Thumb"),
(5, "Head / Face"),
(6, "Hip / Groin"),
(7, "Knee"),
(8, "Low back / Sacrum / Pelvis"),
(9, "Lower Leg / Achilles Tendon"),
(10, "Neck / Cervical Spine"),
(11, "Shoulder / Clavicula"),
(12, "Sternum / Ribs / Upper back"),
(13, "Thigh"),
(14, "Upper arm"),
(15, "Wrist"),
],
verbose_name="Injury type",
),
),
(
"injury_type",
models.SmallIntegerField(
choices=[
(0, "Abrasion"),
(1, "Dental Injury"),
(2, "Dislocation / Subluxation"),
(3, "Fracture"),
(4, "Haematoma / Contusion / Bruise"),
(5, "Head Concussion"),
(6, "Laceration"),
(7, "Lesion of Meniscus or Cartilage"),
(8, "Muscle Rupture /Strain / Tear / Cramps"),
(9, "Nerve Injury"),
(10, "Other Bone Injury"),
(11, "Sprain / Ligament Injury"),
(12, "Tendon Injury / Rupture / Tendinosis / Bursitis"),
],
verbose_name="Injury type",
),
),
(
"body_side",
models.PositiveSmallIntegerField(
choices=[
(0, "Not Applicable"),
(1, "Left"),
(2, "Right"),
(3, "Both"),
],
verbose_name="Body side",
),
),
(
"mechanism",
models.PositiveSmallIntegerField(
choices=[(0, "Overuse"), (1, "Trauma")],
verbose_name="Injury mechanism",
),
),
(
"nb_week_off",
models.SmallIntegerField(
blank=True, null=True, verbose_name="# week off"
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"gymnast",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="injuries",
to="people.gymnast",
verbose_name="Gymnast",
),
),
(
"skill",
models.ForeignKey(
blank=True,
default=None,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="injuries",
to="objective.skill",
verbose_name="Skill",
),
),
],
options={
"verbose_name": "Injury",
"verbose_name_plural": "Injuries",
},
),
]

View File

@ -39,6 +39,25 @@ INJURY_TYPE_CHOICE = (
(12, "Tendon Injury / Rupture / Tendinosis / Bursitis"), (12, "Tendon Injury / Rupture / Tendinosis / Bursitis"),
) )
INJURY_LOCATION_CHOICE = (
(0, "Abdomen"),
(1, "Ankle"),
(2, "Elbow"),
(3, "Foot / Toe"),
(4, "Hand / Finger / Thumb"),
(5, "Head / Face"),
(6, "Hip / Groin"),
(7, "Knee"),
(8, "Low back / Sacrum / Pelvis"),
(9, "Lower Leg / Achilles Tendon"),
(10, "Neck / Cervical Spine"),
(11, "Shoulder / Clavicula"),
(12, "Sternum / Ribs / Upper back"),
(13, "Thigh"),
(14, "Upper arm"),
(15, "Wrist"),
)
ROUTINE_TYPE_CHOICE = ( ROUTINE_TYPE_CHOICE = (
(0, "Other"), (0, "Other"),
(1, "Q1R1"), (1, "Q1R1"),
@ -162,73 +181,55 @@ class ChronoDetails(models.Model):
value = models.DecimalField(max_digits=5, decimal_places=3) value = models.DecimalField(max_digits=5, decimal_places=3)
# class InjuryLocation(models.Model): class Injury(Markdownizable, Seasonisable):
# """ """
# Classe représentant les localisations de blessures La classe `Injury` permet d'indiquer qu'un gymnaste a eu un blessure, en liaison avec un
# """ skill ou non.
"""
# class Meta: class Meta:
# verbose_name = "Injury Location" verbose_name = "Injury"
# verbose_name_plural = "Injury Locations" verbose_name_plural = "Injuries"
# unique_together = ("gymnast", "skill", "date")
# label = models.CharField(max_length=100, null=False, blank=False) gymnast = models.ForeignKey(
Gymnast,
verbose_name="Gymnast",
related_name="injuries",
on_delete=models.CASCADE,
)
skill = models.ForeignKey(
"objective.Skill",
verbose_name="Skill",
related_name="injuries",
on_delete=models.SET_NULL,
default=None,
blank=True,
null=True,
)
location = models.SmallIntegerField(
choices=INJURY_LOCATION_CHOICE, verbose_name="Location"
)
injury_type = models.SmallIntegerField(
choices=INJURY_TYPE_CHOICE, verbose_name="Type"
)
body_side = models.PositiveSmallIntegerField(
choices=INJURY_BODY_SIDE_CHOICE, verbose_name="Body side"
)
mechanism = models.PositiveSmallIntegerField(
choices=INJURY_MECHANISM_CHOICE, verbose_name="Mechanism"
)
nb_week_off = models.SmallIntegerField(
blank=True, null=True, verbose_name="# week off"
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# def __str__(self): def __str__(self):
# return f"{self.label}" return f"{self.gymnast} ({self.date})"
def timeline_representation(self):
# class Injury(Markdownizable, Seasonisable): return f"<li>{self.date:%d %b %Y} - Accident ({self.skill}): {self.nb_week_off} (weeks off)</li>"
# """
# La classe `Injury` permet d'indiquer qu'un gymnaste a eu un blessure, en liaison avec un
# skill ou non.
# """
# class Meta:
# verbose_name = "Injury"
# verbose_name_plural = "Injuries"
# # unique_together = ("gymnast", "skill", "date")
# gymnast = models.ForeignKey(
# Gymnast,
# verbose_name="Gymnast",
# related_name="injuries",
# on_delete=models.CASCADE,
# )
# skill = models.ForeignKey(
# "objective.Skill",
# verbose_name="Skill",
# related_name="injuries",
# on_delete=models.SET_NULL,
# default=None,
# blank=True,
# null=True,
# )
# location = models.ForeignKey(
# InjuryLocation,
# verbose_name="Location",
# related_name="injuries",
# on_delete=models.CASCADE,
# )
# injury_type = models.SmallIntegerField(
# choices=INJURY_TYPE_CHOICE, verbose_name="Injury type"
# )
# body_side = models.PositiveSmallIntegerField(
# choices=INJURY_BODY_SIDE_CHOICE, verbose_name="Body side"
# )
# mechanism = models.PositiveSmallIntegerField(
# choices=INJURY_MECHANISM_CHOICE, verbose_name="Injury mechanism"
# )
# nb_week_off = models.SmallIntegerField(
# blank=True, null=True, verbose_name="# week off"
# )
# created_at = models.DateTimeField(auto_now_add=True)
# updated_at = models.DateTimeField(auto_now=True)
# def __str__(self):
# return f"{self.gymnast} ({self.date})"
# def timeline_representation(self):
# return f"<li>{self.date:%d %b %Y} - Accident ({self.skill}): {self.nb_week_off} (weeks off)</li>"
class LearnedSkill(Seasonisable): class LearnedSkill(Seasonisable):

View File

@ -19,7 +19,7 @@ from .models import (
Note, Note,
Point, Point,
Chrono, Chrono,
# Injury, Injury,
WellBeing, WellBeing,
Intensity, Intensity,
LearnedSkill, LearnedSkill,
@ -35,7 +35,7 @@ from .forms import (
NoteForm, NoteForm,
ScoreForm, ScoreForm,
ChronoForm, ChronoForm,
# InjuryForm, InjuryForm,
WellBeingForm, WellBeingForm,
IntensityForm, IntensityForm,
HeightWeightForm, HeightWeightForm,

View File

@ -35,7 +35,7 @@ from jarvis.followup.models import (
Skill, Skill,
Point, Point,
Chrono, Chrono,
# Injury, Injury,
WellBeing, WellBeing,
Intensity, Intensity,
LearnedSkill, LearnedSkill,
@ -287,7 +287,7 @@ def gymnast_display_injury(request, gymnast_id):
Args: Args:
gymnast_id (int) identifiant du gymnast gymnast_id (int) identifiant du gymnast
""" """
injuries_list = None # Injury.objects.filter(gymnast=gymnast_id) injuries_list = Injury.objects.filter(gymnast=gymnast_id)
context = {"injuries_list": injuries_list, "gymnast_id": gymnast_id} context = {"injuries_list": injuries_list, "gymnast_id": gymnast_id}
return render(request, "gymnasts/list_injury.html", context) return render(request, "gymnasts/list_injury.html", context)
@ -301,7 +301,7 @@ def gymnast_display_physiological(request, gymnast_id):
Args: Args:
gymnast_id (int) identifiant du gymnast gymnast_id (int) identifiant du gymnast
""" """
injuries_list = None # Injury.objects.filter(gymnast=gymnast_id).order_by("date") injuries_list = Injury.objects.filter(gymnast=gymnast_id).order_by("date")
wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id).order_by("date") wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id).order_by("date")
height_weight_list = HeightWeight.objects.filter(gymnast=gymnast_id).order_by( height_weight_list = HeightWeight.objects.filter(gymnast=gymnast_id).order_by(
"date" "date"