diff --git a/templates/followup/notes/create.html b/templates/followup/notes/create.html
index 2f30e953cb..22087c6701 100644
--- a/templates/followup/notes/create.html
+++ b/templates/followup/notes/create.html
@@ -22,7 +22,14 @@
+
{{ form.informations }}
diff --git a/ultron/followup/admin.py b/ultron/followup/admin.py
index 8ea8f1cef7..404a524451 100644
--- a/ultron/followup/admin.py
+++ b/ultron/followup/admin.py
@@ -25,7 +25,7 @@ class ChronoAdmin(admin.ModelAdmin):
model = Chrono
list_display = ("date", "gymnast", "tof", "chrono_type")
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_filter = ("chrono_type",)
autocomplete_fields = ("gymnast",)
date_hierarchy = "date"
@@ -47,7 +47,7 @@ class LearnedSkillAdmin(admin.ModelAdmin):
model = LearnedSkill
list_display = ("gymnast", "skill", "cando", "date")
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_filter = (
('gymnast', RelatedDropdownFilter),
('skill', RelatedDropdownFilter),
@@ -89,7 +89,7 @@ class AccidentAdmin(admin.ModelAdmin):
model = Accident
fields = ("date", "gymnast", "skill", "informations") # educative
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_display = ("date", "gymnast", "skill") # educative
list_filter = ("date",)
date_hierarchy = "date"
@@ -101,7 +101,7 @@ class MindStateAdmin(admin.ModelAdmin):
model = MindState
fields = ("gymnast", "date", "score", "informations")
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_display = ("date", "gymnast", "score")
list_filter = (
"date",
@@ -156,7 +156,7 @@ class PlanAdmin(admin.ModelAdmin):
model = Plan
list_display = ("gymnast", "date", "educative")
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_filter = (
('gymnast', RelatedDropdownFilter),
('educative', RelatedDropdownFilter),
@@ -175,7 +175,7 @@ class NoteAdmin(admin.ModelAdmin):
model = Note
list_display = ("gymnast", "coach")
- readonly_fields = ('created_at', 'updated_at')
+ readonly_fields = ('season', 'week_number', 'created_at', 'updated_at')
list_filter = (
('gymnast', RelatedDropdownFilter),
('coach', RelatedDropdownFilter),
diff --git a/ultron/followup/forms.py b/ultron/followup/forms.py
index 5832d79ad1..f8e20dd064 100644
--- a/ultron/followup/forms.py
+++ b/ultron/followup/forms.py
@@ -484,11 +484,18 @@ class PlanForm(forms.ModelForm):
class NoteForm(forms.ModelForm):
class Meta:
model = Note
- fields = ("gymnast", "coach", "status", "informations")
+ fields = ("gymnast", "coach", "status", "informations", "date")
widgets = {
"gymnast": forms.HiddenInput(),
"coach": forms.HiddenInput(),
"status": forms.Select(attrs={"class": "form-control selectpicker"}),
+ "date": forms.TextInput(
+ attrs={
+ "class": "form-control datepicker",
+ "placeholder": date.today().strftime("%Y-%m-%d"),
+ "value": date.today().strftime("%Y-%m-%d"),
+ }
+ ),
"informations": forms.Textarea(
attrs={
"class": "form-control",
diff --git a/ultron/followup/migrations/0025_note_date_note_season_note_week_number.py b/ultron/followup/migrations/0025_note_date_note_season_note_week_number.py
new file mode 100644
index 0000000000..01c5f031e9
--- /dev/null
+++ b/ultron/followup/migrations/0025_note_date_note_season_note_week_number.py
@@ -0,0 +1,33 @@
+# Generated by Django 4.1.1 on 2022-10-12 08:37
+
+from django.db import migrations, models
+import ultron.tools.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("followup", "0024_rename_note_type_note_status"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="note",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AddField(
+ model_name="note",
+ name="season",
+ field=models.CharField(default="2022-2023", max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="note",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1),
+ preserve_default=False,
+ ),
+ ]
diff --git a/ultron/followup/migrations/0026_alter_note_season_alter_note_week_number.py b/ultron/followup/migrations/0026_alter_note_season_alter_note_week_number.py
new file mode 100644
index 0000000000..8909491e1a
--- /dev/null
+++ b/ultron/followup/migrations/0026_alter_note_season_alter_note_week_number.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.1.1 on 2022-10-12 08:58
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("followup", "0025_note_date_note_season_note_week_number"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="note",
+ name="season",
+ field=models.CharField(editable=False, max_length=9),
+ ),
+ migrations.AlterField(
+ model_name="note",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(editable=False),
+ ),
+ ]
diff --git a/ultron/followup/migrations/0027_accident_season_accident_week_number_chrono_season_and_more.py b/ultron/followup/migrations/0027_accident_season_accident_week_number_chrono_season_and_more.py
new file mode 100644
index 0000000000..f3915c3fd1
--- /dev/null
+++ b/ultron/followup/migrations/0027_accident_season_accident_week_number_chrono_season_and_more.py
@@ -0,0 +1,147 @@
+# Generated by Django 4.1.1 on 2022-10-12 09:03
+
+from django.db import migrations, models
+import ultron.tools.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("followup", "0026_alter_note_season_alter_note_week_number"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="accident",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="accident",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="chrono",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="chrono",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="heightweight",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="heightweight",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="learnedskill",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="learnedskill",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="mindstate",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="mindstate",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="numberofroutinedone",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="numberofroutinedone",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="plan",
+ name="season",
+ field=models.CharField(default="2022-2023", editable=False, max_length=9),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name="plan",
+ name="week_number",
+ field=models.PositiveSmallIntegerField(default=1, editable=False),
+ preserve_default=False,
+ ),
+ migrations.AlterField(
+ model_name="accident",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="chrono",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="heightweight",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="learnedskill",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="mindstate",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="numberofroutinedone",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ migrations.AlterField(
+ model_name="plan",
+ name="date",
+ field=models.DateField(
+ default=ultron.tools.models.get_default_date, verbose_name="Date"
+ ),
+ ),
+ ]
diff --git a/ultron/followup/models.py b/ultron/followup/models.py
index 2a47ef1f5d..0f53e5b13b 100644
--- a/ultron/followup/models.py
+++ b/ultron/followup/models.py
@@ -4,7 +4,7 @@ User = get_user_model()
from datetime import date
-from ultron.tools.models import Markdownizable
+from ultron.tools.models import Markdownizable, Seasonisable
from ultron.people.models import Gymnast
from ultron.planning.models import Event
from ultron.objective.models import Educative, Skill, Routine
@@ -30,7 +30,7 @@ CAN_DO_TYPE_CHOICES = (
)
-class Chrono(models.Model):
+class Chrono(Seasonisable):
"""
Représente les chronos (de chandelles ou de série) enregistrés pour un(e) gymnaste.
"""
@@ -68,7 +68,6 @@ class Chrono(models.Model):
)
score = models.DecimalField(max_digits=5, decimal_places=3)
tof = models.DecimalField(max_digits=5, decimal_places=3, blank=True, null=True)
- date = models.DateField(default=date.today, verbose_name="Date")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@@ -102,7 +101,7 @@ class ChronoDetails(models.Model):
value = models.DecimalField(max_digits=5, decimal_places=3)
-class Accident(Markdownizable):
+class Accident(Markdownizable, Seasonisable):
"""
La classe `Accident` permet d'indiquer qu'un gymnaste a eu un accident, en liaison avec un
skill ou non.
@@ -128,7 +127,6 @@ class Accident(Markdownizable):
blank=True,
null=True,
)
- date = models.DateField(verbose_name="Date")
nb_week_off = models.SmallIntegerField(
blank=True, null=True, verbose_name="# week off"
)
@@ -142,7 +140,7 @@ class Accident(Markdownizable):
)
-class LearnedSkill(models.Model):
+class LearnedSkill(Seasonisable):
"""
Représente la capacité d'un gymnaste à savori faire un skill de la ligne d'apprentissage.
"""
@@ -167,12 +165,11 @@ class LearnedSkill(models.Model):
cando = models.PositiveSmallIntegerField(
choices=CAN_DO_TYPE_CHOICES, verbose_name="Can do type"
)
- date = models.DateField(default=date.today, verbose_name="Date")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
-class Plan(models.Model):
+class Plan(Seasonisable):
"""
Classe représentant les objectifs qu'un gymnaste devra savoir faire pour une date donnée.
"""
@@ -195,7 +192,6 @@ class Plan(models.Model):
related_name="plan",
on_delete=models.CASCADE,
)
- date = models.DateField(default=date.today, verbose_name="Date")
cando = models.PositiveSmallIntegerField(
choices=CAN_DO_TYPE_CHOICES, verbose_name="Can do type", default=3
)
@@ -243,7 +239,7 @@ class Point(models.Model):
)
-class MindState(Markdownizable):
+class MindState(Markdownizable, Seasonisable):
"""
Représente l'état d'esprit psychologique d'un gymnaste
"""
@@ -251,7 +247,6 @@ class MindState(Markdownizable):
gymnast = models.ForeignKey(
Gymnast, on_delete=models.CASCADE, default=None, related_name="mindstate"
)
- date = models.DateField(default=date.today, verbose_name="Date")
event = models.ForeignKey(
Event,
on_delete=models.SET_NULL,
@@ -302,7 +297,7 @@ class GymnastHasRoutine(models.Model):
return "%s - %s : %s" % (self.gymnast, self.routine_type, self.routine)
-class NumberOfRoutineDone(models.Model):
+class NumberOfRoutineDone(Seasonisable):
"""
Classe permettant de suivre le nombre de séries faites par le gymnaste.
"""
@@ -332,7 +327,6 @@ class NumberOfRoutineDone(models.Model):
number_of_successes = models.PositiveSmallIntegerField(
verbose_name="number of successes", default=0
)
- date = models.DateField(default=date.today, verbose_name="Date")
def __str__(self):
return "%s - %s (%s) : %s | %s" % (
@@ -344,7 +338,7 @@ class NumberOfRoutineDone(models.Model):
)
-class HeightWeight(models.Model):
+class HeightWeight(Seasonisable):
"""
Classe permettant de suivre le poids et la taille d'un gymnaste
"""
@@ -363,13 +357,12 @@ class HeightWeight(models.Model):
height = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Height")
hips_height = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Hips height")
weight = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Weight")
- date = models.DateField(default=date.today, verbose_name="Date")
def __str__(self):
return "%s : %s/%s - %s" % (self.gymnast, self.height, self.hips_height, self.weight)
-class Note(Markdownizable):
+class Note(Markdownizable, Seasonisable):
"""
Notes relatives à un gymnaste
"""
diff --git a/ultron/followup/views.py b/ultron/followup/views.py
index 4c9dfe61ff..93298242e7 100644
--- a/ultron/followup/views.py
+++ b/ultron/followup/views.py
@@ -160,8 +160,6 @@ def note_create_or_update(request, note_id=None, gymnast_id=None):
data["gymnast"] = gymnast_id
data["gymnast_related"] = str(gymnast)
- # print(data)
-
if request.method == "POST":
form = NoteForm(request.POST, instance=note)
diff --git a/ultron/tools/date_week_transition.py b/ultron/tools/date_week_transition.py
index e7bec0526b..656d965c65 100644
--- a/ultron/tools/date_week_transition.py
+++ b/ultron/tools/date_week_transition.py
@@ -126,6 +126,8 @@ def from_date_to_week_number(the_date=None):
if the_date is None:
the_date = pendulum.today().date()
+ else:
+ the_date = pendulum.parse(the_date.strftime("%Y%m%d"))
number_of_year_week = the_date.week_of_year
if the_date.month >= 9: # nouvelle saison
diff --git a/ultron/tools/models.py b/ultron/tools/models.py
index 7f9ef9c54b..0e76419f22 100644
--- a/ultron/tools/models.py
+++ b/ultron/tools/models.py
@@ -11,21 +11,27 @@ from .date_week_transition import (
import markdown
import pendulum
+
+def get_default_date():
+ return pendulum.now().date()
+
+
class Seasonisable(models.Model):
""" """
class Meta:
abstract = True
- date = models.DateField(default=pendulum.now().date, verbose_name="Date")
- season = models.CharField(max_length=9)
- week_number = models.PositiveSmallIntegerField()
+ date = models.DateField(default=get_default_date, verbose_name="Date")
+ season = models.CharField(max_length=9, editable=False)
+ week_number = models.PositiveSmallIntegerField(editable=False)
def save(self, *args, **kwargs):
""" Calcule les valeurs `season` et `week_number` sur base d'une date lors de l'
enregistrement d'un object enfant.
"""
- if self.date is not None:
- self.season, self.week_number = from_date_to_week_number(self.date)
+ if self.date is None:
+ self.date = get_default_date()
+ self.season, self.week_number = from_date_to_week_number(self.date)
super().save(*args, **kwargs)