Private
Public Access
1
0

Merge branch 'release/v9.67'

This commit is contained in:
Sander Roosendaal
2019-04-06 14:46:06 +02:00
34 changed files with 3242 additions and 642 deletions
File diff suppressed because it is too large Load Diff
+15 -13
View File
@@ -3,6 +3,7 @@ apipkg==1.5
appdirs==1.4.3 appdirs==1.4.3
arcgis==1.6.0 arcgis==1.6.0
arrow==0.13.1 arrow==0.13.1
asn1crypto==0.24.0
atomicwrites==1.3.0 atomicwrites==1.3.0
attrs==19.1.0 attrs==19.1.0
backcall==0.1.0 backcall==0.1.0
@@ -24,29 +25,30 @@ cookies==2.2.1
coreapi==2.3.3 coreapi==2.3.3
coreschema==0.0.4 coreschema==0.0.4
coverage==4.5.3 coverage==4.5.3
cryptography==2.6.1
cycler==0.10.0 cycler==0.10.0
dask==1.1.4 dask==1.1.4
decorator==4.4.0 decorator==4.4.0
defusedxml==0.5.0 defusedxml==0.5.0
Django==1.9.5 Django==2.1.7
django-analytical==2.5.0 django-analytical==2.5.0
django-async-messages==0.3.1 django-async-messages==0.3.1
django-braces==1.13.0 django-braces==1.13.0
django-classy-tags==0.8.0 django-classy-tags==0.8.0
django-cookie-law==2.0.1 django-cookie-law==2.0.1
django-cors-headers==2.4.0 django-cors-headers==2.5.2
django-countries==5.3.3 django-countries==5.3.3
django-datetime-widget==0.9.3 django-datetime-widget==0.9.3
django-debug-toolbar==1.4 django-debug-toolbar==1.11
django-extensions==2.1.6 django-extensions==2.1.6
django-htmlmin==0.10.0 django-htmlmin==0.11.0
django-leaflet==0.24.0 django-leaflet==0.24.0
django-mailbox==4.7.1 django-mailbox==4.7.1
django-oauth-toolkit==0.10.0 django-oauth-toolkit==1.2.0
django-oauth2-provider==0.2.6.1 django-oauth2-provider==0.2.6.1
django-rest-framework==0.1.0 django-rest-framework==0.1.0
django-rest-swagger==2.2.0 django-rest-swagger==2.2.0
django-rq==1.3.0 django-rq==1.3.1
django-rq-dashboard==0.3.3 django-rq-dashboard==0.3.3
django-ses==0.8.10 django-ses==0.8.10
django-shell-plus==1.1.7 django-shell-plus==1.1.7
@@ -54,7 +56,7 @@ django-social-share==1.3.2
django-suit==0.2.26 django-suit==0.2.26
django-suit-rq==1.0.1 django-suit-rq==1.0.1
django-tz-detect==0.2.9 django-tz-detect==0.2.9
djangorestframework==3.5.4 djangorestframework==3.9.2
docopt==0.6.2 docopt==0.6.2
docutils==0.14 docutils==0.14
entrypoints==0.3 entrypoints==0.3
@@ -63,7 +65,6 @@ factory-boy==2.11.1
Faker==1.0.4 Faker==1.0.4
fitparse==1.1.0 fitparse==1.1.0
future==0.17.1 future==0.17.1
GDAL==2.3.3
geocoder==1.38.1 geocoder==1.38.1
holoviews==1.11.3 holoviews==1.11.3
html5lib==1.0.1 html5lib==1.0.1
@@ -75,13 +76,14 @@ idna==2.8
image==1.5.27 image==1.5.27
importlib-resources==1.0.2 importlib-resources==1.0.2
ipykernel==5.1.0 ipykernel==5.1.0
ipython==7.3.0 ipython==7.4.0
ipython-genutils==0.2.0 ipython-genutils==0.2.0
ipywidgets==7.4.2 ipywidgets==7.4.2
iso8601==0.1.12 iso8601==0.1.12
isodate==0.6.0 isodate==0.6.0
itypes==1.1.0 itypes==1.1.0
jedi==0.13.3 jedi==0.13.3
jeepney==0.4
Jinja2==2.10 Jinja2==2.10
jsonschema==3.0.1 jsonschema==3.0.1
jupyter==1.0.0 jupyter==1.0.0
@@ -89,7 +91,7 @@ jupyter-client==5.2.4
jupyter-console==6.0.0 jupyter-console==6.0.0
jupyter-core==4.4.0 jupyter-core==4.4.0
jupyterlab==0.35.4 jupyterlab==0.35.4
jupyterlab-server==0.2.0 jupyterlab-server==0.3.0
keyring==18.0.0 keyring==18.0.0
kiwisolver==1.0.1 kiwisolver==1.0.1
kombu==4.3.0 kombu==4.3.0
@@ -109,7 +111,7 @@ nose-parameterized==0.6.0
notebook==5.7.6 notebook==5.7.6
numpy==1.16.2 numpy==1.16.2
oauth2==1.9.0.post1 oauth2==1.9.0.post1
oauthlib==1.0.3 oauthlib==3.0.1
openapi-codec==1.3.2 openapi-codec==1.3.2
packaging==19.0 packaging==19.0
pandas==0.24.2 pandas==0.24.2
@@ -152,10 +154,11 @@ ratelim==0.1.6
redis==3.2.1 redis==3.2.1
requests==2.21.0 requests==2.21.0
requests-oauthlib==1.2.0 requests-oauthlib==1.2.0
rowingdata==2.2.3 rowingdata==2.2.5
rowingphysics==0.5.0 rowingphysics==0.5.0
rq==0.13.0 rq==0.13.0
scipy==1.2.1 scipy==1.2.1
SecretStorage==3.1.1
Send2Trash==1.5.0 Send2Trash==1.5.0
shell==1.0.1 shell==1.0.1
shortuuid==0.5.0 shortuuid==0.5.0
@@ -182,7 +185,6 @@ vine==1.3.0
wcwidth==0.1.7 wcwidth==0.1.7
webencodings==0.5.1 webencodings==0.5.1
widgetsnbextension==3.4.2 widgetsnbextension==3.4.2
winkerberos==0.7.0
xmltodict==0.12.0 xmltodict==0.12.0
yamjam==0.1.7 yamjam==0.1.7
yamllint==1.15.0 yamllint==1.15.0
+1 -11
View File
@@ -54,7 +54,7 @@ from rowers.models import strokedatafields
#allowedcolumns = [item[0] for item in rowingmetrics] #allowedcolumns = [item[0] for item in rowingmetrics]
allowedcolumns = [key for key,value in strokedatafields.items()] allowedcolumns = [key for key,value in strokedatafields.items()]
from async_messages import messages as a_messages #from async_messages import messages as a_messages
import os import os
import zipfile import zipfile
import pandas as pd import pandas as pd
@@ -920,12 +920,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
for key, value in checks.items(): for key, value in checks.items():
if not value: if not value:
allchecks = 0 allchecks = 0
if consistencychecks:
a_messages.error(
r.user, 'Failed consistency check: ' + key + ', autocorrected')
else:
pass
# a_messages.error(r.user,'Failed consistency check: '+key+', not corrected')
except ZeroDivisionError: except ZeroDivisionError:
pass pass
@@ -1148,9 +1142,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
# submit email task to send email about breakthrough workout # submit email task to send email about breakthrough workout
if isbreakthrough: if isbreakthrough:
a_messages.info(
r.user, 'It looks like you have a new breakthrough workout'
)
if r.getemailnotifications and not r.emailbounced: if r.getemailnotifications and not r.emailbounced:
job = myqueue(queuehigh,handle_sendemail_breakthrough, job = myqueue(queuehigh,handle_sendemail_breakthrough,
w.id, w.id,
@@ -1161,7 +1152,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
# submit email task to send email about breakthrough workout # submit email task to send email about breakthrough workout
if ishard: if ishard:
a_messages.info(r.user, 'That was a pretty hard workout')
if r.getemailnotifications and not r.emailbounced: if r.getemailnotifications and not r.emailbounced:
job = myqueue(queuehigh,handle_sendemail_hard, job = myqueue(queuehigh,handle_sendemail_hard,
w.id, w.id,
+3
View File
@@ -1007,7 +1007,10 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
f = rowdatadf['TimeStamp (sec)'].diff().mean() f = rowdatadf['TimeStamp (sec)'].diff().mean()
if f != 0: if f != 0:
try:
windowsize = 2*(int(10./(f)))+1 windowsize = 2*(int(10./(f)))+1
except ValueError:
windowsize = 1
else: else:
windowsize = 1 windowsize = 1
if windowsize <= 3: if windowsize <= 3:
+1 -1
View File
@@ -42,7 +42,7 @@ def login_required_message(function=None, message=default_message):
to the log-in page if necessary. to the log-in page if necessary.
""" """
actual_decorator = user_passes_test( actual_decorator = user_passes_test(
lambda u: u.is_authenticated(), lambda u: u.is_authenticated,
message=message, message=message,
) )
if function: if function:
+12 -6
View File
@@ -25,6 +25,12 @@ import datetime
from django.forms import formset_factory from django.forms import formset_factory
from rowers.utils import landingpages from rowers.utils import landingpages
from rowers.metrics import axes from rowers.metrics import axes
from rowers.metrics import axlabels
formaxlabels = axlabels.copy()
formaxlabels.pop('None')
parchoices = list(sorted(formaxlabels.items(), key = lambda x:x[1]))
class FlexibleDecimalField(forms.DecimalField): class FlexibleDecimalField(forms.DecimalField):
@@ -710,6 +716,12 @@ class DataFrameColumnsForm(forms.Form):
cols = forms.MultipleChoiceField(choices=colchoices, cols = forms.MultipleChoiceField(choices=colchoices,
label='Table Columns') label='Table Columns')
class HistoForm(forms.Form):
includereststrokes = forms.BooleanField(initial=False,label='Include Rest Strokes',required=False)
histoparam = forms.ChoiceField(choices=parchoices,initial='power',
label='Metric')
# form to select modality and boat type for trend flex # form to select modality and boat type for trend flex
class TrendFlexModalForm(forms.Form): class TrendFlexModalForm(forms.Form):
modality = forms.ChoiceField(choices=workouttypes, modality = forms.ChoiceField(choices=workouttypes,
@@ -797,12 +809,6 @@ class PlannedSessionMultipleCloneForm(forms.Form):
label='Planned Sessions' label='Planned Sessions'
) )
from rowers.metrics import axlabels
formaxlabels = axlabels.copy()
formaxlabels.pop('None')
parchoices = list(sorted(formaxlabels.items(), key = lambda x:x[1]))
class BoxPlotChoiceForm(forms.Form): class BoxPlotChoiceForm(forms.Form):
yparam = forms.ChoiceField(choices=parchoices,initial='spm', yparam = forms.ChoiceField(choices=parchoices,initial='spm',
+34 -9
View File
@@ -1214,12 +1214,13 @@ def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower',startdate=None,
return [script,div] return [script,div]
def interactive_histoall(theworkouts): def interactive_histoall(theworkouts,histoparam,includereststrokes):
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair'
ids = [int(w.id) for w in theworkouts] ids = [int(w.id) for w in theworkouts]
rowdata = dataprep.getsmallrowdata_db(['power'],ids=ids,doclean=True) workstrokesonly = not includereststrokes
rowdata = dataprep.getsmallrowdata_db([histoparam],ids=ids,doclean=True,workstrokesonly=workstrokesonly)
rowdata.dropna(axis=0,how='any',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True)
@@ -1227,16 +1228,16 @@ def interactive_histoall(theworkouts):
return "","No Valid Data Available","","" return "","No Valid Data Available","",""
try: try:
histopwr = rowdata['power'].values histopwr = rowdata[histoparam].values
except KeyError: except KeyError:
return "","No power data","","" return "","No data","",""
if len(histopwr) == 0: if len(histopwr) == 0:
return "","No valid data available","","" return "","No valid data available","",""
# throw out nans # throw out nans
histopwr = histopwr[~np.isinf(histopwr)] histopwr = histopwr[~np.isinf(histopwr)]
histopwr = histopwr[histopwr > 25] histopwr = histopwr[histopwr > yaxminima[histoparam]]
histopwr = histopwr[histopwr < 1000] histopwr = histopwr[histopwr < yaxmaxima[histoparam]]
plot = Figure(tools=TOOLS,plot_width=900, plot = Figure(tools=TOOLS,plot_width=900,
toolbar_sticky=False, toolbar_sticky=False,
@@ -1289,7 +1290,7 @@ def interactive_histoall(theworkouts):
# plot.quad(top='hist_norm',bottom=0,left=edges[:-1],right=edges[1:]) # plot.quad(top='hist_norm',bottom=0,left=edges[:-1],right=edges[1:])
plot.quad(top='hist_norm',bottom=0,left='left',right='right',source=source) plot.quad(top='hist_norm',bottom=0,left='left',right='right',source=source)
plot.xaxis.axis_label = "Power (W)" plot.xaxis.axis_label = axlabels[histoparam]
plot.yaxis.axis_label = "% of strokes" plot.yaxis.axis_label = "% of strokes"
plot.y_range = Range1d(0,1.05*max(hist_norm)) plot.y_range = Range1d(0,1.05*max(hist_norm))
@@ -1297,7 +1298,7 @@ def interactive_histoall(theworkouts):
hover = plot.select(dict(type=HoverTool)) hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([ hover.tooltips = OrderedDict([
('Power(W)','@left{int}'), (axlabels[histoparam],'@left{int}'),
('% of strokes','@hist_norm'), ('% of strokes','@hist_norm'),
('Cumulative %','@histsum{int}'), ('Cumulative %','@histsum{int}'),
]) ])
@@ -1311,12 +1312,36 @@ def interactive_histoall(theworkouts):
axis_label="Cumulative % of strokes"),'right') axis_label="Cumulative % of strokes"),'right')
plot.sizing_mode = 'scale_width' plot.sizing_mode = 'scale_width'
annolabel = Label(x=50,y=450,x_units='screen',y_units='screen',
text='',
background_fill_alpha=0.7,
background_fill_color='white',
text_color='black',
)
plot.add_layout(annolabel)
callback = CustomJS(args = dict(
annolabel=annolabel,
), code="""
var annotation = annotation.value
annolabel.text = annotation
""")
annotation = TextInput(title="Type your plot notes here", value="",
callback=callback)
callback.args["annotation"] = annotation
layout = layoutcolumn([annotation,plot])
try: try:
script, div = components(plot) script, div = components(layout)
except ValueError: except ValueError:
script = '' script = ''
div = '' div = ''
return [script,div] return [script,div]
def course_map(course): def course_map(course):
+1 -1
View File
@@ -14,7 +14,7 @@ import io
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django_mailbox.models import Message, MessageAttachment,Mailbox from django_mailbox.models import Message, MessageAttachment,Mailbox
from django.core.urlresolvers import reverse from django.urls import reverse
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
+27 -6
View File
@@ -9,6 +9,7 @@ queuelow = django_rq.get_queue('low')
from rowers.tasks import handle_updatefitnessmetric,handle_sendemail_expired from rowers.tasks import handle_updatefitnessmetric,handle_sendemail_expired
from rowers.mytypes import otwtypes from rowers.mytypes import otwtypes
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponse
def getrower(user): def getrower(user):
try: try:
@@ -70,12 +71,19 @@ def do_update(user,mode='rower',days=42):
class PowerTimeFitnessMetricMiddleWare(object): class PowerTimeFitnessMetricMiddleWare(object):
def process_request(self, request): def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Code to be executed before the view is called # Code to be executed before the view is called
if request.user.is_authenticated(): if request.user.is_authenticated:
result = do_update(request.user,mode='rower') result = do_update(request.user,mode='rower')
result = do_update(request.user,mode='water') result = do_update(request.user,mode='water')
response = self.get_response(request)
return response
from django.shortcuts import redirect from django.shortcuts import redirect
@@ -93,8 +101,11 @@ allowed_paths = [
] ]
class GDPRMiddleWare(object): class GDPRMiddleWare(object):
def process_request(self, request): def __init__(self, get_response):
if request.user.is_authenticated() and request.path not in allowed_paths: self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.path not in allowed_paths:
r = getrower(request.user) r = getrower(request.user)
nexturl = request.path nexturl = request.path
if 'optin' in nexturl: if 'optin' in nexturl:
@@ -104,9 +115,16 @@ class GDPRMiddleWare(object):
'/rowers/me/gdpr-optin/?next=%s' % nexturl '/rowers/me/gdpr-optin/?next=%s' % nexturl
) )
response = self.get_response(request)
return response
class RowerPlanMiddleWare(object): class RowerPlanMiddleWare(object):
def process_request(self, request): def __init__(self, get_response):
if request.user.is_authenticated() and request.user.rower.rowerplan != 'basic': self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.user.rower.rowerplan != 'basic':
if request.user.rower.paymenttype == 'single': if request.user.rower.paymenttype == 'single':
if request.user.rower.planexpires < timezone.now().date(): if request.user.rower.planexpires < timezone.now().date():
messg = 'Your paid plan has expired. We have reset you to a free basic plan.' messg = 'Your paid plan has expired. We have reset you to a free basic plan.'
@@ -122,3 +140,6 @@ class RowerPlanMiddleWare(object):
r.user.last_name, r.user.last_name,
str(r.planexpires)) str(r.planexpires))
response = self.get_response(request)
return response
+2 -2
View File
@@ -1014,7 +1014,7 @@ class BasePlannedSessionFormSet(BaseFormSet):
# Check if workout is owned by this user # Check if workout is owned by this user
def checkworkoutuser(user,workout): def checkworkoutuser(user,workout):
if user.is_anonymous(): if user.is_anonymous:
return False return False
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
@@ -1034,7 +1034,7 @@ def checkworkoutuser(user,workout):
# Check if workout may be viewed by this user # Check if workout may be viewed by this user
def checkworkoutuserview(user,workout): def checkworkoutuserview(user,workout):
if user.is_anonymous(): if user.is_anonymous:
return False return False
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
+11 -7
View File
@@ -97,6 +97,12 @@ import arrow
from rowers.utils import get_strava_stream from rowers.utils import get_strava_stream
def safetimedelta(x):
try:
return timedelta(seconds=x)
except ValueError:
return timedelta(seconds=0)
siteurl = SITE_URL siteurl = SITE_URL
# testing task # testing task
@@ -292,7 +298,7 @@ def handle_check_race_course(self,
rowdata = rowdata[rowdata['time']>splitsecond] rowdata = rowdata[rowdata['time']>splitsecond]
# we may want to expand the time (interpolate) # we may want to expand the time (interpolate)
rowdata['dt'] = rowdata['time'].apply( rowdata['dt'] = rowdata['time'].apply(
lambda x: timedelta(seconds=x) lambda x: safetimedelta(seconds=x)
) )
rowdata = rowdata.resample('100ms',on='dt').mean() rowdata = rowdata.resample('100ms',on='dt').mean()
rowdata = rowdata.interpolate() rowdata = rowdata.interpolate()
@@ -618,7 +624,7 @@ def handle_calctrimp(id,
df2['time'] = df2[' ElapsedTime (sec)'] df2['time'] = df2[' ElapsedTime (sec)']
df2['time'] = df2['time'].apply( df2['time'] = df2['time'].apply(
lambda x:timedelta(seconds=x) lambda x:safetimedelta(seconds=x)
) )
duration = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min() duration = df['TimeStamp (sec)'].max()-df['TimeStamp (sec)'].min()
@@ -1659,11 +1665,10 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename,
try: try:
haspower = row.df[' Power (watts)'].mean() > 50 haspower = row.df[' Power (watts)'].mean() > 50
except TypeError: except (TypeError, KeyError):
haspower = True
except KeyError:
haspower = False haspower = False
nr_rows = len(row.df) nr_rows = len(row.df)
if (plotnr in [1, 2, 4, 5, 8, 11, 9, 12]) and (nr_rows > 1200): if (plotnr in [1, 2, 4, 5, 8, 11, 9, 12]) and (nr_rows > 1200):
bin = int(nr_rows / 1200.) bin = int(nr_rows / 1200.)
@@ -1700,11 +1705,10 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename,
t += ' - Power Distribution' t += ' - Power Distribution'
fig1 = row.get_power_piechart(t) fig1 = row.get_power_piechart(t)
if fig1:
canvas = FigureCanvas(fig1) canvas = FigureCanvas(fig1)
# plt.savefig('static/plots/'+imagename,format='png')
canvas.print_figure('static/plots/' + imagename) canvas.print_figure('static/plots/' + imagename)
# plt.imsave(fname='static/plots/'+imagename)
plt.close(fig1) plt.close(fig1)
fig1.clf() fig1.clf()
gc.collect() gc.collect()
-1
View File
@@ -14,7 +14,6 @@ django.setup()
import time import time
from celery import app from celery import app
from django_rq import job from django_rq import job
from async_messages import message_user,messages
from rowers.models import Workout from rowers.models import Workout
from django.contrib.auth.models import User from django.contrib.auth.models import User
+2 -2
View File
@@ -40,14 +40,14 @@
</p> </p>
</li> </li>
<li class="rounder"> <li class="rounder">
<h2>Power Histogram</h2> <h2>Histogram</h2>
<a href="/rowers/histo/"> <a href="/rowers/histo/">
<div class="vignet"> <div class="vignet">
<img src="/static/img/histogram.png" alt="Power Histogram"> <img src="/static/img/histogram.png" alt="Power Histogram">
</div> </div>
</a> </a>
<p> <p>
Plot a power histogram of all your strokes over a date range. Plot a histogram chart of one metric for all your strokes over a date range.
</p> </p>
</li> </li>
<li class="rounder"> <li class="rounder">
+7
View File
@@ -75,6 +75,8 @@
</div> </div>
<h1>Histogram View</h1>
<ul class="main-content"> <ul class="main-content">
<li class="grid_4"> <li class="grid_4">
@@ -100,6 +102,11 @@
{{ form.as_table }} {{ form.as_table }}
</table> </table>
</li> </li>
<li>
<table>
{{ histoform.as_table }}
</table>
</li>
<li> <li>
{% csrf_token %} {% csrf_token %}
<input class="button green small" value="Submit" type="Submit"> <input class="button green small" value="Submit" type="Submit">
+2 -2
View File
@@ -62,9 +62,9 @@
<i class="fal fa-table fa-fw"></i>&nbsp;Statistics <i class="fal fa-table fa-fw"></i>&nbsp;Statistics
</a> </a>
</li> </li>
<li id="stats-histopower"> <li id="stats-histo">
<a href="/rowers/histo/"> <a href="/rowers/histo/">
<i class="fas fa-chart-bar"></i>&nbsp;Power Histogram <i class="fas fa-chart-bar"></i>&nbsp;Histogram
</a> </a>
</li> </li>
</ul> </ul>
+1 -1
View File
@@ -8,7 +8,7 @@
<ul class="main-content"> <ul class="main-content">
<li class="grid_2 frontitem"> <li class="grid_2 frontitem">
<form method="post" action="{% url 'django.contrib.auth.views.login' %}"> <form method="post" action="{% url 'login' %}">
{% csrf_token %} {% csrf_token %}
<table> <table>
<tr> <tr>
+1 -1
View File
@@ -88,7 +88,7 @@ def secondstotimestring(tdelta):
@register.filter @register.filter
def existing_customer(user): def existing_customer(user):
if user.is_anonymous(): if user.is_anonymous:
return False return False
else: else:
return payments.is_existing_customer(user.rower) return payments.is_existing_customer(user.rower)
+1 -1
View File
@@ -53,7 +53,7 @@ from mock import Mock, patch
import pandas as pd import pandas as pd
import rowers.c2stuff as c2stuff import rowers.c2stuff as c2stuff
from django.core.urlresolvers import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
import json import json
import numpy as np import numpy as np
+3 -3
View File
@@ -59,8 +59,6 @@ class ViewTest(TestCase):
form = DocumentsForm(form_data,file_data) form = DocumentsForm(form_data,file_data)
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
@@ -69,6 +67,7 @@ class ViewTest(TestCase):
response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/edit/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@@ -77,6 +76,7 @@ class ViewTest(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
f.close()
response = self.c.get('/rowers/workout/'+encoded1+'/workflow/', response = self.c.get('/rowers/workout/'+encoded1+'/workflow/',
@@ -157,7 +157,6 @@ class ViewTest(TestCase):
response = self.c.post('/rowers/workout/upload/', form_data, follow=True) response = self.c.post('/rowers/workout/upload/', form_data, follow=True)
f.close()
self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/', self.assertRedirects(response, expected_url='/rowers/workout/'+encoded1+'/edit/',
status_code=302,target_status_code=200) status_code=302,target_status_code=200)
@@ -167,6 +166,7 @@ class ViewTest(TestCase):
response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True) response = self.c.get('/rowers/workout/'+encoded1+'/', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
f.close()
w = Workout.objects.get(id=1) w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename f_to_be_deleted = w.csvfilename
Binary file not shown.
+1 -1
View File
@@ -25,7 +25,7 @@ tpapilocation = "https://api.trainingpeaks.com"
from celery import Celery,app from celery import Celery,app
from django_rq import job from django_rq import job
import time import time
from async_messages import message_user,messages #from async_messages import message_user,messages
oauth_data = { oauth_data = {
'client_id': TP_CLIENT_ID, 'client_id': TP_CLIENT_ID,
+1 -1
View File
@@ -349,7 +349,7 @@ def upload_options(body):
uploadoptions = {} uploadoptions = {}
body = cleanbody(body) body = cleanbody(body)
try: try:
yml = (yaml.load(body)) yml = (yaml.safe_load(body))
if yml and 'fromuploadform' in yml: if yml and 'fromuploadform' in yml:
return yml return yml
try: try:
+420 -418
View File
File diff suppressed because it is too large Load Diff
+51 -19
View File
@@ -20,11 +20,17 @@ def histo(request,theuser=0,
'workouttypes':[i[0] for i in mytypes.workouttypes], 'workouttypes':[i[0] for i in mytypes.workouttypes],
'waterboattype':mytypes.waterboattype, 'waterboattype':mytypes.waterboattype,
'rankingonly': False, 'rankingonly': False,
'histoparam':'power'
}): }):
r = getrequestrower(request,userid=theuser) r = getrequestrower(request,userid=theuser)
theuser = r.user theuser = r.user
if 'histoparam' in request.session:
histoparam = request.session['histoparam']
else:
histoparam = 'power'
if 'waterboattype' in request.session: if 'waterboattype' in request.session:
waterboattype = request.session['waterboattype'] waterboattype = request.session['waterboattype']
else: else:
@@ -81,6 +87,7 @@ def histo(request,theuser=0,
if request.method == 'POST': if request.method == 'POST':
form = DateRangeForm(request.POST) form = DateRangeForm(request.POST)
modalityform = TrendFlexModalForm(request.POST) modalityform = TrendFlexModalForm(request.POST)
histoform = HistoForm(request.POST)
if form.is_valid(): if form.is_valid():
startdate = form.cleaned_data['startdate'] startdate = form.cleaned_data['startdate']
enddate = form.cleaned_data['enddate'] enddate = form.cleaned_data['enddate']
@@ -110,6 +117,11 @@ def histo(request,theuser=0,
'startdate': startdate, 'startdate': startdate,
'enddate': enddate, 'enddate': enddate,
}) })
if histoform.is_valid():
includereststrokes = histoform.cleaned_data['includereststrokes']
histoparam = histoform.cleaned_data['histoparam']
request.session['histoparam'] = histoparam
request.session['includereststrokes'] = includereststrokes
else: else:
form = DateRangeForm(initial={ form = DateRangeForm(initial={
'startdate': startdate, 'startdate': startdate,
@@ -125,6 +137,10 @@ def histo(request,theuser=0,
'rankingonly':rankingonly, 'rankingonly':rankingonly,
} }
) )
histoform = HistoForm(initial={
'includereststrokes':False,
'histoparam':histoparam
})
negtypes = [] negtypes = []
for b in mytypes.boattypes: for b in mytypes.boattypes:
@@ -149,23 +165,36 @@ def histo(request,theuser=0,
'enddatestring':enddatestring, 'enddatestring':enddatestring,
'rankingonly':rankingonly, 'rankingonly':rankingonly,
'includereststrokes':includereststrokes, 'includereststrokes':includereststrokes,
'histoparam':histoparam,
} }
request.session['options'] = options request.session['options'] = options
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember = 1 promember = 1
request.session['options'] = options request.session['options'] = options
breadcrumbs = [
{
'url':'/rowers/analysis',
'name':'Analysis'
},
{
'url':reverse('histo'),
'name': 'Histogram'
}
]
return render(request, 'histo.html', return render(request, 'histo.html',
{'interactiveplot':script, {'interactiveplot':script,
'the_div':div, 'the_div':div,
'breadcrumbs':breadcrumbs,
'id':theuser, 'id':theuser,
'active':'nav-analysis', 'active':'nav-analysis',
'theuser':theuser, 'theuser':theuser,
@@ -174,6 +203,7 @@ def histo(request,theuser=0,
'enddate':enddate, 'enddate':enddate,
'form':form, 'form':form,
'optionsform':modalityform, 'optionsform':modalityform,
'histoform':histoform,
'teams':get_my_teams(request.user), 'teams':get_my_teams(request.user),
}) })
@@ -239,9 +269,9 @@ def cum_flex_data(
if theuser == 0: if theuser == 0:
theuser = request.user.id theuser = request.user.id
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -295,6 +325,7 @@ def histo_data(
'enddatestring':timezone.now().strftime("%Y-%m-%d"), 'enddatestring':timezone.now().strftime("%Y-%m-%d"),
'startdatestring':(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"), 'startdatestring':(timezone.now()-datetime.timedelta(days=30)).strftime("%Y-%m-%d"),
'deltadays':-1, 'deltadays':-1,
'histoparam':'power',
}): }):
def_options = options def_options = options
@@ -311,6 +342,7 @@ def histo_data(
theuser = keyvalue_get_default('theuser',options,def_options) theuser = keyvalue_get_default('theuser',options,def_options)
startdatestring = keyvalue_get_default('startdatestring',options,def_options) startdatestring = keyvalue_get_default('startdatestring',options,def_options)
enddatestring = keyvalue_get_default('enddatestring',options,def_options) enddatestring = keyvalue_get_default('enddatestring',options,def_options)
histoparam = keyvalue_get_default('histoparam',options,def_options)
if modality == 'all': if modality == 'all':
modalities = [m[0] for m in mytypes.workouttypes] modalities = [m[0] for m in mytypes.workouttypes]
@@ -337,9 +369,9 @@ def histo_data(
if theuser == 0: if theuser == 0:
theuser = request.user.id theuser = request.user.id
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -358,7 +390,7 @@ def histo_data(
rankingpiece__in=rankingpiece) rankingpiece__in=rankingpiece)
if allworkouts: if allworkouts:
res = interactive_histoall(allworkouts) res = interactive_histoall(allworkouts,histoparam,includereststrokes)
script = res[0] script = res[0]
div = res[1] div = res[1]
else: else:
@@ -543,8 +575,8 @@ def cum_flex(request,theuser=0,
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember = 1 promember = 1
@@ -662,7 +694,7 @@ def rankings_view(request,theuser=0,
theuser = request.user.id theuser = request.user.id
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
if r.birthdate: if r.birthdate:
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
@@ -674,7 +706,7 @@ def rankings_view(request,theuser=0,
else: else:
worldclasspower = None worldclasspower = None
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -1015,7 +1047,7 @@ def rankings_view2(request,theuser=0,
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
wcdurations = [] wcdurations = []
wcpower = [] wcpower = []
@@ -1082,7 +1114,7 @@ def rankings_view2(request,theuser=0,
request.session['options'] = options request.session['options'] = options
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -1434,9 +1466,9 @@ def otwrankings_view(request,theuser=0,
theuser = request.user.id theuser = request.user.id
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -1840,9 +1872,9 @@ def oterankings_view(request,theuser=0,
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -3388,9 +3420,9 @@ def cumstats(request,theuser=0,
if theuser == 0: if theuser == 0:
theuser = request.user.id theuser = request.user.id
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
+9 -9
View File
@@ -7,29 +7,29 @@ from rowers.views.statements import *
# Custom error pages with Rowsandall headers # Custom error pages with Rowsandall headers
def error500_view(request): def error500_view(request):
response = render_to_response('500.html', {}, response = render(request,'500.html', {},)
context_instance = RequestContext(request)) # context_instance = RequestContext(request))
response.status_code = 500 response.status_code = 500
return response return response
def error404_view(request): def error404_view(request):
response = render_to_response('404.html', {}, response = render(request,'404.html', {},)
context_instance = RequestContext(request)) # context_instance = RequestContext(request))
response.status_code = 404 response.status_code = 404
return response return response
def error400_view(request): def error400_view(request):
response = render_to_response('400.html', {}, response = render(request,'400.html', {},)
context_instance = RequestContext(request)) # context_instance = RequestContext(request))
response.status_code = 400 response.status_code = 400
return response return response
def error403_view(request): def error403_view(request,*args, **kwargs):
response = render_to_response('403.html', {}, response = render(request,'403.html', {},)
context_instance = RequestContext(request)) # context_instance = RequestContext(request))
response.status_code = 403 response.status_code = 403
return response return response
+2 -2
View File
@@ -11,7 +11,7 @@ def deactivate_user(request):
pk = request.user.id pk = request.user.id
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
user_form = DeactivateUserForm(instance=user) user_form = DeactivateUserForm(instance=user)
if request.user.is_authenticated() and request.user.id == user.id: if request.user.is_authenticated and request.user.id == user.id:
if request.method == "POST": if request.method == "POST":
user_form = DeactivateUserForm(request.POST, instance=user) user_form = DeactivateUserForm(request.POST, instance=user)
if user_form.is_valid(): if user_form.is_valid():
@@ -80,7 +80,7 @@ def remove_user(request):
pk = request.user.id pk = request.user.id
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
user_form = DeleteUserForm(instance=user) user_form = DeleteUserForm(instance=user)
if request.user.is_authenticated() and request.user.id == user.id: if request.user.is_authenticated and request.user.id == user.id:
if request.method == "POST": if request.method == "POST":
user_form = DeleteUserForm(request.POST,instance=user) user_form = DeleteUserForm(request.POST,instance=user)
if user_form.is_valid(): if user_form.is_valid():
+1 -1
View File
@@ -6,7 +6,7 @@ from __future__ import unicode_literals
from rowers.views.statements import * from rowers.views.statements import *
def paidplans_view(request): def paidplans_view(request):
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = request.user.rower r = request.user.rower
if r.paymentprocessor != 'braintree' and r.paymenttype == 'recurring': if r.paymentprocessor != 'braintree' and r.paymenttype == 'recurring':
messages.error(request,'Automated payment processing is currently only available through BrainTree (by PayPal). You are currently on a recurring payment plan with PayPal. Contact the site administrator at support@rowsandall.com before you proceed') messages.error(request,'Automated payment processing is currently only available through BrainTree (by PayPal). You are currently on a recurring payment plan with PayPal. Contact the site administrator at support@rowsandall.com before you proceed')
+12 -12
View File
@@ -495,7 +495,7 @@ def virtualevents_view(request):
races = (races1 | races2).order_by("startdate","start_time") races = (races1 | races2).order_by("startdate","start_time")
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
else: else:
r = None r = None
@@ -687,7 +687,7 @@ def virtualevent_disqualify_view(request,raceid=0,recordid=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -724,7 +724,7 @@ def virtualevent_view(request,id=0):
results = [] results = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
else: else:
r = None r = None
@@ -757,7 +757,7 @@ def virtualevent_view(request,id=0):
) )
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -907,7 +907,7 @@ def virtualevent_ranking_view(request,id=0):
results = [] results = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
else: else:
r = None r = None
@@ -940,7 +940,7 @@ def virtualevent_ranking_view(request,id=0):
) )
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -1247,7 +1247,7 @@ def virtualevent_addboat_view(request,id=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -1401,7 +1401,7 @@ def virtualevent_register_view(request,id=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -1592,7 +1592,7 @@ def indoorvirtualevent_register_view(request,id=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -1940,7 +1940,7 @@ def virtualevent_edit_view(request,id=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -2039,7 +2039,7 @@ def indoorvirtualevent_edit_view(request,id=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
@@ -2254,7 +2254,7 @@ def virtualevent_submit_result_view(request,id=0,workoutid=0):
buttons = [] buttons = []
if not request.user.is_anonymous(): if not request.user.is_anonymous:
if race_can_register(r,race): if race_can_register(r,race):
buttons += ['registerbutton'] buttons += ['registerbutton']
+15 -18
View File
@@ -48,7 +48,7 @@ from django.http import (
) )
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
from rowers.forms import ( from rowers.forms import (
ForceCurveOptionsForm, ForceCurveOptionsForm,HistoForm,
LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,CourseForm, LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,CourseForm,
TeamUploadOptionsForm,WorkFlowLeftPanelForm,WorkFlowMiddlePanelForm, TeamUploadOptionsForm,WorkFlowLeftPanelForm,WorkFlowMiddlePanelForm,
WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement, WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement,
@@ -61,9 +61,6 @@ from rowers.forms import (
disqualifiers,SearchForm,BillingForm,PlanSelectForm disqualifiers,SearchForm,BillingForm,PlanSelectForm
) )
try:
from django.core.urlresolvers import reverse, reverse_lazy
except ModuleNotFoundError:
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
@@ -188,7 +185,7 @@ from rowers.tasks import (
) )
from scipy.signal import savgol_filter from scipy.signal import savgol_filter
from django.shortcuts import render_to_response #from django.shortcuts import render_to_response
try: try:
from Cookie import SimpleCookie from Cookie import SimpleCookie
except ModuleNotFoundError: except ModuleNotFoundError:
@@ -269,7 +266,7 @@ def getfavorites(r,row):
return favorites,maxfav return favorites,maxfav
def get_workout_default_page(request,id): def get_workout_default_page(request,id):
if request.user.is_anonymous(): if request.user.is_anonymous:
return reverse('workout_view',kwargs={'id':id}) return reverse('workout_view',kwargs={'id':id})
else: else:
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
@@ -347,10 +344,10 @@ def getrequestplanrower(request,rowerid=0,userid=0,notpermanent=False):
def getrower(user): def getrower(user):
try: try:
if user.is_anonymous(): if user.is_anonymous:
return None return None
except AttributeError: except AttributeError:
if User.objects.get(id=user).is_anonymous(): if User.objects.get(id=user).is_anonymous:
return None return None
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
@@ -768,7 +765,7 @@ def get_thumbnails(request,id):
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == row.user.user: if request.user == row.user.user:
@@ -999,21 +996,21 @@ from rowers.models import (
# Check if a user is a Coach member # Check if a user is a Coach member
def iscoachmember(user): def iscoachmember(user):
if not user.is_anonymous(): if not user.is_anonymous:
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
except Rower.DoesNotExist: except Rower.DoesNotExist:
r = Rower(user=user) r = Rower(user=user)
r.save() r.save()
result = user.is_authenticated() and (r.rowerplan=='coach') result = user.is_authenticated and (r.rowerplan=='coach')
else: else:
result = False result = False
return result return result
def cancreateteam(user): def cancreateteam(user):
if user.is_anonymous(): if user.is_anonymous:
return False return False
try: try:
@@ -1022,7 +1019,7 @@ def cancreateteam(user):
r = Rower(user=user) r = Rower(user=user)
r.save() r.save()
if user.is_authenticated() and (r.rowerplan=='coach'): if user.is_authenticated and (r.rowerplan=='coach'):
return True return True
elif user.is_athenticated() and r.rowerplan in ['plan','pro']: elif user.is_athenticated() and r.rowerplan in ['plan','pro']:
ts = Team.objects.filter(manager=user) ts = Team.objects.filter(manager=user)
@@ -1031,16 +1028,16 @@ def cancreateteam(user):
# Check if a user can create planned sessions # Check if a user can create planned sessions
def hasplannedsessions(user): def hasplannedsessions(user):
if not user.is_anonymous(): if not user.is_anonymous:
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
except Rower.DoesNotExist: except Rower.DoesNotExist:
r = Rower(user=user) r = Rower(user=user)
r.save() r.save()
result = user.is_authenticated() and (r.rowerplan=='coach' or r.rowerplan=='plan') result = user.is_authenticated and (r.rowerplan=='coach' or r.rowerplan=='plan')
if not result and r.plantrialexpires: if not result and r.plantrialexpires:
result = user.is_authenticated() and r.plantrialexpires >= datetime.date.today() result = user.is_authenticated and r.plantrialexpires >= datetime.date.today()
else: else:
result = False result = False
@@ -1050,14 +1047,14 @@ from rowers.utils import isprorower,ProcessorCustomerError
# Check if a user is a Pro member # Check if a user is a Pro member
def ispromember(user): def ispromember(user):
if not user.is_anonymous(): if not user.is_anonymous:
try: try:
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
except Rower.DoesNotExist: except Rower.DoesNotExist:
r = Rower(user=user) r = Rower(user=user)
r.save() r.save()
result = user.is_authenticated() and isprorower(r) result = user.is_authenticated and isprorower(r)
else: else:
result = False result = False
return result return result
+23 -23
View File
@@ -15,9 +15,9 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == row.user.user: if request.user == row.user.user:
@@ -100,9 +100,9 @@ def workout_histo_view(request,id=0):
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == w.user.user: if request.user == w.user.user:
@@ -111,7 +111,7 @@ def workout_histo_view(request,id=0):
if not promember: if not promember:
return HttpResponseRedirect("/rowers/about/") return HttpResponseRedirect("/rowers/about/")
res = interactive_histoall([w]) res = interactive_histoall([w],'power',False)
script = res[0] script = res[0]
div = res[1] div = res[1]
@@ -404,9 +404,9 @@ def workout_recalcsummary_view(request,id=0):
redirect_field_name=None) redirect_field_name=None)
def workouts_join_view(request): def workouts_join_view(request):
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -822,9 +822,9 @@ def virtualevent_compare_view(request,id=0):
results = [] results = []
promember = 0 promember = 0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
else: else:
@@ -1022,9 +1022,9 @@ def plannedsession_compare_view(request,id=0,userid=0):
@login_required() @login_required()
def multi_compare_view(request,id=0,userid=0): def multi_compare_view(request,id=0,userid=0):
promember=0 promember=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
@@ -1488,7 +1488,7 @@ def workout_fusion_list(request,id=0,message='',successmessage='',
def workout_view(request,id=0): def workout_view(request,id=0):
request.session['referer'] = absolute(request)['PATH'] request.session['referer'] = absolute(request)['PATH']
if not request.user.is_anonymous(): if not request.user.is_anonymous:
rower = getrower(request.user) rower = getrower(request.user)
else: else:
rower = None rower = None
@@ -2733,7 +2733,7 @@ def workout_workflow_view(request,id):
row = get_workout_permittedview(request.user,id) row = get_workout_permittedview(request.user,id)
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == row.user.user: if request.user == row.user.user:
@@ -2835,9 +2835,9 @@ def workout_flexchart3_view(request,*args,**kwargs):
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == row.user.user: if request.user == row.user.user:
@@ -2888,7 +2888,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
else: else:
yparam2 = 'hr' yparam2 = 'hr'
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
if favoritenr>=0 and r.showfavoritechartnotes: if favoritenr>=0 and r.showfavoritechartnotes:
try: try:
@@ -2918,7 +2918,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
workstrokesonly = False workstrokesonly = False
if request.method == 'POST' and 'savefavorite' in request.POST: if request.method == 'POST' and 'savefavorite' in request.POST:
if not request.user.is_anonymous(): if not request.user.is_anonymous:
workstrokesonly = request.POST['workstrokesonlysave'] workstrokesonly = request.POST['workstrokesonlysave']
reststrokes = not workstrokesonly reststrokes = not workstrokesonly
r = getrower(request.user) r = getrower(request.user)
@@ -3146,9 +3146,9 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
promember=0 promember=0
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == w.user.user: if request.user == w.user.user:
@@ -3620,9 +3620,9 @@ def workout_map_view(request,id=0):
mapdiv = "" mapdiv = ""
mayedit=0 mayedit=0
if not request.user.is_anonymous(): if not request.user.is_anonymous:
r = getrower(request.user) r = getrower(request.user)
result = request.user.is_authenticated() and ispromember(request.user) result = request.user.is_authenticated and ispromember(request.user)
if result: if result:
promember=1 promember=1
if request.user == w.user.user: if request.user == w.user.user:
@@ -5253,9 +5253,9 @@ class WorkoutDelete(DeleteView):
mayedit=0 mayedit=0
promember=0 promember=0
if not self.request.user.is_anonymous(): if not self.request.user.is_anonymous:
r = getrower(self.request.user) r = getrower(self.request.user)
result = self.request.user.is_authenticated() and ispromember(self.request.user) result = self.request.user.is_authenticated and ispromember(self.request.user)
if result: if result:
promember=1 promember=1
if self.request.user == self.object.user.user: if self.request.user == self.object.user.user:
+3 -7
View File
@@ -58,7 +58,7 @@ INSTALLED_APPS = [
'suit_rq', 'suit_rq',
'leaflet', 'leaflet',
'django_rq', 'django_rq',
'django_rq_dashboard', # 'django_rq_dashboard',
# 'translation_manager', # 'translation_manager',
'django_mailbox', 'django_mailbox',
'rest_framework', 'rest_framework',
@@ -80,8 +80,7 @@ AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.ModelBackend',
) )
MIDDLEWARE_CLASSES = [ MIDDLEWARE = [
# 'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.common.BrokenLinkEmailsMiddleware', 'django.middleware.common.BrokenLinkEmailsMiddleware',
'django.middleware.gzip.GZipMiddleware', 'django.middleware.gzip.GZipMiddleware',
@@ -94,10 +93,8 @@ MIDDLEWARE_CLASSES = [
'corsheaders.middleware.CorsMiddleware', 'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'oauth2_provider.middleware.OAuth2TokenMiddleware', 'oauth2_provider.middleware.OAuth2TokenMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'async_messages.middleware.AsyncMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'tz_detect.middleware.TimezoneMiddleware', 'tz_detect.middleware.TimezoneMiddleware',
'rowers.middleware.GDPRMiddleWare', 'rowers.middleware.GDPRMiddleWare',
@@ -389,8 +386,7 @@ REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ( 'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.SessionAuthentication',
'oauth2_provider.ext.rest_framework.OAuth2Authentication', 'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
# 'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
), ),
'PAGE_SIZE': 20, 'PAGE_SIZE': 20,
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.LimitOffsetPagination', 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.LimitOffsetPagination',
+1 -1
View File
@@ -55,7 +55,7 @@ ALLOWED_HOSTS = []
#INSTALLED_APPS += ['debug_toolbar',] #INSTALLED_APPS += ['debug_toolbar',]
MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware',] MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware',]
CACHES = { CACHES = {
'default': { 'default': {
+41 -47
View File
@@ -5,15 +5,16 @@ The `urlpatterns` list routes URLs to views. For more information please see:
Examples: Examples:
Function views Function views
1. Add an import: from my_app import views 1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 2. Add a URL to urlpatterns: re_path(r'^$', views.home, name='home')
Class-based views Class-based views
1. Add an import: from other_app.views import Home 1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 2. Add a URL to urlpatterns: re_path(r'^$', Home.as_view(), name='home')
Including another URLconf Including another URLconf
1. Import the include() function: from django.conf.urls import url, include 1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 2. Add a URL to urlpatterns: re_path(r'^blog/', include('blog.urls'))
""" """
from django.conf.urls import url,include from django.conf.urls import url,include
from django.urls import path, re_path
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
@@ -35,61 +36,54 @@ handler500 = 'rowers.views.error500_view'
urlpatterns = [ urlpatterns = [
url('^', include('django.contrib.auth.urls')), re_path('^', include('django.contrib.auth.urls')),
url(r'^django-rq/',include('django_rq.urls')), re_path(r'^django-rq/',include('django_rq.urls')),
url(r'^password_change_done/$',auth_views.password_change_done,name='password_change_done'), re_path(r'^password_change_done/$',auth_views.PasswordChangeDoneView,name='password_change_done'),
# url(r'^password_change_done/$',auth_views.PasswordChangeDoneView,name='password_change_done'), re_path(r'^password_change/$',auth_views.PasswordChangeView,name='password_change'),
url(r'^password_change/$',auth_views.password_change), re_path(r'^password_reset/$',
# url(r'^password_change/$',auth_views.PasswordChangeView,name='password_change'), auth_views.PasswordResetView,
url(r'^password_reset/$',
auth_views.password_reset,
# auth_views.PasswordResetView,
{'template_name': 'rowers/templates/registration/password_reset.html'}, {'template_name': 'rowers/templates/registration/password_reset.html'},
name='password_reset'), name='password_reset'),
url(r'^password_reset/done/$', re_path(r'^password_reset/done/$',
auth_views.password_reset_done, auth_views.PasswordResetDoneView,
# auth_views.PasswordResetDoneView,
name='password_reset_done'), name='password_reset_done'),
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', re_path(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
auth_views.password_reset_confirm, auth_views.PasswordResetConfirmView,
# auth_views.PasswordResetConfirmView,
name='password_reset_confirm'), name='password_reset_confirm'),
url(r'^reset/done/$', re_path(r'^reset/done/$',
auth_views.password_reset_complete, auth_views.PasswordResetCompleteView,
# auth_views.PasswordResetCompleteView,
name='password_reset_complete'), name='password_reset_complete'),
] ]
urlpatterns += [ urlpatterns += [
url(r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt', re_path(r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt',
content_type='text/plain')), content_type='text/plain')),
url(r'^admin/', admin.site.urls), re_path(r'^admin/', admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework2')), re_path(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework2')),
url(r'^$',rootview), re_path(r'^$',rootview),
url(r'^getblogs/$',rowersviews.get_blog_posts), re_path(r'^getblogs/$',rowersviews.get_blog_posts),
url(r'^login/', re_path(r'^login/',
auth_views.login,
# auth_views.LoginView, # auth_views.LoginView,
auth_views.LoginView,
name='login'), name='login'),
url(r'^logout/$', re_path(r'^logout/$',
auth_views.logout, auth_views.LogoutView,
# auth_views.LogoutView,
{'next_page': '/'}, {'next_page': '/'},
name='logout',), name='logout',),
url(r'^rowers/',include('rowers.urls')), re_path(r'^rowers/',include('rowers.urls')),
# url(r'^cvkbrno/',include('cvkbrno.urls')), # re_path(r'^cvkbrno/',include('cvkbrno.urls')),
url(r'^admin/rq/',include('django_rq_dashboard.urls')), # re_path(r'^admin/rq/',include('django_rq_dashboard.urls')),
url(r'^call\_back',rowersviews.rower_process_callback), re_path(r'^call\_back',rowersviews.rower_process_callback),
url(r'^stravacall\_back',rowersviews.rower_process_stravacallback), re_path(r'^stravacall\_back',rowersviews.rower_process_stravacallback),
url(r'^sporttracks\_callback',rowersviews.rower_process_sporttrackscallback), re_path(r'^sporttracks\_callback',rowersviews.rower_process_sporttrackscallback),
url(r'^underarmour\_callback',rowersviews.rower_process_underarmourcallback), re_path(r'^underarmour\_callback',rowersviews.rower_process_underarmourcallback),
url(r'^polarflowcallback',rowersviews.rower_process_polarcallback), re_path(r'^polarflowcallback',rowersviews.rower_process_polarcallback),
url(r'^runkeeper\_callback',rowersviews.rower_process_runkeepercallback), re_path(r'^runkeeper\_callback',rowersviews.rower_process_runkeepercallback),
url(r'^tp\_callback',rowersviews.rower_process_tpcallback), re_path(r'^tp\_callback',rowersviews.rower_process_tpcallback),
url(r'^twitter\_callback',rowersviews.rower_process_twittercallback), re_path(r'^twitter\_callback',rowersviews.rower_process_twittercallback),
url(r'^i18n/', include('django.conf.urls.i18n')), re_path(r'^i18n/', include('django.conf.urls.i18n')),
url(r'^tz_detect/', include('tz_detect.urls')), re_path(r'^tz_detect/', include('tz_detect.urls')),
url(r'^jsi18n/', django.views.i18n.javascript_catalog,name='jsi18n'), # re_path(r'^jsi18n/', django.views.i18n.javascript_catalog,name='jsi18n'),
] ]
@@ -97,8 +91,8 @@ if settings.DEBUG:
import debug_toolbar import debug_toolbar
import django import django
urlpatterns += [ urlpatterns += [
# url(r'^__debug__/','debug_toolbar.urls'), # re_path(r'^__debug__/','debug_toolbar.urls'),
url(r'^static/(?P<path>.*)$', re_path(r'^static/(?P<path>.*)$',
django.views.static.serve, django.views.static.serve,
kwargs={'document_root': settings.STATIC_ROOT,} kwargs={'document_root': settings.STATIC_ROOT,}
) )
+1 -2
View File
@@ -1,5 +1,4 @@
from django.shortcuts import render, redirect, render_to_response from django.shortcuts import render, redirect
from django.template.loader import render_to_string
from django.template import RequestContext from django.template import RequestContext
from django.conf import settings from django.conf import settings
from rowers.forms import LoginForm from rowers.forms import LoginForm