From 984198e63cc5e726bf047b5aea44b40ea086ea7d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 16 Feb 2022 13:21:58 +0100 Subject: [PATCH] more pep --- rowers/templatetags/rowerfilters.py | 463 ++++++++++++++++------------ tox.ini | 1 + 2 files changed, 263 insertions(+), 201 deletions(-) diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index a8aeae27..a3864281 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -1,3 +1,5 @@ +from datetime import date + from django import template from django.utils.safestring import mark_safe from time import strftime @@ -7,69 +9,73 @@ import json import math import datetime import re -register = template.Library() + from rowers.utils import calculate_age from rowers.models import ( - course_length,WorkoutComment, - TrainingMacroCycle,TrainingMesoCycle, TrainingMicroCycle, - Rower,Workout,SiteAnnouncement, TeamInvite, TeamRequest, CoachOffer,CoachRequest, - VirtualRaceFollower,VirtualRace,favanalysischoices - ) + course_length, WorkoutComment, + TrainingMacroCycle, TrainingMesoCycle, TrainingMicroCycle, + Rower, Workout, SiteAnnouncement, TeamInvite, TeamRequest, CoachOffer, CoachRequest, + VirtualRaceFollower, VirtualRace, favanalysischoices, + Team, TrainingPlan, TrainingTarget) + from rowers.plannedsessions import ( - race_can_register, race_can_submit,race_rower_status - ) + race_can_register, race_can_submit, race_rower_status) +from rowers.models import PlannedSession +from rowers.teams import coach_getcoachees from rowers import credits from rowers import c2stuff from rowers.c2stuff import c2_open -from rowers.rower_rules import is_coach_user, is_workout_user, isplanmember,ispromember +from rowers.rower_rules import is_coach_user, is_workout_user, isplanmember, ispromember from rowers.mytypes import ( - otwtypes,adaptivetypes,sexcategories,weightcategories,workouttypes, - workouttypes_icons, - ) + otwtypes, adaptivetypes, sexcategories, weightcategories, workouttypes, + workouttypes_icons) from rowers.utils import NoTokenError, step_to_string, landingpages2 +from rowers.teams import rower_get_managers import rowers.payments as payments from rowsandall_app.settings import NK_VIEWER_LOCATION - from rowers.opaque import encoder from rowers.plannedsessions import ps_dict_get_description_html import arrow -from django.utils.safestring import mark_safe from django.utils.html import urlize as urlize_impl from django.template.defaultfilters import stringfilter from six import string_types +register = template.Library() + + @register.filter -def workoutdate(id): # pragma: no cover +def workoutdate(id): # pragma: no cover try: w = Workout.objects.get(id=id) return w.date except Workout.DoesNotExist: return 'unknown' -@register.filter -def isfollower(user,id): - if user.is_anonymous: # pragma: no cover +@register.filter +def isfollower(user, id): + + if user.is_anonymous: # pragma: no cover return True try: race = VirtualRace.objects.get(id=id) - except VirtualRace.DoesNotExist: # pragma: no cover + except VirtualRace.DoesNotExist: # pragma: no cover return False - followers = VirtualRaceFollower.objects.filter(race=race,user=user) + followers = VirtualRaceFollower.objects.filter(race=race, user=user) + return followers.count() == 0 - return followers.count()==0 favanalysisdict = {} -for key,value in favanalysischoices: +for key, value in favanalysischoices: favanalysisdict[key] = value landingpagedict = {} @@ -77,54 +83,60 @@ for key, value in landingpages2: landingpagedict[key] = value landingpageicons = { - 'workout_view':'fas fa-search fa-fw', - 'workout_edit_view':'fas fa-pencil-alt fa-fw', - 'workout_workflow_view':'fas fa-tachometer-alt fa-fw', - 'workout_stats_view':'fal fa-table fa-fw', - 'workout_data_view':'fal fa-table fa-fw', - 'workout_summary_edit_view':'fas fa-pause fa-fw', - 'workout_flexchart_stacked_view':'fas fa-align-justify fa-fw', - 'workout_flexchart3_view':'fas fa-chart-line fa-fw', - 'workout_delete':'fas fa-trash-alt fa-fw' + 'workout_view': 'fas fa-search fa-fw', + 'workout_edit_view': 'fas fa-pencil-alt fa-fw', + 'workout_workflow_view': 'fas fa-tachometer-alt fa-fw', + 'workout_stats_view': 'fal fa-table fa-fw', + 'workout_data_view': 'fal fa-table fa-fw', + 'workout_summary_edit_view': 'fas fa-pause fa-fw', + 'workout_flexchart_stacked_view': 'fas fa-align-justify fa-fw', + 'workout_flexchart3_view': 'fas fa-chart-line fa-fw', + 'workout_delete': 'fas fa-trash-alt fa-fw' } + @register.filter def landingicon(landingpage): try: return landingpageicons[landingpage] - except KeyError: # pragma: no cover + except KeyError: # pragma: no cover return 'fas fa-search fa-fw' + @register.filter def steptostring(steps): - res = ps_dict_get_description_html(steps,short=True) + res = ps_dict_get_description_html(steps, short=True) return res + # for verbose version of fav analysis @register.filter def verbose(s): try: return landingpagedict[s] - except KeyError: # pragma: no cover + except KeyError: # pragma: no cover return 'Details' + @register.filter -def datarows(data): # pragma: no cover +def datarows(data): # pragma: no cover return range(len(data)) + @register.filter def adaptive(s): u = s - for e,v in adaptivetypes: + for e, v in adaptivetypes: if e.lower() == u.lower(): u = v continue return u + @register.filter -def nkviewerlink(workout): # pragma: no cover +def nkviewerlink(workout): # pragma: no cover url = "{nkviewer}{nkid}".format( nkid=workout.uploadedtonk, nkviewer=NK_VIEWER_LOCATION) @@ -136,229 +148,250 @@ def nkviewerlink(workout): # pragma: no cover def boatclass(s): u = s - for e,v in workouttypes: + for e, v in workouttypes: if e.lower() == u.lower(): u = v continue return u + @register.filter def sex(s): u = s - for e,v in sexcategories: + for e, v in sexcategories: if e.lower() == u.lower(): u = v continue return u + @register.filter def weekbegin(nr): - week, day = divmod(nr,7) + week, day = divmod(nr, 7) if day == 1: return True return False + @register.filter -def discount(amount,rower): # pragma: no cover - return credits.discount(amount,rower) +def discount(amount, rower): # pragma: no cover + return credits.discount(amount, rower) @register.filter -def discounted(amount,rower): - return credits.discounted(amount,rower) +def discounted(amount, rower): + return credits.discounted(amount, rower) + @register.filter def weekend(nr): - week, day = divmod(nr,7) + week, day = divmod(nr, 7) if day == 0: return True return False + @register.filter def weight(s): u = s - for e,v in weightcategories: + for e, v in weightcategories: if e.lower() == u.lower(): u = v continue return u + @register.filter -def sigdig(value, digits = 3): +def sigdig(value, digits=3): try: order = int(math.floor(math.log10(math.fabs(value)))) - except (ValueError,TypeError): # pragma: no cover + except (ValueError, TypeError): # pragma: no cover return value # return integers as is if value % 1 == 0: return value - places = digits - order - 1 # pragma: no cover + places = digits - order - 1 # pragma: no cover - if places > 0: # pragma: no cover + if places > 0: # pragma: no cover fmtstr = "%%.%df" % (places) - else: # pragma: no cover + else: # pragma: no cover fmtstr = "%.0f" - return fmtstr % (round(value, places)) # pragma: no cover + return fmtstr % (round(value, places)) # pragma: no cover + @register.filter -def pickle(dc): # pragma: no cover +def pickle(dc): # pragma: no cover s = dict() for key, value in dc.items(): s[key] = value return s + @register.filter(is_safe=True, needs_autoescape=True) @stringfilter -def urlshorten(value, limit,autoescape=None): +def urlshorten(value, limit, autoescape=None): return mark_safe( urlize_impl( value, trim_url_limit=int(limit), nofollow=True, autoescape=autoescape).replace(' 22: + if isinstance(s, string_types) and len(s) > 22: s = s[:22] return s + @register.filter def lookuplong(dict, key): try: s = dict.get(key) - except KeyError: # pragma: no cover + except KeyError: # pragma: no cover return None return s -from rowers.models import PlannedSession @register.filter -def is_session_manager(id,user): +def is_session_manager(id, user): try: ps = PlannedSession.objects.get(id=id) - except PlannedSession.DoesNotExist: # pragma: no cover + except PlannedSession.DoesNotExist: # pragma: no cover return False return ps.manager == user @register.filter -def may_edit(workout,request): +def may_edit(workout, request): mayedit = 0 if request.user == workout.user.user: mayedit = True - if is_workout_user(request.user,workout): + if is_workout_user(request.user, workout): mayedit = True return mayedit - @register.filter -def mayeditplan(obj,request): +def mayeditplan(obj, request): - if obj is None: # pragma: no cover + if obj is None: # pragma: no cover return False - if hasattr(obj,'plan'): - return mayeditplan(obj.plan,request) + if hasattr(obj, 'plan'): + return mayeditplan(obj.plan, request) - if hasattr(obj,'manager'): + if hasattr(obj, 'manager'): if obj.manager is not None: return request.user == obj.manager.user - rr = Rower.objects.get(user=request.user) # pragma: no cover - if is_coach_user(request.user,obj.rower) and rr.rowerplan not in ['basic','pro']: # pragma: no cover + rr = Rower.objects.get(user=request.user) # pragma: no cover + if is_coach_user(request.user, obj.rower) and rr.rowerplan not in ['basic', 'pro']: # pragma: no cover mayedit = True + return mayedit # pragma: no cover - return mayedit # pragma: no cover @register.filter -def iterrows(df): # pragma: no cover +def iterrows(df): # pragma: no cover return df.iterrows() + @register.filter(name='times') -def times(number): # pragma: no cover +def times(number): # pragma: no cover return range(number) -@register.simple_tag -def get_df_iloc(data,i,j): # pragma: no cover - return data.iloc(i,j) @register.simple_tag -def get_field_id(id,s,form): # pragma: no cover +def get_df_iloc(data, i, j): # pragma: no cover + return data.iloc(i, j) + + +@register.simple_tag +def get_field_id(id, s, form): # pragma: no cover field_name = s+str(id) return form.__getitem__(field_name) -from rowers.models import Rower,Team,TrainingPlan,TrainingTarget - @register.filter def is_promember(user): return ispromember(user) + @register.filter def is_manager(user): r = Rower.objects.get(user=user) @@ -605,8 +650,9 @@ def is_manager(user): def is_planmember(user): return isplanmember(user) + @register.filter -def get_age(r): # pragma: no cover +def get_age(r): # pragma: no cover return calculate_age(r.birthdate) @@ -622,6 +668,7 @@ def user_teams(user): return teams + @register.filter def user_team1(user): try: @@ -629,51 +676,53 @@ def user_team1(user): teams1 = therower.team.all() teams2 = Team.objects.filter(manager=user) teams = list(set(teams1).union(set(teams2))) - except TypeError: # pragma: no cover + except TypeError: # pragma: no cover teams = [] return teams[0].id + @register.filter def announcements(request): announcements = SiteAnnouncement.objects.filter( expires__gte=datetime.date.today()).order_by( "-created", - "-id" - ) + "-id") return announcements[0:4] + @register.filter -def has_teams(user): # pragma: no cover +def has_teams(user): # pragma: no cover try: therower = Rower.objects.get(user=user) teams1 = therower.team.all() teams2 = Team.objects.filter(manager=user) - teams = list(set(teams1).union(set(teams2))) + _ = list(set(teams1).union(set(teams2))) return True except TypeError: return False return False + @register.filter def team_members(user): try: therower = Rower.objects.get(user=user) - if therower.rowerplan == 'basic': # pragma: no cover + if therower.rowerplan == 'basic': # pragma: no cover return [] teams = Team.objects.filter(manager=user) members = Rower.objects.filter( - team__in=teams - ).distinct().order_by( - "user__last_name","user__first_name" - ).exclude(rowerplan='freecoach') + team__in=teams).distinct().order_by( + "user__last_name", "user__first_name").exclude( + rowerplan='freecoach') return [rower.user for rower in members] - except TypeError: # pragma: no cover + except TypeError: # pragma: no cover return [] - return [] # pragma: no cover + return [] # pragma: no cover + @register.filter def openactions(user): @@ -692,43 +741,43 @@ def openactions(user): @register.filter -def team_rowers(user): # pragma: no cover +def team_rowers(user): # pragma: no cover try: therower = Rower.objects.get(user=user) if therower.rowerplan == 'basic': return [] teams = Team.objects.filter(manager=user) - members = Rower.objects.filter(team__in=teams).distinct().order_by( - "user__last_name","user__last_name" - ).exclude(rowerplan='freecoach') + members = Rower.objects.filter( + team__in=teams).distinct().order_by( + "user__last_name", "user__last_name").exclude( + rowerplan='freecoach') return members except TypeError: return [] return [] -from rowers.teams import coach_getcoachees @register.filter def coach_rowers(user): if user.rower.rowerplan != 'freecoach': thelist = [user.rower]+[c for c in coach_getcoachees(user.rower)] - else: # pragma: no cover + else: # pragma: no cover thelist = [c for c in coach_getcoachees(user.rower)] return thelist @register.filter -def verbosetimeperiod(timeperiod): # pragma: no cover +def verbosetimeperiod(timeperiod): # pragma: no cover table = { - 'today':'Today', + 'today': 'Today', 'thisweek': 'This Week', 'thismonth': 'This Month', 'lastmonth': 'Last Month', 'lastweek': 'Last Week', 'nextweek': 'Next Week', 'nextmonth': 'Next Month', - } + } try: verbose = table[timeperiod] @@ -737,10 +786,9 @@ def verbosetimeperiod(timeperiod): # pragma: no cover return verbose -from datetime import date @ register.filter -def future_date_only(the_date): # pragma: no cover +def future_date_only(the_date): # pragma: no cover if the_date > date.today(): return the_date else: @@ -751,112 +799,123 @@ def future_date_only(the_date): # pragma: no cover def is_future_date(the_date): return the_date >= date.today() + @register.filter def amount(value): vs = '{v}.00'.format(v=int(value)) return vs - @register.filter def date_dif(the_date): - if the_date == date(1970,1,1): + if the_date == date(1970, 1, 1): return 1 if the_date: return the_date - date.today() - else: # pragma: no cover + else: # pragma: no cover return 1 @register.filter -def can_register(race,r): - return race_can_register(r,race) +def can_register(race, r): + return race_can_register(r, race) + @register.filter -def can_submit(race,r): # pragma: no cover - return race_can_submit(r,race) +def can_submit(race, r): # pragma: no cover + return race_can_submit(r, race) + @register.filter -def race_complete(race,r): # pragma: no cover - is_complete,has_registered = race_rower_status(r,race) +def race_complete(race, r): # pragma: no cover + is_complete, has_registered = race_rower_status(r, race) return is_complete -@register.filter -def past_not_registered(race,r): # pragma: no cover - is_complete,has_registered = race_rower_status(r,race) - return not has_registered @register.filter -def future_registered(race,r): # pragma: no cover - is_complete, has_registered = race_rower_status(r,race) +def past_not_registered(race, r): # pragma: no cover + is_complete, has_registered = race_rower_status(r, race) + return not has_registered + + +@register.filter +def future_registered(race, r): # pragma: no cover + is_complete, has_registered = race_rower_status(r, race) is_open = race.evaluation_closure > timezone.now() return has_registered and not is_complete and is_open + @property -def is_past_due(self): # pragma: no cover +def is_past_due(self): # pragma: no cover return datetime.date.today() > self.date + + @property -def is_not_past_due(self): # pragma: no cover +def is_not_past_due(self): # pragma: no cover return datetime.date.today() <= self.date + @register.filter -def is_closed(race): # pragma: no cover +def is_closed(race): # pragma: no cover return race.evaluation_closure < timezone.now() -@register.filter -def is_final(race): # pragma: no cover - return race.evaluation_closure < timezone.now()-datetime.timedelta(hours=1) @register.filter -def userurl(path,member): +def is_final(race): # pragma: no cover + return race.evaluation_closure < timezone.now()-datetime.timedelta(hours=1) + + +@register.filter +def userurl(path, member): pattern = re.compile('user\/\d+/') userstring = 'user/%s/' % member.id # remove team tpattern = re.compile('team\/\d+/') if tpattern.search(path) is not None: - path = tpattern.sub('',path) + path = tpattern.sub('', path) if pattern.search(path) is not None: - replaced = pattern.sub(userstring,path) + replaced = pattern.sub(userstring, path) else: replaced = path+userstring return replaced + @register.filter -def teamurl(path,team): +def teamurl(path, team): pattern = re.compile('team\/\d+/') teamstring = 'team/%s/' % team.id # remove user upattern = re.compile('\/user\/\d+/') if upattern.search(path) is not None: - path = upattern.sub('/',path) - + path = upattern.sub('/', path) if pattern.search(path) is not None: - replaced = pattern.sub(teamstring,path) + replaced = pattern.sub(teamstring, path) else: replaced = path+teamstring - return replaced + @register.filter -def timeurl(path,timestring): # pragma: no cover +def timeurl(path, timestring): # pragma: no cover pattern = re.compile('\?when=w.*') timeurl = '?when=%s' % timestring replaced = '' if pattern.search(path) is not None: - replaced = pattern.sub(timeurl,path) + replaced = pattern.sub(timeurl, path) if not replaced: replaced = path+timeurl return replaced + @register.filter def trainingplans(rower): today = datetime.date.today() @@ -868,8 +927,9 @@ def trainingplans(rower): return plans + @register.filter -def mesomacroid(id): # pragma: no cover +def mesomacroid(id): # pragma: no cover try: thismeso = TrainingMesoCycle.objects.get(id=id) except TrainingMesoCycle.DoesNotExist: @@ -879,8 +939,9 @@ def mesomacroid(id): # pragma: no cover return str(theid) + @register.filter -def micromesoid(id): # pragma: no cover +def micromesoid(id): # pragma: no cover try: thismicro = TrainingMicroCycle.objects.get(id=id) except TrainingMicroCycle.DoesNotExist: @@ -892,7 +953,7 @@ def micromesoid(id): # pragma: no cover @register.filter -def micromacroid(id): # pragma: no cover +def micromacroid(id): # pragma: no cover try: thismicro = TrainingMicroCycle.objects.get(id=id) except TrainingMicroCycle.DoesNotExist: @@ -902,8 +963,9 @@ def micromacroid(id): # pragma: no cover return str(theid) + @register.filter -def nextworkout(workout,user): +def nextworkout(workout, user): if user.rower == workout.user: try: ws = Workout.objects.filter( @@ -918,11 +980,11 @@ def nextworkout(workout,user): try: ws = Workout.objects.filter( startdatetime__gt=workout.startdatetime, - user=workout.user,privacy='visible' + user=workout.user, privacy='visible' ).order_by( "startdatetime" ).exclude(id=workout.id) - except ValueError: # pragma: no cover + except ValueError: # pragma: no cover return 0 if ws: @@ -931,9 +993,8 @@ def nextworkout(workout,user): return 0 - @register.filter -def previousworkout(workout,user): +def previousworkout(workout, user): if user.rower == workout.user: try: ws = Workout.objects.filter( @@ -948,11 +1009,11 @@ def previousworkout(workout,user): try: ws = Workout.objects.filter( startdatetime__lt=workout.startdatetime, - user=workout.user,privacy='visible' + user=workout.user, privacy='visible' ).order_by( "-startdatetime" ).exclude(id=workout.id) - except ValueError: # pragma: no cover + except ValueError: # pragma: no cover return 0 if ws: diff --git a/tox.ini b/tox.ini index 0f9e321d..3fb438ed 100644 --- a/tox.ini +++ b/tox.ini @@ -1,3 +1,4 @@ [flake8] ignore = F405, F403, E722, E226, W504, F401, W605 max-line-length = 120 +exclude = .git, rowers/migrations