Private
Public Access
1
0

Merge branch 'release/v10.43'

This commit is contained in:
Sander Roosendaal
2019-10-31 16:02:33 +01:00
4 changed files with 103 additions and 96 deletions

View File

@@ -574,6 +574,7 @@ def createc2workoutdata(w):
"time": int(10*makeseconds(durationstr)),
"weight_class": c2wc(w.weightcategory),
"comments": w.notes,
"stroke_count": int(row.stroke_count),
'stroke_rate': int(row.df[' Cadence (stokes/min)'].mean()),
'drag_factor': int(row.dragfactor),
"heart_rate": {

View File

@@ -2007,9 +2007,9 @@ def read_df_sql(id):
f = 'media/strokedata_{id}.parquet.gz'.format(id=id)
df = pd.read_parquet(f)
except OSError:
rowdata,row = getrowdata(id=ids[0])
rowdata,row = getrowdata(id=id)
if rowdata and len(rowdata.df):
data = dataprep(rowdata.df,id=ids[0],bands=True,otwpower=True,barchart=True)
data = dataprep(rowdata.df,id=id,bands=True,otwpower=True,barchart=True)
df = pd.read_parquet(f)
df = df.fillna(value=0)

View File

@@ -166,7 +166,7 @@ def create_c2_stroke_data_db(
try:
spm = 60.*nr_strokes/totalseconds
except ZeroDivisionError:
spm = 20*zeros(nr_strokes)
spm = 20*np.zeros(nr_strokes)
step = totalseconds/float(nr_strokes)
@@ -713,7 +713,7 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
columns = [c for c in columns if c != 'None']
if len(ids)>1:
for f in csvfilenames:
for id, f in zip(ids,csvfilenames):
try:
df = pd.read_parquet(f,columns=columns,engine='pyarrow')
data.append(df)
@@ -721,7 +721,10 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
pass
df = pd.concat(data,axis=0)
try:
df = pd.concat(data,axis=0)
except ValueError:
df = pd.DataFrame()
else:
df = pd.read_parquet(csvfilenames[0],columns=columns,engine='pyarrow')

View File

@@ -115,23 +115,23 @@ def add(x, y):
return x + y
@app.task
def handle_c2_import_stroke_data(c2token,
c2id,workoutid,
starttimeunix,
csvfilename,debug=True,**kwargs):
if 'workouttype' in kwargs:
workouttype = kwargs['workouttype']
else:
workouttype = 'rower'
authorizationstring = str('Bearer ' + c2token)
headers = {'Authorization': authorizationstring,
'user-agent': 'sanderroosendaal',
'Content-Type': 'application/json'}
'user-agent': 'sanderroosendaal',
'Content-Type': 'application/json'}
url = "https://log.concept2.com/api/users/me/results/"+str(c2id)+"/strokes"
s = requests.get(url,headers=headers)
if s.status_code == 200:
@@ -140,13 +140,13 @@ def handle_c2_import_stroke_data(c2token,
strokedata,workoutid,starttimeunix,
csvfilename,debug=debug,workouttype=workouttype
)
return 1
else:
url = "https://log.concept2.com/api/users/me/results/{id}".format(id=c2id)
s = requests.get(url,headers=headers)
if s.status_code == 200:
workoutdata = s.json()['data']
distance = workoutdata['distance']
@@ -179,10 +179,10 @@ def handle_c2_import_stroke_data(c2token,
workoutid,starttimeunix,
csvfilename,debug=debug,
)
return 1
return 0
return 0
@@ -191,7 +191,10 @@ def getagegrouprecord(age,sex='male',weightcategory='hwt',
distance=2000,duration=None,indf=pd.DataFrame()):
if not duration:
df = indf[indf['distance'] == distance]
try:
df = indf[indf['distance'] == distance]
except KeyError:
df = pd.DataFrame()
else:
duration = 60*int(duration)
df = indf[indf['duration'] == duration]
@@ -238,7 +241,7 @@ def polygon_to_path(polygon,debug=True):
conn.close()
engine.dispose()
s = []
for point in points:
s.append([point[1],point[2]])
@@ -270,7 +273,7 @@ def handle_check_race_course(self,
try:
row = rdata(csvfile=f1)
except IOError:
try:
try:
row = rdata(csvfile=f1 + '.csv')
except IOError:
try:
@@ -278,7 +281,7 @@ def handle_check_race_course(self,
except IOError:
return 0
rowdata = row.df
try:
@@ -309,7 +312,7 @@ def handle_check_race_course(self,
engine = create_engine(database_url_debug, echo=False)
else:
engine = create_engine(database_url, echo=False)
# get polygons
query = "SELECT id FROM rowers_geopolygon WHERE course_id = {courseid} ORDER BY order_in_course ASC".format(
courseid=courseid
@@ -342,7 +345,7 @@ def handle_check_race_course(self,
coursetimeseconds,
coursemeters,
coursecompleted,
) = coursetime_paths(rowdata2,paths)
(
coursetimefirst,
@@ -378,7 +381,7 @@ def handle_check_race_course(self,
coursemeters = records[records['coursetimeseconds'] == mintime]['coursemeters'].min()
else:
coursecompleted = False
if coursecompleted:
query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid} WHERE id={recordid}'.format(
@@ -395,8 +398,8 @@ def handle_check_race_course(self,
distance=int(coursemeters),
workoutid=workoutid,
)
with engine.connect() as conn, conn.begin():
result = conn.execute(query)
@@ -430,7 +433,7 @@ def handle_getagegrouprecords(self,
if sex == 'not specified':
return 0
for distance in distances:
worldclasspower = getagegrouprecord(
age,
@@ -477,22 +480,22 @@ def long_test_task(self,aantal,debug=False,job=None,session_key=None):
return longtask.longtask(aantal,jobid=job.id,debug=debug,
session_key=session_key)
@app.task(bind=True)
def long_test_task2(self,aantal,**kwargs):
#debug=False,job=None,jobid='aap'):
job = self.request
job_id = job.id
if 'jobkey' in kwargs:
job_id = kwargs.pop('jobkey')
kwargs['jobid'] = job_id
return longtask.longtask2(aantal,**kwargs)
# create workout
@app.task
@@ -520,7 +523,7 @@ def handle_update_empower(self,
aantal = len(workoutdicts)
counter = 0
for workoutdict in workoutdicts:
wid = workoutdict['id']
inboard = workoutdict['inboard']
@@ -529,7 +532,7 @@ def handle_update_empower(self,
f1 = workoutdict['filename']
# oarlength consistency checks will be done in view
havedata = 1
try:
rowdata = rdata(csvfile=f1)
@@ -541,7 +544,7 @@ def handle_update_empower(self,
rowdata = rdata(csvfile=f1 + '.gz')
except IOError:
havedata = 0
progressurl = SITE_URL
siteurl = SITE_URL
if debug:
@@ -550,10 +553,10 @@ def handle_update_empower(self,
secret = PROGRESS_CACHE_SECRET
kwargs['job_id'] = job_id
progressurl += "/rowers/record-progress/"
progressurl += job_id
if havedata:
success = update_empower(wid, inboard, oarlength, boattype,
rowdata.df, f1, debug=debug)
@@ -561,7 +564,7 @@ def handle_update_empower(self,
counter += 1
progress = 100.*float(counter)/float(aantal)
post_data = {
"secret":secret,
"value":progress,
@@ -601,7 +604,7 @@ def handle_calctrimp(id,
engine = create_engine(database_url_debug, echo=False)
else:
engine = create_engine(database_url, echo=False)
try:
rowdata = rdata(csvfile=csvfilename)
except IOError:
@@ -621,7 +624,7 @@ def handle_calctrimp(id,
return 0
df2 = df.copy()
df2['time'] = df2[' ElapsedTime (sec)']
df2['time'] = df2['time'].apply(
lambda x:safetimedelta(x)
@@ -633,7 +636,7 @@ def handle_calctrimp(id,
df2 = df2.rolling(30).mean()
df2[' Power (watts)'] = df2[' Power (watts)'].abs()
df2['pwr4'] = df2[' Power (watts)']**(4.0)
# pwr4mean = wavg(df,'pwr4','deltat')
pwr4mean = df2['pwr4'].mean()
@@ -647,7 +650,7 @@ def handle_calctrimp(id,
intensityfactor = normp/float(ftp)
tss = 100.*((duration*normp*intensityfactor)/(3600.*ftp))
if sex == 'male':
f = 1.92
else:
@@ -665,7 +668,7 @@ def handle_calctrimp(id,
hrtss = 100.*trimp/trimp1hr
pp = 8.0
df['v4'] = df[' AverageBoatSpeed (m/s)']**(pp)
v4mean = wavg(df,'v4','deltat')
normv = v4mean**(1./pp)
@@ -676,14 +679,14 @@ def handle_calctrimp(id,
normw = w4mean**(1./pp)
except KeyError:
normw = 0
if not np.isfinite(normv):
normv = 500./120.
if not np.isfinite(normw):
normw = 0
try:
dum = int(tss)
except ValueError:
@@ -718,7 +721,7 @@ def handle_calctrimp(id,
engine.dispose()
return 1
@app.task
def handle_updatedps(useremail, workoutids, debug=False,**kwargs):
@@ -738,7 +741,7 @@ def handle_updatedps(useremail, workoutids, debug=False,**kwargs):
if havedata:
update_strokedata(wid, rowdata.df, debug=debug)
subject = "Rowsandall.com Your Distance per Stroke metric has been updated"
message = "All your workouts now have Distance per Stroke"
@@ -766,7 +769,7 @@ def sigdig(value, digits = 3):
# return integers as is
if value % 1 == 0:
return value
places = digits - order - 1
if places > 0:
fmtstr = "%%.%df" % (places)
@@ -899,7 +902,7 @@ def handle_send_email_failed_cancel(
d, **kwargs)
return 1
@app.task
def handle_send_email_subscription_update(
@@ -932,7 +935,7 @@ def handle_send_email_subscription_update(
template_name = 'subscription_update_email.html'
notification_template_name = 'subscription_update_notification.html'
subject = "Rowsandall Payment Confirmation"
res = send_template_email(from_email,[useremail],
subject,
template_name,
@@ -1199,7 +1202,7 @@ def handle_sendemail_userdeleted(name, email, debug=False, **kwargs):
if not emailbounced:
res = email.send()
return 1
@@ -1232,7 +1235,7 @@ def handle_sendemail_unrecognized(unrecognizedfile, useremail,
if not emailbounced:
res = email.send()
# remove tcx file
try:
@@ -1286,7 +1289,7 @@ def handle_sendemailics(first_name, last_name, email, icsfile, **kwargs):
os.remove(icsfile)
return 1
@app.task
def handle_sendemailkml(first_name, last_name, email, kmlfile,**kwargs):
@@ -1341,10 +1344,10 @@ def handle_zip_file(emailfrom, subject, file,**kwargs):
debug = kwargs['debug']
except KeyError:
debug = False
if debug:
print(message)
email = EmailMessage(subject, message,
emailfrom,
['workouts@rowsandall.com'])
@@ -1354,8 +1357,8 @@ def handle_zip_file(emailfrom, subject, file,**kwargs):
res = email.send()
if debug:
print("sent")
time.sleep(60)
@@ -1379,7 +1382,7 @@ def handle_sendemailsummary(first_name, last_name, email, csvfile, **kwargs):
subject,'summarymail.html',d,
attach_file=csvfile,
**kwargs)
try:
os.remove(csvfile)
except:
@@ -1392,7 +1395,7 @@ def handle_sendemailsummary(first_name, last_name, email, csvfile, **kwargs):
@app.task
def handle_sendemailcsv(first_name, last_name, email, csvfile,**kwargs):
# send email with attachment
fullemail = first_name + " " + last_name + " " + "<" + email + ">"
subject = "File from Rowsandall.com"
@@ -1407,7 +1410,7 @@ def handle_sendemailcsv(first_name, last_name, email, csvfile,**kwargs):
res = send_template_email(from_email,[fullemail],
subject,'csvemail.html',d,
attach_file=csvfile,**kwargs)
return 1
@@ -1427,7 +1430,7 @@ def handle_sendemail_ical(first_name, last_name, email, url, icsfile, **kwargs):
progressurl = SITE_URL_DEV
siteurl = SITE_URL_DEV
d = {'first_name':first_name,
'siteurl':siteurl,
'url':url,
@@ -1439,20 +1442,20 @@ def handle_sendemail_ical(first_name, last_name, email, url, icsfile, **kwargs):
res = send_template_email(from_email,[fullemail],
subject,'icsemail.html',d,
attach_file=icsfile,**kwargs)
try:
os.remove(csvfile)
except:
pass
return 1
@app.task
def handle_sendemailfile(first_name, last_name, email, csvfile,**kwargs):
# send email with attachment
fullemail = first_name + " " + last_name + " " + "<" + email + ">"
subject = "File from Rowsandall.com"
@@ -1467,7 +1470,7 @@ def handle_sendemailfile(first_name, last_name, email, csvfile,**kwargs):
res = send_template_email(from_email,[fullemail],
subject,'fileemail.html',d,
attach_file=csvfile,**kwargs)
if 'delete' in kwargs:
dodelete = kwargs['delete']
@@ -1479,7 +1482,7 @@ def handle_sendemailfile(first_name, last_name, email, csvfile,**kwargs):
os.remove(csvfile)
except:
pass
return 1
# Calculate wind and stream corrections for OTW rowing
@@ -1492,7 +1495,7 @@ def handle_otwsetpower(self,f1, boattype, weightvalue,
job = self.request
job_id = job.id
if 'jobkey' in kwargs:
job_id = kwargs.pop('jobkey')
if 'ps' in kwargs:
@@ -1563,7 +1566,7 @@ def handle_otwsetpower(self,f1, boattype, weightvalue,
# determine cache file name
physics_cache = 'media/'+str(boattype)+'_'+str(int(weightvalue))
rowdata.otw_setpower(skiprows=5, mc=weightvalue, rg=rg,
powermeasured=powermeasured,
progressurl=progressurl,
@@ -1638,7 +1641,7 @@ def handle_updateergcp(rower_id,workoutfilenames,debug=False,**kwargs):
cpdata = rowingdata.cumcpdata(therows)
cpdata.columns = cpdata.columns.str.lower()
updatecpdata_sql(rower_id,cpdata['delta'],cpdata['cp'],
table='ergcpdata',distance=cpdata['distance'],
debug=debug)
@@ -1659,7 +1662,7 @@ def cp_from_workoutids(workoutids,debug=False):
maxt = 1.05*df['time'].max()/1000.
logarr = datautils.getlogarr(maxt)
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)
powerdf = pd.DataFrame({
@@ -1705,7 +1708,7 @@ def cp_from_workoutids(workoutids,debug=False):
power2k = fitfunc(p1,t3)
return powerfourmin,power2k,powerhour
@app.task
def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
@@ -1714,7 +1717,7 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
powerfourmin = -1
power2k = -1
powerhour = -1
mdict = {
'user_id': user_id,
'PowerFourMin': powerfourmin,
@@ -1730,7 +1733,7 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
powerfourmin,power2k,powerhour = cp_from_workoutids(workoutids,debug=debug)
if powerfourmin > 0 and power2k > 0 and powerhour > 0:
mdict = {
'user_id': user_id,
'PowerFourMin': powerfourmin,
@@ -1744,7 +1747,7 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
result = fitnessmetric_to_sql(mdict,debug=debug,doclean=True)
else:
result = 0
return result
@app.task
@@ -1760,13 +1763,13 @@ def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs):
logarr = datautils.getlogarr(maxt)
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)
updatecpdata_sql(rower_id,delta,cpvalue,debug=debug,table=table)
return 1
@app.task
def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename,
debug=False,**kwargs):
@@ -1864,11 +1867,11 @@ def handle_sendemail_coachrequest(email,name,code,coachname,
}
form_email = 'Rowsandall <info@rowsandall.com>'
res = send_template_email(from_email,[fullemail],
subject,'coachrequestemail.html',d,
**kwargs)
return 1
@app.task
@@ -1984,7 +1987,7 @@ def handle_sendemail_coacheerequest(email,name,code,coachname,
res = send_template_email(from_email,[fullemail],
subject,'coacheerequestemail.html',d,
**kwargs)
return 1
@app.task
@@ -2004,13 +2007,13 @@ def handle_sendemail_invite(email, name, code, teamname, manager,
'teamname':teamname,
'siteurl':siteurl
}
from_email = 'Rowsandall <info@rowsandall.com>'
res = send_template_email(from_email,[fullemail],
subject,'teaminviteemail.html',d,
**kwargs)
return 1
@@ -2027,7 +2030,7 @@ def handle_sendemailnewresponse(first_name, last_name,
subject = 'New comment on session ' + workoutname
comment = u''+comment
siteurl = SITE_URL
if debug:
siteurl = SITE_URL_DEV
@@ -2035,12 +2038,12 @@ def handle_sendemailnewresponse(first_name, last_name,
sessiontype = 'workout'
if 'sessiontype' in kwargs:
sessiontype=kwargs.pop('sessiontype')
commentlink = '/rowers/workout/{workoutid}/comment/'.format(
workoutid=encoder.encode_hex(workoutid))
if 'commentlink' in kwargs:
commentlink = kwargs.pop('commentlink')
d = {
'first_name':first_name,
'commenter_first_name':commenter_first_name,
@@ -2056,7 +2059,7 @@ def handle_sendemailnewresponse(first_name, last_name,
res = send_template_email(from_email,
[fullemail],
subject,'teamresponseemail.html',d,**kwargs)
subject,'teamresponseemail.html',d,**kwargs)
return 1
@@ -2072,13 +2075,13 @@ def handle_sendemailnewcomment(first_name,
debug=False,**kwargs):
fullemail = email
from_email = 'Rowsandall <info@rowsandall.com>'
subject = 'New comment on session ' + workoutname
comment = u''+comment
siteurl = SITE_URL
if debug:
siteurl = SITE_URL_DEV
@@ -2086,7 +2089,7 @@ def handle_sendemailnewcomment(first_name,
sessiontype = 'workout'
if 'sessiontype' in kwargs:
sessiontype=kwargs.pop('sessiontype')
commentlink = '/rowers/workout/{workoutid}/comment/'.format(
workoutid=encoder.encode_hex(workoutid))
if 'commentlink' in kwargs:
@@ -2106,7 +2109,7 @@ def handle_sendemailnewcomment(first_name,
res = send_template_email(from_email,[fullemail],subject,
'teamresponseemail.html',d,**kwargs)
return 1
@@ -2148,9 +2151,9 @@ def handle_sendemail_request(email, name, code, teamname, requestor, id,
'id':id,
'first_name':name,
}
res = send_template_email(from_email,[fullemail],subject,
'teamrequestemail.html',d,**kwargs)
'teamrequestemail.html',d,**kwargs)
return 1
@@ -2174,7 +2177,7 @@ def handle_sendemail_request_accept(email, name, teamname, managername,
'siteurl':siteurl,
}
res = send_template_email(from_email,[fullemail],subject,
'teamwelcomeemail.html',d,**kwargs)
'teamwelcomeemail.html',d,**kwargs)
return 1
@@ -2198,7 +2201,7 @@ def handle_sendemail_request_reject(email, name, teamname, managername,
'siteurl':siteurl,
}
res = send_template_email(from_email,[fullemail],subject,
'teamrejectemail.html',d,**kwargs)
'teamrejectemail.html',d,**kwargs)
return 1
@@ -2221,7 +2224,7 @@ def handle_sendemail_member_dropped(email, name, teamname, managername,
'siteurl':siteurl,
}
res = send_template_email(from_email,[fullemail],subject,
'teamdropemail.html',d,**kwargs)
'teamdropemail.html',d,**kwargs)
return 1
@@ -2246,7 +2249,7 @@ def handle_sendemail_team_removed(email, name, teamname, managername,
'siteurl':siteurl,
}
res = send_template_email(from_email,[fullemail],subject,
'teamremoveemail.html',d,**kwargs)
'teamremoveemail.html',d,**kwargs)
return 1