Adding new functionnalityies.
This commit is contained in:
parent
8283cfc44d
commit
89f32b40ce
|
@ -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 = [
|
||||
|
|
|
@ -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",
|
||||
}
|
||||
)
|
||||
)
|
||||
|
|
@ -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)
|
|
@ -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),
|
||||
]
|
|
@ -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)
|
|
@ -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 %} <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 %} <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 %} <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 %} <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 %} <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 %} <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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
Loading…
Reference in New Issue