Merge branch 'seasonable'

This commit is contained in:
Gregory Trullemans 2022-10-12 14:00:09 +02:00
commit eba366e55a
10 changed files with 266 additions and 27 deletions

View File

@ -22,7 +22,14 @@
</div>
</div>
<div class="form-group row ">
<label for="id_information" class="col-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 col-form-label">Informations</label>
<label for="id_date" class="col-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 col-form-label">Date <span class="text-danger"><b>*</b></span></label>
<div class="col-8 col-sm-6 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_information" class="col-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 col-form-label">Informations <span class="text-danger"><b>*</b></span></label>
<div class="col-8 col-sm-10 col-md-10 col-lg-10 col-xl-10 {% if form.id_informations.errors %}has-danger{% endif %}">
{{ form.informations }}
</div>

View File

@ -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",
@ -145,6 +145,7 @@ class HeightWeightAdmin(admin.ModelAdmin):
model = HeightWeight
list_display = ("gymnast", "height", "hips_height", "weight", "date")
readonly_fields = ('season', 'week_number')
list_filter = (
('gymnast', RelatedDropdownFilter),
)
@ -156,7 +157,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 +176,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),

View File

@ -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",

View File

@ -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,
),
]

View File

@ -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),
),
]

View File

@ -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"
),
),
]

View File

@ -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
"""

View File

@ -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)

View File

@ -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

View File

@ -4,8 +4,36 @@ from django.db import models
from django.utils import timezone
from datetime import date
from .date_week_transition import (
get_number_of_weeks_between,
from_date_to_week_number,
)
import markdown
from .date_week_transition import get_number_of_weeks_between
import pendulum
def get_default_date():
return pendulum.now().date()
class Seasonisable(models.Model):
""" """
class Meta:
abstract = True
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 None:
self.date = get_default_date()
self.season, self.week_number = from_date_to_week_number(self.date)
super().save(*args, **kwargs)
class TemporizableQuerySet(models.QuerySet):
"""