From cfd6c1da7ab0717d2a5a725ce2b43e6df388f117 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 3 Jul 2017 22:07:07 +0200 Subject: [PATCH] values in CP notification email --- rowers/dataprep.py | 9 ++++++--- rowers/datautils.py | 7 +++---- rowers/tasks.py | 23 ++++++++++++++++------- rowers/utils.py | 5 ++++- rowsanda_107501 | Bin 1775616 -> 1775616 bytes 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 0059162f..a68e288e 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -428,7 +428,8 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', isbreakthrough = False if workouttype == 'water': delta,cpvalues,avgpower = datautils.getsinglecp(row.df) - if utils.isbreakthrough(delta,cpvalues,r.p0,r.p1,r.p2,r.p3,r.cpratio): + res,btvalues = utils.isbreakthrough(delta,cpvalues,r.p0,r.p1,r.p2,r.p3,r.cpratio) + if res: isbreakthrough = True res = datautils.updatecp(delta,cpvalues,r) @@ -595,14 +596,16 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', if settings.DEBUG and r.getemailnotifications: res = handle_sendemail_breakthrough.delay(w.id,r.user.email, r.user.first_name, - r.user.last_name) + r.user.last_name, + btvalues=btvalues.to_json()) elif r.getemailnotifications: try: res = queuehigh.enqueue( handle_sendemail_breakthrough(w.id, r.user.email, r.user.first_name, - r.user.last_name)) + r.user.last_name, + btvalues=btvalues.to_json())) except AttributeError: pass else: diff --git a/rowers/datautils.py b/rowers/datautils.py index ca4cbff1..8cdde524 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -77,8 +77,8 @@ def cpfit(powerdf): def getlogarr(maxt): maxlog10 = np.log10(maxt-5) - logarr = np.log10(5.)+np.arange(50)*maxlog10/50. - logarr = [int(10.**(la)) for la in logarr] + logarr = np.arange(50)*maxlog10/50. + logarr = [5+int(10.**(la)) for la in logarr] logarr = pd.Series(logarr) logarr.drop_duplicates(keep='first',inplace=True) @@ -88,7 +88,7 @@ def getlogarr(maxt): def getsinglecp(df): thesecs = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min() if thesecs != 0: - maxt = 2*thesecs + maxt = 1.05*thesecs else: maxt = 1000. @@ -152,7 +152,6 @@ def getcp(dfgrouped,logarr): dt = pd.Series(dt) cpw = pd.Series(cpw) if len(dt): - cpvalues = griddata(dt.values, cpw.values, logarr,method='linear', diff --git a/rowers/tasks.py b/rowers/tasks.py index 50277880..9b98a4e8 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -52,7 +52,7 @@ def handle_new_workout_from_file(r,f2, @app.task def handle_sendemail_breakthrough(workoutid,useremail, userfirstname,userlastname, - btvalues = pd.DataFrame()): + btvalues = pd.DataFrame().to_json()): # send email with attachment subject = "A breakthrough workout on rowsandall.com" @@ -63,7 +63,7 @@ def handle_sendemail_breakthrough(workoutid,useremail, message += " Critical Power (CP) is the power that you can " message += "sustain for a given duration. For more, see this " message += " article in the analytics blog:\n\n" - message += " [link to article to be written]\n\n" + message += " http://analytics.rowsandall.com/2017/06/17/how-do-we-calculate-critical-power/ \n\n" message += "Link to the workout http://rowsandall.com/rowers/workout/" message += str(workoutid) message +="/edit\n\n" @@ -72,6 +72,9 @@ def handle_sendemail_breakthrough(workoutid,useremail, message += str(workoutid) message += "/updatecp\n\n" + btvalues = pd.read_json(btvalues) + btvalues.sort_values('delta',axis=0,inplace=True) + if not btvalues.empty: message += "These were the breakthrough values:\n" for t in btvalues.itertuples(): @@ -79,9 +82,15 @@ def handle_sendemail_breakthrough(workoutid,useremail, cpvalue = t.cpvalues pwr = t.pwr - message += "Time: "+str(delta)+" seconds\n" - message += "New: "+str(cpvalue)+" Watt\n" - message += "Old: "+str(pwr)+" Watt\n\n" + message += "Time: {delta} seconds\n".format( + delta=delta + ) + message += "New: {cpvalue:.0f} Watt\n".format( + cpvalue=cpvalue + ) + message += "Old: {pwr:.0f} Watt\n\n".format( + pwr=pwr + ) message += "To opt out of these email notifications, deselect the checkbox on your Profile page under Account Information.\n\n" @@ -237,11 +246,11 @@ def handle_otwsetpower(f1,boattype,weightvalue, update_strokedata(workoutid,rowdata.df,debug=debug) delta,cpvalues,avgpower = datautils.getsinglecp(rowdata.df) - res,deltas = utils.isbreakthrough(delta,cpvalues,ps[0],ps[1],ps[2],ps[3],ratio) + res,btvalues = utils.isbreakthrough(delta,cpvalues,ps[0],ps[1],ps[2],ps[3],ratio) if res: handle_sendemail_breakthrough(workoutid,email, first_name, - last_name,deltas) + last_name,btvalues=btvalues.to_json()) # send email fullemail = first_name + " " + last_name + " " + "<" + email + ">" diff --git a/rowers/utils.py b/rowers/utils.py index 5036dac2..6e788b7c 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -77,7 +77,6 @@ def geo_distance(lat1,lon1,lat2,lon2): def isbreakthrough(delta,cpvalues,p0,p1,p2,p3,ratio): - pwr = p0/(1+delta/p2) pwr += p1/(1+delta/p3) @@ -92,4 +91,8 @@ def isbreakthrough(delta,cpvalues,p0,p1,p2,p3,ratio): 'pwr':pwr[cpvalues>pwr], } ) + + btdf.sort_values('delta',axis=0,inplace=True) + + return res>1,btdf diff --git a/rowsanda_107501 b/rowsanda_107501 index f2be965892023a47dda55a7521ff65bbb6a8180c..c0aaa64663a6f1a889b0bf6f2129de644db66c63 100644 GIT binary patch delta 3686 zcmdUyU33-I8HUgNoP82FK*-Pe83M)-Aetx$5hC&vG$OTBV;3kO#S|h!jDScnLg36m zgn$78L?%Lj03jzLVi3q6Mg&ESk_xu8<$?=ba>44dOKg*w$;@P??{`)&yOyh$y?CGb z&bRl>?7hEt?@8pg3c0PKZU~pXGxKpS`()`cf%l&~6%-qVB>%@Q^ZER*Y-|f`ZVPY_ z4+)S6`5^{TTN0EE^@I9DL1+Lp5E`Vl1yY{78E4(8;%0Uy1sWV@cT$5YyPcA+PR$rn zsFmMNX%sYOrm`fpB$E#(ujeYcm0Shar3N$kq3X0!DPO%p(c(HGbvk#MyTF~}PID)? zR_-v@$nD|kxUF0@{}f-$PvHysv3x#1lF#BLK3!-LnuNVVy|7)V5jF@_!fIiKP%e~l zi`Bp13XFJO)$hX`8}%IU9sM4#UYEeVdIq>lPXYJn{lPk&R%5r$flGU;z@0sBfZKak zg4=pt_4!z!X9?o1J&V*PA?;puGnbY#s-gP{CFk=oy9Pbv@bYbRlilCNXW3nBFdCh>dZvFeGYX zYlb5P{X&y(8MoMnp0*ae6%x4Frj>@_WZDzZ^t7FeIL#gorrJZnupJVP`^MXt3JY48 z3L9);Dy*M{sjz_-O(n@%BAoZ7S{OWAY!!imTK0WtIM=P#d>@(?`@vj>_uVj;f`2i~ zz`vObz(1SMgSFHe8NM{B43}ai)uGd%I(%+W9WEMFhsy>A@Bhr8I-EBafnOLj ztPW!?c)^$jo;98UKQ*2L+YPGDCk7_yKW#h;YQ}i*BjX|Pq>&GvF{lV18rk3p0}JRs zWz3D>a@@cw``K|y*CE_t9K3f&)!ww z&%LywZ>w29ght0c&@1tyMW;C()oD)0behuVrC#+Q)48&i}4X3;qkfAN#)>zr89digB?mqc|=$XCN{&#>B<5VMH^+ zuxfsYPr@mH7FHAj3gBNhBeYA@8YYF732{~uLVGb~=Z9P&E*{UoU8Nx&eP_}QOQ>lM znly1m;#p;st)gs2B3qrvR#Kua6!832Z;^eiK0KY&a0za0q3 zr`R;oK{lq#(rs)rHsF_z2=rkV9Lf4ya3m8gIFcn>a3td`IFfM|9LfCuIYx#T;fG++ zHuEgnX0Aostk0rt=2*1Nep0JjB3oklef`k&u|7XIwU1VQnzI(1?9c)hIj@0_Iu+nV z=Vfq;vk)wF=7SR)96@Z7^IPy?=QrRZ&J1vz^Eh5`*O`L&T?Z#I8|xH+4>_a3@y`9= zXlDfYV9d$FrN9{i<~bp7j58R_b%Nk1CjdU+@Zbo09hhTdyR!T2*THNX`1 zW#B#bi{Nm39yrvV4QAOT;1K)Qpkz-6huPCGS6?}Y^}@2fqyRguY2{|}B{?a{{igGc*ntw&~kJ?4>HS9;{uH$3{Ft#I*8V9Q;66WA&j=O=sB z#rerzb8&vMS6p&yxl3+c=8{{Nxa8KC-KW7y_g7$Y#K1Ue0A&_~co=nV8B zbRru#1s#XphuWa`pjPMupHIm%$EjSoG(x*NCOiQ%DWsX?;Ou8bVLG*EhIzzI85GY- z#FLPZizW1Vn1e)|m4Y zw4`E$781*(C8tFCgrh8iUJ=~Nazi^sP0frfN3S4da|r2#{0QohMV$&GZXhn^(yNLi z^rb4GY)K+pMA`X~#FvQfDxr2?K2Eq!I7_3siP31{wZuT~&=YS^wmU)#dOMMIsPA2Z z84-^%tR72>&WW>n2_0)C>R1-#(=o^>5|vR()I@o#Ts`8L$W8SL&+rGipAh&MT*TlO z1{X27h`})oE@E&IgJT$6#NZeP7qO2aIEleI3{GNj4TF;y48!0g1}8BXhQUef1O&q{ z7>U71>=*}4Rh7Li^&_U<`bOdUIs818r0IAS^=pCpY+6(Q1 z_CR&eZfHBS6RL&YhPFaGe7?!72EjIH6Z96e1=t^t29mS^ccQ&ydI{NXYEO}p&M=AIktx~OR6$f+%#mo*M5y=$D1Kbb zqUWF@m~8+#tDYHL)P<2>%BCE$%e{ delta 3250 zcmdUxZFCgn6~}jXo_%(gED)0H?CuaSK+tF+M2HYEnxIi>OBE{EfC#BZ3?cIVrUZ7T zPzY_r04WnSO2puTrgg2r(3aA)wU)MNNn6_Tfe)OPd|FGkphwuxZ{))!r1_14XqsQoXBsyPcvy>G3km*Iw|*z0 zRlO8Es^12FSC_ypJq8}p^TES<9(YKniFN9J@YUfq@Zj)v@Ri|BV8`%_;CF_b!EX;g z2W}r`;I?cE+?stE+>+f2Zq9B1H)Yp?8`XpU!bwwFvyb3rZMGI{$=(O9$5uFlz5{)`hNr4Ufx;>32SVXu8dLe_t?Ft&98>;LP`i&6?qfw~S&a3h z*}^zWvuuoMtS{yWM>8?5@fD&gq**3bud!+|K&ugRXKE~wIKniwQd}QO^Ewgk-k2+B zYym>jyha3;khfku%(U(%ah;In3&pU;TXU~#Kp$(&#qOZkW{Q>3rLhfSAe`nM zotF9yotFA_9ZT)wHUt)YO{WF_f*LUEe=h=O9g!n9Z&HGW<4Dk~D1^00QJk|gJIzK`IF)PE%|l%^x$1V+`B9EIld6YK;}K!zm=#6$^Ygd##Qp^8w7CwN_gK3_}DKhWQYk_&<*Dnbi;!dbi$c!AbT~u-IM%PPD%QO7^2*(w;vS(+v8K`Gmy*E$?K4AqfW) z24r%Y^7As~=K!@DCFJ?}oE9(U^86Zg4H0gV1g_*Hkj-^nrw1JJ-hzJ4uq5fiq)?Uw z`l%I8Hfa1@?tRV4KoO4GBo%>vI_cZ+08Z~@h-qW@CP$!%{v=hEjwC7!yGs7N?xc+h zbDG}Qm&E4=sFfiM63&tD3bj6_)(vV6Q7cQWYsv5lE}?OgTv3{unGA)su?fi$v+cnMw69FRB7tSTa^o2AkiFa=$%W*TQ41CT33^_iGDI9ykP@* z8zd`~6LyOq8S3MoXwmDU6li%@Q3TwcP~_dX^eOU7xV)ptI7j$#MJD0Ct;j97^eQq* z_n0C#;_{XvlX%}$WKwUBB9naIP-N2Y>x%psF5QYu3RV@FB>ewSLbiKU$+me^$hLY^ z9k!%ADi51IDi51H`p?L95)s{!yEBjZ nYkk5Kfn)y9{OW}6$PBgeVtkKUSsYHOv$6%%+V(@q1A%`7+U=tS