From df7f300d87d9a735aef95fb8ef45cd6b61335490 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 5 Jan 2018 16:16:11 +0100 Subject: [PATCH] quickened Ranking 2.0 --- rowers/metrics.py | 15 +++- rowers/tasks.py | 3 + rowers/templates/.#multiflex.html | 1 + rowers/templates/rankings.html | 19 +++++ rowers/urls.py | 2 + rowers/views.py | 129 +++++++++++++++++++++--------- 6 files changed, 129 insertions(+), 40 deletions(-) create mode 100644 rowers/templates/.#multiflex.html diff --git a/rowers/metrics.py b/rowers/metrics.py index 72d2d1bb..b2f3eaa6 100644 --- a/rowers/metrics.py +++ b/rowers/metrics.py @@ -354,14 +354,21 @@ def getagegrouprecord(age,sex='male',weightcategory='hwt', p0 = [700,120,700,10,100,100] - p1, success = optimize.leastsq(errfunc,p0[:], + try: + p1, success = optimize.leastsq(errfunc,p0[:], args = (ages,powers)) + except: + p1 = p0 + success = 0 - power = fitfunc(p1, float(age)) + if success: + power = fitfunc(p1, float(age)) - #power = np.polyval(poly_coefficients,age) + #power = np.polyval(poly_coefficients,age) - power = 0.5*(np.abs(power)+power) + power = 0.5*(np.abs(power)+power) + else: + power = 0 else: power = 0 diff --git a/rowers/tasks.py b/rowers/tasks.py index f17fb216..a89377de 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -66,7 +66,10 @@ def long_test_task2(self,aantal,**kwargs): kwargs['jobid'] = job_id return longtask.longtask2(aantal,**kwargs) + + + # create workout @app.task def handle_new_workout_from_file(r, f2, diff --git a/rowers/templates/.#multiflex.html b/rowers/templates/.#multiflex.html new file mode 100644 index 00000000..9fe5f5d9 --- /dev/null +++ b/rowers/templates/.#multiflex.html @@ -0,0 +1 @@ +E408191@CZ27LT9RCGN72.81156:1514927368 \ No newline at end of file diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html index ee6fc209..6c0b0b6a 100644 --- a/rowers/templates/rankings.html +++ b/rowers/templates/rankings.html @@ -5,6 +5,25 @@ {% block title %}Workouts{% endblock %} {% block scripts %} {% include "monitorjobs.html" %} + + + {% endblock %} {% block content %} diff --git a/rowers/urls.py b/rowers/urls.py index 7c5b3679..7d345028 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -123,6 +123,8 @@ urlpatterns = [ url(r'^imports/$', TemplateView.as_view(template_name='imports.html'), name='imports'), url(r'^agegroupcp/(?P\d+)$',views.agegroupcpview), url(r'^agegroupcp/(?P\d+)/(?P\d+)$',views.agegroupcpview), + url(r'^ajax_agegroup/(?P\d+)/(?P\w+.*)/(?P\w+.*)/(?P\d+)$', + views.ajax_agegrouprecords), url(r'^agegrouprecords/(?P\w+.*)/(?P\w+.*)/(?P\d+)m$', views.agegrouprecordview), url(r'^agegrouprecords/(?P\w+.*)/(?P\w+.*)/(?P\d+)min$', diff --git a/rowers/views.py b/rowers/views.py index 0ba882d2..759b49a9 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3509,6 +3509,66 @@ def rankings_view(request,theuser=0, 'teams':get_my_teams(request.user), }) +@login_required() +def ajax_agegrouprecords(request, + age=25, + sex='female', + weightcategory='hwt', + userid=0): + + wcdurations = [] + wcpower = [] + durations = [1,4,30,60] + distances = [100,500,1000,2000,5000,6000,10000,21097,42195] + for distance in distances: + worldclasspower = metrics.getagegrouprecord( + age, + sex=sex, + distance=distance, + weightcategory=weightcategory + ) + velo = (worldclasspower/2.8)**(1./3.) + try: + duration = distance/velo + wcdurations.append(duration) + wcpower.append(worldclasspower) + except ZeroDivisionError: + pass + for duration in durations: + worldclasspower = metrics.getagegrouprecord( + age, + sex=sex, + duration=duration, + weightcategory=weightcategory + ) + try: + velo = (worldclasspower/2.8)**(1./3.) + distance = int(60*duration*velo) + wcdurations.append(60.*duration) + wcpower.append(worldclasspower) + except ValueError: + pass + + options = {} + options['wcpower'] = wcpower + options['wcdurations'] = wcdurations + + thenowtime = timezone.now().isoformat() + options['lastupdated'] = thenowtime + options['userid'] = userid + + request.session['options'] = options + + + return JSONResponse( + { + 'wcdurations': wcdurations, + 'wcpower': wcpower, + 'lastupdated': thenowtime, + } + ) + + # Show ranking distances including predicted paces @login_required() def rankings_view2(request,theuser=0, @@ -3534,64 +3594,60 @@ def rankings_view2(request,theuser=0, if theuser == 0: theuser = request.user.id + else: + lastupdated = "01-01-1900" + promember=0 if not request.user.is_anonymous(): - r = getrower(request.user) + r = getrower(theuser) wcdurations = [] wcpower = [] - + + lastupdated = "01-01-1900" + userid = 0 if 'options' in request.session: options = request.session['options'] try: wcdurations = options['wcdurations'] wcpower = options['wcpower'] + lastupdated = options['lastupdated'] except KeyError: pass + try: + userid = options['userid'] + except KeyError: + userid = 0 + else: + options = {} - if r.birthdate: - age = calculate_age(r.birthdate) - -# job = myqueue - durations = [1,4,30,60] - distances = [100,500,1000,2000,5000,6000,10000,21097,42195] - for distance in distances: - worldclasspower = metrics.getagegrouprecord( - age, - sex=r.sex, - distance=distance, - weightcategory=r.weightcategory - ) - velo = (worldclasspower/2.8)**(1./3.) - try: - duration = distance/velo - wcdurations.append(duration) - wcpower.append(worldclasspower) - except ZeroDivisionError: - pass - for duration in durations: - worldclasspower = metrics.getagegrouprecord( - age, - sex=r.sex, - duration=duration, - weightcategory=r.weightcategory - ) - try: - velo = (worldclasspower/2.8)**(1./3.) - distance = int(60*duration*velo) - wcdurations.append(60.*duration) - wcpower.append(worldclasspower) - except ValueError: - pass + + lastupdatedtime = arrow.get(lastupdated).timestamp + current_time = arrow.utcnow().timestamp + + deltatime_seconds = current_time - lastupdatedtime + recalc = False + if str(userid) != str(theuser) or deltatime_seconds > 3600: + recalc = True + else: + recalc = False + + options['userid'] = theuser + + if r.birthdate: + age = calculate_age(r.birthdate) else: worldclasspower = None age = 0 options['wcpower'] = wcpower options['wcdurations'] = wcdurations + if theuser: + options['userid'] = theuser request.session['options'] = options + result = request.user.is_authenticated() and ispromember(request.user) if result: @@ -3868,6 +3924,7 @@ def rankings_view2(request,theuser=0, 'theuser':uu, 'age':age, 'sex':r.sex, + 'recalc':recalc, 'weightcategory':r.weightcategory, 'startdate':startdate, 'enddate':enddate,