diff --git a/Ultron/urls.py b/Ultron/urls.py index a7d530ec8a..7f3c923fcc 100644 --- a/Ultron/urls.py +++ b/Ultron/urls.py @@ -35,6 +35,7 @@ urlpatterns = [ # Follow-up management path(r"chrono/", include(followup.urls.chrono_urlpatterns)), path(r"skill/", include(followup.urls.skill_urlpatterns)), + path(r"learnedskill/", include(followup.urls.learnedskill_urlpatterns)), # path(r"search/", config.views.search, name="global_search"), diff --git a/followup/forms.py b/followup/forms.py index b0b1da17d4..53ebc802b8 100644 --- a/followup/forms.py +++ b/followup/forms.py @@ -2,7 +2,10 @@ from django import forms from datetime import date -from .models import Chrono + +from django.db import models +from django.forms import fields, widgets +from .models import Chrono, LearnedSkill class ChronoForm(forms.ModelForm): class Meta: @@ -33,3 +36,42 @@ class ChronoForm(forms.ModelForm): } ) ) + + +class LearnedSkillForm(forms.ModelForm): + + class Meta: + model = LearnedSkill + fields = ('jumper', 'skill', 'cando', 'date') + widgets = { + "jumper": forms.HiddenInput(), + "skill": forms.HiddenInput(), + "date": forms.TextInput( + attrs={ + "class": "form-control datepicker", + "placeholder": date.today().strftime("%Y-%m-%d"), + "value": date.today().strftime("%Y-%m-%d"), + } + ), + "cando": forms.Select(attrs={"class": "form-control"}), + } + + jumper_related = forms.CharField( + widget=forms.TextInput( + attrs={ + "class": "form-control", + "placeholder": "Searching gymnast…", + "data-ref": "#id_jumper", + } + ) + ) + + skill_related = forms.CharField( + widget=forms.TextInput( + attrs={ + "class": "form-control", + "placeholder": "Searching skill…", + "data-ref": "#id_skill", + } + ) + ) \ No newline at end of file diff --git a/followup/urls.py b/followup/urls.py index f2f4251512..9a7b1638f9 100644 --- a/followup/urls.py +++ b/followup/urls.py @@ -10,11 +10,17 @@ chrono_urlpatterns = [ ] skill_urlpatterns = [ + path(r"", views.skill_listing, name='skill_list'), + path(r"/", views.skill_details, name="skill_details"), + path(r"lookup/", views.skill_lookup), re_path( r"^(?P(level|rank|difficulty))/(?P[\w]+)/(?P[\w]+)$", views.skill_listing, name="skill_listing_by_key", ), - path(r"/", views.skill_details, name="skill_details"), - path(r"", views.skill_listing, name='skill_list'), +] + +learnedskill_urlpatterns = [ + path(r"create/", views.learnedskill_create_or_update, name="learnedskill_create"), + path(r"create//", views.learnedskill_create_or_update, name='learnedskill_create'), ] \ No newline at end of file diff --git a/followup/views.py b/followup/views.py index 344b480b1d..a8590edea0 100644 --- a/followup/views.py +++ b/followup/views.py @@ -6,7 +6,9 @@ from django.db.models import Q from jumpers.models import Jumper from .models import Chrono, Skill -from .forms import ChronoForm +from .forms import ChronoForm, LearnedSkillForm + +import simplejson @login_required @require_http_methods(["GET"]) @@ -65,6 +67,28 @@ def chrono_create_or_update(request, chronoid=None, jumperid=None): return render(request, "chronos/create.html", context) +@login_required +@require_http_methods(["GET"]) +def skill_lookup(request): + """ + Récupère la liste des skill à 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 = Skill.objects.filter( + Q(short_label__icontains=pattern) | Q(long_label__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 skill_listing(request, field=None, expression=None, value=None, level=None): @@ -105,4 +129,35 @@ def skill_details(request, skillid): :return: skill """ context = {"skill": get_object_or_404(Skill, pk=skillid)} - return render(request, "skills/details.html", context) \ No newline at end of file + return render(request, "skills/details.html", context) + + +@login_required +@require_http_methods(["GET", "POST"]) +def learnedskill_create_or_update(request, jumperid=None): + """ + Formulaire de creation et modification d'un lien skill/gymnaste. + """ + + if jumperid: + jumper = get_object_or_404(Jumper, pk=jumperid) + data = { + "jumper": jumper.id, + "jumper_related": str(jumper), + } + else: + data = {} + + if request.method == "POST": + learnedskill_form = LearnedSkillForm(request.POST) + + if learnedskill_form.is_valid(): + learnedskill_form.save() + return HttpResponseRedirect("/jumper/details/" + str(learnedskill_form.cleaned_data['jumper'].id)) + else: + print(learnedskill_form.errors) + + form = LearnedSkillForm(initial=data) + + context = {"form": form, "jumperid": jumperid} + return render(request, "learnedskills/create.html", context) \ No newline at end of file diff --git a/jumpers/views.py b/jumpers/views.py index 8937d4f86d..cf11fe88cd 100644 --- a/jumpers/views.py +++ b/jumpers/views.py @@ -7,7 +7,7 @@ from django.db.models import Q from django.contrib import messages from .models import Club, Jumper -from followup.models import Chrono, LearnedSkill +from followup.models import Chrono, LearnedSkill, Skill from .forms import JumperForm import simplejson @@ -83,8 +83,10 @@ def jumper_details(request, jumperid): """Récupère toutes les informations d'un gymnaste. """ jumper = get_object_or_404(Jumper, pk=jumperid) - learnedskills_list = LearnedSkill.objects.filter(jumper=jumperid).order_by('-date')[:8] - chronos_list = Chrono.objects.filter(jumper=jumperid).order_by('-date')[:8] + learnedskills_list = LearnedSkill.objects.filter(jumper=jumperid).order_by('-date')[:10] + nb_skill = Skill.objects.all().count() + known_skill = LearnedSkill.objects.filter(jumper=jumperid).count() + chronos_list = Chrono.objects.filter(jumper=jumperid).order_by('-date')[:10] 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] @@ -96,7 +98,9 @@ def jumper_details(request, jumperid): 'straightjump_score': straightjump_score, 'routine_score': routine_score, 'best_routine': best_routine, - 'best_straightjump': best_straightjump + 'best_straightjump': best_straightjump, + 'nb_skill': nb_skill, + 'known_skill': known_skill } return render(request, "jumpers/details.html", context) diff --git a/templates/base.html b/templates/base.html index 2251d4e3e0..0ac7af4861 100644 --- a/templates/base.html +++ b/templates/base.html @@ -154,7 +154,7 @@ @@ -260,6 +260,7 @@ {% else %} sidebar_mini_active = false; {% endif %} + {% if request.session.template == 0 %} white_color = false; {% else %} @@ -267,7 +268,6 @@ {% endif %} window_width = $(window).width(); - fixed_plugin_open = $('.sidebar .sidebar-wrapper .nav li.active a p').html(); {% if request.session.sidebar == 1 %} diff --git a/templates/index.html b/templates/index.html index 7fad07aa39..8355bbca40 100644 --- a/templates/index.html +++ b/templates/index.html @@ -43,7 +43,7 @@
-

(line 2 celle 2)

+

(line 2 cadre 2)

diff --git a/templates/jumpers/details.html b/templates/jumpers/details.html index 851135e144..94e214f29a 100644 --- a/templates/jumpers/details.html +++ b/templates/jumpers/details.html @@ -36,8 +36,16 @@ {% endif %} {% endif %} + {{ known_skill }} known skill on {{ nb_skill }} skills. +
+
+
+ New +
+
+ New +
- New
diff --git a/templates/learnedskills/create.html b/templates/learnedskills/create.html new file mode 100644 index 0000000000..efff4053fc --- /dev/null +++ b/templates/learnedskills/create.html @@ -0,0 +1,123 @@ +{% extends "base.html" %} + +{% block content %} +
+
+
+
+

Add Jumper/Skill link

+
+
+
+ {% csrf_token %} +
+ +
+ {{ form.date }} + {% if form.date.errors %}{% for error in form.date.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+ {{ form.jumper }} + {{ form.jumper_related }} + {% if form.jumper.errors %} {% for error in form.jumper.errors %}{{error}}{% endfor %}{% endif %} +
+
+ +
+ +
+ {{ form.skill }} + {{ form.skill_related }} + {% if form.skill.errors %} {% for error in form.skill.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+ {{ form.cando }} + {% if form.cando.errors %} {% for error in form.cando.errors %}{{error}}{% endfor %}{% endif %} +
+
+
+ +
+
+
+
+
+
+ + + +{% endblock %} \ No newline at end of file