diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 24869490..d5c46c6b 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -34,6 +34,7 @@ from rowingdata import ( MysteryParser, BoatCoachOTWParser,QuiskeParser, painsledDesktopParser, speedcoachParser, ErgStickParser, SpeedCoach2Parser, FITParser, fitsummarydata, + RitmoTimeParser, make_cumvalues,cumcpdata,ExcelTemplate, summarydata, get_file_type, ) @@ -1088,77 +1089,37 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', return (w.id, message) +parsers = { + 'xls': ExcelTemplate, + 'rp': RowProParser, + 'tcx':TCXParser, + 'mystery':MysteryParser, + 'ritmotime':RitmoTimeParser, + 'quiske': QuiskeParser, + 'rowperfect3': RowPerfectParser, + 'coxmate': CoxMateParser, + 'bcmike': BoatCoachAdvancedParser, + 'boatcoach': BoatCoachParser, + 'boatcoachotw': BoatCoachOTWParser, + 'painsleddesktop': painsledDesktopParser, + 'speedcoach': speedcoachParser, + 'speedcoach2': SpeedCoach2Parser, + 'ergstick': ErgStickParser, + 'fit': FITParser, + 'ergdata': ErgDataParser, + } + def parsenonpainsled(fileformat,f2,summary): - # handle RowPro: - if (fileformat == 'xls'): - row = ExcelTemplate(f2) - hasrecognized = True - - - if (fileformat == 'rp'): - row = RowProParser(f2) - hasrecognized = True - # handle TCX - if (fileformat == 'tcx'): - row = TCXParser(f2) - hasrecognized = True - - # handle Mystery - if (fileformat == 'mystery'): - row = MysteryParser(f2) + try: + row = parsers[fileformat](f2) hasrecognized = True + except KeyError: + hasrecognized = False - # handle Quiske - if (fileformat == 'quiske'): - row = QuiskeParser(f2) - hasrecognized = True - - # handle RowPerfect - if (fileformat == 'rowperfect3'): - row = RowPerfectParser(f2) - hasrecognized = True - - # handle ErgData - if (fileformat == 'ergdata'): - row = ErgDataParser(f2) - hasrecognized = True - - # handle CoxMate - if (fileformat == 'coxmate'): - row = CoxMateParser(f2) - hasrecognized = True - - # handle Mike - if (fileformat == 'bcmike'): - row = BoatCoachAdvancedParser(f2) - hasrecognized = True - - # handle BoatCoach - if (fileformat == 'boatcoach'): - row = BoatCoachParser(f2) - hasrecognized = True - - # handle BoatCoach OTW - if (fileformat == 'boatcoachotw'): - row = BoatCoachOTWParser(f2) - hasrecognized = True - - # handle painsled desktop - if (fileformat == 'painsleddesktop'): - row = painsledDesktopParser(f2) - hasrecognized = True - - # handle speed coach GPS - if (fileformat == 'speedcoach'): - row = speedcoachParser(f2) - hasrecognized = True # handle speed coach GPS 2 if (fileformat == 'speedcoach2'): - row = SpeedCoach2Parser(f2) - hasrecognized = True - oarlength, inboard = get_empower_rigging(f2) empowerfirmware = get_empower_firmware(f2) if empowerfirmware != '': @@ -1168,15 +1129,8 @@ def parsenonpainsled(fileformat,f2,summary): summary = row.allstats() - # handle ErgStick - if (fileformat == 'ergstick'): - row = ErgStickParser(f2) - hasrecognized = True - # handle FIT if (fileformat == 'fit'): - row = FITParser(f2) - hasrecognized = True try: s = fitsummarydata(f2) s.setsummary() @@ -1317,7 +1271,6 @@ def new_workout_from_file(r, f2, return (0, message, '') except Exception as e: errorstring = str(sys.exc_info()[0]) - print e.message message = 'Something went wrong: ' + e.message return (0, message, '') diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 7f59ef89..0f5e4594 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2114,7 +2114,7 @@ def interactive_streamchart(id=0,promember=0): return [script,div] -def interactive_chart(id=0,promember=0): +def interactive_chart(id=0,promember=0,intervaldata = {}): # Add hover to this comma-separated string and see what changes if (promember==1): TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair' @@ -2219,6 +2219,26 @@ def interactive_chart(id=0,promember=0): plot.add_layout(LinearAxis(y_range_name="spmax",axis_label="SPM"),'right') plot.legend.location = "bottom_right" + + + # add shaded bar chart areas + if intervaldata: + intervaldf = pd.DataFrame(intervaldata) + intervaldf['itime'] = intervaldf['itime']*1.e3 + intervaldf['time'] = intervaldf['itime'].cumsum() + intervaldf['time_r'] = intervaldf['time'] +intervaldf['itime'].shift(-1) + intervaldf['value'] = 10 + mask = intervaldf['itype'] == 3 + intervaldf.loc[mask,'value'] = 45 + intervaldf['bottom'] = 10 + + intervalsource = ColumnDataSource( + intervaldf + ) + + plot.quad(left='time',top='value',bottom='bottom', + right='time_r',source=intervalsource,color='pink', + y_range_name='spmax',fill_alpha=0.2,line_alpha=0.2) script, div = components(plot) @@ -3398,7 +3418,7 @@ def thumbnail_flex_chart(rowdata,id=0,promember=0, try: tseconds = rowdata.ix[:,'time'] except KeyError: - return '','No time data - cannot make flex plot','','' + return '','No time data - cannot make flex plot' try: diff --git a/rowers/models.py b/rowers/models.py index b2f26e18..9278e80b 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1641,12 +1641,23 @@ class VirtualRaceResult(models.Model): u1 = rr.user.first_name, u2 = rr.user.last_name, ) - return u'Entry for {n} for "{r}" in {c} {d}'.format( - n = name, - r = self.race, - d = self.boattype, - c = self.boatclass, + if self.teamname: + return u'Entry for {n} for "{r}" in {c} {d} with {t} ({s})'.format( + n = name, + r = self.race, + d = self.boattype, + c = self.boatclass, + t = self.teamname, + s = self.sex, ) + else: + return u'Entry for {n} for "{r}" in {c} {d} ({s})'.format( + n = name, + r = self.race, + d = self.boattype, + c = self.boatclass, + s = self.sex, + ) class CourseTestResult(models.Model): diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 3419f077..3a399ebe 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -164,9 +164,11 @@ {% csrf_token %} + {% localize off %} {% for key,value in formvalues.items %} {% endfor %} + {% endlocalize %} {% for field in detailform %} {{ field.as_hidden }} {% endfor %} diff --git a/rowers/views.py b/rowers/views.py index d968cae2..7948a933 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -11286,13 +11286,6 @@ def workout_summary_edit_view(request,id,message="",successmessage="" return HttpResponse("Error: CSV Data File Not Found") nrintervals = len(idist) - # create interactive plot - try: - res = interactive_chart(id,promember=1) - script = res[0] - div = res[1] - except ValueError: - pass savebutton = 'nosavebutton' formvalues = {} @@ -11305,13 +11298,21 @@ def workout_summary_edit_view(request,id,message="",successmessage="" try: avpace = datetime.timedelta(seconds=int(500./normv)) except: - avpage = datetime.timedelta(seconds=130) + avpace = datetime.timedelta(seconds=130) data = { 'power': int(normp), 'pace': avpace, - 'selector': normp, + 'selector': 'power', } + + powerorpace = 'power' + + if normp == 0: + data['selector'] = 'pace' + powerorpace = 'pace' + + powerupdateform = PowerIntervalUpdateForm(initial=data) @@ -11568,6 +11569,22 @@ def workout_summary_edit_view(request,id,message="",successmessage="" detailform = IntervalUpdateForm(aantal=nrintervals,initial=initial) + # create interactive plot + try: + intervaldata = { + 'itime':itime, + 'idist':idist, + 'itype':itype, + 'selector': powerorpace, + 'normp': normp, + 'normv': normv, + } + res = interactive_chart(id,promember=1,intervaldata=intervaldata) + script = res[0] + div = res[1] + except ValueError: + pass + # render page return render(request, 'summary_edit.html',