diff --git a/followup/urls.py b/followup/urls.py index 16d387c3a4..f2f4251512 100644 --- a/followup/urls.py +++ b/followup/urls.py @@ -6,7 +6,7 @@ chrono_urlpatterns = [ path(r"", views.chrono_listing, name='chrono_list'), path(r"create/", views.chrono_create_or_update, name='chrono_create'), path(r"create//", views.chrono_create_or_update, name='chrono_create'), - path(r"edit/", views.chrono_create_or_update, name="chrono_update"), + path(r"edit//", views.chrono_create_or_update, name="chrono_update"), ] skill_urlpatterns = [ diff --git a/jumpers/forms.py b/jumpers/forms.py new file mode 100644 index 0000000000..2e3855d375 --- /dev/null +++ b/jumpers/forms.py @@ -0,0 +1,42 @@ +"""Formulaires de gestion des données entrantes pour les gymnastes et accidents.""" + +from django import forms + +from .models import ( + Jumper +) + +class JumperForm(forms.ModelForm): + + class Meta: + model = Jumper + fields = ( + 'last_name', + 'first_name', + 'birthdate', + 'gender', + 'is_active', + 'club', + ) + + widgets = { + "last_name": forms.TextInput( + attrs={"class": "form-control", "placeholder": "Lastname"} + ), + "first_name": forms.TextInput( + attrs={"class": "form-control", "placeholder": "Firstname"} + ), + "birthdate": forms.DateInput(attrs={"class": "form-control datepicker"}), + "gender": forms.Select(attrs={"class": "form-control"}), + } + + club_related = forms.CharField( + widget=forms.TextInput( + attrs={ + "class": "form-control", + "placeholder": "Searching club…", + "data-ref": "#id_club", + } + ) + ) + diff --git a/jumpers/models.py b/jumpers/models.py index 0defc6e847..a21f82a98a 100644 --- a/jumpers/models.py +++ b/jumpers/models.py @@ -53,4 +53,4 @@ class Club(models.Model): active = models.BooleanField(default=1, verbose_name="Active") def __str__(self): - return "%s (%s)" % (self.name, self.acronym) \ No newline at end of file + return "%s (%s) - %s" % (self.name, self.acronym, self.city) \ No newline at end of file diff --git a/jumpers/urls.py b/jumpers/urls.py index 6bb441154a..c76f6b88be 100644 --- a/jumpers/urls.py +++ b/jumpers/urls.py @@ -6,8 +6,13 @@ jumper_urlpatterns = [ path(r"", views.jumper_listing, name="jumper_list"), path(r"lookup/", views.jumper_lookup), path(r"details//", views.jumper_details, name="jumper_details"), + path(r"add/", views.jumper_create_or_update, name="jumper_create"), + path( + r"edit//", views.jumper_create_or_update, name="jumper_update" + ), ] club_urlpatterns = [ path(r"", views.club_listing, name="club_list"), -] \ No newline at end of file + path(r"lookup/", views.club_lookup), +] \ No newline at end of file diff --git a/jumpers/views.py b/jumpers/views.py index cc2ebae7be..a2bff0b7b1 100644 --- a/jumpers/views.py +++ b/jumpers/views.py @@ -2,10 +2,12 @@ from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_http_methods +from django.http import HttpResponse, HttpResponseRedirect from django.db.models import Q from .models import Club, Jumper from followup.models import Chrono, LearnedSkill +from .forms import JumperForm import simplejson @@ -20,6 +22,28 @@ def club_listing(request): return render(request, "clubs/list.html", context) +@login_required +@require_http_methods(["GET"]) +def club_lookup(request): + """ + Récupère la liste des gymnastes à la volée suivant des caractères de + recherche entrés. (min 3 caractères) + """ + + results = [] + pattern = request.GET.get("pattern", None) + + # Ignore queries shorter than length 3 + if pattern is not None and len(pattern) > 3: + model_results = Club.objects.filter( + Q(name__icontains=pattern) | Q(city__icontains=pattern) + ) + results = [{"ID": x.id, "Name": str(x)} for x in model_results] + + json = simplejson.dumps(results) + return HttpResponse(json, content_type="application/json") + + @login_required @require_http_methods(["GET"]) def jumper_lookup(request): @@ -61,13 +85,44 @@ def jumper_details(request, jumperid): learnedskills_list = LearnedSkill.objects.filter(jumper=jumperid).order_by('-date')[:8] chronos_list = Chrono.objects.filter(jumper=jumperid).order_by('-date')[:8] straightjump_score = Chrono.objects.filter(jumper=jumperid).filter(type=0).order_by('-date') + best_straightjump = Chrono.objects.filter(jumper=jumperid).filter(type=0).order_by('-score')[:1] + best_routine = Chrono.objects.filter(jumper=jumperid).filter(type=1).order_by('-score')[:1] routine_score = Chrono.objects.filter(jumper=jumperid).filter(type=1).order_by('-date') context = { 'jumper': jumper, 'learnedskills_list': learnedskills_list, 'chronos_list': chronos_list, 'straightjump_score': straightjump_score, - 'routine_score': routine_score + 'routine_score': routine_score, + 'best_routine': best_routine, + 'best_straightjump': best_straightjump } - return render(request, "jumpers/details.html", context) \ No newline at end of file + return render(request, "jumpers/details.html", context) + + +@login_required +@require_http_methods(["GET", "POST"]) +def jumper_create_or_update(request, jumperid=None): + """ + Formulaire de creation et modification d'un gymnaste. + """ + + if jumperid: + jumper = get_object_or_404(Jumper, pk=jumperid) + else: + jumper = None + + if request.method == "POST": + gymnast_form = JumperForm(request.POST, instance=jumper) + + if gymnast_form.is_valid(): + jumper = gymnast_form.save() + + return HttpResponseRedirect("/jumper/details/" + str(jumper.id)) + + else: + form = JumperForm(instance=jumper) + + context = {"form": form, "jumperid": jumperid} + return render(request, "jumpers/create.html", context) \ No newline at end of file diff --git a/templates/jumpers/create.html b/templates/jumpers/create.html new file mode 100644 index 0000000000..47311d3cbb --- /dev/null +++ b/templates/jumpers/create.html @@ -0,0 +1,135 @@ +{% extends "base.html" %} + +{% block content %} +
+
+
+
+

{% if jumperid %}Edit{% else %}Add{% endif %} Gymnast

+
+
+
+ {% csrf_token %} +
+ +
+
+
+ {{ form.last_name }} + {% if form.last_name.errors %} {% for error in form.last_name.errors %}{{error}}{% endfor %}{% endif %} +
+
+ {{ form.first_name }} + {% if form.first_name.errors %} {% for error in form.first_name.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+
+
+ +
+ {{ form.birthdate }} + {% if form.birthdate.errors %} {% for error in form.birthdate.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+ {{ form.gender }} + {% if form.gender.errors %} {% for error in form.gender.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+ {{ form.club_related }} + {% if form.club.errors %} {% for error in form.club.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+ {{ form.is_active }} + {% if form.is_active.errors %} {% for error in form.is_active.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/jumpers/details.html b/templates/jumpers/details.html index 9c46bc89cd..851135e144 100644 --- a/templates/jumpers/details.html +++ b/templates/jumpers/details.html @@ -23,9 +23,18 @@

{{ jumper.age }} years ({{ jumper.birthdate | date:"d F Y" }}){{ jumper.get_orientation_display }}
+ {{ jumper.club.name }} - {{ jumper.club.city }}

- {% if jumper.address %} - {{ jumper.address }} - {{ jumper.postal }} {{ jumper.city }}
+ {% if best_routine or best_straightjump %} +
Bests Scores
+
    + {% if best_straightjump %} +
  • Straight : {{ best_straightjump.0.date | date:"d-m-Y" }} - {{ best_straightjump.0.tof }}
  • + {% endif %} + {% if best_routine %} +
  • Routine : {{ best_routine.0.date | date:"d-m-Y" }} - {{ best_routine.0.tof }}
  • + {% endif %} +
{% endif %}
New @@ -48,7 +57,7 @@ {% for learnedskill in learnedskills_list %} {{ learnedskill.date | date:"d-m-Y" }} - {{ learnedskill.skill.name }} + {{ learnedskill.skill.short_label }} {{ learnedskill.get_cando_display }} {% endfor %} @@ -95,6 +104,7 @@ +{% if chronos_list %}
@@ -102,6 +112,7 @@
+{% endif %} {% endblock %} {% block footerscript %} diff --git a/templates/jumpers/list.html b/templates/jumpers/list.html index 12a8870c04..422139dca3 100644 --- a/templates/jumpers/list.html +++ b/templates/jumpers/list.html @@ -21,7 +21,11 @@ {% for jumper in jumper_list %} - + + + + + {{ jumper.last_name }} {{ jumper.first_name }} {{ jumper.age }} diff --git a/templates/skills/details.html b/templates/skills/details.html index b694896b7c..5dac7dfd5e 100644 --- a/templates/skills/details.html +++ b/templates/skills/details.html @@ -24,7 +24,7 @@

Ancestor

{% endif %}