From a3d75528ce3bc1e4e2ab8cbfb7be77129e57c7c7 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 7 Jan 2022 18:08:22 +0100 Subject: [PATCH 1/4] Ignore docstrings on classes, modules, ... --- .pylintrc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index aa7903956d..cfc4343b5a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -87,7 +87,12 @@ disable=raw-checker-failed, suppressed-message, useless-suppression, deprecated-pragma, - use-symbolic-message-instead + use-symbolic-message-instead, + empty-docstring, + missing-class-docstring, + missing-module-docstring, + missing-function-docstring, + consider-using-f-string, # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option From ad243fc1abc02e8eb0407ef294d148824ce876bc Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 7 Jan 2022 18:08:39 +0100 Subject: [PATCH 2/4] Pylint review: part 1 --- ultron/core/admin.py | 3 - ultron/core/tests.py | 8 +- ultron/core/views.py | 13 +- ultron/followup/forms.py | 68 ++++------ ultron/followup/models.py | 5 +- ultron/followup/views.py | 127 +++++++++--------- ultron/location/forms.py | 3 +- ultron/location/models.py | 4 +- ultron/location/tests.py | 3 - ultron/location/urls.py | 1 - ultron/location/views.py | 29 ++-- ultron/objective/admin.py | 13 +- ultron/objective/forms.py | 8 +- ultron/objective/models.py | 17 ++- ultron/objective/tests.py | 3 - ultron/objective/urls.py | 7 - ultron/objective/views.py | 52 ++++--- ultron/people/models.py | 8 +- ultron/people/templatetags/level_chart_bar.py | 2 +- ultron/people/templatetags/skill_doughnut.py | 10 +- ultron/people/tests.py | 21 ++- ultron/people/urls.py | 2 +- ultron/people/views.py | 53 +++++--- ultron/planning/forms.py | 5 +- ultron/planning/models.py | 1 - ultron/planning/tests.py | 3 - ultron/planning/urls.py | 2 +- ultron/planning/views.py | 14 +- ultron/profiles/forms.py | 5 +- ultron/profiles/models.py | 2 +- ultron/profiles/tests.py | 3 - ultron/profiles/urls.py | 2 +- ultron/profiles/views.py | 6 +- ultron/tools/models.py | 5 +- ultron/tools/templatetags/menuitems.py | 39 +++--- 35 files changed, 261 insertions(+), 286 deletions(-) delete mode 100644 ultron/core/admin.py delete mode 100644 ultron/location/tests.py delete mode 100644 ultron/objective/tests.py delete mode 100644 ultron/planning/tests.py delete mode 100644 ultron/profiles/tests.py diff --git a/ultron/core/admin.py b/ultron/core/admin.py deleted file mode 100644 index 8c38f3f3da..0000000000 --- a/ultron/core/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/ultron/core/tests.py b/ultron/core/tests.py index 37f889468a..850d1f1f0a 100644 --- a/ultron/core/tests.py +++ b/ultron/core/tests.py @@ -15,15 +15,15 @@ class HomeTests(TestCase): def test_home_view_anonymous_redirected_statuts_code(self): url = reverse("home") response = self.client.get(url) - self.assertEquals(response.status_code, 302) + self.assertEqual(response.status_code, 302) def test_home_view_status_code_with_user_connected(self): """Note: This test will switch to green once we will get rid of whitenoise - See https://stackoverflow.com/questions/50658241/django-doesnt-load-static-files-valueerrormissing-staticfiles-manifest-entry + See https://stackoverflow.com/questions/50658241/django-doesnt-load-static-files-valueerrormissing-staticfiles-manifest-entry # pylint: disable=line-too-long """ - login_result = self.client.login(username="jbond", password="007") + self.client.login(username="jbond", password="007") url = reverse("home") response = self.client.get(url, follow=True) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) diff --git a/ultron/core/views.py b/ultron/core/views.py index c0fd3df20b..db0fd4371a 100644 --- a/ultron/core/views.py +++ b/ultron/core/views.py @@ -1,10 +1,8 @@ -from datetime import datetime, timedelta, date +from datetime import datetime from django.db.models import Q from django.shortcuts import render -from django.template import RequestContext from django.utils import timezone -from django.utils.html import format_html from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout from django.http import HttpResponseRedirect from django.contrib.auth.decorators import login_required @@ -12,7 +10,7 @@ from django.views.decorators.http import require_http_methods from ultron.objective.models import Routine from ultron.profiles.models import Profile -from ultron.followup.models import Accident, Skill, MindState, Point +from ultron.followup.models import Skill, Point from ultron.location.models import Place, Club from ultron.people.models import Gymnast from ultron.planning.models import Event @@ -43,8 +41,8 @@ def login(request): pass request.session["clubid"] = request.POST.get("clubid", None) return HttpResponseRedirect("/") - else: - context = {"message": "Account disabled."} + + context = {"message": "Account disabled."} else: context = {"message": "Wrong login/password."} else: @@ -106,7 +104,8 @@ def home(request): # check if gymnast have point # --------------------------- # 1. récupérer tous les évènements passés - # 2. pour chaque event, vérifier que tous les gymnastes renseignés dans les participants ont des points associés. + # 2. pour chaque event, vérifier que tous les gymnastes renseignés + # dans les participants ont des points associés. # S'il n'y a pas de point, faire une alerte à l'utilisateur qui se connecte. # Check if gymnast have update diff --git a/ultron/followup/forms.py b/ultron/followup/forms.py index e22a4a3d96..e14a5c3416 100644 --- a/ultron/followup/forms.py +++ b/ultron/followup/forms.py @@ -1,10 +1,8 @@ -# coding=UTF-8 - -from django import forms from datetime import date -from django.db import models -from django.forms import fields, widgets +from django import forms +from django.forms import widgets + from .models import ( Chrono, LearnedSkill, @@ -114,40 +112,23 @@ class ScoreForm(forms.ModelForm): "event": forms.HiddenInput(), "routine_type": forms.Select(attrs={"class": "form-control selectpicker"}), "point_execution": forms.NumberInput( - attrs={ - "class": "form-control", - "placeholder": "xx,xx", - "min": "0" - } + attrs={"class": "form-control", "placeholder": "xx,xx", "min": "0"} ), "point_difficulty": forms.NumberInput( - attrs={ - "class": "form-control", - "placeholder": "xx,xx", - "min": "0" - } + attrs={"class": "form-control", "placeholder": "xx,xx", "min": "0"} ), "point_time_of_flight": forms.NumberInput( - attrs={ - "class": "form-control", - "placeholder": "xx,xx", - "min": "0" - } + attrs={"class": "form-control", "placeholder": "xx,xx", "min": "0"} ), "point_horizontal_displacement": forms.NumberInput( - attrs={ - "class": "form-control", - "placeholder": "x,xx", - "min": "0" - } + attrs={"class": "form-control", "placeholder": "x,xx", "min": "0"} ), "penality": forms.NumberInput( attrs={ "class": "form-control", - "placeholder": - "xx,xx", + "placeholder": "xx,xx", "value": "0", - "min": "0" + "min": "0", } ), "total": forms.TextInput( @@ -201,7 +182,7 @@ class AccidentForm(forms.ModelForm): "informations": forms.Textarea( attrs={ "class": "form-control", - "placeholder": "Informations about accident: context (why, where, …), consequencies, re-education exercices, …", + "placeholder": "Informations about accident: context (why, where, …), consequencies, re-education exercices, …", # pylint: disable=line-too-long } ), } @@ -244,10 +225,10 @@ class MindStateForm(forms.ModelForm): "event": forms.HiddenInput(), "score": forms.NumberInput( attrs={ - "class": "form-control", - "placeholder": "x", - "min": "0", - "max": "10" + "class": "form-control", + "placeholder": "x", + "min": "0", + "max": "10", } ), "informations": forms.Textarea( @@ -343,7 +324,7 @@ class HeightWeightForm(forms.ModelForm): "class": "form-control", "placeholder": "xxx,x", "min": "100", - "max": "220" + "max": "220", } ), "hips_height": forms.NumberInput( @@ -351,7 +332,7 @@ class HeightWeightForm(forms.ModelForm): "class": "form-control", "placeholder": "xxx,x", "min": "50", - "max": "110" + "max": "110", } ), "weight": forms.NumberInput( @@ -359,7 +340,7 @@ class HeightWeightForm(forms.ModelForm): "class": "form-control", "placeholder": "xxx,x", "min": "20", - "max": "110" + "max": "110", } ), } @@ -378,7 +359,14 @@ class HeightWeightForm(forms.ModelForm): class NumberOfRoutineDoneForm(forms.ModelForm): class Meta: model = NumberOfRoutineDone - fields = ("gymnast", "routine", "routine_type", "date", "number_of_try", "number_of_successes") + fields = ( + "gymnast", + "routine", + "routine_type", + "date", + "number_of_try", + "number_of_successes", + ) widgets = { "gymnast": forms.HiddenInput(), "routine": forms.HiddenInput(), @@ -393,7 +381,7 @@ class NumberOfRoutineDoneForm(forms.ModelForm): "class": "form-control", "placeholder": "x", "min": "0", - "max": "50" + "max": "50", } ), "number_of_successes": forms.NumberInput( @@ -401,7 +389,7 @@ class NumberOfRoutineDoneForm(forms.ModelForm): "class": "form-control", "placeholder": "x", "min": "0", - "max": "50" + "max": "50", } ), } @@ -448,7 +436,7 @@ class PlanForm(forms.ModelForm): "cando": forms.Select(attrs={"class": "form-control selectpicker"}), "is_done": forms.CheckboxInput( attrs={"class": "form-control form-check-input ml-0 mt-0"} - ) + ), } gymnast_related = forms.CharField( diff --git a/ultron/followup/models.py b/ultron/followup/models.py index 3c9783881d..b809c8332a 100644 --- a/ultron/followup/models.py +++ b/ultron/followup/models.py @@ -1,6 +1,7 @@ -from django.db import models + from datetime import date -from django.db.models.deletion import CASCADE + +from django.db import models from ultron.tools.models import Markdownizable from ultron.people.models import Gymnast diff --git a/ultron/followup/views.py b/ultron/followup/views.py index 3bca1c6d39..a756deb6cb 100644 --- a/ultron/followup/views.py +++ b/ultron/followup/views.py @@ -1,3 +1,5 @@ +from datetime import datetime + 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 @@ -8,6 +10,7 @@ from django.urls import reverse from ultron.people.models import Gymnast from ultron.planning.models import Event from ultron.objective.models import Skill + from .models import ( Plan, Point, @@ -18,6 +21,7 @@ from .models import ( HeightWeight, NumberOfRoutineDone, ) + from .forms import ( PlanForm, ScoreForm, @@ -29,9 +33,6 @@ from .forms import ( NumberOfRoutineDoneForm, ) -from datetime import datetime -import simplejson - @login_required @require_http_methods(["GET"]) @@ -65,10 +66,7 @@ def chrono_create_or_update(request, chronoid=None, gymnast_id=None): data = None if gymnast_id is not None: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": gymnast - } + data = {"gymnast": gymnast_id, "gymnast_related": gymnast} if request.method == "POST": form = ChronoForm(request.POST, instance=chrono) @@ -87,8 +85,8 @@ def chrono_create_or_update(request, chronoid=None, gymnast_id=None): return HttpResponseRedirect( "/gymnast/details/" + str(new_chrono.gymnast.id) + "/" ) - else: - print(form.errors) + + print(form.errors) else: form = ChronoForm(instance=chrono, initial=data) @@ -116,12 +114,12 @@ def gymnast_learn_skill(request): ) learned_skill.save() return HttpResponse(status=200) + + if gymnast_id: + print("Error : can not link Gymnast and skill. Missing Skill_ID.") else: - if gymnast_id: - print("Error : can not link Gymnast and skill. Missing Skill_ID.") - else: - print("Error : can not link Gymnast and skill. Missing Gymnast_ID.") - return HttpResponse(status=500) + print("Error : can not link Gymnast and skill. Missing Gymnast_ID.") + return HttpResponse(status=500) @login_required @@ -145,9 +143,11 @@ def learnedskill_create_or_update(request, gymnast_id=None): if form.is_valid(): form.save() - return HttpResponseRedirect(reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,))) - else: - print(form.errors) + return HttpResponseRedirect( + reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,)) + ) + + print(form.errors) else: form = LearnedSkillForm(initial=data) @@ -173,24 +173,23 @@ def score_create_or_update(request, scoreid=None, gymnast_id=None): data = None if gymnast_id is not None: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": str(gymnast) - } + data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast)} if request.method == "POST": form = ScoreForm(request.POST, instance=score) if form.is_valid(): form.save() - return HttpResponseRedirect(reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,))) + return HttpResponseRedirect( + reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,)) + ) # return HttpResponseRedirect( # "/gymnast/details/" # + str(form.cleaned_data["gymnast"].id) # + "/" # ) - else: - print(form.errors) + + print(form.errors) else: form = ScoreForm(instance=score, initial=data) @@ -210,8 +209,7 @@ def score_listing(request, gymnast_id=None): if pattern: score_list = Point.objects.filter( - Q(event__icontains=pattern) - | Q(gymnast__icontains=pattern) + Q(event__icontains=pattern) | Q(gymnast__icontains=pattern) ) elif gymnast_id: score_list = Point.objects.filter(gymnast=gymnast_id) @@ -261,22 +259,20 @@ def accident_create_or_update(request, accidentid=None, gymnast_id=None): data = None if gymnast_id is not None: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": str(gymnast) - } + data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast)} if request.method == "POST": form = AccidentForm(request.POST, instance=accident) if form.is_valid(): form.save() + if accidentid: return HttpResponseRedirect("/accident/" + str(accidentid) + "/") - else: - return HttpResponseRedirect("/accident/") - else: - print(form.errors) + + return HttpResponseRedirect("/accident/") + + print(form.errors) else: form = AccidentForm(instance=accident, initial=data) @@ -314,32 +310,25 @@ def mindstate_listing(request, gymnast_id=None): @login_required @require_http_methods(["GET", "POST"]) -def mindstate_create_or_update(request, mindstateid=None, gymnast_id=None, eventid=None): +def mindstate_create_or_update( + request, mindstateid=None, gymnast_id=None, eventid=None +): """ Formulaire de création d'un nouvel accident. """ if mindstateid: mindstate = get_object_or_404(MindState, pk=mindstateid) - data = { - "gymnast_related": mindstate.gymnast, - "event_related": mindstate.event - } + data = {"gymnast_related": mindstate.gymnast, "event_related": mindstate.event} else: mindstate = None data = None if gymnast_id is not None: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": str(gymnast) - } + data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast)} if eventid is not None: event = get_object_or_404(Event, pk=eventid) - data = { - "event": eventid, - "event_related": str(event) - } + data = {"event": eventid, "event_related": str(event)} if request.method == "POST": form = MindStateForm(request.POST, instance=mindstate) @@ -348,10 +337,10 @@ def mindstate_create_or_update(request, mindstateid=None, gymnast_id=None, event form.save() if mindstateid: return HttpResponseRedirect("/mindstate/" + str(mindstateid) + "/") - else: - return HttpResponseRedirect(reverse("mindstate_list")) - else: - print(form.errors) + + return HttpResponseRedirect(reverse("mindstate_list")) + + print(form.errors) else: form = MindStateForm(instance=mindstate, initial=data) @@ -401,25 +390,32 @@ def heightweight_create_or_update(request, heightweight_id=None, gymnast_id=None heightweight = None data = None if gymnast_id: - heightweight = HeightWeight.objects.filter(gymnast=gymnast_id).order_by('-date').first() + heightweight = ( + HeightWeight.objects.filter(gymnast=gymnast_id) + .order_by("-date") + .first() + ) gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": str(gymnast) - } + data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast)} if request.method == "POST": form = HeightWeightForm(request.POST, instance=heightweight) if form.is_valid(): form.save() - return HttpResponseRedirect(reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,))) - else: - print(form.errors) + return HttpResponseRedirect( + reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,)) + ) + + print(form.errors) else: form = HeightWeightForm(instance=heightweight, initial=data) - context = {"form": form, "gymnast_id": gymnast_id, "heightweight_id": heightweight_id} + context = { + "form": form, + "gymnast_id": gymnast_id, + "heightweight_id": heightweight_id, + } return render(request, "followup/heightweight/create.html", context) @@ -451,24 +447,23 @@ def routinedone_create_or_update(request, routinedone_id=None, gymnast_id=None): "gymnast": routinedone.gymnast.id, "gymnast_related": str(routinedone.gymnast), "routine": routinedone.routine.id, - "routine_related": str(routinedone.routine) + "routine_related": str(routinedone.routine), } else: routinedone = None data = None if gymnast_id is not None: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - data = { - "gymnast": gymnast_id, - "gymnast_related": gymnast - } + data = {"gymnast": gymnast_id, "gymnast_related": gymnast} if request.method == "POST": form = NumberOfRoutineDoneForm(request.POST, instance=routinedone) if form.is_valid(): form.save() - return HttpResponseRedirect(reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,))) + return HttpResponseRedirect( + reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,)) + ) else: print(form.errors) else: diff --git a/ultron/location/forms.py b/ultron/location/forms.py index 26c3020ab7..dbad657ea6 100644 --- a/ultron/location/forms.py +++ b/ultron/location/forms.py @@ -1,7 +1,6 @@ -# coding=UTF-8 from django import forms -from datetime import date + from .models import Place diff --git a/ultron/location/models.py b/ultron/location/models.py index d6369e5fe6..34aab3f0cb 100644 --- a/ultron/location/models.py +++ b/ultron/location/models.py @@ -1,4 +1,3 @@ -# coding=UTF-8 from django.db import models @@ -55,7 +54,8 @@ class Club(models.Model): Représente un club. Un club est associé à un lieu. Pour faciliter les filtres, un club peut être actif ou non. - .. todo:: Un club peut avoir plusieurs salle et une salle peut-être louée par plusieurs clubs... M2M ? + .. todo:: Un club peut avoir plusieurs salle + et une salle peut-être louée par plusieurs clubs... M2M ? """ class Meta: diff --git a/ultron/location/tests.py b/ultron/location/tests.py deleted file mode 100644 index 7ce503c2dd..0000000000 --- a/ultron/location/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ultron/location/urls.py b/ultron/location/urls.py index 17fc85223d..91a9029b78 100644 --- a/ultron/location/urls.py +++ b/ultron/location/urls.py @@ -1,4 +1,3 @@ -# coding=UTF-8 from django.urls import path diff --git a/ultron/location/views.py b/ultron/location/views.py index e0ec8e2a36..4549e7de08 100644 --- a/ultron/location/views.py +++ b/ultron/location/views.py @@ -1,21 +1,12 @@ -from datetime import datetime, timedelta, date -from functools import reduce -import operator +from datetime import datetime import simplejson -from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout from django.contrib.auth.decorators import login_required -from django.db.models import Q, Count +from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render, get_object_or_404 -from django.template import RequestContext -from django.utils.html import format_html from django.views.decorators.http import require_http_methods -from ultron.planning.models import ( - Event, -) - from .models import ( Club, Place, @@ -24,7 +15,7 @@ from .models import ( from .forms import PlaceForm -def __diffTime(end, start): +def __difference_between_times(end, start): """ Prend deux `datetime.time` en paramètre et calcul la différence entre les deux. """ @@ -153,11 +144,11 @@ def club_lookup(request): @login_required -def chooseStatistics(request): +def choose_statistics(request): """ - Renvoie la liste des clubs et des saisons pour que l'utilisateur choisisse quelles statistiques il veut voir. + Renvoie la liste des clubs et des saisons pour que l'utilisateur + choisisse quelles statistiques il veut voir. """ - pass # year = int(request.GET.get("year", date.today().year)) @@ -185,7 +176,6 @@ def club_statistics(request, clubid): .. todo:: tenir compte de la saison. """ - pass # courses = Course.objects.filter(club__in=clubid).order_by( @@ -204,7 +194,9 @@ def club_statistics(request, clubid): # list_of_gymnasts = Gymnast.objects.filter(to_gym__in=course.to_subgroup.all()) # gymnasts.extend(list_of_gymnasts) # nbgymnast = len(list_of_gymnasts) -# # gymnasts = set(gymnasts.extend(Gymnast.objects.filter(to_gym__in=course.to_subgroup.all()))) +# # gymnasts = set(gymnasts.extend(Gymnast.objects.filter( +# to_gym__in=course.to_subgroup.all())) +# ) # nbhour = __diffTime(course.hour_end, course.hour_begin) # timedelta # totalHoursByWeek += nbhour.seconds @@ -292,7 +284,8 @@ def club_statistics(request, clubid): # - gymnastsDict[gymnast.id]["nbattendance"] # ) -# # tmp = (gymnastsDict[gymnast.id]['nbhourattendance'].days * 24) + (gymnastsDict[gymnast.id]['nbhourattendance'].seconds/3600) +# # tmp = (gymnastsDict[gymnast.id]['nbhourattendance'].days * 24) +# + (gymnastsDict[gymnast.id]['nbhourattendance'].seconds/3600) # gymnastsDict[gymnast.id]["nbhourattendance"] = ( # gymnastsDict[gymnast.id]["nbhourattendance"].days * 24 # ) + (gymnastsDict[gymnast.id]["nbhourattendance"].seconds / 3600) diff --git a/ultron/objective/admin.py b/ultron/objective/admin.py index 3f13ad3b83..a5b85af147 100644 --- a/ultron/objective/admin.py +++ b/ultron/objective/admin.py @@ -1,8 +1,9 @@ from django.contrib import admin -from .models import Educative, TouchPosition, Skill, Routine, RoutineSkill from django_extensions.admin import ForeignKeyAutocompleteAdmin +from .models import TouchPosition, Skill, Routine, RoutineSkill + class TouchPositionAdmin(admin.ModelAdmin): model = TouchPosition @@ -13,10 +14,10 @@ class TouchPositionAdmin(admin.ModelAdmin): list_filter = ("allowed_in_competition",) -def duplicate_skill(self, SkillAdmin, request, queryset): - for object in queryset: - object.id = None - object.save() +def duplicate_skill(modeladmin, request, queryset): # pylint: disable=unused-argument + for obj in queryset: + obj.id = None + obj.save() class SkillAdmin(ForeignKeyAutocompleteAdmin): @@ -141,4 +142,4 @@ class RoutineSkillAdmin(admin.ModelAdmin): admin.site.register(TouchPosition, TouchPositionAdmin) admin.site.register(Skill, SkillAdmin) admin.site.register(Routine, RoutineAdmin) -admin.site.register(RoutineSkill, RoutineSkillAdmin) \ No newline at end of file +admin.site.register(RoutineSkill, RoutineSkillAdmin) diff --git a/ultron/objective/forms.py b/ultron/objective/forms.py index dd726cb606..0df0d7ac6c 100644 --- a/ultron/objective/forms.py +++ b/ultron/objective/forms.py @@ -1,6 +1,6 @@ from django import forms -from datetime import date -from .models import Routine, RoutineSkill + +from .models import Routine class RoutineForm(forms.ModelForm): @@ -24,10 +24,10 @@ class RoutineForm(forms.ModelForm): "informations": forms.Textarea( attrs={ "class": "form-control", - "placeholder": "Informations about the psychological state of mind : context (why, where, …), possible consequencies, …", + "placeholder": "Informations about the psychological state of mind : context (why, where, …), possible consequencies, …", # pylint: disable=line-too-long } ), "difficulty": forms.HiddenInput(), "level": forms.HiddenInput(), "active": forms.HiddenInput(), - } \ No newline at end of file + } diff --git a/ultron/objective/models.py b/ultron/objective/models.py index 0c79967dc9..cfe6e08b11 100644 --- a/ultron/objective/models.py +++ b/ultron/objective/models.py @@ -1,7 +1,9 @@ + + from django.db import models -from ultron.tools.models import Markdownizable from django.db.models import Q, Count -from datetime import date + +from ultron.tools.models import Markdownizable class Educative(Markdownizable): @@ -68,7 +70,7 @@ def get_default_position(): """ try: return TouchPosition.objects.get(default=True).id - except: + except TouchPosition.DoesNotExist: return None @@ -77,8 +79,13 @@ class Skill(Educative): Classe représentant une figure (aka un saut acrobatique). """ - # SELECT * FROM `objective_skill` WHERE educative_ptr_id NOT IN (SELECT DISTINCT(from_educative_id) FROM `objective_educative_prerequisite`) - # SELECT * FROM `objective_skill`, `objective_educative` WHERE `objective_educative`.id = `objective_skill`.educative_ptr_id + # SELECT * FROM `objective_skill` + # WHERE educative_ptr_id NOT IN ( + # SELECT DISTINCT(from_educative_id) FROM `objective_educative_prerequisite` + # ) + # + # SELECT * FROM `objective_skill`, `objective_educative` + # WHERE `objective_educative`.id = `objective_skill`.educative_ptr_id class Meta: verbose_name = "Skill" diff --git a/ultron/objective/tests.py b/ultron/objective/tests.py deleted file mode 100644 index 7ce503c2dd..0000000000 --- a/ultron/objective/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ultron/objective/urls.py b/ultron/objective/urls.py index 9bd6ab50f1..0a9172ca11 100644 --- a/ultron/objective/urls.py +++ b/ultron/objective/urls.py @@ -30,13 +30,6 @@ routine_urlpatterns = [ views.link_skill_to_routine, name="link_skill_to_routine", ), - # # path(r'/del_skill//order//', views.delete_skill_from_routine, name="delete_skill_from_routine"), - # path( - # r"/order//", - # views.delete_skill_from_routine, - # name="delete_skill_from_routine", - # ), - # path(r"suggest/", views.suggest_routine, name="suggest_routine",), path(r"", views.routine_listing, name="routine_list"), path(r"gymnast/", views.routine_listing, name="routine_list_for_gymnast"), ] diff --git a/ultron/objective/views.py b/ultron/objective/views.py index a11397e7be..eddade4193 100644 --- a/ultron/objective/views.py +++ b/ultron/objective/views.py @@ -1,17 +1,17 @@ -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 from django.db.models import Q +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render, get_object_or_404 +from django.views.decorators.http import require_http_methods from django.urls import reverse -from ultron.people.models import Gymnast -from .models import Skill, Routine, RoutineSkill -from ultron.followup.models import Plan -from .forms import RoutineForm - import simplejson +from ultron.people.models import Gymnast + +from .forms import RoutineForm +from .models import Skill, Routine, RoutineSkill + @login_required @require_http_methods(["GET"]) @@ -27,8 +27,7 @@ def skill_lookup(request): # Ignore queries shorter than length 2 if pattern is not None and len(pattern) > 2: model_results = Skill.objects.filter( - Q(short_label__icontains=pattern) - | Q(long_label__icontains=pattern) + Q(short_label__icontains=pattern) | Q(long_label__icontains=pattern) ) results = [ {"ID": x.id, "Name": str(x), "Notation": x.notation} for x in model_results @@ -52,8 +51,7 @@ def skill_listing(request, field=None, expression=None, value=None, level=None): if pattern: skill_list = Skill.objects.filter( - Q(long_label__icontains=pattern) - | Q(short_label__icontains=pattern) + Q(long_label__icontains=pattern) | Q(short_label__icontains=pattern) ) elif field and expression and value: kwargs = {"{0}__{1}".format(field, expression): value} @@ -70,9 +68,10 @@ def skill_listing(request, field=None, expression=None, value=None, level=None): @login_required @require_http_methods(["GET"]) def skill_details(request, skillid): - """ - Récupère toutes les informations d'un skill. - La méthode en profite pour vérifier les champs level, rank, age_boy et age_girl par rapport aux pré-requis. + """Récupère toutes les informations d'un skill. + + La méthode en profite pour vérifier les champs level, rank, age_boy et age_girl + par rapport aux pré-requis. :param skillig: id d'un `skill` :type skillid: int @@ -103,16 +102,14 @@ def skill_details(request, skillid): @login_required @require_http_methods(["GET"]) def routine_listing(request, gymnast_id=None): - """ - Récupère la liste des routines (série) suivant un pattern si celui-ci est définit. + """Récupère la liste des routines suivant un pattern si celui-ci est défini """ gymnast = None pattern = request.GET.get("pattern", None) if pattern: routine_list = Routine.objects.filter( - Q(long_label__icontains=pattern) - | Q(short_label__icontains=pattern) + Q(long_label__icontains=pattern) | Q(short_label__icontains=pattern) ) else: if gymnast_id: @@ -121,7 +118,11 @@ def routine_listing(request, gymnast_id=None): else: routine_list = Routine.objects.all() - context = {"routine_list": routine_list, "gymnast_id": gymnast_id, "gymnast": gymnast} + context = { + "routine_list": routine_list, + "gymnast_id": gymnast_id, + "gymnast": gymnast, + } return render(request, "objectives/routines/list.html", context) @@ -135,8 +136,7 @@ def routine_lookup(request): if pattern is not None and len(pattern) >= 3: results = Routine.objects.filter( - Q(long_label__icontains=pattern) - | Q(short_label__icontains=pattern) + Q(long_label__icontains=pattern) | Q(short_label__icontains=pattern) ) place_list = [{"id": x.id, "label": str(x)} for x in results] @@ -234,8 +234,8 @@ def routine_create_or_update(request, routineid=None): # something like this : http://stackoverflow.com/questions/3074938/django-m2m-form-save-through-table # TO_FRED : can you help me ? return HttpResponseRedirect(reverse("routine_details", args=(routine.pk,))) - else: - print(form.errors) + + print(form.errors) else: form = RoutineForm(instance=routine) @@ -270,9 +270,5 @@ def link_skill_to_routine(request, routineid, skillid, order): link, created = RoutineSkill.objects.get_or_create( routine=routine, skill=skill, rank=order ) - # context = {'link':link, 'created':created} - # return render(request, 'compose_routine.html', context) return HttpResponse(200, (link, created)) - # except: - # return False \ No newline at end of file diff --git a/ultron/people/models.py b/ultron/people/models.py index 3f0344164a..239b43c0da 100644 --- a/ultron/people/models.py +++ b/ultron/people/models.py @@ -1,8 +1,10 @@ + +from datetime import date + from django.db import models -from django.db.models import Q, Count, Min +from django.db.models import Count import pendulum -from datetime import date from ultron.location.models import Club from ultron.objective.models import Skill @@ -36,7 +38,7 @@ class Gymnast(Markdownizable): hours_by_week = models.PositiveSmallIntegerField(verbose_name="# Hours by week") def __str__(self): - return u"%s %s" % (self.first_name, self.last_name) + return "%s %s" % (self.first_name, self.last_name) @property def next_birthday(self): diff --git a/ultron/people/templatetags/level_chart_bar.py b/ultron/people/templatetags/level_chart_bar.py index f2ef821caf..055dbc16fb 100644 --- a/ultron/people/templatetags/level_chart_bar.py +++ b/ultron/people/templatetags/level_chart_bar.py @@ -16,4 +16,4 @@ def generate_level_chart_bar(gymnast_id): gymnast_known_skills = gymnast.known_skills.count() context = gymnast.get_informations_from_level() - return context \ No newline at end of file + return context diff --git a/ultron/people/templatetags/skill_doughnut.py b/ultron/people/templatetags/skill_doughnut.py index afe7c9067f..2ccbcea38c 100644 --- a/ultron/people/templatetags/skill_doughnut.py +++ b/ultron/people/templatetags/skill_doughnut.py @@ -35,11 +35,17 @@ def generate_skill_doughnut(gymnast_id): .distinct() .count() ) - + nb_skill = Skill.objects.all().count() gymnast_nb_known_skills = ( LearnedSkill.objects.filter(gymnast=gymnast_id).distinct("skill").count() ) nb_unknown_skill = nb_skill - gymnast_nb_known_skills - return {"nb_skill_masterised": nb_skill_masterised, "nb_skill_chained": nb_skill_chained, "nb_skill_without_help": nb_skill_without_help, "nb_skill_whith_help": nb_skill_whith_help, "nb_unknown_skill": nb_unknown_skill} \ No newline at end of file + return { + "nb_skill_masterised": nb_skill_masterised, + "nb_skill_chained": nb_skill_chained, + "nb_skill_without_help": nb_skill_without_help, + "nb_skill_whith_help": nb_skill_whith_help, + "nb_unknown_skill": nb_unknown_skill, + } diff --git a/ultron/people/tests.py b/ultron/people/tests.py index 287e9d31bd..a8a25924f9 100644 --- a/ultron/people/tests.py +++ b/ultron/people/tests.py @@ -1,49 +1,48 @@ from datetime import datetime from django.test import TestCase -from django.urls import reverse from ultron.people.models import Gymnast class GymnastTestCase(TestCase): def test_gymnast_tostring(self): - g = Gymnast(last_name="Pauchou", first_name="Fred") - self.assertEqual(str(g), "Fred Pauchou") + gymnast = Gymnast(last_name="Pauchou", first_name="Fred") + self.assertEqual(str(gymnast), "Fred Pauchou") def test_gymnaste_get_age(self): - g = Gymnast( + gymnast = Gymnast( last_name="Pauchou", first_name="Fred", birthdate=datetime.strptime("03/07/1985", "%d/%m/%Y"), ) - self.assertEqual(g.age, 36) + self.assertEqual(gymnast.age, 36) def test_gymnaste_get_next_age(self): - g = Gymnast( + gymnast = Gymnast( last_name="Pauchou", first_name="Fred", birthdate=datetime.strptime("03/07/1985", "%d/%m/%Y"), ) - self.assertEqual(g.next_age, 37) + self.assertEqual(gymnast.next_age, 37) def test_gymnaste_next_birthday(self): - g = Gymnast( + gymnast = Gymnast( last_name="Pauchou", first_name="Fred", birthdate=datetime.strptime("03/07/1985", "%d/%m/%Y"), ) - self.assertEqual(g.next_birthday, datetime.strptime("03/07/2022", "%d/%m/%Y")) + self.assertEqual(gymnast.next_birthday, datetime.strptime("03/07/2022", "%d/%m/%Y")) def test_next_birthday_in_days(self): - g = Gymnast( + gymnast = Gymnast( last_name="Pauchou", first_name="Fred", birthdate=datetime.strptime("03/07/1985", "%d/%m/%Y"), ) - self.assertEqual(g.next_birthday_in_days, 196) + self.assertEqual(gymnast.next_birthday_in_days, 196) def test_min_rank_skill(self): pass diff --git a/ultron/people/urls.py b/ultron/people/urls.py index a09c4fd6a5..216f4bf41b 100644 --- a/ultron/people/urls.py +++ b/ultron/people/urls.py @@ -1,4 +1,4 @@ -from django.urls import path, re_path +from django.urls import path from . import views diff --git a/ultron/people/views.py b/ultron/people/views.py index 1f36bcd4ef..e6052e78ec 100644 --- a/ultron/people/views.py +++ b/ultron/people/views.py @@ -1,15 +1,14 @@ -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, F, Count, Min -from django.contrib import messages -from .models import Gymnast -from .forms import GymnastForm +from django.contrib.auth.decorators import login_required +from django.db.models import Q, F +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render, get_object_or_404 +from django.views.decorators.http import require_http_methods + +import simplejson +import pendulum + from ultron.followup.models import Event -from ultron.objective.models import Educative from ultron.followup.forms import GymnastHasRoutineForm from ultron.followup.models import ( Chrono, @@ -20,11 +19,10 @@ from ultron.followup.models import ( Accident, HeightWeight, NumberOfRoutineDone, - Plan ) -import simplejson -import pendulum +from .models import Gymnast +from .forms import GymnastForm @login_required @@ -80,13 +78,19 @@ def gymnast_details(request, gymnast_id, tab=None): percentage_known_skill = (nb_known_skill / nb_skill) * 100 chronos_list = Chrono.objects.filter(gymnast=gymnast_id).order_by("-date")[:10] straightjump_score = ( - Chrono.objects.filter(gymnast=gymnast_id).filter(chrono_type=0).order_by("-date") + Chrono.objects.filter(gymnast=gymnast_id) + .filter(chrono_type=0) + .order_by("-date") ) best_straightjump = ( - Chrono.objects.filter(gymnast=gymnast_id).filter(chrono_type=0).order_by("-score")[:1] + Chrono.objects.filter(gymnast=gymnast_id) + .filter(chrono_type=0) + .order_by("-score")[:1] ) best_routine = ( - Chrono.objects.filter(gymnast=gymnast_id).filter(chrono_type=1).order_by("-score")[:1] + Chrono.objects.filter(gymnast=gymnast_id) + .filter(chrono_type=1) + .order_by("-score")[:1] ) nb_unknown_skill = nb_skill - gymnast_nb_known_skills @@ -217,10 +221,18 @@ def gymnast_display_routines(request, gymnast_id): Tag affichant les séries d'un gymnaste. """ gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - ghr_list = gymnast.has_routine.prefetch_related("routine").filter(dateend__isnull=True) - routine_done_list = NumberOfRoutineDone.objects.filter(gymnast = gymnast_id).order_by("-date")[:8] + ghr_list = gymnast.has_routine.prefetch_related("routine").filter( + dateend__isnull=True + ) + routine_done_list = NumberOfRoutineDone.objects.filter(gymnast=gymnast_id).order_by( + "-date" + )[:8] - context = {"ghr_list": ghr_list, "routine_done_list": routine_done_list, "gymnast_id": gymnast_id} + context = { + "ghr_list": ghr_list, + "routine_done_list": routine_done_list, + "gymnast_id": gymnast_id, + } return render(request, "people/gymnasts/list_routine.html", context) @@ -243,9 +255,8 @@ def link_routine_to_gymnast(request, gymnast_id=None): form.save() if gymnast_id is not None: return HttpResponseRedirect("/gymnast/details/" + str(gymnast_id) + "/") - else: - return HttpResponseRedirect("/gymnast/") + return HttpResponseRedirect("/gymnast/") else: form = GymnastHasRoutineForm(instance=gymnast, initial=data) diff --git a/ultron/planning/forms.py b/ultron/planning/forms.py index 93f81acacb..5ccc51543d 100644 --- a/ultron/planning/forms.py +++ b/ultron/planning/forms.py @@ -1,15 +1,16 @@ from datetime import date from django import forms -from django.contrib.admin.widgets import FilteredSelectMultiple from ultron.people.models import Gymnast + from .models import Event class EventForm(forms.ModelForm): - # gymnasts = forms.ModelMultipleChoiceField(queryset=Gymnast.objects.all(), widget=FilteredSelectMultiple('Gymnast(s)', is_stacked=False)) + # gymnasts = forms.ModelMultipleChoiceField(queryset=Gymnast.objects.all(), + # widget=FilteredSelectMultiple('Gymnast(s)', is_stacked=False)) class Meta: model = Event diff --git a/ultron/planning/models.py b/ultron/planning/models.py index 5d4fe3ca4c..13d2034eaf 100644 --- a/ultron/planning/models.py +++ b/ultron/planning/models.py @@ -1,6 +1,5 @@ from datetime import datetime, time -from django.contrib.auth import get_user_model from django.db import models import pendulum diff --git a/ultron/planning/tests.py b/ultron/planning/tests.py deleted file mode 100644 index 7ce503c2dd..0000000000 --- a/ultron/planning/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ultron/planning/urls.py b/ultron/planning/urls.py index 1b2dbdc208..eef8956f06 100644 --- a/ultron/planning/urls.py +++ b/ultron/planning/urls.py @@ -1,4 +1,4 @@ -from django.urls import path, re_path +from django.urls import path from . import views diff --git a/ultron/planning/views.py b/ultron/planning/views.py index 8c1dafd231..152f94d0f7 100644 --- a/ultron/planning/views.py +++ b/ultron/planning/views.py @@ -4,6 +4,8 @@ from django.shortcuts import render, get_object_or_404 from django.utils import timezone from django.views.decorators.http import require_http_methods +import simplejson + # from followup.models import Chrono, Skill from ultron.people.models import Gymnast @@ -17,7 +19,7 @@ from .forms import EventForm # import pendulum -import simplejson + # import collections # import locale @@ -64,8 +66,8 @@ def event_create_or_update(request, eventid=None): if event_form.is_valid(): event = event_form.save() return HttpResponseRedirect("/event/" + str(event.id) + "/") - else: - print(event_form.errors) + + print(event_form.errors) form = EventForm(instance=event, initial=data) @@ -89,7 +91,7 @@ def link_gymnast_to_event(request, eventid, gymnastid): try: gymnast = get_object_or_404(Gymnast, pk=gymnastid) event = get_object_or_404(Event, pk=eventid) - link = Event_Participation.objects.create(gymnast=gymnast, event=event) + Event_Participation.objects.create(gymnast=gymnast, event=event) except: return HttpResponse(409) @@ -173,8 +175,8 @@ def event_detail(request, eventid=None): event = Event.objects.get(pk=eventid) gymnast_list = [] - today = timezone.now().date() - tohour = timezone.now().time() + # today = timezone.now().date() + # tohour = timezone.now().time() # if event.datebegin.date() > today: # for gymnast in event.gymnasts.all(): diff --git a/ultron/profiles/forms.py b/ultron/profiles/forms.py index 3ce7bf6d41..d0c116e498 100644 --- a/ultron/profiles/forms.py +++ b/ultron/profiles/forms.py @@ -1,7 +1,8 @@ -# coding=UTF-8 + +from datetime import date from django import forms -from datetime import date + from .models import Profile diff --git a/ultron/profiles/models.py b/ultron/profiles/models.py index 9b51fd6fbe..306aba1674 100644 --- a/ultron/profiles/models.py +++ b/ultron/profiles/models.py @@ -9,7 +9,7 @@ Les profils peuvent enregistrer les informations suivantes: from django.contrib.auth import get_user_model from django.db import models -from django.dispatch import receiver + User = get_user_model() diff --git a/ultron/profiles/tests.py b/ultron/profiles/tests.py deleted file mode 100644 index 7ce503c2dd..0000000000 --- a/ultron/profiles/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ultron/profiles/urls.py b/ultron/profiles/urls.py index d75df28040..be7bb26268 100644 --- a/ultron/profiles/urls.py +++ b/ultron/profiles/urls.py @@ -1,6 +1,6 @@ """URLs définissant la gestion des profils utilisateurs.""" -from django.urls import path, re_path +from django.urls import path from . import views diff --git a/ultron/profiles/views.py b/ultron/profiles/views.py index c2c31fa171..f4f832e064 100644 --- a/ultron/profiles/views.py +++ b/ultron/profiles/views.py @@ -2,14 +2,14 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import get_user_model -from django.db.models import Q -from django.http import HttpResponseRedirect, HttpResponse -from django.shortcuts import get_object_or_404, render +from django.http import HttpResponseRedirect +from django.shortcuts import render from django.views.decorators.http import require_http_methods from .forms import ProfileForm from .models import Profile + User = get_user_model() diff --git a/ultron/tools/models.py b/ultron/tools/models.py index 72cdd95d38..8c01094a6e 100644 --- a/ultron/tools/models.py +++ b/ultron/tools/models.py @@ -1,7 +1,6 @@ """Ensemble des classes d'utilité publique :-)""" from django.db import models -from datetime import datetime, date, time, timedelta from django.utils import timezone import markdown @@ -135,8 +134,8 @@ class Temporizable(models.Model): """ if rest: return get_number_of_weeks_between(the_date, self.dateend.date()) - else: - return get_number_of_weeks_between(self.datebegin.date(), the_date) + + return get_number_of_weeks_between(self.datebegin.date(), the_date) class Markdownizable(models.Model): diff --git a/ultron/tools/templatetags/menuitems.py b/ultron/tools/templatetags/menuitems.py index 117dd224fd..b5ce6fa595 100644 --- a/ultron/tools/templatetags/menuitems.py +++ b/ultron/tools/templatetags/menuitems.py @@ -19,33 +19,32 @@ def menuitem(context, url, css_class, title): css_class, title, ) - else: - if url == "/admin/": - return format_html( - '
  • {}

  • ', - url, - css_class, - title, - ) - else: - return format_html( - '
  • {}

  • ', - url, - css_class, - title, - ) - else: # si le contexte est "/" - if context.request.path == url: + + if url == "/admin/": return format_html( - '
  • {}

  • ', + '
  • {}

  • ', url, css_class, title, ) - else: - return format_html( + return format_html( '
  • {}

  • ', url, css_class, title, ) + + if context.request.path == url: # si le contexte est "/" + return format_html( + '
  • {}

  • ', + url, + css_class, + title, + ) + + return format_html( + '
  • {}

  • ', + url, + css_class, + title, + ) From 4e6bb63019e37f6a71d916b78450f46f69b2196e Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 7 Jan 2022 19:28:23 +0100 Subject: [PATCH 3/4] Remove duplicate code from pylint --- .pylintrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.pylintrc b/.pylintrc index cfc4343b5a..c04c25493f 100644 --- a/.pylintrc +++ b/.pylintrc @@ -93,6 +93,7 @@ disable=raw-checker-failed, missing-module-docstring, missing-function-docstring, consider-using-f-string, + duplicate-code, # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option From b502b57a2a4db62dccc032e0c284b6cd9f2a7be0 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 7 Jan 2022 19:28:33 +0100 Subject: [PATCH 4/4] Finalize pylint review --- ultron/followup/admin.py | 4 +- ultron/followup/forms.py | 3 +- ultron/followup/tests.py | 3 -- ultron/followup/urls.py | 6 +-- ultron/followup/views.py | 4 +- ultron/objective/views.py | 2 +- ultron/people/models.py | 40 ++++++++++++++----- ultron/people/templatetags/level_chart_bar.py | 2 +- ultron/people/views.py | 12 +++--- ultron/planning/admin.py | 4 +- ultron/planning/forms.py | 2 - ultron/planning/views.py | 1 - ultron/profiles/forms.py | 2 - ultron/tools/templatetags/menuitems.py | 2 +- 14 files changed, 48 insertions(+), 39 deletions(-) delete mode 100644 ultron/followup/tests.py diff --git a/ultron/followup/admin.py b/ultron/followup/admin.py index ac719f3ae6..a4b861ca3f 100644 --- a/ultron/followup/admin.py +++ b/ultron/followup/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from django.db.models import fields + +from django_extensions.admin import ForeignKeyAutocompleteAdmin from .models import ( Chrono, @@ -12,7 +13,6 @@ from .models import ( HeightWeight, Plan ) -from django_extensions.admin import ForeignKeyAutocompleteAdmin class ChronoAdmin(ForeignKeyAutocompleteAdmin): diff --git a/ultron/followup/forms.py b/ultron/followup/forms.py index e14a5c3416..9e6e7e8001 100644 --- a/ultron/followup/forms.py +++ b/ultron/followup/forms.py @@ -1,7 +1,6 @@ from datetime import date from django import forms -from django.forms import widgets from .models import ( Chrono, @@ -234,7 +233,7 @@ class MindStateForm(forms.ModelForm): "informations": forms.Textarea( attrs={ "class": "form-control", - "placeholder": "Informations about the psychological state of mind : context (why, where, …), possible consequencies, …", + "placeholder": "Informations about the psychological state of mind : context (why, where, …), possible consequencies, …", # pylint: disable=line-too-long } ), } diff --git a/ultron/followup/tests.py b/ultron/followup/tests.py deleted file mode 100644 index 7ce503c2dd..0000000000 --- a/ultron/followup/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/ultron/followup/urls.py b/ultron/followup/urls.py index e752a97655..be29e79eb3 100644 --- a/ultron/followup/urls.py +++ b/ultron/followup/urls.py @@ -1,6 +1,4 @@ -from django.urls import path, re_path - -from ultron.followup.models import MindState +from django.urls import path from . import views @@ -152,4 +150,4 @@ plan_urlpatterns = [ views.plan_create_or_update, name="plan_update", ), -] \ No newline at end of file +] diff --git a/ultron/followup/views.py b/ultron/followup/views.py index a756deb6cb..713b1312e5 100644 --- a/ultron/followup/views.py +++ b/ultron/followup/views.py @@ -464,8 +464,8 @@ def routinedone_create_or_update(request, routinedone_id=None, gymnast_id=None): return HttpResponseRedirect( reverse("gymnast_details", args=(form.cleaned_data["gymnast"].id,)) ) - else: - print(form.errors) + + print(form.errors) else: form = NumberOfRoutineDoneForm(instance=routinedone, initial=data) diff --git a/ultron/objective/views.py b/ultron/objective/views.py index eddade4193..e71a4be888 100644 --- a/ultron/objective/views.py +++ b/ultron/objective/views.py @@ -231,7 +231,7 @@ def routine_create_or_update(request, routineid=None): routine = form.save() # ici faire un FOR skill in form_skills_list: # record.save() # ca sauve le record dans la table RoutineSkill - # something like this : http://stackoverflow.com/questions/3074938/django-m2m-form-save-through-table + # something like this : http://stackoverflow.com/questions/3074938/django-m2m-form-save-through-table # pylint: disable=line-too-long # TO_FRED : can you help me ? return HttpResponseRedirect(reverse("routine_details", args=(routine.pk,))) diff --git a/ultron/people/models.py b/ultron/people/models.py index 239b43c0da..61dd2e2d24 100644 --- a/ultron/people/models.py +++ b/ultron/people/models.py @@ -154,8 +154,9 @@ class Gymnast(Markdownizable): def unknown_skill_lte_level(self, max_level_skill): """ - Renvoie la liste des skill inférieurs ou égaux au niveau max que le gymnaste ne sait *pas* faire. - Liste des Skill que le gymnaste ne sait PAS faire, classé par niveau (ayant un niveau inférieur ou égal au niveau max du gym) + Liste des Skill que le gymnaste ne sait PAS faire/ + + Ces skills sont classé par niveau. """ return Skill.objects.filter(level__lte=max_level_skill).exclude( known_by__gymnast=self.id @@ -163,8 +164,8 @@ class Gymnast(Markdownizable): def unknown_skill_gt_level(self, max_level_skill): """ - Renvoie la liste des skill inférieurs ou égaux au niveau max que le gymnaste ne sait *pas* faire. - Liste des Skill que le gymnaste ne sait PAS faire, classé par niveau (ayant un niveau inférieur ou égal au niveau max du gym) + Liste des Skill que le gymnaste ne sait PAS faire, + classé par niveau (ayant un niveau inférieur ou égal au niveau max du gym) """ return Skill.objects.filter(level__gt=max_level_skill).exclude( known_by__gymnast=self.id @@ -179,7 +180,8 @@ class Gymnast(Markdownizable): def unknown_skill_gt_rank(self, max_rank_skill): """ - Liste des Skill que le gymnaste ne sais PAS faire (ayant un niveau plus grand que le niveau max du gym) + Liste des Skill que le gymnaste ne sais PAS faire + (ayant un niveau plus grand que le niveau max du gym) """ return Skill.objects.filter(level__gt=max_rank_skill).exclude( known_by__gymnast=self.id @@ -274,15 +276,33 @@ class Gymnast(Markdownizable): 1. on va chercher le niveau maximum de skill que le gymnast sait faire 2. on va chercher le nombre de skill par niveau que le gymnast sait faire - nb_known_skill_by_level = [{'level': 1, 'nb_known_skill': 1}, {'level': 2, 'nb_known_skill': 2}] + nb_known_skill_by_level = [ + { + 'level': 1, + 'nb_known_skill': 1 + }, + { + 'level': 2, + 'nb_known_skill': 2 + } + ] 3. si le niveau max est supérieur à 0 OUI: - a. on va chercher le nombre total des skills dont le niveau est inférieur ou égale au niveau max (cf. 1.) + a. on va chercher le nombre total des skills dont le niveau + est inférieur ou égale au niveau max (cf. 1.) b. on va chercher le nombre de skill qu'il y a par niveau : - [{'level': 1, 'nb_skill': 1}, {'level': 2, 'nb_skill': 1}] + [ + { + 'level': 1, 'nb_skill': 1 + }, + { + 'level': 2, 'nb_skill': 1 + } + ] c. Pour chaque élément da la liste obtenue en b : - - si le niveau du skill est le même que le niveau courant ... je sais pas, je comprends plus... + - si le niveau du skill est le même que le niveau courant ... + je sais pas, je comprends plus... - on incrémente j NON: @@ -319,7 +339,7 @@ class Gymnast(Markdownizable): """ context = {} - min_rank_skill = self.min_rank_skill() + # min_rank_skill = self.min_rank_skill() max_rank_skill = self.max_rank_skill() context["max_rank_skill"] = max_rank_skill nb_known_skill_by_rank = self.known_skill_by_rank() diff --git a/ultron/people/templatetags/level_chart_bar.py b/ultron/people/templatetags/level_chart_bar.py index 055dbc16fb..d14179e0ff 100644 --- a/ultron/people/templatetags/level_chart_bar.py +++ b/ultron/people/templatetags/level_chart_bar.py @@ -13,7 +13,7 @@ def generate_level_chart_bar(gymnast_id): """ gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - gymnast_known_skills = gymnast.known_skills.count() + # gymnast_known_skills = gymnast.known_skills.count() context = gymnast.get_informations_from_level() return context diff --git a/ultron/people/views.py b/ultron/people/views.py index e6052e78ec..0157f70ac0 100644 --- a/ultron/people/views.py +++ b/ultron/people/views.py @@ -93,7 +93,7 @@ def gymnast_details(request, gymnast_id, tab=None): .order_by("-score")[:1] ) - nb_unknown_skill = nb_skill - gymnast_nb_known_skills + # nb_unknown_skill = nb_skill - gymnast_nb_known_skills context = { "gymnast": gymnast, @@ -284,8 +284,8 @@ def gymnast_create_or_update(request, gymnast_id=None): if gymnast_form.is_valid(): gymnast = gymnast_form.save() return HttpResponseRedirect("/gymnast/details/" + str(gymnast.id)) - else: - print(gymnast_form.errors) + + print(gymnast_form.errors) form = GymnastForm(instance=gymnast, initial=data) @@ -296,9 +296,9 @@ def gymnast_create_or_update(request, gymnast_id=None): @login_required @require_http_methods(["GET"]) def gymnast_display_skill(request, gymnast_id): - """ - Tag affichant les statistiques de skill d'un gymnaste : le nombre de saut qu'il sait faire (total, - par niveau, par rank, …), calcule la complétude, … + """Tag affichant les statistiques de skill d'un gymnaste + + Le nombre de saut qu'il sait faire (total, par niveau, par rank, …), calcule la complétude, … .. todo:: Générer UNE fois la liste de skill que le gymnaste ne sait pas faire (1 query) et les counts puis, dans le template on parcourt plusieurs fois cette même liste mais on diff --git a/ultron/planning/admin.py b/ultron/planning/admin.py index 4a9f8b9d66..6990f2efca 100644 --- a/ultron/planning/admin.py +++ b/ultron/planning/admin.py @@ -45,7 +45,7 @@ class EventAdmin(ForeignKeyAutocompleteAdmin): # filter_horizontal = ('gymnasts',) -class Event_ParticipationAdmin(admin.ModelAdmin): +class EventParticipationAdmin(admin.ModelAdmin): model = Event_Participation fields = ("event", "gymnast", "rank") @@ -54,4 +54,4 @@ class Event_ParticipationAdmin(admin.ModelAdmin): admin.site.register(EventType, EventTypeAdmin) admin.site.register(Event, EventAdmin) -admin.site.register(Event_Participation, Event_ParticipationAdmin) +admin.site.register(Event_Participation, EventParticipationAdmin) diff --git a/ultron/planning/forms.py b/ultron/planning/forms.py index 5ccc51543d..276452ace8 100644 --- a/ultron/planning/forms.py +++ b/ultron/planning/forms.py @@ -2,8 +2,6 @@ from datetime import date from django import forms -from ultron.people.models import Gymnast - from .models import Event diff --git a/ultron/planning/views.py b/ultron/planning/views.py index 152f94d0f7..d0a82ee675 100644 --- a/ultron/planning/views.py +++ b/ultron/planning/views.py @@ -1,7 +1,6 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render, get_object_or_404 -from django.utils import timezone from django.views.decorators.http import require_http_methods import simplejson diff --git a/ultron/profiles/forms.py b/ultron/profiles/forms.py index d0c116e498..fb5efad974 100644 --- a/ultron/profiles/forms.py +++ b/ultron/profiles/forms.py @@ -1,6 +1,4 @@ -from datetime import date - from django import forms from .models import Profile diff --git a/ultron/tools/templatetags/menuitems.py b/ultron/tools/templatetags/menuitems.py index b5ce6fa595..ef7184c52e 100644 --- a/ultron/tools/templatetags/menuitems.py +++ b/ultron/tools/templatetags/menuitems.py @@ -1,6 +1,6 @@ from django import template from django.utils.html import format_html -from django.urls import resolve, reverse +from django.urls import reverse register = template.Library()