Private
Public Access
1
0

Merge branch 'release/v16.6.10'

This commit is contained in:
Sander Roosendaal
2021-10-31 17:15:37 +01:00
5 changed files with 61 additions and 14 deletions

View File

@@ -141,13 +141,13 @@ def c2_open(user):
return thetoken return thetoken
def get_c2_workouts(rower,do_async=True): def get_c2_workouts(rower,page=1,do_async=True):
try: try:
thetoken = c2_open(rower.user) thetoken = c2_open(rower.user)
except NoTokenError: # pragma: no cover except NoTokenError: # pragma: no cover
return 0 return 0
res = get_c2_workout_list(rower.user,page=1) res = get_c2_workout_list(rower.user,page=page)
if (res.status_code != 200): # pragma: no cover if (res.status_code != 200): # pragma: no cover
return 0 return 0
@@ -634,7 +634,7 @@ def createc2workoutdata(w):
try: try:
spmav = int(row.df[' Cadence (stokes/min)'][mask].mean()) spmav = int(row.df[' Cadence (stokes/min)'][mask].mean())
hrav = int(row.df[' HRCur (bpm)'][mask].mean()) hrav = int(row.df[' HRCur (bpm)'][mask].mean())
except ValuError: except ValueError:
smpav = 0 smpav = 0
try: try:
hrav = int(row.df[' HRCur (bpm)'][mask].mean()) hrav = int(row.df[' HRCur (bpm)'][mask].mean())

View File

@@ -2182,6 +2182,9 @@ class TrainingMesoCycle(models.Model):
if not self.enddate <= self.startdate: if not self.enddate <= self.startdate:
super(TrainingMesoCycle,self).save(*args, **kwargs) super(TrainingMesoCycle,self).save(*args, **kwargs)
else:
self.enddate = self.startdate
super(TrainingMesoCycle,self).save(*args, **kwargs)
microcycles = TrainingMicroCycle.objects.filter(plan = self) microcycles = TrainingMicroCycle.objects.filter(plan = self)
if not microcycles: if not microcycles:

View File

@@ -30,6 +30,10 @@
</p> </p>
</li> </li>
<li class="grid_4"> <li class="grid_4">
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<input name='workouts' type="submit" value="Import selected workouts">
<a href="/rowers/workout/c2list/?selectallnew=true">Select All New</a>
<table width="70%" class="listtable"> <table width="70%" class="listtable">
<thead> <thead>
<tr> <tr>
@@ -47,7 +51,12 @@
{% for workout in workouts %} {% for workout in workouts %}
<tr> <tr>
<td> <td>
<a href="/rowers/workout/c2import/{{ workout|lookup:'id' }}/async/">Import</a></td> {% if workout|lookup:'new' == 'NEW' and checknew == 'true' %}
<input checked type="checkbox" value={{ workout|lookup:'id' }} name="workoutid">
{% else %}
<input type="checkbox" value={{ workout|lookup:'id' }} name="workoutid">
{% endif %}
</td>
<td>{{ workout|lookup:'starttime' }}</td> <td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }}</td> <td>{{ workout|lookup:'duration' }}</td>
<td>{{ workout|lookup:'distance' }}</td> <td>{{ workout|lookup:'distance' }}</td>
@@ -62,6 +71,7 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</form>
</li> </li>
{% else %} {% else %}
<p> No workouts found </p> <p> No workouts found </p>

View File

@@ -1499,7 +1499,7 @@ def workout_getc2workout_all(request,page=1,message=""): # pragma: no cover
r = getrequestrower(request) r = getrequestrower(request)
result = c2stuff.get_c2_workouts(r,do_async=True) result = c2stuff.get_c2_workouts(r,page=page,do_async=True)
if result: if result:
messages.info(request,'Your C2 workouts will be imported in the coming few minutes') messages.info(request,'Your C2 workouts will be imported in the coming few minutes')
@@ -1534,8 +1534,8 @@ def workout_getrp3workout_all(request): # pragma: no cover
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True) @permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_c2import_view(request,page=1,userid=0,message=""): def workout_c2import_view(request,page=1,userid=0,message=""):
r = getrequestrower(request,userid=userid) rower = getrequestrower(request,userid=userid)
if r.user != request.user: if rower.user != request.user:
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes') messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_c2import_view',kwargs={'userid':request.user.id}) url = reverse('workout_c2import_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -1556,17 +1556,17 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
workouts = [] workouts = []
c2ids = [item['id'] for item in res.json()['data']] c2ids = [item['id'] for item in res.json()['data']]
knownc2ids = uniqify([ knownc2ids = uniqify([
w.uploadedtoc2 for w in Workout.objects.filter(user=r) w.uploadedtoc2 for w in Workout.objects.filter(user=rower)
]) ])
tombstones = [ tombstones = [
t.uploadedtoc2 for t in TombStone.objects.filter(user=r) t.uploadedtoc2 for t in TombStone.objects.filter(user=rower)
] ]
parkedids = [] parkedids = []
try: try:
with open('c2blocked.json','r') as c2blocked: with open('c2blocked.json','r') as c2blocked:
jsondata = json.load(c2blocked) jsondata = json.load(c2blocked)
parkedids = jsondata['ids'] parkedids = jsondata['ids']
except FileNotFoundError: # pragma: no cover except (FileNotFoundError,JSONDecodeError): # pragma: no cover
pass pass
knownc2ids = uniqify(knownc2ids+tombstones+parkedids) knownc2ids = uniqify(knownc2ids+tombstones+parkedids)
@@ -1586,8 +1586,38 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
nnn = 'NEW' nnn = 'NEW'
keys = ['id','distance','duration','starttime','rowtype','source','comment','new'] keys = ['id','distance','duration','starttime','rowtype','source','comment','new']
values = [i,d,ttot,s,r,s2,c,nnn] values = [i,d,ttot,s,r,s2,c,nnn]
res = dict(zip(keys,values)) ress = dict(zip(keys,values))
workouts.append(res) workouts.append(ress)
if request.method == "POST":
try: # pragma: no cover
tdict = dict(request.POST.lists())
ids = tdict['workoutid']
c2ids = [int(id) for id in ids]
alldata = {}
for item in res.json()['data']:
alldata[item['id']] = item
counter = 0
for c2id in c2ids:
csvfilename = 'media/{code}_{c2id}.csv'.format(code=uuid4().hex[:16],c2id=c2id)
result = myqueue(
queue,
handle_c2_async_workout,
alldata,
rower.user.id,
rower.c2token,
c2id,
counter,
rower.defaulttimezone
)
counter = counter+1
# done, redirect to workouts list
messages.info(request,'Your Concept2 workouts will be imported in the background. It may take a few minutes before it appears.'.format(c2id=c2id))
url = reverse('workouts_view')
return HttpResponseRedirect(url)
except KeyError:
pass
breadcrumbs = [ breadcrumbs = [
@@ -1605,16 +1635,19 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
} }
] ]
r = getrower(request.user) rower = getrower(request.user)
checknew = request.GET.get('selectallnew',False)
return render(request, return render(request,
'c2_list_import2.html', 'c2_list_import2.html',
{'workouts':workouts, {'workouts':workouts,
'rower':r, 'rower':rower,
'active':'nav-workouts', 'active':'nav-workouts',
'breadcrumbs':breadcrumbs, 'breadcrumbs':breadcrumbs,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
'page':page, 'page':page,
'checknew':checknew,
}) })
importlistviews = { importlistviews = {

View File

@@ -220,6 +220,7 @@ from rowers.tasks import (
handle_sendemail_racesubmission, handle_sendemail_racesubmission,
handle_sendemail_optout, handle_sendemail_optout,
handle_sendemail_ical, handle_sendemail_ical,
handle_c2_async_workout,
) )
from scipy.signal import savgol_filter from scipy.signal import savgol_filter