Merge branch 'release/v16.6.10'
This commit is contained in:
@@ -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())
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user