diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 4faf1137..dca076d2 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -162,8 +162,13 @@ def prepmultipledata(ids,verbose=False): res = list(itertools.chain.from_iterable(res.fetchall())) conn.close() engine.dispose() - - res = list(set(ids)-set(res)) + + try: + ids2 = [int(id) for id in ids] + except ValueError: + ids2 = ids + + res = list(set(ids2)-set(res)) for id in res: rowdata,row = getrowdata(id=id) if verbose: @@ -196,7 +201,8 @@ def read_cols_df_sql(ids,columns): columns = cls, ids = tuple(ids), )) - + + connection = engine.raw_connection() df = pd.read_sql_query(query,engine) engine.dispose() return df @@ -276,7 +282,7 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, if windowsize <= 3: windowsize = 5 - if windowsize > 3: + if windowsize > 3 and windowsize 3: + if windowsize > 3 and windowsize 0] @@ -880,63 +895,6 @@ def interactive_flex_chart2(id=0,promember=0, workstrokesonly=False): - axlabels = { - 'time': 'Time', - 'distance': 'Distance (m)', - 'cumdist': 'Distance (m)', - 'hr': 'Heart Rate (bpm)', - 'spm': 'Stroke Rate (spm)', - 'pace': 'Pace (/500m)', - 'power': 'Power (Watt)', - 'averageforce': 'Average Drive Force (lbs)', - 'drivelength': 'Drive Length (m)', - 'peakforce': 'Peak Drive Force (lbs)', - 'forceratio': 'Average/Peak Drive Force Ratio', - 'driveenergy': 'Work per Stroke (J)', - 'drivespeed': 'Drive Speed (m/s)', - 'slip': 'Slip (degrees)', - 'catch': 'Catch (degrees)', - 'finish': 'Finish (degrees)', - 'wash': 'Wash (degrees)', - 'peakforceangle': 'Peak Force Angle (degrees)', - 'None': '', - } - - yaxminima = { - 'hr':100, - 'spm':15, - 'pace': 1.0e3*210, - 'power': 0, - 'averageforce': 0, - 'peakforce': 0, - 'forceratio':0, - 'drivelength':0.5, - 'driveenergy': 0, - 'drivespeed': 0, - 'slip': 0, - 'catch': -70, - 'finish': 30, - 'wash': 0, - 'peakforceangle': -20, - } - - yaxmaxima = { - 'hr':200, - 'spm':45, - 'pace': 1.0e3*75, - 'power': 600, - 'averageforce':200, - 'peakforce':400, - 'forceratio':1, - 'drivelength':2.0, - 'driveenergy': 1000, - 'drivespeed':4, - 'slip': 30, - 'catch': -30, - 'finish': 70, - 'wash': 30, - 'peakforceangle': 20, - } #rowdata,row = dataprep.getrowdata_db(id=id) columns = [xparam,yparam1,yparam2, @@ -1174,6 +1132,7 @@ def interactive_flex_chart2(id=0,promember=0, var time1 = data['time'] var pace1 = data['pace'] var hr1 = data['hr'] + var fpace1 = data['fpace'] var distance1 = data['distance'] var power1 = data['power'] var xname = data['xname'][0] @@ -1195,6 +1154,7 @@ def interactive_flex_chart2(id=0,promember=0, data2['time'] = [] data2['pace'] = [] data2['hr'] = [] + data2['fpace'] = [] data2['distance'] = [] data2['power'] = [] data2['x1mean'] = [] @@ -1212,6 +1172,7 @@ def interactive_flex_chart2(id=0,promember=0, data2['y2'].push(y2[i]) data2['spm'].push(spm1[i]) data2['time'].push(time1[i]) + data2['fpace'].push(fpace1[i]) data2['pace'].push(pace1[i]) data2['hr'].push(hr1[i]) data2['distance'].push(distance1[i]) diff --git a/rowers/models.py b/rowers/models.py index be9e55c0..bce7c2c4 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -6,6 +6,7 @@ from django import forms from django.forms import ModelForm from django.dispatch import receiver from django.forms.widgets import SplitDateTimeWidget +from django.forms.formsets import BaseFormSet from datetimewidget.widgets import DateTimeWidget import os @@ -80,6 +81,120 @@ class Rower(models.Model): def __str__(self): return self.user.username +class FavoriteChart(models.Model): + y1params = ( + ('hr','Heart Rate'), + ('pace','Pace'), + ('spm','SPM'), + ('driveenergy','Work per Stroke'), + ('power','Power'), + ('drivelength','Drivelength'), + ('averageforce','Average Force'), + ('peakforce','Peak Force'), + ('forceratio','Average/Peak Force Ratio'), + ('drivespeed','Drive Speed'), + ('wash','Wash'), + ('slip','Slip'), + ('catch','Catch Angle'), + ('finish','Finish Angle'), + ('peakforceangle','Peak Force Angle') + ) + + y2params = ( + ('hr','Heart Rate'), + ('spm','SPM'), + ('driveenergy','Work per Stroke'), + ('power','Power'), + ('drivelength','Drivelength'), + ('averageforce','Average Force'), + ('peakforce','Peak Force'), + ('forceratio','Average/Peak Force Ratio'), + ('drivespeed','Drive Speed'), + ('wash','Wash'), + ('slip','Slip'), + ('catch','Catch Angle'), + ('finish','Finish Angle'), + ('peakforceangle','Peak Force Angle'), + ('None','None') + ) + + xparams = ( + ('time','Time'), + ('distance','Distance'), + ('hr','Heart Rate'), + ('spm','SPM'), + ('driveenergy','Work per Stroke'), + ('power','Power'), + ('drivelength','Drivelength'), + ('averageforce','Average Force'), + ('peakforce','Peak Force'), + ('forceratio','Average/Peak Force Ratio'), + ('drivespeed','Drive Speed'), + ('wash','Wash'), + ('slip','Slip'), + ('catch','Catch Angle'), + ('finish','Finish Angle'), + ('peakforceangle','Peak Force Angle'), + ) + + workouttypechoices = ( + ('ote','Erg/SkiErg'), + ('otw','On The Water'), + ('both','both') + ) + + plottypes = ( + ('line','Line Chart'), + ('scatter','Scatter Chart') + ) + + yparam1 = models.CharField(max_length=50,choices=y1params,verbose_name='Y1') + yparam2 = models.CharField(max_length=50,choices=y2params,verbose_name='Y2',default='None',blank=True) + xparam = models.CharField(max_length=50,choices=xparams,verbose_name='X') + plottype = models.CharField(max_length=50,choices=plottypes, + default='line', + verbose_name='Chart Type') + workouttype = models.CharField(max_length=50,choices=workouttypechoices, + default='both', + verbose_name='Workout Type') + reststrokes = models.BooleanField(default=True,verbose_name="Incl. Rest") + user = models.ForeignKey(Rower) + + +class FavoriteForm(ModelForm): + class Meta: + model = FavoriteChart + fields = ['xparam','yparam1','yparam2', + 'plottype','workouttype','reststrokes'] + +class BaseFavoriteFormSet(BaseFormSet): + def clean(self): + if any(self.errors): + return + + for form in self.forms: + if form.cleaned_data: + xparam = form.cleaned_data['xparam'] + yparam1 = form.cleaned_data['yparam1'] + yparam2 = form.cleaned_data['yparam2'] + plottype = form.cleaned_data['plottype'] + reststrokes = form.cleaned_data['reststrokes'] + + if not xparam: + raise forms.ValidationError( + 'Must have x parameter.', + code='missing_xparam' + ) + + if not yparam1: + raise forms.ValidationError( + 'Must have Y1 parameter.', + code='missing_yparam1' + ) + + if not yparam2: + yparam2 = 'None' + class Workout(models.Model): workouttypes = ( ('water','On-water'), diff --git a/rowers/templates/about_us.html b/rowers/templates/about_us.html index c7c998c7..34c64464 100644 --- a/rowers/templates/about_us.html +++ b/rowers/templates/about_us.html @@ -142,6 +142,7 @@ You will be taken to the secure PayPal payment site.