Merge branch 'release/v20.1.31'
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
from django.contrib.admin.widgets import AdminDateWidget
|
||||||
|
import glob
|
||||||
|
|
||||||
class CsvForm(forms.Form):
|
class CsvForm(forms.Form):
|
||||||
file = forms.FileField(label='CSV File')
|
file = forms.FileField(label='CSV File')
|
||||||
@@ -7,3 +9,25 @@ class CsvForm(forms.Form):
|
|||||||
class TimeTeamForm(forms.Form):
|
class TimeTeamForm(forms.Form):
|
||||||
resulturl = forms.URLField()
|
resulturl = forms.URLField()
|
||||||
startorder = forms.IntegerField(initial=1,label='First result to process')
|
startorder = forms.IntegerField(initial=1,label='First result to process')
|
||||||
|
|
||||||
|
columns = ['Rank 1','Rank2','Score 1', 'Score 2','Positions Climbed','Score Increase']
|
||||||
|
choices = [
|
||||||
|
('Rank1','Rank 1'),
|
||||||
|
('Rank2','Rank 2'),
|
||||||
|
('PositionsClimbed','Positions Climbed'),
|
||||||
|
('ScoreIncrease','Score Increase')
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class DatesForm(forms.Form):
|
||||||
|
filenameslist = glob.glob('media/boatmovers_*.csv')
|
||||||
|
filenameslist.sort()
|
||||||
|
datechoices = [
|
||||||
|
(a[17:-4],a[17:-4]) for a in filenameslist
|
||||||
|
]
|
||||||
|
date1 = forms.ChoiceField(choices=datechoices)
|
||||||
|
date2 = forms.ChoiceField(choices=datechoices)
|
||||||
|
sort_by = forms.ChoiceField(choices=choices)
|
||||||
|
ascending = forms.BooleanField(initial=True,required=False)
|
||||||
|
limit_to_first = forms.IntegerField(initial=100)
|
||||||
|
gender = forms.ChoiceField(choices=(('all','all'),('f','f'),('m','m')))
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from boatmovers.models import Athlete, Crew, Race, Result
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
athletes = Athlete.objects.filter(trueskill_exposed__gt=0,
|
||||||
|
dummy=False).order_by('-trueskill_exposed','-birth_year','last_name','first_name')
|
||||||
|
df = pd.DataFrame(athletes.values())
|
||||||
|
filename = "media/boatmovers_"+datetime.now().strftime("%Y-%m-%d")+".csv"
|
||||||
|
df.to_csv(filename)
|
||||||
@@ -7,13 +7,15 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{% block title %}Rowsandall Boatmovers{% endblock %}</title>
|
<title>{% block title %}Rowsandall Boatmovers{% endblock %}</title>
|
||||||
<link rel="stylesheet" href="/static/css/resetnew.css" />
|
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css"/>
|
||||||
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
|
<link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/>
|
||||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
<link rel="stylesheet" href="/static/css/resetnew.css" />
|
||||||
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
|
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
|
||||||
<link rel="stylesheet" href="/static/css/styles2.css">
|
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||||
<link rel="stylesheet" href="/static/css/text2.css" />
|
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
|
||||||
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
|
<link rel="stylesheet" href="/static/css/styles2.css">
|
||||||
|
<link rel="stylesheet" href="/static/css/text2.css" />
|
||||||
|
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -43,3 +45,17 @@
|
|||||||
</html>
|
</html>
|
||||||
|
|
||||||
{% block scripts %} {% endblock %}
|
{% block scripts %} {% endblock %}
|
||||||
|
<script defer type="text/javascript" src="/jsi18n/"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/core.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">
|
||||||
|
</script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/calendar.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/urlify.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/SelectBox.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/inlines.js"></script>
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
{% extends "boatmovers_base.html" %}
|
||||||
|
{% block main %}
|
||||||
|
<form action="" method="post">{% csrf_token %}
|
||||||
|
{{ form.as_table }}
|
||||||
|
<input type="submit" value="Compare" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<table width="100%" class="listtable shortpadded">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
#
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Name
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Club
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Gender
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Rank 1
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Rank 2
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Positions Climbed
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Score 1
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Score 2
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Score Increase
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for index, row in df.iterrows %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ forloop.counter }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.Name }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.club }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.gender }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.Rank1 }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.Rank2 }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.PositionsClimbed }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.Score1|floatformat:2 }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.Score2|floatformat:2 }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ row.ScoreIncrease|floatformat:2 }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
||||||
@@ -21,6 +21,7 @@ urlpatterns = [
|
|||||||
name='race_delete_results'),
|
name='race_delete_results'),
|
||||||
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
|
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
|
||||||
url(r'^$',views.boatmovers_view,name='boatmovers'),
|
url(r'^$',views.boatmovers_view,name='boatmovers'),
|
||||||
|
url(r'^compare/$',views.boatmovers_compareview,name='boatmovers_compare'),
|
||||||
path(r'faq/', TemplateView.as_view(template_name='faq.html'), name='faq'),
|
path(r'faq/', TemplateView.as_view(template_name='faq.html'), name='faq'),
|
||||||
#url(r'(?P<filter>\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers')
|
#url(r'(?P<filter>\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers')
|
||||||
]
|
]
|
||||||
|
|||||||
+69
-1
@@ -5,17 +5,20 @@ from django.urls import reverse
|
|||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from django.views.generic.edit import CreateView
|
from django.views.generic.edit import CreateView
|
||||||
from boatmovers.models import Athlete, Crew, Race, Result
|
from boatmovers.models import Athlete, Crew, Race, Result
|
||||||
import boatmovers.tasks as tasks
|
import boatmovers.tasks as tasks
|
||||||
from boatmovers.forms import CsvForm, TimeTeamForm
|
from boatmovers.forms import CsvForm, TimeTeamForm, DatesForm
|
||||||
from boatmovers.scrapers import *
|
from boatmovers.scrapers import *
|
||||||
#from rowers.rows import handle_uploaded_file
|
#from rowers.rows import handle_uploaded_file
|
||||||
import django_rq
|
import django_rq
|
||||||
queue = django_rq.get_queue('high')
|
queue = django_rq.get_queue('high')
|
||||||
|
|
||||||
|
import glob
|
||||||
|
|
||||||
class AthleteCreateView(CreateView):
|
class AthleteCreateView(CreateView):
|
||||||
model = Athlete
|
model = Athlete
|
||||||
fields = [
|
fields = [
|
||||||
@@ -98,6 +101,71 @@ def boatmovers_view(request):
|
|||||||
'new_races': new_races}
|
'new_races': new_races}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def boatmovers_compareview(request):
|
||||||
|
filenameslist = glob.glob('media/boatmovers_*.csv')
|
||||||
|
filenameslist.sort()
|
||||||
|
datechoices = [
|
||||||
|
(a[17:-4],a[17:-4]) for a in filenameslist
|
||||||
|
]
|
||||||
|
|
||||||
|
form = DatesForm()
|
||||||
|
form.fields['date1'].choices = datechoices
|
||||||
|
form.fields['date2'].choices = datechoices
|
||||||
|
|
||||||
|
df = pd.DataFrame()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = DatesForm(request.POST)
|
||||||
|
form.fields['date1'].choices = datechoices
|
||||||
|
form.fields['date2'].choices = datechoices
|
||||||
|
if form.is_valid():
|
||||||
|
date1 = form.cleaned_data['date1']
|
||||||
|
date2 = form.cleaned_data['date2']
|
||||||
|
sort_by = form.cleaned_data['sort_by']
|
||||||
|
ascending = form.cleaned_data['ascending']
|
||||||
|
limit_to_first = form.cleaned_data['limit_to_first']
|
||||||
|
gender = form.cleaned_data['gender']
|
||||||
|
|
||||||
|
file1 = "media/boatmovers_"+date1+".csv"
|
||||||
|
df1 = pd.read_csv(file1)
|
||||||
|
if gender in ['m','f']:
|
||||||
|
df1 = df1[df1.gender==gender]
|
||||||
|
df1.index = df1['id']
|
||||||
|
df1 = df1.assign(rank=range(len(df1)))
|
||||||
|
df1['rank'] = df1['rank']+1
|
||||||
|
df1.rename(columns={'full_name':'Name','trueskill_exposed':'Score1','rank':'Rank1'},inplace=True)
|
||||||
|
df1 = df1.loc[:, ['Name','club','gender','Score1','Rank1']]
|
||||||
|
|
||||||
|
file2 = "media/boatmovers_"+date2+".csv"
|
||||||
|
df2 = pd.read_csv(file2)
|
||||||
|
if gender in ['m','f']:
|
||||||
|
df2 = df2[df2.gender==gender]
|
||||||
|
df2.index = df2['id']
|
||||||
|
df2 = df2.assign(rank=range(len(df2)))
|
||||||
|
df2['rank'] = df2['rank']+1
|
||||||
|
df2.rename(columns={'trueskill_exposed':'Score2','rank':'Rank2'},inplace=True)
|
||||||
|
df2 = df2.loc[:, ['Rank2','Score2']]
|
||||||
|
|
||||||
|
df = df1.merge(df2,left_on='id',right_on='id')
|
||||||
|
df['PositionsClimbed'] = df['Rank1']-df['Rank2']
|
||||||
|
df['ScoreIncrease'] = df['Score2']-df['Score1']
|
||||||
|
df = df.loc[:, ['Name', 'club', 'gender', 'Rank1', 'Rank2', 'PositionsClimbed',
|
||||||
|
'Score1', 'Score2',
|
||||||
|
'ScoreIncrease']]
|
||||||
|
|
||||||
|
df.sort_values(by='Rank2',inplace=True)
|
||||||
|
df = df.head(limit_to_first)
|
||||||
|
|
||||||
|
df.sort_values(by=[sort_by],inplace=True,ascending=ascending)
|
||||||
|
|
||||||
|
return render(request,
|
||||||
|
'boatmovers_compare.html',
|
||||||
|
{
|
||||||
|
'form':form,
|
||||||
|
'df':df,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
def race_view(request,id=0):
|
def race_view(request,id=0):
|
||||||
race = get_object_or_404(Race, pk=id)
|
race = get_object_or_404(Race, pk=id)
|
||||||
results = race.results.all().order_by('order')
|
results = race.results.all().order_by('order')
|
||||||
|
|||||||
+3056
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -1648,7 +1648,7 @@ def get_existing_job(w):
|
|||||||
try:
|
try:
|
||||||
job = Job.fetch(jobid, connection=r)
|
job = Job.fetch(jobid, connection=r)
|
||||||
if isinstance(job.args[1], str):
|
if isinstance(job.args[1], str):
|
||||||
if job.args[1] == w.csvfilename:
|
if job.args[1] == w.csvfilename and len(job.args)==7:
|
||||||
return 1
|
return 1
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|||||||
+7
-2
@@ -1496,13 +1496,14 @@ def handle_calctrimp(id,
|
|||||||
normv = response.normv
|
normv = response.normv
|
||||||
normw = response.normw
|
normw = response.normw
|
||||||
hrtss = response.hrtss
|
hrtss = response.hrtss
|
||||||
dologging('metrics.log','Got tss {tss}, normp {normp} trimp {trimp} normv {normv} normw {normw} hrtss {hrtss}'.format(
|
dologging('metrics.log','File {csvfile}. Got tss {tss}, normp {normp} trimp {trimp} normv {normv} normw {normw} hrtss {hrtss}'.format(
|
||||||
tss = tss,
|
tss = tss,
|
||||||
normp = normp,
|
normp = normp,
|
||||||
trimp = trimp,
|
trimp = trimp,
|
||||||
normv = normv,
|
normv = normv,
|
||||||
normw = normw,
|
normw = normw,
|
||||||
hrtss = hrtss
|
hrtss = hrtss,
|
||||||
|
csvfile=csvfile,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
@@ -1555,6 +1556,10 @@ def handle_calctrimp(id,
|
|||||||
workout.normv = normv
|
workout.normv = normv
|
||||||
workout.normw = normw
|
workout.normw = normw
|
||||||
workout.save()
|
workout.save()
|
||||||
|
dologging('metrics.log','Saving to workout {id} {obscure}'.format(
|
||||||
|
id = id,
|
||||||
|
obscure = encoder.encode_hex(id)
|
||||||
|
))
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -149,6 +149,10 @@ def do_sync(w, options, quick=False):
|
|||||||
try:
|
try:
|
||||||
if options['nkid'] != 0 and options['nkid'] != '': # pragma: no cover
|
if options['nkid'] != 0 and options['nkid'] != '': # pragma: no cover
|
||||||
w.uploadedtonk = options['nkid']
|
w.uploadedtonk = options['nkid']
|
||||||
|
dologging('metrics.log','NK ID {nkid} file {csvfilename}'.format(
|
||||||
|
nkid=nkid,
|
||||||
|
csvfilename=w.csvfilename,
|
||||||
|
))
|
||||||
w.save()
|
w.save()
|
||||||
record = create_or_update_syncrecord(w.user, w, nkid=options['nkid'])
|
record = create_or_update_syncrecord(w.user, w, nkid=options['nkid'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|||||||
Reference in New Issue
Block a user