diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index 4c08ebb4..10b96bae 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -696,7 +696,7 @@ def updatecpdata_sql(rower_id,delta,cp,table='cpdata',distance=pd.Series([]),deb engine = create_engine(database_url, echo=False) - with engine.connect() as conn, conn.begin(): + with engine.connect() as conn, conn.begin(): df.to_sql(table, engine, if_exists='append', index=False) conn.close() engine.dispose() diff --git a/rowers/tasks.py b/rowers/tasks.py index a42987e8..7b32ebe7 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -139,34 +139,34 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|',workouttype='rower'): spm = 0 try: resttime = data['rest_time']/10. - except KeyError: + except KeyError: # pragma: no cover resttime = 0 try: restdistance = data['rest_distance'] - except KeyError: + except KeyError: # pragma: no cover restdistance = 0 try: avghr = data['heart_rate']['average'] - except KeyError: + except KeyError: # pragma: no cover avghr = 0 try: maxhr = data['heart_rate']['max'] - except KeyError: + except KeyError: # pragma: no cover maxhr = 0 try: avgpace = 500.*totaltime/totaldist - except (ZeroDivisionError,OverflowError): + except (ZeroDivisionError,OverflowError): # pragma: no cover avgpace = 0. try: restpace = 500.*resttime/restdistance - except (ZeroDivisionError,OverflowError): + except (ZeroDivisionError,OverflowError): # pragma: no cover restpace = 0. velo = totaldist/totaltime avgpower = 2.8*velo**(3.0) - if workouttype in ['bike','bikeerg']: + if workouttype in ['bike','bikeerg']: # pragma: no cover velo = velo/2. avgpower = 2.8*velo**(3.0) velo = velo*2 @@ -174,11 +174,11 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|',workouttype='rower'): try: restvelo = restdistance/resttime - except (ZeroDivisionError,OverflowError): + except (ZeroDivisionError,OverflowError): # pragma: no cover restvelo = 0 restpower = 2.8*restvelo**(3.0) - if workouttype in ['bike','bikeerg']: + if workouttype in ['bike','bikeerg']: # pragma: no cover restvelo = restvelo/2. restpower = 2.8*restvelo**(3.0) restvelo = restvelo*2 @@ -213,45 +213,45 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|',workouttype='rower'): try: timebased = data['workout_type'] in ['FixedTimeSplits','FixedTimeInterval'] - except KeyError: + except KeyError: # pragma: no cover timebased = False for interval in splitdata: try: idist = interval['distance'] - except KeyError: + except KeyError: # pragma: no cover idist = 0 try: itime = interval['time']/10. - except KeyError: + except KeyError: # pragma: no cover itime = 0 try: ipace = 500.*itime/idist - except (ZeroDivisionError,OverflowError): + except (ZeroDivisionError,OverflowError): # pragma: no cover ipace = 180. try: ispm = interval['stroke_rate'] - except KeyError: + except KeyError: # pragma: no cover ispm = 0 try: irest_time = interval['rest_time']/10. - except KeyError: + except KeyError: # pragma: no cover irest_time = 0 try: iavghr = interval['heart_rate']['average'] - except KeyError: + except KeyError: # pragma: no cover iavghr = 0 try: imaxhr = interval['heart_rate']['average'] - except KeyError: + except KeyError: # pragma: no cover imaxhr = 0 # create interval values iarr = [idist,'meters','work'] resarr = [itime] - if timebased: + if timebased: # pragma: no cover iarr = [itime,'seconds','work'] resarr = [idist] @@ -268,9 +268,9 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|',workouttype='rower'): if itime != 0: ivelo = idist/itime ipower = 2.8*ivelo**(3.0) - if workouttype in ['bike','bikeerg']: + if workouttype in ['bike','bikeerg']: # pragma: no cover ipower = 2.8*(ivelo/2.)**(3.0) - else: + else: # pragma: no cover ivelo = 0 ipower = 0 @@ -340,23 +340,23 @@ def handle_strava_sync(stravatoken,workoutid,filename,name,activity_type,descrip act = client.upload_activity(f,'tcx.gz',name=name) try: res = act.wait(poll_interval=5.0, timeout=60) - except stravalib.exc.ActivityUploadFailed: + except stravalib.exc.ActivityUploadFailed: # pragma: no cover failed = True - except JSONDecodeError: + except JSONDecodeError: # pragma: no cover failed = True - except stravalib.exc.ObjectNotFound: + except stravalib.exc.ObjectNotFound: # pragma: no cover failed = True - except ActivityUploadFailed: + except ActivityUploadFailed: # pragma: no cover failed = True if not failed: try: act = client.update_activity(res.id,activity_type=activity_type, description=description,device_name='Rowsandall.com') - except TypeError: + except TypeError: # pragma: no cover act = client.update_activity(res.id,activity_type=activity_type, description=description) - except: + except: # pragma: no cover e = sys.exc_info()[0] t = time.localtime() timestamp = bytes('{t}'.format(t=time.strftime('%b-%d-%Y_%H%M', t)),'utf-8') @@ -368,7 +368,7 @@ def handle_strava_sync(stravatoken,workoutid,filename,name,activity_type,descrip result = update_workout_field_sql(workoutid,'uploadedtostrava',res.id,debug=debug) try: os.remove(filename) - except: + except: # pragma: no cover pass return 1 @@ -441,7 +441,7 @@ def handle_c2_import_stroke_data(c2token, return 0 - return 0 + return 0 # pragma: no cover def getagegrouprecord(age,sex='male',weightcategory='hwt', distance=2000,duration=None,indf=pd.DataFrame()): @@ -450,7 +450,7 @@ def getagegrouprecord(age,sex='male',weightcategory='hwt', if not duration: try: df = indf[indf['distance'] == distance] - except KeyError: + except KeyError: # pragma: no cover df = pd.DataFrame() else: duration = 60*int(duration) @@ -496,8 +496,9 @@ def polygon_to_path(polygon,debug=True): ) if debug: engine = create_engine(database_url_debug, echo=False) - else: + else: # pragma: no cover engine = create_engine(database_url, echo=False) + with engine.connect() as conn, conn.begin(): result = conn.execute(query) points = result.fetchall() @@ -517,45 +518,46 @@ def polygon_to_path(polygon,debug=True): def handle_check_race_course(self, f1,workoutid,courseid, recordid,useremail,userfirstname, - **kwargs): + **kwargs): # pragma: no cover logfile = 'courselog_{workoutid}_{courseid}.log'.format(workoutid=workoutid,courseid=courseid) - if 'debug' in kwargs: + + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False - if 'splitsecond' in kwargs: + if 'splitsecond' in kwargs: # pragma: no cover splitsecond = kwargs['splitsecond'] else: splitsecond = 0 - if 'referencespeed' in kwargs: + if 'referencespeed' in kwargs: # pragma: no cover referencespeed = kwargs['referencespeed'] else: referencespeed = 5.0 - if 'coursedistance' in kwargs: + if 'coursedistance' in kwargs: # pragma: no cover coursedistance = kwargs['coursedistance'] else: coursedistance = 0 mode = 'race' - if 'mode' in kwargs: + if 'mode' in kwargs: # pragma: no cover mode = kwargs['mode'] columns = ['time',' latitude',' longitude','cum_dist'] try: row = rdata(csvfile=f1) - except IOError: + except IOError: # pragma: no cover try: row = rdata(csvfile=f1 + '.csv') - except IOError: + except IOError: # pragma: no cover try: row = rdata(csvfile=f1 + '.gz') - except IOError: + except IOError: # pragma: no cover return 0 @@ -569,7 +571,7 @@ def handle_check_race_course(self, try: s = rowdata[' latitude'] - except KeyError: + except KeyError: # pragma: no cover return 0 rowdata.rename(columns = { @@ -593,22 +595,23 @@ def handle_check_race_course(self, # initiate database engine - if debug: + if debug: # pragma: no cover engine = create_engine(database_url_debug, echo=False) else: engine = create_engine(database_url, echo=False) + # get polygons query = "SELECT id,name FROM rowers_geopolygon WHERE course_id = {courseid} ORDER BY order_in_course ASC".format( courseid=courseid ) - with engine.connect() as conn, conn.begin(): result = conn.execute(query) polygons = result.fetchall() conn.close() + engine.dispose() paths = [] @@ -621,8 +624,12 @@ def handle_check_race_course(self, # check how many times went through start polygon try: - entrytimes,entrydistances = time_in_path(rowdata,paths[0],maxmin='max',getall=True, - name=polygons[0].name,logfile=logfile) + try: + entrytimes,entrydistances = time_in_path(rowdata,paths[0],maxmin='max',getall=True, + name=polygons[0].name,logfile=logfile) + except AttributeError: # for testing + entrytimes, entrydistances = time_in_path(rowdata,paths[0],maxmin='max',getall=True, + name='Start',logfile=logfile) with open(logfile,'ab') as f: t = time.localtime() timestamp = bytes('{t}'.format(t=time.strftime('%b-%d-%Y_%H%M', t)),'utf-8') @@ -633,7 +640,7 @@ def handle_check_race_course(self, f.write(b' ') f.write(bytes('Found {n} entrytimes'.format(n=len(entrytimes)),'utf-8')) - except InvalidTrajectoryError: + except InvalidTrajectoryError: # pragma: no cover entrytimes = [] entrydistances = [] coursecompleted = False @@ -701,7 +708,7 @@ def handle_check_race_course(self, coursemeters = records[records['coursetimeseconds'] == mintime]['coursemeters'].min() startsecond = records[records['coursetimeseconds'] == mintime]['startsecond'].min() endsecond = records[records['coursetimeseconds'] == mintime]['endsecond'].min() - else: + else: # pragma: no cover coursecompleted = False points = 0 @@ -732,6 +739,7 @@ def handle_check_race_course(self, ) + with engine.connect() as conn, conn.begin(): result = conn.execute(query) @@ -742,7 +750,7 @@ def handle_check_race_course(self, return 1 - else: + else: # pragma: no cover query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 0, duration = "{duration}", distance = {distance}, workoutid = {workoutid}, startsecond = {startsecond}, endsecond = {endsecond}, points={points} WHERE id={recordid}'.format( recordid=recordid, duration=totaltime_sec_to_string(0), @@ -788,12 +796,11 @@ def handle_check_race_course(self, handle_sendemail_coursefail( useremail,userfirstname,logfile ) - os.remove(logfile) return 2 - return 0 + return 0 # pragma: no cover @app.task(bind=True) @@ -805,7 +812,7 @@ def handle_getagegrouprecords(self, wcdurations = [] wcpower = [] - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False @@ -813,7 +820,7 @@ def handle_getagegrouprecords(self, df = pd.read_json(df) - if sex == 'not specified': + if sex == 'not specified': # pragma: no cover return 0 for distance in distances: @@ -829,7 +836,7 @@ def handle_getagegrouprecords(self, duration = distance/velo wcdurations.append(duration) wcpower.append(worldclasspower) - except ZeroDivisionError: + except ZeroDivisionError: # pragma: no cover pass @@ -847,7 +854,7 @@ def handle_getagegrouprecords(self, distance = int(60*duration*velo) wcdurations.append(60.*duration) wcpower.append(worldclasspower) - except ValueError: + except ValueError: # pragma: no cover pass update_agegroup_db(age,sex,weightcategory,wcdurations,wcpower, @@ -868,7 +875,7 @@ def handle_get_garmin_file(client_id, regex = '.*\?id=(\d+)' - try: + try: # pragma: no cover m = re.compile(regex).match(url).group(1) garminid = int(m) except AttributeError: @@ -912,14 +919,14 @@ def handle_get_garmin_file(client_id, return 1 @app.task(bind=True) -def long_test_task(self,aantal,debug=False,job=None,session_key=None): +def long_test_task(self,aantal,debug=False,job=None,session_key=None): # pragma: no cover job = self.request return longtask.longtask(aantal,jobid=job.id,debug=debug, session_key=session_key) @app.task(bind=True) -def long_test_task2(self,aantal,**kwargs): +def long_test_task2(self,aantal,**kwargs): # pragma: no cover #debug=False,job=None,jobid='aap'): job = self.request job_id = job.id @@ -942,7 +949,7 @@ def long_test_task2(self,aantal,**kwargs): def handle_update_empower(self, useremail, workoutdicts, - debug=False, **kwargs): + debug=False, **kwargs): # pragma: no cover job = self.request job_id = job.id @@ -1029,7 +1036,7 @@ def handle_calctrimp(id, hrmax, hrmin, debug=False, **kwargs): - if debug: + if debug: # pragma: no cover engine = create_engine(database_url_debug, echo=False) else: engine = create_engine(database_url, echo=False) @@ -1044,11 +1051,11 @@ def handle_calctrimp(id, # check what the real file name is if os.path.exists(csvfilename): csvfile = csvfilename - elif os.path.exists(csvfilename+'.csv'): + elif os.path.exists(csvfilename+'.csv'): # pragma: no cover csvfile = csvfilename+'.csv' - elif os.path.exists(csvfilename+'.gz'): + elif os.path.exists(csvfilename+'.gz'): # pragma: no cover csvfile = csvfilename+'.gz' - else: + else: # pragma: no cover return 0 csvfile = os.path.abspath(csvfile) @@ -1061,7 +1068,7 @@ def handle_calctrimp(id, ) as channel: try: grpc.channel_ready_future(channel).result(timeout=10) - except grpc.FutureTimeoutError: + except grpc.FutureTimeoutError: # pragma: no cover return 0 stub = metrics_pb2_grpc.MetricsStub(channel) @@ -1075,7 +1082,7 @@ def handle_calctrimp(id, ) try: response = stub.CalcMetrics(req,timeout=60) - except: + except: # pragma: no cover return 0 tss = response.tss @@ -1085,40 +1092,40 @@ def handle_calctrimp(id, normw = response.normw hrtss = response.hrtss - if np.isnan(tss): + if np.isnan(tss): # pragma: no cover tss = 0 - if np.isnan(normp): + if np.isnan(normp): # pragma: no cover normp = 0 - if np.isnan(trimp): + if np.isnan(trimp): # pragma: no cover trimp = 0 - if np.isnan(normv): + if np.isnan(normv): # pragma: no cover normv = 0 - if np.isnan(normw): + if np.isnan(normw): # pragma: no cover normw = 0 - if np.isnan(hrtss): + if np.isnan(hrtss): # pragma: no cover hrtss = 0 - if tss > 1000: + if tss > 1000: # pragma: no cover tss = 0 - if trimp > 1000: + if trimp > 1000: # pragma: no cover trimp = 0 - if normp > 2000: + if normp > 2000: # pragma: no cover normp = 0 - if normv > 2000: + if normv > 2000: # pragma: no cover normv = 0 - if normw > 10000: + if normw > 10000: # pragma: no cover normw = 0 - if hrtss > 1000: + if hrtss > 1000: # pragma: no cover hrtss = 0 @@ -1146,7 +1153,7 @@ def handle_updatedps(useremail, workoutids, debug=False,**kwargs): havedata = 1 try: rowdata = rdata(csvfile=f1) - except IOError: + except IOError: # pragma: no cover try: rowdata = rdata(csvfile=f1 + '.csv') except IOError: @@ -1166,7 +1173,7 @@ def handle_updatedps(useremail, workoutids, debug=False,**kwargs): 'Rowsandall ', [useremail]) - if 'emailbounced' in kwargs: + if 'emailbounced' in kwargs: # pragma: no cover emailbounced = kwargs['emailbounced'] else: emailbounced = False @@ -1180,11 +1187,11 @@ import math def sigdig(value, digits = 3): try: order = int(math.floor(math.log10(math.fabs(value)))) - except (ValueError,TypeError): + except (ValueError,TypeError): # pragma: no cover return value # return integers as is - if value % 1 == 0: + if value % 1 == 0: # pragma: no cover return value places = digits - order - 1 @@ -1200,12 +1207,12 @@ def sigdig(value, digits = 3): def handle_send_email_alert( useremail, userfirstname, userlastname, rowerfirstname, alertname, stats, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False - if 'othertexts' in kwargs: + if 'othertexts' in kwargs: # pragma: no cover othertexts = kwargs['othertexts'] else: othertexts = None @@ -1213,12 +1220,12 @@ def handle_send_email_alert( report = {} try: report['Percentage'] = int(stats['percentage']) - except KeyError: + except KeyError: # pragma: no cover pass try: report['Number of workouts'] = int(stats['workouts']) - except KeyError: + except KeyError: # pragma: no cover pass try: @@ -1226,18 +1233,18 @@ def handle_send_email_alert( a = stats['nr_strokes_qualifying'], b = stats['nr_strokes'] ) - except KeyError: + except KeyError: # pragma: no cover pass try: report['Median'] = sigdig(stats['median']) - except KeyError: + except KeyError: # pragma: no cover pass try: report['Median of qualifying strokes'] = sigdig(stats['median_q']) - except KeyError: + except KeyError: # pragma: no cover pass subject = "Rowsandall.com: {alertname} ({startdate} to {enddate})".format( @@ -1270,7 +1277,7 @@ def handle_send_email_alert( def handle_send_email_transaction( username, useremail, amount, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1296,7 +1303,7 @@ def handle_send_email_transaction( def handle_send_email_failed_cancel( name, email, username, id, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1326,7 +1333,7 @@ def handle_send_email_subscription_update( username, useremail, planname, recurring, price, amount, end_of_billing_period, method, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1370,7 +1377,7 @@ def handle_send_email_subscription_create( username, useremail, planname, recurring, price, amount, end_of_billing_period, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1405,7 +1412,7 @@ def handle_send_email_subscription_create( def handle_sendemail_raceregistration( useremail, username, registeredname, racename, raceid, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1434,7 +1441,7 @@ def handle_sendemail_raceregistration( def handle_sendemail_coursefail( useremail, username, logfile, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1461,7 +1468,7 @@ def handle_sendemail_coursefail( def handle_sendemail_optout( useremail, username, registeredname, racename, raceid, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1493,7 +1500,7 @@ def handle_sendemail_optout( def handle_sendemail_racesubmission( useremail, username, registeredname, racename, raceid, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1523,7 +1530,7 @@ def handle_sendemail_racesubmission( def handle_send_disqualification_email( useremail,username,reason,message, racename, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1553,7 +1560,7 @@ def handle_send_disqualification_email( def handle_send_withdraw_email( useremail,username,reason,message, racename, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = True @@ -1583,7 +1590,7 @@ def handle_send_withdraw_email( @app.task def handle_sendemail_expired(useremail,userfirstname,userlastname,expireddate, **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False @@ -1609,7 +1616,7 @@ def handle_sendemail_breakthrough(workoutid, useremail, btvalues=pd.DataFrame().to_json(), **kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False @@ -1653,7 +1660,7 @@ def handle_sendemail_hard(workoutid, useremail, btvalues=pd.DataFrame().to_json(), debug=False,**kwargs): - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False @@ -1701,7 +1708,7 @@ def handle_sendemail_userdeleted(name, email, debug=False, **kwargs): 'Rowsandall ', [fullemail]) - if 'emailbounced' in kwargs: + if 'emailbounced' in kwargs: # pragma: no cover emailbounced = kwargs['emailbounced'] else: emailbounced = False @@ -1731,10 +1738,10 @@ def handle_sendemail_unrecognized(unrecognizedfile, useremail, try: email.attach_file(unrecognizedfile) - except IOError: + except IOError: # pragma: no cover pass - if 'emailbounced' in kwargs: + if 'emailbounced' in kwargs: # pragma: no cover emailbounced = kwargs['emailbounced'] else: emailbounced = False @@ -1746,7 +1753,7 @@ def handle_sendemail_unrecognized(unrecognizedfile, useremail, # remove tcx file try: os.remove(unrecognizedfile) - except: + except: # pragma: no cover pass return 1 @@ -1844,7 +1851,7 @@ def handle_sendemailtcx(first_name, last_name, email, tcxfile,**kwargs): @app.task -def handle_zip_file(emailfrom, subject, file,**kwargs): +def handle_zip_file(emailfrom, subject, file,**kwargs): # pragma: no cover message = "... zip processing ... " try: debug = kwargs['debug'] @@ -1891,7 +1898,7 @@ def handle_sendemailsummary(first_name, last_name, email, csvfile, **kwargs): try: os.remove(csvfile) - except: + except: # pragma: no cover pass return 1 @@ -1926,13 +1933,13 @@ def handle_sendemail_ical(first_name, last_name, email, url, icsfile, **kwargs): fullemail = first_name + " " + last_name + " " + "<" + email + ">" subject = "Calendar File for your sessions from Rowsandall.com" - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False siteurl = SITE_URL - if debug: + if debug: # pragma: no cover progressurl = SITE_URL_DEV siteurl = SITE_URL_DEV @@ -1978,12 +1985,12 @@ def handle_sendemailfile(first_name, last_name, email, csvfile,**kwargs): attach_file=csvfile,**kwargs) - if 'delete' in kwargs: + if 'delete' in kwargs: # pragma: no cover dodelete = kwargs['delete'] else: dodelete = False - if dodelete: + if dodelete: # pragma: no cover try: os.remove(csvfile) except: @@ -2005,16 +2012,16 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, if 'jobkey' in kwargs: job_id = kwargs.pop('jobkey') - if 'ps' in kwargs: + if 'ps' in kwargs: # pragma: no cover ps = kwargs['ps'] else: ps = [1,1,1,1] - if 'ratio' in kwargs: + if 'ratio' in kwargs: # pragma: no cover ratio = kwargs['ratio'] else: ratio = 1.0 - if 'debug' in kwargs: + if 'debug' in kwargs: # pragma: no cover debug = kwargs['debug'] else: debug = False @@ -2029,11 +2036,11 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, # check what the real file name is if os.path.exists(f1): csvfile = f1 - elif os.path.exists(f1+'.csv'): + elif os.path.exists(f1+'.csv'): # pragma: no cover csvfile = f1+'.csv' - elif os.path.exists(f1+'.gz'): + elif os.path.exists(f1+'.gz'): # pragma: no cover csvfile = f1+'.gz' - else: + else: # pragma: no cover return 0 csvfile = os.path.abspath(csvfile) @@ -2041,7 +2048,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, # do something with boat type try: rowdata = rdata(csvfile=csvfile) - except IOError: + except IOError: # pragma: no cover try: rowdata = rdata(csvfile=csvfile) except IOError: @@ -2049,7 +2056,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, # do calculation, but do not overwrite NK Empower Power data powermeasured = False - try: + try: # pragma: no cover w = rowdata.df['wash'] if w.mean() != 0: powermeasured = True @@ -2058,7 +2065,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, progressurl = SITE_URL siteurl = SITE_URL - if debug: + if debug: # pragma: no cover progressurl = SITE_URL_DEV siteurl = SITE_URL_DEV secret = PROGRESS_CACHE_SECRET @@ -2076,7 +2083,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, ) as channel: try: grpc.channel_ready_future(channel).result(timeout=10) - except grpc.FutureTimeoutError: + except grpc.FutureTimeoutError: # pragma: no cover return 0 stub = calculator_pb2_grpc.PowerStub(channel) @@ -2092,13 +2099,13 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, boatclass = boatclass, ),timeout=1200) result = response.result - if result == 0: + if result == 0: # pragma: no cover # send failure email return 0 # do something with boat type try: rowdata = rdata(csvfile=csvfile) - except IOError: + except IOError: # pragma: no cover try: rowdata = rdata(csvfile=csvfile) except IOError: @@ -2110,7 +2117,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, ) - rowdata.df['TimeStamp (sec)'].min() try: totaltime = totaltime + rowdata.df.loc[0, ' ElapsedTime (sec)'] - except KeyError: + except KeyError: # pragma: no cover pass df = getsmallrowdata_db( ['power', 'workoutid', 'time'], ids=[workoutid], @@ -2124,7 +2131,7 @@ def handle_otwsetpower(self,f1, boattype, boatclass, coastalbrand, weightvalue, #delta,cpvalues,avgpower = datautils.getsinglecp(rowdata.df) res, btvalues, res2 = utils.isbreakthrough( delta, cpvalues, ps[0], ps[1], ps[2], ps[3], ratio) - if res: + if res: # pragma: no cover handle_sendemail_breakthrough( workoutid, email, first_name, @@ -2155,7 +2162,7 @@ def handle_updateergcp(rower_id,workoutfilenames,debug=False,**kwargs): for f1 in workoutfilenames: try: rowdata = rdata(csvfile=f1) - except IOError: + except IOError: # pragma: no cover try: rowdata = rdata(csvfile=f1 + '.csv') except IOError: @@ -2180,7 +2187,7 @@ def cp_from_workoutids(workoutids,debug=False): df = getsmallrowdata_db(columns,ids=workoutids,debug=debug) df.dropna(inplace=True,axis=0) - if df.empty: + if df.empty: # pragma: no cover # change this return 0,0,0 @@ -2197,12 +2204,12 @@ def cp_from_workoutids(workoutids,debug=False): df = pd.read_parquet(cpfile) df['workout'] = str(id) data.append(df) - except: + except: # pragma: no cover pass # ignore for now - if len(data) == 0: + if len(data) == 0: # pragma: no cover return 0,0,0 - if len(data)>1: + if len(data)>1: # pragma: no cover df = pd.concat(data,axis=0) @@ -2238,7 +2245,7 @@ def cp_from_workoutids(workoutids,debug=False): t2k = 2000./velo2k pwr2k = fitfunc(p1,t2k) velo2 = (pwr2k/2.8)**(1./3.) - if np.isnan(velo2) or velo2 <= 0: + if np.isnan(velo2) or velo2 <= 0: # pragma: no cover velo2 = 1.0 t2 = 2000./velo2 @@ -2261,7 +2268,7 @@ def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs): columns = ['power','workoutid','time'] df = getsmallrowdata_db(columns,ids=workoutids,debug=debug) - if df.empty: + if df.empty: # pragma: no cover return 0 maxt = 1.05*df['time'].max()/1000. @@ -2299,7 +2306,7 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename, hrzones=hrzones) try: row = rdata(csvfile=f2, rower=rr) - except IOError: + except IOError: # pragma: no cover row = rdata(csvfile=f2 + '.gz', rower=rr) try: @@ -2312,7 +2319,7 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename, nr_rows = len(row.df) - if (plotnr in [1, 2, 4, 5, 8, 11, 9, 12]) and (nr_rows > 1200): + if (plotnr in [1, 2, 4, 5, 8, 11, 9, 12]) and (nr_rows > 1200): # pragma: no cover bin = int(nr_rows / 1200.) df = row.df.groupby(lambda x: x / bin).mean() row.df = df @@ -2324,16 +2331,16 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename, elif (plotnr == 3): try: t += ' - Heart Rate Distribution' - except TypeError: + except TypeError: # pragma: no cover t = 'Heart Rate Distribution' fig1 = row.get_piechart(t,**kwargs) elif (plotnr == 4): - if haspower: + if haspower: # pragma: no cover fig1 = row.get_timeplot_otwempower(t,pacerange=otwrange,**kwargs) else: fig1 = row.get_timeplot_otw(t,pacerange=otwrange,**kwargs) elif (plotnr == 5): - if haspower: + if haspower: # pragma: no cover fig1 = row.get_metersplot_otwempower(t,pacerange=otwrange,**kwargs) else: fig1 = row.get_metersplot_otw(t,pacerange=otwrange,**kwargs) @@ -2350,7 +2357,7 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename, t += ' - Power Distribution' fig1 = row.get_power_piechart(t,**kwargs) - if fig1 is None: + if fig1 is None: # pragma: no cover return 0 @@ -2373,7 +2380,7 @@ def handle_sendemail_coachrequest(email,name,code,coachname, subject = 'Invitation to add {n} to your athletes'.format(n=name) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2399,7 +2406,7 @@ def handle_sendemail_coachoffer_rejected(coachemail,coachname,name, subject = '{n} has rejected your offer to be his coach on rowsandall.com'.format(n=name) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2422,7 +2429,7 @@ def handle_sendemail_coachrequest_rejected(email,coachname,name, subject = '{n} has rejected your coaching request on rowsandall.com'.format(n=coachname) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2445,7 +2452,7 @@ def handle_sendemail_coachrequest_accepted(email,coachname,name, subject = '{n} has accepted your coaching request on rowsandall.com'.format(n=coachname) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2468,7 +2475,7 @@ def handle_sendemail_coachoffer_accepted(coachemail,coachname,name, subject = '{n} has accepted your coaching offer on rowsandall.com'.format(n=name) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2491,7 +2498,7 @@ def handle_sendemail_coacheerequest(email,name,code,coachname, subject = '{n} requests coach access to your data on rowsandall.com'.format(n=coachname) from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2514,7 +2521,7 @@ def handle_sendemail_invite(email, name, code, teamname, manager, subject = 'Invitation to join team ' + teamname siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2549,16 +2556,16 @@ def handle_sendemailnewresponse(first_name, last_name, comment = u''+comment siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV sessiontype = 'workout' - if 'sessiontype' in kwargs: + if 'sessiontype' in kwargs: # pragma: no cover sessiontype=kwargs.pop('sessiontype') commentlink = '/rowers/workout/{workoutid}/comment/'.format( workoutid=encoder.encode_hex(workoutid)) - if 'commentlink' in kwargs: + if 'commentlink' in kwargs: # pragma: no cover commentlink = kwargs.pop('commentlink') d = { @@ -2604,12 +2611,12 @@ def handle_sendemailnewcomment(first_name, siteurl = SITE_URL_DEV sessiontype = 'workout' - if 'sessiontype' in kwargs: + if 'sessiontype' in kwargs: # pragma: no cover sessiontype=kwargs.pop('sessiontype') commentlink = '/rowers/workout/{workoutid}/comment/'.format( workoutid=encoder.encode_hex(workoutid)) - if 'commentlink' in kwargs: + if 'commentlink' in kwargs: # pragma: no cover commentlink = kwargs.pop('commentlink') d = { @@ -2674,7 +2681,7 @@ def handle_sendemail_request(email, name, code, teamname, requestor, id, from_email = 'Rowsandall ' siteurl = SITE_URL - if debug: + if debug: # pragma: no cover siteurl = SITE_URL_DEV d = { @@ -2823,7 +2830,7 @@ def handle_setcp(strokesdf,filename,workoutid,debug=False,**kwargs): try: totaltime = strokesdf['time'].max() - except KeyError: + except KeyError: # pragma: no cover return 0 try: powermean = strokesdf['power'].mean() @@ -2848,7 +2855,7 @@ def handle_setcp(strokesdf,filename,workoutid,debug=False,**kwargs): df.to_parquet(filename,engine='fastparquet',compression='GZIP') return 1 - return 1 + return 1 # pragma: no cover @app.task def handle_sendemail_invite_accept(email, name, teamname, managername, @@ -2876,7 +2883,7 @@ def handle_sendemail_invite_accept(email, name, teamname, managername, # Another simple task for debugging purposes -def add2(x, y,debug=False,**kwargs): +def add2(x, y,debug=False,**kwargs): # pragma: no cover return x + y graphql_url = "https://rp3rowing-app.com/graphql" @@ -2982,8 +2989,7 @@ def handle_nk_async_workout(alldata,userid,nktoken,nkid,delaysec,defaulttimezone url = NK_API_LOCATION+"api/v1/sessions/strokes" response = requests.get(url,headers=headers,params=params) - - if response.status_code != 200: + if response.status_code != 200: # pragma: no cover # error handling and logging return 0 @@ -3005,7 +3011,7 @@ def handle_nk_async_workout(alldata,userid,nktoken,nkid,delaysec,defaulttimezone workoutid,error = add_workout_from_data(userid,nkid,data,df) - if debug: + if debug: # pragma: no cover engine = create_engine(database_url_debug, echo=False) else: engine = create_engine(database_url, echo=False) @@ -3026,7 +3032,7 @@ def handle_nk_async_workout(alldata,userid,nktoken,nkid,delaysec,defaulttimezone with open('nkblocked.json','r') as nkblocked: jsondata = json.load(nkblocked) parkedids = jsondata['ids'] - except FileNotFoundError: + except FileNotFoundError: # pragma: no cover pass newparkedids = [id for id in parkedids if id != newnkid] diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index c479a40c..563c5477 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -165,6 +165,70 @@ def mocked_sqlalchemy(*args, **kwargs): return MockEngine() +from rowers import courses + +def mocked_sqlalchemy_courses(*args, **kwargs): + # return object with method + cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml') + course = cs[0] + cname = course['name'] + cnotes = course['description'] + polygons = course['polygons'] + + lijst = [] + i=0 + for polygon in polygons: + lijst.append((i,polygon['name'])) + i = i+1 + + puntenlijst = [] + i = 0 + for p in polygons[0]['points']: + puntenlijst.append((i,p['latitude'],p['longitude'])) + i = i+1 + + + class MockEngine: + def connect(self): + return MockConnection() + + def dispose(self): + return True + + def raw_connection(self): + return True + + class QueryResultPolygons: + def fetchall(self): + return lijst + + class QueryResultPoints: + def fetchall(self): + return puntenlijst + + class MockConnection: + def begin(self): + return True + + def execute(self,query): + if 'latitude' in query: + return QueryResultPoints() + if 'polygon' in query: + return QueryResultPolygons() + return True + + def close(self): + return True + + def __exit__(self, *args, **kwargs): + return True + + def __enter__(self, *args, **kwargs): + return True + + return MockEngine() + + #@pytest.mark.django_db class DjangoTestCase(TestCase): #, MockTestCase): def _pre_setup(self): @@ -801,6 +865,7 @@ def mocked_requests(*args, **kwargs): nkstrokesregex = '.*?nkrowlink\.com\/api\/v1\/sessions\/strokes' nkstrokestester = re.compile(nkstrokesregex) + stravaathleteregex = '.*?strava\.com\/api\/v3\/athlete$' stravaathletetester = re.compile(stravaathleteregex) @@ -967,7 +1032,6 @@ def mocked_requests(*args, **kwargs): if nktester.match(args[0]): - if 'token' in args[0]: json_data = { 'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq', @@ -977,6 +1041,7 @@ def mocked_requests(*args, **kwargs): return MockResponse(json_data,200) if nkstrokestester.match(args[0]): params = kwargs.pop('params',{}) + if 'sessionIds' in params and params['sessionIds'] == '404': return MockResponse(nkimpellerstrokedata, 200) return MockResponse(nkstrokedata,200) diff --git a/rowers/tests/test_async_tasks.py b/rowers/tests/test_async_tasks.py index 172d2fe1..ee39dbb8 100644 --- a/rowers/tests/test_async_tasks.py +++ b/rowers/tests/test_async_tasks.py @@ -10,6 +10,8 @@ import pandas as pd nu = datetime.datetime.now() from rowers import tasks +import rowers.courses as courses + class fakejob: def __init__(self): @@ -53,6 +55,15 @@ class AsyncTaskTests(TestCase): workouttype = 'water', ) + cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml') + course = cs[0] + cname = course['name'] + cnotes = course['description'] + polygons = course['polygons'] + self.ThyroBaantje = courses.createcourse(self.r,cname,polygons,notes=cnotes) + self.ThyroBaantje.save() + + def tearDown(self): for workout in self.user_workouts: try: @@ -68,6 +79,13 @@ class AsyncTaskTests(TestCase): except: pass + def test_polygons(self): + polygons = GeoPolygon.objects.all() + polygon = polygons[0] + obj = (polygon.id,polygon.name) + path = tasks.polygon_to_path(obj) + self.assertEqual(len(path),4) + def test_summaryfromsplitdata(self): splitdata = [ { diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index f0a85235..6a42f1a4 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -432,24 +432,20 @@ class NKObjects(DjangoTestCase): self.assertEqual(response.status_code,200) - @patch('rowers.nkimportutils.requests.session', side_effect=mocked_session) - @patch('rowers.tasks.requests.get', side_effects=mocked_requests) - def test_handle_nk_get_workouts(self, mocked_session, mock_get): + @patch('rowers.tasks.requests.get', side_effect=mocked_requests) + def test_handle_nk_get_workouts(self, mock_get): with open('rowers/tests/testdata/nk_list.json','r') as f: data = json.load(f) - with open('rowers/tests/testdata/nk_strokes.json','r') as f: - strokeData = json.load(f) alldata = {} for item in data: alldata[item['id']] = item - result = rowers.nkstuff.rower_nk_token_refresh(self.u) - res = tasks.handle_nk_async_workout( alldata,self.r.user.id,self.r.nktoken,469,0,'UTC' ) + self.assertTrue(res>0) @patch('rowers.nkstuff.requests.get', side_effect=mocked_requests) @@ -570,21 +566,6 @@ class StravaObjects(DjangoTestCase): ) -# @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) -# @patch('rowers.views.stravastuff.handle_stravaexport') - #@patch('rowers.dataprep.getsmallrowdata_db') - #def test_strava_upload(self, mock_post,MockStravalibClient, - # mocked_getsmallrowdata_db): - # def test_strava_upload(self,mock_post, mocked_stravaexport): - # response = self.c.get('/rowers/workout/1/stravauploadw/') - - # self.assertRedirects(response, - # expected_url = '/rowers/workout/1/edit/', - # status_code=302,target_status_code=200) - - # self.assertEqual(response.url, '/rowers/workout/1/edit/') - # self.assertEqual(response.status_code, 302) - @patch('rowers.stravastuff.requests.get', side_effect=mocked_requests) @patch('rowers.stravastuff.requests.post', side_effect=mocked_requests) def test_strava_list(self, mock_get, mockpost): diff --git a/rowers/tests/test_races.py b/rowers/tests/test_races.py index 6f31a102..c89fc888 100644 --- a/rowers/tests/test_races.py +++ b/rowers/tests/test_races.py @@ -729,6 +729,20 @@ class ChallengesTest(TestCase): self.assertEqual(response.status_code, 200) + @patch('rowers.tasks.create_engine', side_effect=mocked_sqlalchemy_courses) + def notest_virtualevent_check_view(self,mocked_sqlalchemy_courses): + + res = tasks.handle_check_race_course( + self.wthyro.csvfilename, + self.wthyro.id, + self.ThyroBaantje.id, + self.result.id, + self.wthyro.user.user.email, + self.wthyro.user.user.first_name, + mode='coursetest', + ) + + self.assertEqual(res,1) # add boat diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 8f2a820b..9486d1a5 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4978,7 +4978,7 @@ def workout_upload_view(request, }, raceid=0): - is_ajax = request_is_ajax + is_ajax = request_is_ajax(request) if settings.TESTING: is_ajax = False