From 921e3b1070227fb09758f612b9bd83cb398641a8 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 10 Oct 2018 22:19:46 +0200 Subject: [PATCH] user prefernces - continue urls.py line 381 --- rowers/templates/menu_profile.html | 14 +- rowers/templates/rower_form.html | 282 +++++----------------- rowers/templates/rower_preferences.html | 108 +++++++++ rowers/urls.py | 4 +- rowers/views.py | 295 +++++++++++++++++++++++- 5 files changed, 465 insertions(+), 238 deletions(-) create mode 100644 rowers/templates/rower_preferences.html diff --git a/rowers/templates/menu_profile.html b/rowers/templates/menu_profile.html index 1315e599..f4535b50 100644 --- a/rowers/templates/menu_profile.html +++ b/rowers/templates/menu_profile.html @@ -13,8 +13,18 @@
  • - -  Preferences + +  Zones + +
  • +
  • + +  Favorite Charts + +
  • +
  • + +  Manage Workflow
  • diff --git a/rowers/templates/rower_form.html b/rowers/templates/rower_form.html index 8333ccef..c5b82b61 100644 --- a/rowers/templates/rower_form.html +++ b/rowers/templates/rower_form.html @@ -1,117 +1,25 @@ -{% extends "base.html" %} +{% extends "newbase.html" %} {% load staticfiles %} {% load rowerfilters %} {% block title %}Change Rower {% endblock %} -{% block content %} -
    -
    -

    User Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}

    -

    Need help? Click to read the tutorial

    -
    - -
    +{% block main %} +

    User Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}

    + +

    Need help? Click to read the tutorial

    + +
      +
    • +

      Account Information

      -

      Heart Rate Zones

      -

      Set your heart rate zones with this form.

      - {% if form.errors %} -

      - Please correct the error{{ form.errors|pluralize }} below. + {% if rower.user == user %} + Password Change + {% else %} +   + {% endif %}

      - {% endif %} - -
      - - {{ form.as_table }} -
      - {% csrf_token %} -
      - - -

      -
      -
    -
    -

    -

    Power Zones

    -

    The power zones are defined relative to power as measured by the - indoor rower.

    -
    - {% if powerzonesform.errors %} -

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

    - {% endif %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IDZone NameLower Boundary (Watt)
    1{{ powerzonesform.ut3name }}
    2{{ powerzonesform.ut2name }}{{ powerzonesform.pw_ut2 }}
    3{{ powerzonesform.ut1name }}{{ powerzonesform.pw_ut1 }}
    4{{ powerzonesform.atname }}{{ powerzonesform.pw_at }}
    5{{ powerzonesform.trname }}{{ powerzonesform.pw_tr }}
    6{{ powerzonesform.anname }}{{ powerzonesform.pw_an }}
    - {% csrf_token %} -
    - -
    -
    -

    -
    -
    -
    -
    -

    -

    Account Information

    -
    -
    -

    - {% if rower.user == user %} - Password Change - {% else %} -   - {% endif %} -

    -
    -
    -

    - {% if userform.errors %} + {% if userform.errors %}

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

    @@ -133,137 +41,59 @@ {% csrf_token %} -
    - {% if rower.rowerplan == 'basic' and rower.user == user %} - Upgrade - {% else %} -   - {% endif %} -
    -
    - + {% if rower.rowerplan == 'basic' and rower.user == user %} + Upgrade + {% else %} +   + {% endif %} + -
    - - -

    -
    -
    + + {% if rower.user == user %} +
  • +

    GDPR - Data Protection

    -

    Functional Threshold Power and OTW Slack

    -

    Use this form to quickly change your zones based on the power of a - recent - full out 60 minutes effort on the ergometer. - It will update all zones defined above.

    -

    The OTW Power Slack is the percentage drop of your On-the-water - rowing power - vs the erg power. Typical values are around 15%. This will lower - the power zones for your OTW workouts.

    -
    - - {{ powerform.as_table }} -
    - {% csrf_token %} -
    - - -
    -
  • -
    -{% if rower.user == user %} -
    -
    -

    -

    Teams

    - + Download your data

    -
    - -

    -

    Favorite Charts

    - + Deactivate Account

    -
    -
    -
    -

    -

    Export Settings

    - + Delete Account

    -
    -
    -

    -

    Configure Workflow Layout

    - -

    -
    - - -
    - -
    -
    -

    -

    GDPR - Data Protection

    - - -
    -

    - Delete Account -

    -
    -

    -
    -
    + +
  • {% if grants %} -

    -

    Applications

    - - - - - - - - - - {% for grant in grants %} - - - - + {% endfor %} + +
    ApplicationScopeRevoke
    {{ grant.application }}{{ grant.scope }} - Revoke +

    Applications

    + + + + + + + + + + {% for grant in grants %} + + + + - - {% endfor %} - -
    ApplicationScopeRevoke
    {{ grant.application }}{{ grant.scope }} + Revoke
    -

    - {% else %} -

     

    +
    {% endif %} -
  • -
    + + {% endif %} +{% endblock %} + +{% block sidebar %} +{% include 'menu_profile.html' %} {% endblock %} diff --git a/rowers/templates/rower_preferences.html b/rowers/templates/rower_preferences.html new file mode 100644 index 00000000..74c8da4c --- /dev/null +++ b/rowers/templates/rower_preferences.html @@ -0,0 +1,108 @@ +{% extends "newbase.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block title %}Change Rower Preferences{% endblock %} + +{% block main %} +

    User Preferences for {{ rower.user.first_name }} {{ rower.user.last_name }}

    + +

    Need help? Click to read the tutorial

    + + + + + +{% endblock %} + +{% block sidebar %} +{% include 'menu_profile.html' %} +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index e88eb97e..c15018fb 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -361,6 +361,8 @@ urlpatterns = [ url(r'^me/request/$',views.manager_requests_view), url(r'^me/edit/$',views.rower_edit_view), url(r'^me/edit/user/(?P\d+)$',views.rower_edit_view), + url(r'^me/preferences/$',views.rower_prefs_view), + url(r'^me/preferences/user/(?P\d+)$',views.rower_prefs_view), url(r'^me/edit/(.+.*)/$',views.rower_edit_view), url(r'^me/c2authorize/$',views.rower_c2_authorize), url(r'^me/polarauthorize/$',views.rower_polar_authorize), @@ -375,7 +377,7 @@ urlpatterns = [ url(r'^me/tprefresh/$',views.rower_tp_token_refresh), url(r'^me/c2refresh/$',views.rower_c2_token_refresh), url(r'^me/favoritecharts/$',views.rower_favoritecharts_view), - url(r'^me/workflowconfig$',views.workout_workflow_config_view), +# url(r'^me/workflowconfig$',views.workout_workflow_config_view), url(r'^me/workflowconfig2$',views.workout_workflow_config2_view), url(r'^me/workflowdefault$',views.workflow_default_view), url(r'^email/send/$', views.sendmail), diff --git a/rowers/views.py b/rowers/views.py index 5db4a4bd..65d5860a 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -11927,7 +11927,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): r = getrequestrower(request,rowerid=rowerid,userid=userid,notpermanent=True) rowerid = r.id - + if request.method == 'POST' and "ut2" in request.POST: form = RowerForm(request.POST) if form.is_valid(): @@ -12018,7 +12018,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): messages.info(request,message) url = reverse(rower_edit_view, kwargs = { - 'rowerid':r.id, + 'userid':r.user.id, }) response = HttpResponseRedirect(url) except Rower.DoesNotExist: @@ -12202,6 +12202,288 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): except Rower.DoesNotExist: raise Http404("This user doesn't exist") +# Page where user can set his details +# Add email address to form so user can change his email address +@login_required() +def rower_prefs_view(request,rowerid=0,userid=0,message=""): + r = getrequestrower(request,rowerid=rowerid,userid=userid,notpermanent=True) + + rowerid = r.id + + if request.method == 'POST' and "ut2" in request.POST: + form = RowerForm(request.POST) + if form.is_valid(): + # something + cd = form.cleaned_data + hrmax = cd['max'] + ut2 = cd['ut2'] + ut1 = cd['ut1'] + at = cd['at'] + tr = cd['tr'] + an = cd['an'] + rest = cd['rest'] + try: + r.max = max(min(hrmax,250),10) + r.ut2 = max(min(ut2,250),10) + r.ut1 = max(min(ut1,250),10) + r.at = max(min(at,250),10) + r.tr = max(min(tr,250),10) + r.an = max(min(an,250),10) + r.rest = max(min(rest,250),10) + r.save() + successmessage = "Your Heart Rate data were changed" + messages.info(request,successmessage) + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=r.user) + return render(request, 'rower_preferences.html', + {'form':form, + 'powerzonesform':powerzonesform, + 'teams':get_my_teams(request.user), + 'powerform':powerform, + 'rower':r, + 'accountform':accountform, + 'userform':userform, + }) + except Rower.DoesNotExist: + message = "Funny. This user doesn't exist." + messages.error(request,message) + url = reverse(workouts_view) + response = HttpResponseRedirect(url) + else: + message = HttpResponse("invalid form") + #form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + userform = UserForm(instance=r.user) + accountform = AccountRowerForm(instance=r) + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'powerzonesform':powerzonesform, + 'userform':userform, + 'accountform':accountform, + 'powerform':powerform, + 'rower':r, + }) + + + + return response + elif request.method == 'POST' and "ftp" in request.POST: + powerform = RowerPowerForm(request.POST) + if powerform.is_valid(): + cd = powerform.cleaned_data + hrftp = cd['hrftp'] + if hrftp == 0: + hrftp = int((r.an+r.tr)/2.) + ftp = cd['ftp'] + otwslack = cd['otwslack'] + try: + powerfrac = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + r.ftp = max(min(ftp,650),50) + r.otwslack = max(min(otwslack,50),0) + ut2,ut1,at,tr,an = (r.ftp*powerfrac/100.).astype(int) + r.pw_ut2 = ut2 + r.pw_ut1 = ut1 + r.pw_at = at + r.pw_tr = tr + r.pw_an = an + r.hrftp = hrftp + r.save() + message = "FTP and/or OTW slack values changed." + messages.info(request,message) + url = reverse(rower_prefs_view, + kwargs = { + 'userid':r.user.id, + }) + response = HttpResponseRedirect(url) + except Rower.DoesNotExist: + message = "Funny. This user doesn't exist." + messages.error(request,message) + url = reverse(rower_edit_view) + response = HttpResponseRedirect(url) + else: + message = HttpResponse("invalid form") + form = RowerForm(instance=r) + #powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + userform = UserForm(instance=r.user) + accountform = AccountRowerForm(instance=r) + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'powerform':powerform, + 'rower':r, + 'userform':userform, + 'accountform':accountform, + }) + + + return response + elif request.method == 'POST' and "ut3name" in request.POST: + powerzonesform = RowerPowerZonesForm(request.POST) + if powerzonesform.is_valid(): + cd = powerzonesform.cleaned_data + pw_ut2 = cd['pw_ut2'] + pw_ut1 = cd['pw_ut1'] + pw_at = cd['pw_at'] + pw_tr = cd['pw_tr'] + pw_an = cd['pw_an'] + ut3name = cd['ut3name'] + ut2name = cd['ut2name'] + ut1name = cd['ut1name'] + atname = cd['atname'] + trname = cd['trname'] + anname = cd['anname'] + powerzones = [ut3name,ut2name,ut1name,atname,trname,anname] + try: + r.pw_ut2 = pw_ut2 + r.pw_ut1 = pw_ut1 + r.pw_at = pw_at + r.pw_tr = pw_tr + r.pw_an = pw_an + r.powerzones = powerzones + r.save() + successmessage = "Your Power Zone data were changed" + messages.info(request,successmessage) + form = RowerForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=r.user) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'powerzonesform':powerzonesform, + 'powerform':powerform, + 'userform':userform, + 'accountform':accountform, + 'rower':r, + }) + except Rower.DoesNotExist: + message = "Funny. This user doesn't exist." + messages.error(request,message) + url = reverse(workouts_view) + response = HttpResponseRedirect(url) + return response + else: + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=r.user) + #powerzonesform = RowerPowerZonesForm(instance=r) + message = HttpResponse("invalid form") + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + '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,instance=r.user) + 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'] + sex = cd['sex'] + defaultlandingpage = cd['defaultlandingpage'] + weightcategory = cd['weightcategory'] + birthdate = cd['birthdate'] + showfavoritechartnotes = cd['showfavoritechartnotes'] + getemailnotifications = cd['getemailnotifications'] + getimportantemails = cd['getimportantemails'] + defaulttimezone=cd['defaulttimezone'] + u = r.user + if u.email != email and len(email): + resetbounce = True + else: + resetbounce = False + if len(first_name): + u.first_name = first_name + u.last_name = last_name + if len(email): ## and check_email_freeforuse(u,email): + u.email = email + resetbounce = True + + + u.save() + r.defaulttimezone=defaulttimezone + r.weightcategory = weightcategory + r.getemailnotifications = getemailnotifications + r.getimportantemails = getimportantemails + r.defaultlandingpage = defaultlandingpage + r.showfavoritechartnotes = showfavoritechartnotes + r.sex = sex + r.birthdate = birthdate + if resetbounce and r.emailbounced: + r.emailbounced = False + 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' + messages.info(request,successmessage) + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'powerzonesform':powerzonesform, + 'powerform':powerform, + 'accountform':accountform, + 'userform':userform, + 'rower':r, + }) + else: + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + return render(request, 'rower_preferences.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'powerzonesform':powerzonesform, + 'powerform':powerform, + 'accountform':accountform, + 'userform':userform, + 'rower':r, + }) + + + else: + try: + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + powerzonesform = RowerPowerZonesForm(instance=r) + accountform = AccountRowerForm(instance=r) + userform = UserForm(instance=r.user) + grants = AccessToken.objects.filter(user=request.user) + return render(request, 'rower_preferences.html', + { + 'form':form, + 'teams':get_my_teams(request.user), + 'powerform':powerform, + 'powerzonesform':powerzonesform, + 'userform':userform, + 'accountform':accountform, + 'grants':grants, + 'rower':r, + }) + except Rower.DoesNotExist: + raise Http404("This user doesn't exist") + # Revoke an app that you granted access through the API. # this views is called when you press a button on the User edit page # the button is only there when you have granted access to an app @@ -12219,13 +12501,8 @@ def rower_revokeapp_view(request,id=0): form = RowerForm(instance=r) powerform = RowerPowerForm(instance=r) grants = AccessToken.objects.filter(user=request.user) - return render(request, 'rower_form.html', - { - 'form':form, - 'teams':get_my_teams(request.user), - 'powerform':powerform, - 'grants':grants, - }) + url = reverse(rower_edit_view) + return HttpResponseRedirect(url) except AccessToken.DoesNotExist: raise Http404("Access token doesn't exist")