Private
Public Access
1
0

Merge branch 'release/v20.1.31'

This commit is contained in:
2023-09-21 09:12:18 +02:00
11 changed files with 3283 additions and 12 deletions
+24
View File
@@ -1,4 +1,6 @@
from django import forms
from django.contrib.admin.widgets import AdminDateWidget
import glob
class CsvForm(forms.Form):
file = forms.FileField(label='CSV File')
@@ -7,3 +9,25 @@ class CsvForm(forms.Form):
class TimeTeamForm(forms.Form):
resulturl = forms.URLField()
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)
+23 -7
View File
@@ -7,13 +7,15 @@
<html>
<head>
<title>{% block title %}Rowsandall Boatmovers{% endblock %}</title>
<link rel="stylesheet" href="/static/css/resetnew.css" />
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.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/styles2.css">
<link rel="stylesheet" href="/static/css/text2.css" />
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css"/>
<link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/>
<link rel="stylesheet" href="/static/css/resetnew.css" />
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.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/styles2.css">
<link rel="stylesheet" href="/static/css/text2.css" />
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
</head>
<body>
@@ -43,3 +45,17 @@
</html>
{% 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 %}
+1
View File
@@ -21,6 +21,7 @@ urlpatterns = [
name='race_delete_results'),
url(r'crew/(?P<id>\d+)/$',views.crew_view,name='crew_view'),
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'),
#url(r'(?P<filter>\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers')
]
+69 -1
View File
@@ -5,17 +5,20 @@ from django.urls import reverse
from django.contrib import messages
import collections
import pandas as pd
# Create your views here.
from django.views.generic.edit import CreateView
from boatmovers.models import Athlete, Crew, Race, Result
import boatmovers.tasks as tasks
from boatmovers.forms import CsvForm, TimeTeamForm
from boatmovers.forms import CsvForm, TimeTeamForm, DatesForm
from boatmovers.scrapers import *
#from rowers.rows import handle_uploaded_file
import django_rq
queue = django_rq.get_queue('high')
import glob
class AthleteCreateView(CreateView):
model = Athlete
fields = [
@@ -98,6 +101,71 @@ def boatmovers_view(request):
'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):
race = get_object_or_404(Race, pk=id)
results = race.results.all().order_by('order')
+3057 -1
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1648,7 +1648,7 @@ def get_existing_job(w):
try:
job = Job.fetch(jobid, connection=r)
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
except:
pass
+7 -2
View File
@@ -1496,13 +1496,14 @@ def handle_calctrimp(id,
normv = response.normv
normw = response.normw
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,
normp = normp,
trimp = trimp,
normv = normv,
normw = normw,
hrtss = hrtss
hrtss = hrtss,
csvfile=csvfile,
))
@@ -1555,6 +1556,10 @@ def handle_calctrimp(id,
workout.normv = normv
workout.normw = normw
workout.save()
dologging('metrics.log','Saving to workout {id} {obscure}'.format(
id = id,
obscure = encoder.encode_hex(id)
))
return 1
Binary file not shown.
+4
View File
@@ -149,6 +149,10 @@ def do_sync(w, options, quick=False):
try:
if options['nkid'] != 0 and options['nkid'] != '': # pragma: no cover
w.uploadedtonk = options['nkid']
dologging('metrics.log','NK ID {nkid} file {csvfilename}'.format(
nkid=nkid,
csvfilename=w.csvfilename,
))
w.save()
record = create_or_update_syncrecord(w.user, w, nkid=options['nkid'])
except KeyError: