Compare commits
2 Commits
main
...
review/obj
Author | SHA1 | Date |
---|---|---|
Fred Pauchet | 485a83ec08 | |
Fred Pauchet | bf9bfa24d6 |
|
@ -1,6 +1,7 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from django_extensions.admin import ForeignKeyAutocompleteAdmin
|
||||
|
||||
from .models import (
|
||||
Educative,
|
||||
TouchPosition,
|
||||
|
@ -9,7 +10,6 @@ from .models import (
|
|||
Routine_Skill,
|
||||
Chrono,
|
||||
)
|
||||
from django_extensions.admin import ForeignKeyAutocompleteAdmin
|
||||
|
||||
|
||||
class TouchPositionAdmin(admin.ModelAdmin):
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# coding=UTF-8
|
||||
"""Formulaires d'édition des éducatifs, séries et compétences."""
|
||||
|
||||
from datetime import date
|
||||
|
||||
from django import forms
|
||||
from datetime import date
|
||||
|
||||
from .models import Routine, Routine_Skill, Chrono
|
||||
|
||||
|
||||
|
@ -12,10 +14,10 @@ class RoutineForm(forms.ModelForm):
|
|||
widgets = {
|
||||
# Champs obligatoires de la classe mère.
|
||||
"longLabel": forms.TextInput(
|
||||
attrs={"class": "form-control", "placeholder": "Routine's long name"}
|
||||
attrs={"class": "form-control", "placeholder": "Routine long name"}
|
||||
),
|
||||
"shortLabel": forms.TextInput(
|
||||
attrs={"class": "form-control", "placeholder": "Routine's short name"}
|
||||
attrs={"class": "form-control", "placeholder": "Routine short name"}
|
||||
),
|
||||
"difficulty": forms.HiddenInput(),
|
||||
"level": forms.HiddenInput(),
|
||||
|
|
|
@ -1,21 +1,33 @@
|
|||
# coding=UTF-8
|
||||
"""Modélisation des éducatifs, objectifs et des compétences."""
|
||||
|
||||
from datetime import date
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db.models import Q
|
||||
|
||||
from base.models import Markdownizable
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
class Educative(Markdownizable):
|
||||
"""
|
||||
Classe `mère`.
|
||||
"""Un éducatif représente une étape d'apprentissage.
|
||||
|
||||
Elle sert de classe "mère" pour toutes les autres choses pouvant être apprises.
|
||||
|
||||
Elle est décrite par:
|
||||
* Un libellé court et long
|
||||
* Une difficulté
|
||||
* Un niveau
|
||||
* Des prérequis à réaliser
|
||||
* Un âge minimum auquel il peut être réalisé, suivant que le gymnaste soit une fille ou un garçon
|
||||
|
||||
Un éducatif peut être lié à plusieurs autres éducatifs.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Educatif"
|
||||
verbose_name_plural = "Educatifs"
|
||||
ordering = ["longLabel", "shortLabel"] # 'level',
|
||||
ordering = ["longLabel", "shortLabel"]
|
||||
|
||||
longLabel = models.CharField(max_length=255, verbose_name="Long Name")
|
||||
shortLabel = models.CharField(max_length=255, verbose_name="Short Name")
|
||||
|
@ -47,8 +59,9 @@ class Educative(Markdownizable):
|
|||
|
||||
|
||||
class TouchPosition(models.Model):
|
||||
"""
|
||||
Classe représentant les différentes position d'arrivée/départ (landing position) en trampoline.
|
||||
"""Représentation des différentes positions d'arrivée et de départ en trampoline.
|
||||
|
||||
Cette classe fait référence aux *landing positions*.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
|
@ -76,13 +89,14 @@ def get_default_position():
|
|||
|
||||
|
||||
class Skill(Educative):
|
||||
"""
|
||||
Classe représentant une figure (aka un saut acrobatique).
|
||||
"""
|
||||
"""Les `skills` représentent une figure ou un saut acrobatique.
|
||||
|
||||
# SELECT * FROM `objective_skill` WHERE educative_ptr_id NOT IN (SELECT DISTINCT(from_educative_id) FROM `objective_educative_prerequisite`)
|
||||
Chaque saut est caractérisé par:
|
||||
* Une position de départ
|
||||
* Une position d'arrivée
|
||||
* Un type de rotation
|
||||
|
||||
# SELECT * FROM `objective_skill`, `objective_educative` WHERE `objective_educative`.id = `objective_skill`.educative_ptr_id
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Skill"
|
||||
|
@ -134,9 +148,7 @@ class Skill(Educative):
|
|||
|
||||
|
||||
class Routine(Educative):
|
||||
"""
|
||||
Classe représentant une série (enchainement de plusieurs figures).
|
||||
"""
|
||||
"""Une routine représente une série, càd un enchaînement de plusieurs figures."""
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Routine"
|
||||
|
@ -145,7 +157,7 @@ class Routine(Educative):
|
|||
active = models.BooleanField()
|
||||
jumps = models.ManyToManyField(
|
||||
Skill, through="Routine_Skill", verbose_name="routine"
|
||||
) # ceci n'est pas un vrai champ
|
||||
) # ceci n'est pas un vrai champ (- Magritte ?)
|
||||
is_competitive = models.BooleanField(default=False)
|
||||
|
||||
def __str__(self):
|
||||
|
@ -232,10 +244,9 @@ class Routine_Skill(models.Model):
|
|||
|
||||
|
||||
class Chrono(models.Model):
|
||||
"""
|
||||
Classe représentant le temps réalisé par un élève pour faire une série.
|
||||
"""Représentation du temps demandé à un gymnaste pour réaliser une série.
|
||||
|
||||
.. todo:: lors de l'affichage, aller chercher les ToF contenu dans les points de compétition (avec traitement adéquat).
|
||||
TODO: lors de l'affichage, aller chercher les ToF contenu dans les points de compétition (avec traitement adéquat).
|
||||
"""
|
||||
|
||||
ROUTINETYPE_CHOICE = (
|
||||
|
@ -274,8 +285,7 @@ class Chrono(models.Model):
|
|||
|
||||
|
||||
class Evaluation(models.Model):
|
||||
"""
|
||||
Classe permettant l'évaluation des éducatifs.
|
||||
"""Evaluation d'un éducatif par un utilisateur.
|
||||
"""
|
||||
|
||||
date = models.DateField(default=date.today, verbose_name="Date")
|
||||
|
|
|
@ -1,15 +1,26 @@
|
|||
# coding=UTF-8
|
||||
"""Tests des routines, éducatifs, compétences, ..."""
|
||||
|
||||
from django.urls import reverse
|
||||
from django.test import TestCase, Client
|
||||
from django.urls import reverse
|
||||
|
||||
from .models import Routine_Skill, Routine, Skill, TouchPosition
|
||||
from .views import link_skill_to_routine
|
||||
|
||||
|
||||
class RoutineTest(TestCase):
|
||||
"""Tests unitaires liés aux séries.
|
||||
|
||||
Attributes:
|
||||
routine (Routine)
|
||||
touch_position (TouchPosition)
|
||||
skill (Skill)
|
||||
client (django.test.Client)
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
self.routine, routine_created = Routine.objects.get_or_create(
|
||||
"""Instancie une série (*routine*), des TouchPositions, ...
|
||||
"""
|
||||
self.routine, _ = Routine.objects.get_or_create(
|
||||
longLabel="Routine test",
|
||||
shortLabel="Routine test",
|
||||
difficulty=0,
|
||||
|
@ -17,14 +28,14 @@ class RoutineTest(TestCase):
|
|||
)
|
||||
(
|
||||
self.touch_position,
|
||||
touch_position_created,
|
||||
_,
|
||||
) = TouchPosition.objects.get_or_create(
|
||||
longLabel="Touch test",
|
||||
shortLabel="Touch test",
|
||||
competition=True,
|
||||
default=True,
|
||||
)
|
||||
self.skill, skill_created = Skill.objects.get_or_create(
|
||||
self.skill, _ = Skill.objects.get_or_create(
|
||||
longLabel="Skill test",
|
||||
shortLabel="Skill test",
|
||||
difficulty=0,
|
||||
|
@ -38,17 +49,19 @@ class RoutineTest(TestCase):
|
|||
simplyNotation="t",
|
||||
)
|
||||
self.client = Client()
|
||||
self.url_details = {
|
||||
|
||||
def test_valid_link_skill_to_routine(self):
|
||||
"""Vérifie que l'association d'un Skill à une série fonctionne correctement.
|
||||
"""
|
||||
url_details = {
|
||||
"routineid": self.routine.id,
|
||||
"skillid": self.skill.id,
|
||||
"order": 1,
|
||||
}
|
||||
|
||||
def test_valid_link_skill_to_routine(self):
|
||||
c = Client()
|
||||
url = reverse("link_skill_to_routine", kwargs=self.url_details)
|
||||
response = c.get(url)
|
||||
url = reverse("link_skill_to_routine", kwargs=url_details)
|
||||
|
||||
response = self.client.get(url)
|
||||
|
||||
# print(response)
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertTrue(Routine_Skill.objects.exists())
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
# coding=UTF-8
|
||||
"""Définition des URLs associées à l'application `objective`.
|
||||
|
||||
Il existe trois grandes rubriques pour cette application:
|
||||
|
||||
* chrono
|
||||
* skill
|
||||
* routine
|
||||
"""
|
||||
|
||||
from django.urls import path, re_path
|
||||
|
||||
|
@ -46,7 +53,7 @@ routine_urlpatterns = [
|
|||
r"suggest/",
|
||||
views.suggest_routine,
|
||||
name="suggest_routine",
|
||||
)
|
||||
),
|
||||
]
|
||||
|
||||
# Chrono
|
||||
|
|
|
@ -48,8 +48,7 @@ def __lookup(lookup_class, lookup_value):
|
|||
|
||||
@login_required
|
||||
def skill_listing(request, field=None, expression=None, value=None, level=None):
|
||||
"""
|
||||
Récupère la liste des skills suivant un pattern si celui-ci est définit.
|
||||
"""Récupère la liste des skills suivant un pattern si celui-ci est défini.
|
||||
"""
|
||||
|
||||
pattern = None
|
||||
|
@ -116,8 +115,7 @@ def skill_detail(request, skillid):
|
|||
@login_required
|
||||
@require_http_methods(["POST"])
|
||||
def linkSkillGymnast(request):
|
||||
"""
|
||||
Lie un gymnast à une figure.
|
||||
"""Lie un gymnaste à une figure.
|
||||
"""
|
||||
# utiliser un FORM pour cette fonction.
|
||||
gymnastid = request.POST.get("gymnastid", None)
|
||||
|
|
Loading…
Reference in New Issue