Adding chronos form, views and templates

This commit is contained in:
Trullemans Gregory 2021-11-04 13:49:07 +01:00
parent 5070919d44
commit a7c77d32c7
9 changed files with 260 additions and 7 deletions

View File

@ -16,6 +16,7 @@ Including another URLconf
from django.contrib import admin
from django.urls import include, path
import followup.urls
import jumpers.urls
import Ultron.views
import profiles.urls
@ -27,6 +28,9 @@ urlpatterns = [
# Jumpers management
path(r"jumper/", include(jumpers.urls.jumper_urlpatterns)),
path(r"club/", include(jumpers.urls.club_urlpatterns)),
# Follow-up management
path(r"chrono/", include(followup.urls.chronos_urlpatterns)),
# path(r"search/", config.views.search, name="global_search"),

35
followup/forms.py Normal file
View File

@ -0,0 +1,35 @@
# coding=UTF-8
from django import forms
from datetime import date
from .models import Chrono
class ChronoForm(forms.ModelForm):
class Meta:
model = Chrono
fields = ('jumper', 'date', 'type', 'score_type', 'score')
widgets = {
"jumper": forms.HiddenInput(),
"date": forms.TextInput(
attrs={
"class": "form-control datepicker",
"placeholder": date.today().strftime("%Y-%m-%d"),
"value": date.today().strftime("%Y-%m-%d"),
}
),
"type": forms.Select(attrs={"class": "form-control"}),
"score_type": forms.Select(attrs={"class": "form-control"}),
"score": forms.TextInput(
attrs={"class": "form-control", "placeholder": "xx,xxx"}
),
}
jumper_related = forms.CharField(
widget=forms.TextInput(
attrs={
"class": "form-control",
"placeholder": "Searching gymnast…",
"data-ref": "#id_jumper",
}
)
)

9
followup/urls.py Normal file
View File

@ -0,0 +1,9 @@
from django.urls import path
from . import views
chronos_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"),
]

View File

@ -1,4 +1,57 @@
from django.shortcuts import render
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse, HttpResponseRedirect
# Create your views here.
from jumpers.models import Jumper
from .models import Chrono
from .forms import ChronoForm
@login_required
# @require_http_methods(["GET"])
def chrono_listing(request):
""" Récupère la liste des chronos """
chrono_list = Chrono.objects.all()
context = {'chrono_list': chrono_list}
return render(request, "chronos/list.html", context)
@login_required
@require_http_methods(["GET", "POST"])
def chrono_create_or_update(request, chronoid=None, jumperid=None):
""" Création ou modification d'un chrono.
"""
if chronoid:
chrono = get_object_or_404(Chrono, pk=chronoid)
data = {
"jumper": chrono.jumper.id,
"jumper_related": str(chrono.jumper),
}
else:
chrono = None
data = None
if request.method == "POST":
form = ChronoForm(request.POST, instance=chrono)
if form.is_valid():
form.save()
if chronoid is not None:
return HttpResponseRedirect("/chrono/" + str(chronoid) + "/")
elif jumperid is not None:
return HttpResponseRedirect(
"/jumper/" + str(jumperid)
)
else:
return HttpResponseRedirect("/chrono/")
else:
if data is None and jumperid is not None:
jumper = get_object_or_404(Jumper, pk=jumperid)
data = {"jumper": jumperid, "jumper_related": jumper}
form = ChronoForm(instance=chrono, initial=data)
context = {"form": form, "chronoid": chronoid}
return render(request, "chronos/create.html", context)

View File

@ -57,9 +57,10 @@
<a href="javascript:void(0)" class="simple-text logo-normal">Trampoline</a>
</div>
<ul class="nav">
{% menuitem 'home' 'chart-pie-36' 'Dashboard' %}
{% menuitem 'jumper_list' 'badge' 'Jumpers' %}
{% menuitem 'club_list' 'square-pin' 'Clubs' %}
{% menuitem 'home' 'tim-icons icon-chart-pie-36' 'Dashboard' %}
{% menuitem 'jumper_list' 'tim-icons icon-badge' 'Jumpers' %}
{% menuitem 'club_list' 'tim-icons icon-square-pin' 'Clubs' %}
{% menuitem 'chrono_list' 'far fa-stopwatch' 'Chronos' %}
<li>
<a href="/admin/" target="_blank">
<i class="tim-icons icon-settings"></i>

View File

@ -0,0 +1,95 @@
{% extends "base.html" %}
{% block content %}
<div class="row justify-content-center">
<div class="col-12 col-sm-12 col-md-8 col-lg-6 col-xl-6">
<div class="card">
<div class="card-header">
<h4 class="card-title">{% if chronoid %}Edit{% else %}Add{% endif %} chrono</h4>
</div>
<div class="card-body">
<form action="{% if chronoid %}{% url 'chrono_update' chronoid %}{% else %}{% url 'chrono_create' %}{% endif %}" method="post" class="form-horizontal" id="formulaire" name="formulaire">
{% csrf_token %}
<div class="form-group row ">
<label for="id_date" class="col-4 col-sm-3 col-form-label">Date</label>
<div class="col-sm-6 col-md-5 col-lg-4 col-xl-3 {% if form.date.errors %}has-danger{% endif %}">
{{ form.date }}
{% if form.date.errors %}<span class="btn btn-sm btn-danger-outline">{% for error in form.date.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_jumper" class="col-4 col-sm-3 col-form-label">Jumper</label>
<div class="col-8 col-md-9 col-lg-6 {% if form.jumper.errors %}has-danger{% endif %}">
{{ form.jumper }}
{{ form.jumper_related }}
{% if form.jumper.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.jumper.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_type" class="col-4 col-sm-3 col-form-label">Type</label>
<div class="col-8 col-sm-4 col-md-3 {% if form.type.errors %}has-danger{% endif %}">
{{ form.type }}
{% if form.type.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.type.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_score_type" class="col-4 col-sm-3 col-form-label">Score Type</label>
<div class="col-8 col-sm-4 col-md-3 {% if form.score_type.errors %}has-danger{% endif %}">
{{ form.score_type }}
{% if form.score_type.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.score_type.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group row ">
<label for="id_information" class="col-4 col-sm-3 col-form-label">Score</label>
<div class="col-sm-5 col-md-4 col-lg-3 {% if form.score.errors %}has-danger{% endif %}">
{{ form.score }}
{% if form.score.errors %}&nbsp;<span class="btn btn-sm btn-danger-outline">{% for error in form.score.errors %}{{error}}{% endfor %}</span>{% endif %}
</div>
</div>
<div class="form-group text-center">
<input type="submit" value="{% if chronoid %}Save{% else %}Add{% endif %}" class="btn btn-warning" />
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
{% block footerscript %}
<script type="text/javascript" >
$(function(){
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);
}
});
});
</script>
{% endblock %}

View File

@ -0,0 +1,55 @@
{% extends "listing.html" %}
{% block datacontent %}
<div class="card mb-0">
<div class="card-header">
<h4 class="card-title"> Chronos Listing</h4>
</div>
<div class="card-body pb-0">
<div class="table-responsive pb-0">
{% if chrono_list %}
<table class="table tablesorter table-striped table-condensed" data-sort="table" id="maintable">
<thead>
<tr>
<th style="width: 3%"></th>
<th class="header text-left" style="width: 25%">Jumper</th>
<th class="header text-left" style="width: 35%">Date</th>
<th class="header text-left" style="width: 15%">Score</th>
</tr>
</thead>
<tbody>
{% for chrono in chrono_list %}
<tr>
<td></td>
<td class="text-left"><a href="{% url 'jumper_details' chrono.jumper.id %}">{{ chrono.jumper }}</a></td>
<td class="text-left">{{ chrono.date | date:"d F Y" }}</td>
<td class="text-left">{{ chrono.tof }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<table class="table">
<tr>
<td>There are no chronos corresponding to your criterias</td>
</tr>
</table>
{% endif %}
</div>
</div>
</div>
{% endblock %}
{% block footerscript %}
<script type="text/javascript">
$(document).ready(function() {
$('[data-sort="table"]').tablesorter({
headers: {
0: { sorter: false }, // disable first column
},
dateFormat: "uk",
sortList: [[3,0], [1,0]]
})
});
</script>
{% endblock %}

View File

@ -22,12 +22,13 @@
</div>
</p>
<div class="card-description">
{{ jumper.birthdate | date:"d F Y" }} ({{ jumper.age }} years)<span class="text-info"><b>{{ jumper.get_orientation_display }}</b></span><br/>
{{ jumper.age }} years ({{ jumper.birthdate | date:"d F Y" }})<span class="text-info"><b>{{ jumper.get_orientation_display }}</b></span><br/>
<br \>
{% if jumper.address %}
{{ jumper.address }} - {{ jumper.postal }} {{ jumper.city }}<br \>
{% endif %}
</div>
<a href="{% url 'chrono_create' jumper.id %}" class="nav-item dropdown-item">New <i class="far fa-stopwatch"></i></a>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@ register = template.Library()
@register.simple_tag(takes_context=True)
def menuitem(context, url, css_class, title):
url = reverse(url)
css_class = "tim-icons icon-" + css_class
# css_class = "" + css_class
if len(url) > 1:
if context.request.path.startswith(url):