Adding chronos form, views and templates
This commit is contained in:
parent
5070919d44
commit
a7c77d32c7
|
@ -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"),
|
||||
|
||||
|
|
|
@ -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",
|
||||
}
|
||||
)
|
||||
)
|
|
@ -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"),
|
||||
]
|
|
@ -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)
|
|
@ -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>
|
||||
|
|
|
@ -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 %} <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 %} <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 %} <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 %} <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 %}
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue