Private
Public Access
1
0

manual import rp3 working

This commit is contained in:
Sander Roosendaal
2021-01-27 13:30:51 +01:00
parent 5e5518e176
commit 844b984fb1
10 changed files with 161 additions and 14 deletions

View File

@@ -1571,11 +1571,11 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
oarlength=2.89, inboard=0.88, oarlength=2.89, inboard=0.88,
forceunit='lbs', forceunit='lbs',
consistencychecks=False, consistencychecks=False,
startdatetime='',
impeller=False): impeller=False):
message = None message = None
powerperc = 100 * np.array([r.pw_ut2, powerperc = 100 * np.array([r.pw_ut2,
r.pw_ut1, r.pw_ut1,
r.pw_at, r.pw_at,
@@ -1587,6 +1587,9 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
hrtr=r.tr, hran=r.an, ftp=r.ftp, hrtr=r.tr, hran=r.an, ftp=r.ftp,
powerperc=powerperc, powerzones=r.powerzones) powerperc=powerperc, powerzones=r.powerzones)
row = rdata(f2, rower=rr) row = rdata(f2, rower=rr)
if startdatetime != '':
row.rowdatetime = arrow.get(startdatetime).datetime
if title is None or title == '': if title is None or title == '':
title = 'Workout' title = 'Workout'
@@ -1613,7 +1616,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
return new_workout_from_df(r, newdf, return new_workout_from_df(r, newdf,
title=title,boattype=boattype, title=title,boattype=boattype,
workouttype=workouttype, workouttype=workouttype,
workoutsource=workoutsource) workoutsource=workoutsource,startdatetime=startdatetime)
try: try:
checks = row.check_consistency() checks = row.check_consistency()
allchecks = 1 allchecks = 1
@@ -1700,12 +1703,20 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
summary = row.allstats() summary = row.allstats()
if startdatetime != '':
workoutstartdatetime = arrow.get(startdatetime).datetime
else:
workoutstartdatetime = row.rowdatetime
timezone_str = 'UTC' timezone_str = 'UTC'
try: try:
workoutstartdatetime = timezone.make_aware(row.rowdatetime) workoutstartdatetime = timezone.make_aware(workoutstartdatetime)
except ValueError: except ValueError:
workoutstartdatetime = row.rowdatetime pass
try: try:
latavg = row.df[' latitude'].mean() latavg = row.df[' latitude'].mean()
@@ -1840,9 +1851,11 @@ parsers = {
'eth': ETHParser, 'eth': ETHParser,
} }
def parsenonpainsled(fileformat,f2,summary): def parsenonpainsled(fileformat,f2,summary,startdatetime=''):
try: try:
row = parsers[fileformat](f2) row = parsers[fileformat](f2)
if startdatetime != '':
row.rowdatetime = arrow.get(startdatetime).datetime
hasrecognized = True hasrecognized = True
except (KeyError,IndexError,ValueError): except (KeyError,IndexError,ValueError):
hasrecognized = False hasrecognized = False
@@ -1874,13 +1887,13 @@ def parsenonpainsled(fileformat,f2,summary):
return row,hasrecognized,summary,fileformat return row,hasrecognized,summary,fileformat
def handle_nonpainsled(f2, fileformat, summary=''): def handle_nonpainsled(f2, fileformat, summary='',startdatetime=''):
oarlength = 2.89 oarlength = 2.89
inboard = 0.88 inboard = 0.88
hasrecognized = False hasrecognized = False
impeller = False impeller = False
row,hasrecognized,summary,fileformat = parsenonpainsled(fileformat,f2,summary) row,hasrecognized,summary,fileformat = parsenonpainsled(fileformat,f2,summary,startdatetime=startdatetime)
# Handle c2log # Handle c2log
if (fileformat == 'c2log' or fileformat == 'rowprolog'): if (fileformat == 'c2log' or fileformat == 'rowprolog'):
@@ -1973,6 +1986,7 @@ def new_workout_from_file(r, f2,
boattype='1x', boattype='1x',
rpe=-1, rpe=-1,
makeprivate=False, makeprivate=False,
startdatetime='',
notes='', notes='',
uploadoptions={'boattype':'1x','workouttype':'rower'}): uploadoptions={'boattype':'1x','workouttype':'rower'}):
message = "" message = ""
@@ -2078,6 +2092,7 @@ def new_workout_from_file(r, f2,
f2, summary, oarlength, inboard, fileformat, impeller = handle_nonpainsled( f2, summary, oarlength, inboard, fileformat, impeller = handle_nonpainsled(
f2, f2,
fileformat, fileformat,
startdatetime=startdatetime,
summary=summary summary=summary
) )
if not f2: if not f2:
@@ -2106,6 +2121,7 @@ def new_workout_from_file(r, f2,
dosummary=dosummary, dosummary=dosummary,
workoutsource=workoutsource, workoutsource=workoutsource,
summary=summary, summary=summary,
startdatetime=startdatetime,
rpe=rpe, rpe=rpe,
inboard=inboard, oarlength=oarlength, inboard=inboard, oarlength=oarlength,
title=title, title=title,
@@ -2222,6 +2238,7 @@ def new_workout_from_df(r, df,
boattype='1x', boattype='1x',
workouttype='rower', workouttype='rower',
parent=None, parent=None,
startdatetime='',
setprivate=False, setprivate=False,
forceunit='lbs', forceunit='lbs',
dt=datetime.timedelta()): dt=datetime.timedelta()):
@@ -2250,7 +2267,8 @@ def new_workout_from_df(r, df,
notes = '' notes = ''
summary = '' summary = ''
makeprivate = False makeprivate = False
startdatetime = timezone.now() if startdatetime == '':
startdatetime = timezone.now()
if setprivate: if setprivate:
makeprivate = True makeprivate = True

View File

@@ -178,6 +178,10 @@ def get_rp3_workout(user,workout_id,startdatetime=None):
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
auth_token = rp3_open(user) auth_token = rp3_open(user)
if not startdatetime:
startdatetime = str(timezone.now())
status_code = download_rp3_file(url, auth_token, filename) status_code = download_rp3_file(url, auth_token, filename)
if status_code != 200: if status_code != 200:
@@ -192,6 +196,7 @@ def get_rp3_workout(user,workout_id,startdatetime=None):
'workouttype':'dynamic', 'workouttype':'dynamic',
'boattype':'1x', 'boattype':'1x',
'rp3id':workout_id, 'rp3id':workout_id,
'startdatetime':startdatetime,
} }
session = requests.session() session = requests.session()

View File

@@ -2712,6 +2712,84 @@ def handle_sendemail_invite_accept(email, name, teamname, managername,
def add2(x, y,debug=False,**kwargs): def add2(x, y,debug=False,**kwargs):
return x + y return x + y
graphql_url = "https://rp3rowing-app.com/graphql"
@app.task
def handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,debug=False,**kwargs):
headers = {'Authorization': 'Bearer ' + rp3token }
get_download_link = """{
download(workout_id: """ + str(rp3id) + """, type:csv){
id
status
link
}
}"""
have_link = False
download_url = ''
counter = 0
max_attempts = 20
waittime = 3
while not have_link:
response = requests.post(
url=graphql_url,
headers=headers,
json={'query': get_download_link}
)
if response.status_code != 200:
have_link = True
workout_download_details = pd.json_normalize(response.json()['data']['download'])
if workout_download_details.iat[0,1] == 'ready':
download_url = workout_download_details.iat[0,2]
have_link = True
counter += 1
if counter>max_attempts:
have_link = True
time.sleep(waittime)
filename = 'media/RP3Import_'+str(rp3id)+'.csv'
res = requests.get(download_url,headers=headers)
if not startdatetime:
startdatetime = str(timezone.now())
if res.status_code != 200:
return 0
with open(filename,'wb') as f:
f.write(res.content)
uploadoptions = {
'secret': UPLOAD_SERVICE_SECRET,
'user': userid,
'file': filename,
'workouttype':'dynamic',
'boattype':'1x',
'rp3id':rp3id,
'startdatetime':startdatetime,
}
session = requests.session()
newHeaders = {'Content-type': 'application/json', 'Accept': 'text/plain'}
session.headers.update(newHeaders)
response = session.post(UPLOAD_SERVICE_URL,json=uploadoptions)
if response.status_code != 200:
return 0
workoutid = response.json()['id']
return workoutid
@app.task @app.task
def handle_c2_async_workout(alldata,userid,c2token,c2id,debug=False,**kwargs): def handle_c2_async_workout(alldata,userid,c2token,c2id,debug=False,**kwargs):
data = alldata[c2id] data = alldata[c2id]

View File

@@ -241,6 +241,21 @@
</a> </a>
{% endif %} {% endif %}
</li> </li>
<li id="export-rp3">
{% if workout.uploadedtorp3 %}
<a href="https://rp3rowing-app.com/workouts/show/{{ workout.uploadedtorp3 }}">
RP3 <i class="fas fa-check"></i>
</a>
{% elif user.rower.rp3token == None or user.rower.rp3token == '' %}
<a href="/rowers/me/rp3authorize">
Connect to RP3
</a>
{% else %}
<a href="https://rp3rowing-app.com/home">
RP3
</a>
{% endif %}
</li>
<li id="export-csv"> <li id="export-csv">
<a href="/rowers/workout/{{ workout.id|encode }}/emailcsv/"> <a href="/rowers/workout/{{ workout.id|encode }}/emailcsv/">
CSV CSV

View File

@@ -21,7 +21,7 @@
{% for workout in workouts %} {% for workout in workouts %}
<tr> <tr>
<td> <td>
<a href="/rowers/workout/rp3import/{{ workout|lookup:'id' }}/{{ workout|lookup:'starttime'}}/">Import</a></td> <a href="/rowers/workout/rp3import/{{ workout|lookup:'id' }}/?startdatetime={{ workout|lookup:'starttime'}}">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td> <td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'new' }}</td> <td>{{ workout|lookup:'new' }}</td>
</tr> </tr>

View File

@@ -560,6 +560,13 @@ def do_sync(w,options, quick=False):
except KeyError: except KeyError:
pass pass
try:
if options['rp3id'] != 0 and options['rp3id'] != '':
w.uploadedtorp3 = options['rp3id']
w.save()
except KeyError:
pass
if w.duplicate: if w.duplicate:
return 0 return 0

View File

@@ -543,7 +543,7 @@ urlpatterns = [
re_path(r'^workout/stravaimport/user/(?P<userid>\d+)/$',views.workout_stravaimport_view,name='workout_stravaimport_view'), re_path(r'^workout/stravaimport/user/(?P<userid>\d+)/$',views.workout_stravaimport_view,name='workout_stravaimport_view'),
re_path(r'^workout/c2import/all/$',views.workout_getc2workout_all,name='workout_getc2workout_all'), re_path(r'^workout/c2import/all/$',views.workout_getc2workout_all,name='workout_getc2workout_all'),
re_path(r'^workout/c2import/all/(?P<page>\d+)/$',views.workout_getc2workout_all,name='workout_getc2workout_all'), re_path(r'^workout/c2import/all/(?P<page>\d+)/$',views.workout_getc2workout_all,name='workout_getc2workout_all'),
re_path(r'^workout/rp3import/(?P<externalid>\d+)/(?P<startdatetime>\w+)/$',views.workout_getrp3importview, re_path(r'^workout/rp3import/(?P<externalid>\d+)/$',views.workout_getrp3importview,
name='workout_getrp3importview'), name='workout_getrp3importview'),
re_path(r'^workout/(?P<source>\w+.*)import/(?P<externalid>\d+)/$',views.workout_getimportview,name='workout_getimportview'), re_path(r'^workout/(?P<source>\w+.*)import/(?P<externalid>\d+)/$',views.workout_getimportview,name='workout_getimportview'),
re_path(r'^workout/stravaimport/all/$',views.workout_getstravaworkout_all,name='workout_getstravaworkout_all'), re_path(r'^workout/stravaimport/all/$',views.workout_getstravaworkout_all,name='workout_getstravaworkout_all'),

View File

@@ -1023,8 +1023,8 @@ def workout_rp3import_view(request,userid=0):
'name':'Workouts' 'name':'Workouts'
}, },
{ {
'url':reverse('workout_stravaimport_view'), 'url':reverse('workout_rp3import_view'),
'name':'Strava' 'name':'RP3'
}, },
] ]
@@ -1776,8 +1776,25 @@ importsources = {
} }
@login_required() @login_required()
def workout_getrp3importview(request,externalid,startdatetime): def workout_getrp3importview(request,externalid):
return 1 r = getrequestrower(request)
token = rp3stuff.rp3_open(r.user)
startdatetime = request.GET.get('startdatetime')
job = myqueue(queuehigh,
handle_rp3_async_workout,
r.user.id,
token,
externalid,
startdatetime,
)
#id = rp3stuff.get_rp3_workout(r.user,externalid,startdatetime=startdatetime)
messages.info(request,'The workout will be imported in the background')
url = reverse('workout_rp3import_view')
return HttpResponseRedirect(url)
@login_required() @login_required()
def workout_getimportview(request,externalid,source = 'c2'): def workout_getimportview(request,externalid,source = 'c2'):

View File

@@ -203,6 +203,7 @@ from rowers.tasks import handle_makeplot,handle_otwsetpower,handle_sendemailtcx,
from rowers.tasks import ( from rowers.tasks import (
handle_sendemail_unrecognized,handle_sendemailnewcomment, handle_sendemail_unrecognized,handle_sendemailnewcomment,
handle_sendemailsummary, handle_sendemailsummary,
handle_rp3_async_workout,
handle_send_template_email, handle_send_template_email,
handle_send_disqualification_email, handle_send_disqualification_email,
handle_send_withdraw_email, handle_send_withdraw_email,

View File

@@ -4786,6 +4786,11 @@ def workout_upload_api(request):
except KeyError: except KeyError:
garminid = 0 garminid = 0
try:
startdatetime = post_data['startdatetime']
except KeyError:
startdatetime = ''
r = None r = None
if form.is_valid(): if form.is_valid():
t = form.cleaned_data['title'] t = form.cleaned_data['title']
@@ -4857,6 +4862,7 @@ def workout_upload_api(request):
rpe=rpe, rpe=rpe,
notes=notes, notes=notes,
uploadoptions=post_data, uploadoptions=post_data,
startdatetime=startdatetime,
) )
if id == 0: if id == 0: