diff --git a/rowers/models.py b/rowers/models.py index fb346d1c..da30197d 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -8,6 +8,7 @@ from django.dispatch import receiver from django.forms.widgets import SplitDateTimeWidget from django.forms.formsets import BaseFormSet from datetimewidget.widgets import DateTimeWidget +from django.core.validators import validate_email import os import twitter @@ -85,6 +86,8 @@ class Rower(models.Model): ('lwt','light-weight'), ) user = models.OneToOneField(User) + + # Heart Rate Zone data max = models.IntegerField(default=192,verbose_name="Max Heart Rate") rest = models.IntegerField(default=48,verbose_name="Resting Heart Rate") ut2 = models.IntegerField(default=105,verbose_name="UT2 band lower HR") @@ -92,10 +95,13 @@ class Rower(models.Model): at = models.IntegerField(default=160,verbose_name="AT band lower HR") tr = models.IntegerField(default=167,verbose_name="TR band lower HR") an = models.IntegerField(default=180,verbose_name="AN band lower HR") + + # Weight Category (for sync to C2) weightcategory = models.CharField(default="hwt", max_length=30, choices=weightcategories) + # Power Zone Data ftp = models.IntegerField(default=226,verbose_name="Functional Threshold Power") pw_ut2 = models.IntegerField(default=124,verbose_name="UT2 Power") @@ -111,6 +117,7 @@ class Rower(models.Model): 'Pwr TR', 'Pwr AN']) + # Access tokens c2token = models.CharField(default='',max_length=200,blank=True,null=True) tokenexpirydate = models.DateTimeField(blank=True,null=True) c2refreshtoken = models.CharField(default='',max_length=200,blank=True,null=True) @@ -120,13 +127,19 @@ class Rower(models.Model): blank=True,null=True) stravatoken = models.CharField(default='',max_length=200,blank=True,null=True) + # Plan plans = ( ('basic','basic'), ('pro','pro'), ('coach','coach') ) + rowerplan = models.CharField(default='basic',max_length=30, choices=plans) + + planexpires = models.DateField(default=timezone.now()) + + # Friends/Team friends = models.ManyToManyField("self",blank=True) team = models.ForeignKey(Team,blank=True,null=True) @@ -541,13 +554,28 @@ class RowerPowerZonesForm(ModelForm): raise forms.ValidationError(e) return cleaned_data - + +# Form to set rower's Email and Weight category +class AccountRowerForm(ModelForm): + class Meta: + model = Rower + fields = ['weightcategory'] + +class UserForm(ModelForm): + class Meta: + model = User + fields = ['first_name','last_name','email'] + + + def clean(self): + cleaned_data = super(UserForm, self).clean() + # Form to set rower's Heart Rate zones, including test routines # to enable consistency class RowerForm(ModelForm): class Meta: model = Rower - fields = ['rest','ut2','ut1','at','tr','an','max','weightcategory'] + fields = ['rest','ut2','ut1','at','tr','an','max'] def clean_rest(self): diff --git a/rowers/templates/rower_form.html b/rowers/templates/rower_form.html index 394fe493..90c920e6 100644 --- a/rowers/templates/rower_form.html +++ b/rowers/templates/rower_form.html @@ -3,13 +3,14 @@ {% block title %}Change Rower {% endblock %} {% block content %} -{% if form.errors %} -

- Please correct the error{{ form.errors|pluralize }} below. -

-{% endif %}
+

Heart Rate Zones

+ {% if form.errors %} +

+ Please correct the error{{ form.errors|pluralize }} below. +

+ {% endif %}
@@ -19,7 +20,34 @@
+

+

+

Account Information

+ {% if userform.errors %} +

+ Please correct the error{{ form.errors|pluralize }} below. +

+ {% endif %} + {% if accountform.errors %} +

+ +

+ {% endif %} + +
+ {{ userform.as_table }} + {{ accountform.as_table }} + + + +
Plan{{ rower.rowerplan }}
+ {% csrf_token %} +
+ + +
+

@@ -68,8 +96,9 @@ {% csrf_token %}

-
+
+

Functional Threshold Power

Use this form to quickly change your zones based on the power of a diff --git a/rowers/utils.py b/rowers/utils.py index 11c54dbd..2656e93d 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -1,6 +1,8 @@ import math import numpy as np + + def serialize_list(value,token=','): assert(isinstance(value, list) or isinstance(value, tuple) or isinstance(value,np.ndarray)) return token.join([unicode(s) for s in value]) diff --git a/rowers/views.py b/rowers/views.py index 0bae47d2..2fa5a15b 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -26,7 +26,7 @@ from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart from rowers.models import ( RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm, - RowerPowerZonesForm + RowerPowerZonesForm,AccountRowerForm,UserForm, ) from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement from django.forms.formsets import formset_factory @@ -4706,14 +4706,67 @@ def rower_edit_view(request,message=""): else: form = RowerForm(instance=r) powerform = RowerPowerForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=request.user) #powerzonesform = RowerPowerZonesForm(instance=r) message = HttpResponse("invalid form") return render(request, 'rower_form.html', - {'form':form, - 'powerform':powerform, + {'form':form, + 'powerform':powerform, 'powerzonesform':powerzonesform, + 'accountform':accountform, + 'userform':userform, 'rower':r, - }) + }) + elif request.method == 'POST' and "weightcategory" in request.POST: + accountform = AccountRowerForm(request.POST) + userform = UserForm(request.POST) + if accountform.is_valid() and userform.is_valid(): + # process + cd = accountform.cleaned_data + ucd = userform.cleaned_data + first_name = ucd['first_name'] + last_name = ucd['last_name'] + email = ucd['email'] + weightcategory = cd['weightcategory'] + u = request.user + if len(first_name): + u.first_name = first_name + u.last_name = last_name + if len(email): + u.email = email + u.save() + r = Rower.objects.get(user=u) + r.weightcategory = weightcategory + r.save() + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=u) + successmessage = 'Account Information changed' + return render(request, 'rower_form.html', + {'form':form, + 'powerzonesform':powerzonesform, + 'powerform':powerform, + 'accountform':accountform, + 'userform':userform, + 'rower':r, + 'successmessage':successmessage, + }) + else: + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + return render(request, 'rower_form.html', + {'form':form, + 'powerzonesform':powerzonesform, + 'powerform':powerform, + 'accountform':accountform, + 'userform':userform, + 'rower':r, + }) + else: try: @@ -4722,12 +4775,16 @@ def rower_edit_view(request,message=""): form = RowerForm(instance=r) powerform = RowerPowerForm(instance=r) powerzonesform = RowerPowerZonesForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=request.user) grants = AccessToken.objects.filter(user=request.user) return render(request, 'rower_form.html', { 'form':form, 'powerform':powerform, 'powerzonesform':powerzonesform, + 'userform':userform, + 'accountform':accountform, 'grants':grants, 'rower':r, })