manual import rp3 working
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|||||||
@@ -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'):
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user