diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 9b52d54c..43af9582 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -327,6 +327,80 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', return (w.id,message) +def handle_nonpainsled(f2,fileformat,summary=''): + # handle RowPro: + if (fileformat == 'rp'): + row = RowProParser(f2) + # handle TCX + if (fileformat == 'tcx'): + row = TCXParser(f2) + + # handle Mystery + if (fileformat == 'mystery'): + row = MysteryParser(f2) + + # handle TCX no HR + if (fileformat == 'tcxnohr'): + row = TCXParserNoHR(f2) + + # handle RowPerfect + if (fileformat == 'rowperfect3'): + row = RowPerfectParser(f2) + + # handle ErgData + if (fileformat == 'ergdata'): + row = ErgDataParser(f2) + + # handle Mike + if (fileformat == 'bcmike'): + row = BoatCoachAdvancedParser(f2) + + # handle BoatCoach + if (fileformat == 'boatcoach'): + row = BoatCoachParser(f2) + + # handle painsled desktop + if (fileformat == 'painsleddesktop'): + row = painsledDesktopParser(f2) + + # handle speed coach GPS + if (fileformat == 'speedcoach'): + row = speedcoachParser(f2) + + # handle speed coach GPS 2 + if (fileformat == 'speedcoach2'): + row = SpeedCoach2Parser(f2) + try: + summary = row.allstats() + except: + pass + + + # handle ErgStick + if (fileformat == 'ergstick'): + row = ErgStickParser(f2) + + # handle FIT + if (fileformat == 'fit'): + row = FITParser(f2) + s = fitsummarydata(f2) + s.setsummary() + summary = s.summarytext + + + f_to_be_deleted = f2 + # should delete file + f2 = f2[:-4]+'o.csv' + row.write_csv(f2,gzip=True) + + #os.remove(f2) + try: + os.remove(f_to_be_deleted) + except: + os.remove(f_to_be_deleted+'.gz') + + return (f2,summary) + # Create new workout from file and store it in the database # This routine should be used everywhere in views.py and mailprocessing.py # Currently there is code duplication @@ -375,76 +449,7 @@ def new_workout_from_file(r,f2, # handle non-Painsled by converting it to painsled compatible CSV if (fileformat != 'csv'): - # handle RowPro: - if (fileformat == 'rp'): - row = RowProParser(f2) - # handle TCX - if (fileformat == 'tcx'): - row = TCXParser(f2) - - # handle Mystery - if (fileformat == 'mystery'): - row = MysteryParser(f2) - - # handle TCX no HR - if (fileformat == 'tcxnohr'): - row = TCXParserNoHR(f2) - - # handle RowPerfect - if (fileformat == 'rowperfect3'): - row = RowPerfectParser(f2) - - # handle ErgData - if (fileformat == 'ergdata'): - row = ErgDataParser(f2) - - # handle Mike - if (fileformat == 'bcmike'): - row = BoatCoachAdvancedParser(f2) - - # handle BoatCoach - if (fileformat == 'boatcoach'): - row = BoatCoachParser(f2) - - # handle painsled desktop - if (fileformat == 'painsleddesktop'): - row = painsledDesktopParser(f2) - - # handle speed coach GPS - if (fileformat == 'speedcoach'): - row = speedcoachParser(f2) - - # handle speed coach GPS 2 - if (fileformat == 'speedcoach2'): - row = SpeedCoach2Parser(f2) - try: - summary = row.allstats() - except: - pass - - - # handle ErgStick - if (fileformat == 'ergstick'): - row = ErgStickParser(f2) - - # handle FIT - if (fileformat == 'fit'): - row = FITParser(f2) - s = fitsummarydata(f2) - s.setsummary() - summary = s.summarytext - - - f_to_be_deleted = f2 - # should delete file - f2 = f2[:-4]+'o.csv' - row.write_csv(f2,gzip=True) - - #os.remove(f2) - try: - os.remove(f_to_be_deleted) - except: - os.remove(f_to_be_deleted+'.gz') + f2,summary = handle_nonpainsled(f2,fileformat,summary=summary) dosummary = (fileformat != 'fit') diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py index 19338906..592a8dfe 100644 --- a/rowers/mailprocessing.py +++ b/rowers/mailprocessing.py @@ -159,15 +159,19 @@ def processattachments_debug(): # Need to move the code to a subroutine used both in views.py and here def make_new_workout_from_email(rr,f2,name,cntr=0): workouttype = 'rower' - f2 = f2.name - fileformat = get_file_type('media/'+f2) + + try: + f2 = f2.name + fileformat = get_file_type('media/'+f2) + except IOError: + f2 = f2.name+'.gz' + fileformat = get_file_type('media/'+f2) if len(fileformat)==3 and fileformat[0]=='zip': f_to_be_deleted = f2 with zipfile.ZipFile('media/'+f2) as z: f2 = z.extract(z.namelist()[0],path='media/')[6:] fileformat = fileformat[2] - print f2 if fileformat == 'unknown': if settings.DEBUG: @@ -182,64 +186,13 @@ def make_new_workout_from_email(rr,f2,name,cntr=0): summary = '' # handle non-Painsled - if (fileformat != 'csv'): - # handle RowPro: - if (fileformat == 'rp'): - row = RowProParser('media/'+f2) - - # handle TCX - if (fileformat == 'tcx'): - row = TCXParser('media/'+f2) - - # handle Mystery - if (fileformat == 'mystery'): - row = MysteryParser('media/'+f2) - - # handle TCX no HR - if (fileformat == 'tcxnohr'): - row = TCXParserNoHR('media/'+f2) - - # handle ErgData - if (fileformat == 'ergdata'): - row = ErgDataParser('media/'+f2) - - # handle BoatCoach - if (fileformat == 'boatcoach'): - row = BoatCoachParser('media/'+f2) - - # handle painsled desktop - if (fileformat == 'painsleddesktop'): - row = painsledDesktopParser('media/'+f2) - - # handle speed coach GPS - if (fileformat == 'speedcoach'): - row = speedcoachParser('media/'+f2) - - # handle speed coach GPS 2 - if (fileformat == 'speedcoach2'): - row = SpeedCoach2Parser('media/'+f2) - - # handle ErgStick - if (fileformat == 'ergstick'): - row = ErgStickParser('media/'+f2) - - # handle FIT - if (fileformat == 'fit'): - row = FITParser('media/'+f2) - s = fitsummarydata('media/'+f2) - s.setsummary() - summary = s.summarytext - - timestr = time.strftime("%Y%m%d-%H%M%S") - filename = timestr+str(cntr)+'o.csv' - row.write_csv('media/'+filename,gzip=True) - f2 = filename + f3,summary = dataprep.handle_nonpainsled('media/'+f2,fileformat,summary) # make workout and put in database #r = rrower(hrmax=rr.max,hrut2=rr.ut2, # hrut1=rr.ut1,hrat=rr.at, # hrtr=rr.tr,hran=rr.an,ftp=r.ftp) - row = rdata('media/'+f2) #,rower=r) + row = rdata(f3) #,rower=r) if row == 0: return 0 @@ -248,83 +201,21 @@ def make_new_workout_from_email(rr,f2,name,cntr=0): timestr = time.strftime("%Y%m%d-%H%M%S") f2 = 'media/'+timestr+str(cntr)+'o.csv' - # auto smoothing - pace = row.df[' Stroke500mPace (sec/500m)'].values - velo = 500./pace - - f = row.df['TimeStamp (sec)'].diff().mean() - windowsize = 2*(int(10./(f)))+1 - - if not 'originalvelo' in row.df: - row.df['originalvelo'] = velo - - if windowsize > 3: - velo2 = savgol_filter(velo,windowsize,3) - else: - velo2 = velo - - pace2 = 500./abs(velo2) - row.df[' Stroke500mPace (sec/500m)'] = pace2 - - row.df = row.df.fillna(0) row.write_csv(f2,gzip=True) + dosummary = (fileformat != 'fit') - # recalculate power data - if workouttype == 'rower' or workouttype == 'dynamic' or workouttype == 'slides': - try: - row.erg_recalculatepower() - # row.spm_fromtimestamps() - row.write_csv(f2,gzip=True) - except: - pass - - if fileformat != 'fit': - summary = row.summary() - summary += '\n' - summary += row.intervalstats_painsled() - - averagehr = row.df[' HRCur (bpm)'].mean() - maxhr = row.df[' HRCur (bpm)'].max() - - totaldist = row.df['cum_dist'].max() - totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() - totaltime = totaltime+row.df.ix[0,' ElapsedTime (sec)'] - - - hours = int(totaltime/3600.) - minutes = int((totaltime - 3600.*hours)/60.) - seconds = int(totaltime - 3600.*hours - 60.*minutes) - tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) - - - duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) - - workoutdate = row.rowdatetime.strftime('%Y-%m-%d') - workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') - - notes = 'imported through email' if name == '': name = 'imported through email' - w = Workout(user=rr,name=name,date=workoutdate, - workouttype=workouttype, - duration=duration,distance=totaldist, - weightcategory=rr.weightcategory, - starttime=workoutstarttime, - csvfilename=f2,notes=notes,summary=summary, - maxhr=maxhr,averagehr=averagehr, - startdatetime=row.rowdatetime) + id,message = dataprep.save_workout_database(f2,rr, + workouttype=workouttype, + dosummary=dosummary, + title=name, + notes='imported through email') - w.save() - # put stroke data in database - res = dataprep.dataprep(row.df,id=w.id, - bands=True,barchart=True, - otwpower=True,empower=True) - - - return w.id + return id diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index b92692bb..6aab0eab 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -22,10 +22,7 @@ from rowsandall_app.settings import BASE_DIR from rowingdata import rower as rrower from rowingdata import main as rmain from rowingdata import rowingdata as rrdata -from rowingdata import TCXParser,RowProParser,ErgDataParser,TCXParserNoHR -from rowingdata import MysteryParser -from rowingdata import painsledDesktopParser,speedcoachParser,ErgStickParser -from rowingdata import SpeedCoach2Parser,FITParser,fitsummarydata + from rowingdata import make_cumvalues from rowingdata import summarydata,get_file_type