diff --git a/rowers/models.py b/rowers/models.py index dde7ad1b..1e038f9a 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -881,11 +881,17 @@ class Rower(models.Model): ep3 = models.FloatField(default=1.0,verbose_name="erg CP p4") ecpratio = models.FloatField(default=1.0,verbose_name="erg CP fit ratio") - cprange = models.IntegerField(default=42,verbose_name="Range for calculation breakthrough workouts and fitness (CP)", + cprange = models.IntegerField(default=42,verbose_name="Range for calculation of breakthrough workouts and fitness (CP)", choices=cppresets) otwslack = models.IntegerField(default=0,verbose_name="OTW Power slack") + # performance manager stuff + kfit = models.IntegerField(default=42,verbose_name='Fitness Time Decay Constant (days)') + kfatigue = models.IntegerField(default=7,verbose_name='Fatigue Time Decay Constant (days)') + showfit = models.BooleanField(default=False) + showfresh = models.BooleanField(default=False) + pw_ut2 = models.IntegerField(default=124,verbose_name="UT2 Power") pw_ut1 = models.IntegerField(default=171,verbose_name="UT1 Power") pw_at = models.IntegerField(default=203,verbose_name="AT Power") @@ -2958,12 +2964,6 @@ class Workout(models.Model): inboard = models.FloatField(default=0.88) oarlength = models.FloatField(default=2.89) - # performance manager stuff - kfit = models.IntegerField(default=42) - kfatigue = models.IntegerField(default=7) - showfit = models.BooleanField(default=False) - showfresh = models.BooleanField(default=False) - notes = models.CharField(blank=True,null=True,max_length=1000) summary = models.TextField(blank=True) privacy = models.CharField(default='visible',max_length=30, @@ -3623,7 +3623,7 @@ class RowerPowerForm(ModelForm): class RowerCPForm(ModelForm): class Meta: model = Rower - fields = ['cprange'] + fields = ['cprange','kfit','kfatigue'] # Form to set rower's Power zones, including test routines # to enable consistency diff --git a/rowers/templates/performancemanager.html b/rowers/templates/performancemanager.html index 726bc460..b5a14fab 100644 --- a/rowers/templates/performancemanager.html +++ b/rowers/templates/performancemanager.html @@ -28,7 +28,7 @@ console.log(data); // var parsedJSON = $.parseJSON(data); // $("#id_script").replaceWith('
'+data.script+''); - $("#id_chart").replaceWith('
'+data.div+'/d'+'iv>'); + $("#id_chart").replaceWith('
'+data.div+''); console.log('done'); } }); @@ -109,6 +109,12 @@ on the left. The model balances out after a few weeks of regular training, so don't make this chart shorter than a few months.

+

+ The time constants used in generating this performance chart were + a fitness decay constant of {{ rower.kfit }} days + and a fatigue decay constant of {{ rower.kfatigue }} days. + You can change these values in your Profile Settings. +

diff --git a/rowers/templates/rower_preferences.html b/rowers/templates/rower_preferences.html index d15b1e69..434336f4 100644 --- a/rowers/templates/rower_preferences.html +++ b/rowers/templates/rower_preferences.html @@ -99,11 +99,14 @@
  • -

    Range over which Critical Power rolling data (fitness) are calculated

    -

    Use this form to change the number of weeks over which Rowsandall - keeps track of your Critical Power.

    -

    A shorter range will give you notifications of fitness improvements more often, - but will also quickly forget those breakthrough workouts.

    +

    Fitness and Performance Manager Settings

    +

    Use this form to change the parameters affecting your performance management.

    +

    A shorter range for the CP calculations + will give you notifications of fitness improvements more often, + but will also quickly forget those breakthrough workouts. Shorter decay + time constants for the performance manager will model a quicker building up +of fitness and a faster recovery. Recommended values are 42 days (fitness) +and 7 days (fatigue).

    {{ cpform.as_table }}
    diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 64c86fb3..23ebbf00 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -1555,14 +1555,14 @@ def performancemanager_view(request,userid=0,mode='rower', therower = getrequestrower(request,userid=userid) theuser = therower.user - kfitness = 42 - kfatigue = 7 + kfitness = therower.kfit + kfatigue = therower.kfatigue fitnesstest = 20 metricchoice = 'trimp' modelchoice = 'tsb' usefitscore = False - doform = False - dofatigue = False + doform = therower.showfresh + dofatigue = therower.showfit if request.method == 'POST': form = PerformanceManagerForm(request.POST) @@ -1572,6 +1572,9 @@ def performancemanager_view(request,userid=0,mode='rower', metricchoice = form.cleaned_data['metricchoice'] dofatigue = form.cleaned_data['dofatigue'] doform = form.cleaned_data['doform'] + therower.showfresh = doform + therower.showfatigue = dofatigue + therower.save() else: form = PerformanceManagerForm() @@ -1600,7 +1603,7 @@ def performancemanager_view(request,userid=0,mode='rower', 'script':script, 'div':thediv, }) - + return(HttpResponse(response,content_type='application/json')) diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index afa15a28..51d2fc4c 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -570,9 +570,13 @@ def rower_prefs_view(request,userid=0,message=""): if cpform.is_valid(): cd = cpform.cleaned_data cprange = cd['cprange'] + kfit = cd['kfit'] + kfatigue = cd['kfatigue'] r.cprange = cprange + r.kfit = kfit + r.kfatigue = kfatigue r.save() - messages.info(request,'Updated CP range value') + messages.info(request,'Updated CP range and time decay constants') success = dataprep.update_rolling_cp(r,mytypes.otwtypes,'water') success = dataprep.update_rolling_cp(r,mytypes.otetypes,'erg')