[WIP] Reviews planning application

This commit is contained in:
Fred Pauchet 2020-10-20 11:47:36 +02:00
parent 8855348ef6
commit 0419a5e731
7 changed files with 71 additions and 54 deletions

View File

@ -1,6 +1,9 @@
# coding=UTF-8 """Administration des plannings, évènements et saisons."""
from django.contrib import admin from django.contrib import admin
from django_extensions.admin import ForeignKeyAutocompleteAdmin
from .models import ( from .models import (
EventType, EventType,
Event, Event,
@ -14,19 +17,17 @@ from .models import (
Round, Round,
PlanningLine, PlanningLine,
) )
from django_extensions.admin import ForeignKeyAutocompleteAdmin
def duplicate_record(modeladmin, request, queryset): def duplicate_record(modeladmin, request, queryset):
""" """*Custom action* permettant de dupliquer plusieurs enregistrements.
Duplication de record sélectionner.
""" """
for object in queryset: for object in queryset:
object.id = None object.id = None
object.save() object.save()
duplicate_record.short_description = "Duplicate selected record" duplicate_record.short_description = "Duplicate selected records"
class SeasonAdmin(admin.ModelAdmin): class SeasonAdmin(admin.ModelAdmin):

View File

@ -1,11 +1,11 @@
# coding=UTF-8
from datetime import date
from django import forms from django import forms
from datetime import date
from .models import Unavailability, Event, PlanningLine
from people.models import Gymnast
from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.admin.widgets import FilteredSelectMultiple
from people.models import Gymnast
from .models import Unavailability, Event, PlanningLine
class UnavailabilityForm(forms.ModelForm): class UnavailabilityForm(forms.ModelForm):
class Meta: class Meta:

View File

@ -1,18 +1,23 @@
# coding=UTF-8
from django.db import models from datetime import datetime, date, time, timedelta
from django.contrib.auth.models import User from django.contrib.auth.models import User
from datetime import datetime, date, time from django.db import models
from base.models import Markdownizable
from django.utils import timezone from django.utils import timezone
from people.models import Gymnast
from location.models import Club
from datetime import datetime, timedelta
import pendulum import pendulum
from base.models import Markdownizable
from location.models import Club
from people.models import Gymnast
def get_week(a_date): def get_week(a_date):
""" """
Remarks:
Je ne comprends pas trop cette fonction...
Tu pars d'une date, et tu récupères le lundi et le samedi de la semaine correspondant ?
""" """
the_date = pendulum.parse(a_date) the_date = pendulum.parse(a_date)
day = the_date.weekday() day = the_date.weekday()
@ -33,6 +38,18 @@ def get_number_of_weeks_between(start, stop):
:param stop: date de fin de la période :param stop: date de fin de la période
:type stop: datetime.date :type stop: datetime.date
:return: Le nombre de semaines entre les deux dates. :return: Le nombre de semaines entre les deux dates.
Remarks:
Proposition d'utiliser isocalendar() sur une date.
L'indice 1 de la valeur de retour donne la semaine correspondant.
Eg.
>>> from datetime import date
>>> d = date(2020, 9, 27)
>>> d.isocalendar()
(2020, 39, 7)
-> Est-ce qu'il ne suffirait pas de faire la différence ?
""" """
tmp = stop - start tmp = stop - start
@ -87,9 +104,8 @@ class TemporizableQuerySet(models.QuerySet):
class Temporizable(models.Model): class Temporizable(models.Model):
""" """Classe abstraite définissant une période comprise entre deux dates.
Classe abstraite définissant deux dates (une da te de début, une date de
fin) et des méthodes de calculs sur base de ces dates.
""" """
class Meta: class Meta:
@ -198,12 +214,13 @@ class EventType(models.Model):
class Event(Markdownizable, Temporizable): class Event(Markdownizable, Temporizable):
""" """Classe représentant les évènements.
Classe représentant les évènements. Un évènement est caractèrisé par :
- un nom, Un évènement est caractérisé par :
- un lieu (place), * un nom,
- un type (compétition, démonstration, ), * un lieu (place),
- des gymnastes (participation prévue). * un type (compétition, démonstration, ),
* des gymnastes (participation prévue).
Je ne me rapelle plus à quoi sert le club. Je ne me rapelle plus à quoi sert le club.
""" """
@ -257,14 +274,15 @@ class Event_Participation(models.Model):
class Course(Markdownizable, Temporizable): class Course(Markdownizable, Temporizable):
""" """Classe représentant les cours.
Classe représentant les cours. Un cours est défini par :
- une heure de début et une heure de fin, Un cours est défini par :
- une date de début et une date de fin (un cours est considéré comme donné hebdromadairement entre * une heure de début et une heure de fin,
* une date de début et une date de fin (un cours est considéré comme donné hebdromadairement entre
ces deux dates) (hérite de la classe `Temporizable`) ces deux dates) (hérite de la classe `Temporizable`)
- est associé à un ou plusieurs entraineurs, * est associé à un ou plusieurs entraineurs,
- est associé à un club * est associé à un club
- est associé à un jour de la semaine (numéro du jour dans la semaine : 0 = lundi, 6 = dimanche). * est associé à un jour de la semaine (numéro du jour dans la semaine : 0 = lundi, 6 = dimanche).
""" """
class Meta: class Meta:
@ -319,8 +337,7 @@ class Course(Markdownizable, Temporizable):
class Group(models.Model): class Group(models.Model):
""" """Classe représentant les groupes (Loisir, D1, D2, A, B, …).
Classe représentant les groupes (Loisir, D1, D2, A, B, ).
Un groupe appartient à un club. Un groupe appartient à un club.
""" """
@ -343,10 +360,12 @@ class Group(models.Model):
class Subgroup(models.Model): class Subgroup(models.Model):
""" """Classe représentant les sous-groupes.
Classe représentant les sous-groupes.
Un sous-groupe appartient à un groupe (lui-même lié à un club). De la sorte, quand un gymnaste est mis dans un sous-groupe, en remontant via le groupe, nous pouvons connaître le(s) club(s) du gymnaste pour chaque saison. Un sous-groupe appartient à un groupe (lui-même lié à un club).
De cette manière, quand un gymnaste est mis dans un sous-groupe, en remontant via le groupe,
nous pouvons connaître le(s) club(s) du gymnaste pour chaque saison.
""" """
class Meta: class Meta:
@ -367,8 +386,7 @@ class Subgroup(models.Model):
class UnavailabilityManager(models.Manager): class UnavailabilityManager(models.Manager):
""" """Classe représentant le manager de la classe `Unavailability`.
Classe représentant le manager de la classe `Unavailability`.
""" """
def next(self, count): def next(self, count):
@ -379,8 +397,7 @@ class UnavailabilityManager(models.Manager):
class Unavailability(Markdownizable, Temporizable): class Unavailability(Markdownizable, Temporizable):
""" """Classe représentant les indisponibilités.
Classe représentant les indisponibilités.
""" """
class Meta: class Meta:
@ -405,10 +422,11 @@ class Unavailability(Markdownizable, Temporizable):
class Training(models.Model): class Training(models.Model):
""" """Classe représentant les entraînements.
Classe représentant les entraînements. Un entraînement est une occurence
d'un cours auquel sont présent des gymnastes pour une date donnée. Un objet Un entraînement est une occurence d'un cours pendant lequel des gmnastes sont présents.
de cette classe lie donc un cours et un gymnaste à une date donnée.
Un objet de cette classe lie donc un cours et un gymnaste à une date donnée.
""" """
class Meta: class Meta:
@ -441,9 +459,9 @@ class Training(models.Model):
class Round(Markdownizable): class Round(Markdownizable):
""" """Classe représentant les passages des élèves lors d'un entrainement.
Classe représentant les passages des élèves lors d'un entrainement. Chaque record
représente un passage. Il est donc lié à un record de la classe `Training`. Chaque record représente un passage. Il est donc lié à un record de la classe `Training`.
""" """
class Meta: class Meta:
@ -483,8 +501,7 @@ class Round(Markdownizable):
class PlanningLine(Markdownizable): class PlanningLine(Markdownizable):
""" """Classe représentant les passages prévisionnels (incubating idea).
Classe représentant les passages prévisionnels (incubating idea).
""" """
class Meta: class Meta:

View File

View File

@ -1,12 +1,13 @@
# coding: utf-8
from datetime import datetime from datetime import datetime
from django.test import TestCase from django.test import TestCase
from .models import get_number_of_weeks_between, Season from ..models import get_number_of_weeks_between, Season
class TestUtils(TestCase): class TestUtils(TestCase):
def test_get_number_of_weeks(self): def test_get_number_of_weeks(self):
"""Evalue le nombre de semaines qu'il y a entre deux dates.
"""
x = datetime(2016, 1, 1) x = datetime(2016, 1, 1)
y = datetime(2016, 2, 5) y = datetime(2016, 2, 5)
z = datetime(2016, 2, 4) z = datetime(2016, 2, 4)

View File

@ -1,4 +1,3 @@
# coding=UTF-8
from django.urls import path, re_path from django.urls import path, re_path

View File

@ -1,4 +1,3 @@
# coding=UTF-8
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from django.http import ( from django.http import (