diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 35e3518f..6fdbda9c 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -141,13 +141,13 @@ def c2_open(user): return thetoken -def get_c2_workouts(rower,do_async=True): +def get_c2_workouts(rower,page=1,do_async=True): try: thetoken = c2_open(rower.user) except NoTokenError: # pragma: no cover 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 return 0 @@ -634,7 +634,7 @@ def createc2workoutdata(w): try: spmav = int(row.df[' Cadence (stokes/min)'][mask].mean()) hrav = int(row.df[' HRCur (bpm)'][mask].mean()) - except ValuError: + except ValueError: smpav = 0 try: hrav = int(row.df[' HRCur (bpm)'][mask].mean()) diff --git a/rowers/templates/c2_list_import2.html b/rowers/templates/c2_list_import2.html index 898fcc4e..2902fc23 100644 --- a/rowers/templates/c2_list_import2.html +++ b/rowers/templates/c2_list_import2.html @@ -30,6 +30,10 @@
No workouts found
diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz new file mode 100644 index 00000000..39f655f8 Binary files /dev/null and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 3bcf2cc6..86787cce 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1499,7 +1499,7 @@ def workout_getc2workout_all(request,page=1,message=""): # pragma: no cover 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: 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) def workout_c2import_view(request,page=1,userid=0,message=""): - r = getrequestrower(request,userid=userid) - if r.user != request.user: + rower = getrequestrower(request,userid=userid) + if rower.user != request.user: 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}) return HttpResponseRedirect(url) @@ -1556,17 +1556,17 @@ def workout_c2import_view(request,page=1,userid=0,message=""): workouts = [] c2ids = [item['id'] for item in res.json()['data']] knownc2ids = uniqify([ - w.uploadedtoc2 for w in Workout.objects.filter(user=r) + w.uploadedtoc2 for w in Workout.objects.filter(user=rower) ]) tombstones = [ - t.uploadedtoc2 for t in TombStone.objects.filter(user=r) + t.uploadedtoc2 for t in TombStone.objects.filter(user=rower) ] parkedids = [] try: with open('c2blocked.json','r') as c2blocked: jsondata = json.load(c2blocked) parkedids = jsondata['ids'] - except FileNotFoundError: # pragma: no cover + except (FileNotFoundError,JSONDecodeError): # pragma: no cover pass knownc2ids = uniqify(knownc2ids+tombstones+parkedids) @@ -1586,8 +1586,38 @@ def workout_c2import_view(request,page=1,userid=0,message=""): nnn = 'NEW' keys = ['id','distance','duration','starttime','rowtype','source','comment','new'] values = [i,d,ttot,s,r,s2,c,nnn] - res = dict(zip(keys,values)) - workouts.append(res) + ress = dict(zip(keys,values)) + 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 = [ @@ -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, 'c2_list_import2.html', {'workouts':workouts, - 'rower':r, + 'rower':rower, 'active':'nav-workouts', 'breadcrumbs':breadcrumbs, 'teams':get_my_teams(request.user), 'page':page, + 'checknew':checknew, }) importlistviews = { diff --git a/rowers/views/statements.py b/rowers/views/statements.py index d386d6a9..13434a98 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -220,6 +220,7 @@ from rowers.tasks import ( handle_sendemail_racesubmission, handle_sendemail_optout, handle_sendemail_ical, + handle_c2_async_workout, ) from scipy.signal import savgol_filter