Adding new functionnalityies.

This commit is contained in:
Trullemans Gregory 2021-11-12 15:32:24 +01:00
parent 8283cfc44d
commit 89f32b40ce
9 changed files with 262 additions and 10 deletions

View File

@ -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/<int:jumperid>/", views.chrono_create_or_update, name='chrono_create'),
path(r"edit/<int:chronoid>", views.chrono_create_or_update, name="chrono_update"),
path(r"edit/<int:chronoid>/", views.chrono_create_or_update, name="chrono_update"),
]
skill_urlpatterns = [

42
jumpers/forms.py Normal file
View File

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

View File

@ -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)
return "%s (%s) - %s" % (self.name, self.acronym, self.city)

View File

@ -6,8 +6,13 @@ jumper_urlpatterns = [
path(r"", views.jumper_listing, name="jumper_list"),
path(r"lookup/", views.jumper_lookup),
path(r"details/<int:jumperid>/", views.jumper_details, name="jumper_details"),
path(r"add/", views.jumper_create_or_update, name="jumper_create"),
path(
r"edit/<int:jumperid>/", views.jumper_create_or_update, name="jumper_update"
),
]
club_urlpatterns = [
path(r"", views.club_listing, name="club_list"),
]
path(r"lookup/", views.club_lookup),
]

View File

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

View File

@ -0,0 +1,135 @@
{% extends "base.html" %}
{% block content %}
<div class="row justify-content-center">
<div class="col-12 col-sm-12 col-md-12 col-lg-8 col-xl-8">
<div class="card">
<div class="card-header">
<h4 class="card-title">{% if jumperid %}Edit{% else %}Add{% endif %} Gymnast</h4>
</div>
<div class="card-body">
<form action="{% if jumperid %}{% url 'jumper_update' jumperid %}{% else %}{% url 'jumper_create' %}{% endif %}" method="post" class="form-horizontal" id="formulaire" name="formulaire">
{% csrf_token %}
<div class="form-group row {% if form.last_name.errors %}has-error has-feedback{% endif %}">
<label for="id_last_name" class="col-4 col-sm-2 col-md-3 col-lg-3 col-xl-3 col-form-label">Names</label>
<div class="col-8 col-sm-9 col-md-9 col-lg-9 col-xl-9">
<div class="row">
<div class="col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6 pr-0">
{{ form.last_name }}
{% if form.last_name.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.last_name.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
<div class="col-12 col-sm-6 col-md-6 col-lg-6 col-xl-6">
{{ form.first_name }}
{% if form.first_name.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.first_name.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
</div>
</div>
<div class="form-group row {% if form.birthdate.errors %}has-error has-feedback{% endif %}">
<label for="id_birthdate" class="col-4 col-sm-2 col-md-3 col-lg-3 col-xl-3 col-form-label">Birthdate</label>
<div class="col-8 col-sm-3 col-md-3 col-lg-3 col-xl-3">
{{ form.birthdate }}
{% if form.birthdate.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.birthdate.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row {% if form.gender.errors %}has-error has-feedback{% endif %}">
<label for="id_gender" class="col-4 col-sm-2 col-md-3 col-lg-3 col-xl-3 col-form-label">Gender</label>
<div class="col-8 col-sm-3 col-md-3 col-lg-3 col-xl-3">
{{ form.gender }}
{% if form.gender.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.gender.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_club" class="col-4 col-sm-3 col-form-label">Club</label>
<div class="col-8 col-md-9 col-lg-6 {% if form.club.errors %}has-danger{% endif %}">
{{ form.club_related }}
{% if form.club.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.club.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row {% if form.is_active.errors %}has-error has-feedback{% endif %}">
<label for="id_is_active" class="col-4 col-sm-2 col-md-3 col-lg-3 col-xl-3 col-form-label">Is active</label>
<div class="col-8 col-sm-2 col-md-2 col-lg-2 col-xl-2">
{{ form.is_active }}
{% if form.is_active.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.is_active.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group text-center">
<input type="submit" value="Save" class="btn btn-fill btn-warning" />
</div>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript" >
$(function(){
$('#id_birthdate').datetimepicker({
format: 'YYYY-MM-DD'
});
blackDashboard.initDateTimePicker();
$('#id_gymnast_related').autocomplete({
source: function(request, response) {
$.ajax({
url: '/gymnast/lookup/?pattern=' + $('#id_gymnast_related').val(),
dataType: "json",
success: function(data) {
if(data.length != 0) {
response($.map(data, function(item) {
return {
label: item.Name,
value: item.Name,
gymnastid: item.ID
}
}))
} else {
response([{ label: 'No result found.', value: '' }]);
};
},
error: function (exception) {
console.log(exception);
}
});
},
minLength: 3,
select: function (event, ui) {
$($(this).data('ref')).val(ui.item.gymnastid);
}
});
$('#id_club_related').autocomplete({
source: function(request, response) {
$.ajax({
url: '/club/lookup/?pattern=' + $('#id_club_related').val(),
dataType: "json",
success: function(data) {
if(data.length != 0) {
response($.map(data, function(item) {
return {
label: item.Name,
value: item.Name,
clubid: item.ID
}
}))
} else {
response([{ label: 'No result found.', value: '' }]);
};
},
error: function (exception) {
console.log(exception);
}
});
},
minLength: 3,
select: function (event, ui) {
$($(this).data('ref')).val(ui.item.clubid);
}
});
});
</script>
{% endblock %}

View File

@ -23,9 +23,18 @@
</p>
<div class="card-description">
{{ jumper.age }} years ({{ jumper.birthdate | date:"d F Y" }})<span class="text-info"><b>{{ jumper.get_orientation_display }}</b></span><br/>
{{ jumper.club.name }} - {{ jumper.club.city }}<br/>
<br \>
{% if jumper.address %}
{{ jumper.address }} - {{ jumper.postal }} {{ jumper.city }}<br \>
{% if best_routine or best_straightjump %}
<h5><u>Bests Scores</u></h5>
<ul>
{% if best_straightjump %}
<li><b>Straight</b> : {{ best_straightjump.0.date | date:"d-m-Y" }} - <b>{{ best_straightjump.0.tof }}</b></li>
{% endif %}
{% if best_routine %}
<li><b>Routine</b> : {{ best_routine.0.date | date:"d-m-Y" }} - <b>{{ best_routine.0.tof }}</b></li>
{% endif %}
</ul>
{% endif %}
</div>
<a href="{% url 'chrono_create' jumper.id %}" class="nav-item dropdown-item">New <i class="far fa-stopwatch"></i></a>
@ -48,7 +57,7 @@
{% for learnedskill in learnedskills_list %}
<tr>
<td class="text-left">{{ learnedskill.date | date:"d-m-Y" }}</a></td>
<td class="text-left"><a href="{% url 'skill_details' learnedskill.skill.id %}">{{ learnedskill.skill.name }}</a></td>
<td class="text-left"><a href="{% url 'skill_details' learnedskill.skill.id %}">{{ learnedskill.skill.short_label }}</a></td>
<td class="text-left">{{ learnedskill.get_cando_display }}</a></td>
</tr>
{% endfor %}
@ -95,6 +104,7 @@
</div>
</div>
{% if chronos_list %}
<div class="row">
<div class="col-12 col-sm-12 col-md-12 col-lg-12 card">
<div class="card-body pb-0">
@ -102,6 +112,7 @@
</div>
</div>
</div>
{% endif %}
{% endblock %}
{% block footerscript %}

View File

@ -21,7 +21,11 @@
<tbody>
{% for jumper in jumper_list %}
<tr>
<td></td>
<td>
<a href="{% url 'jumper_update' jumper.id %}">
<span class="tim-icons icon-pencil text-warning"></span>
</a>
</td>
<td class="text-left"><a href="{% url 'jumper_details' jumper.id %}">{{ jumper.last_name }}</a></td>
<td class="text-left"><a href="{% url 'jumper_details' jumper.id %}">{{ jumper.first_name }}</a></td>
<td class="text-left">{{ jumper.age }}</td>

View File

@ -24,7 +24,7 @@
<h4>Ancestor</h4>
<ul>
{% for ancestor in skill.ancestor.all %}
<li><a href="{% url 'skill_details' ancestor.id %}">{{ ancestor.name }}</a></li>
<li><a href="{% url 'skill_details' ancestor.id %}">{{ ancestor.short_label }}</a></li>
{% endfor %}
</ul>
{% endif %}