Merge branch 'develop' into feature/metrics
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
venv
|
||||
config.yaml
|
||||
@@ -46,6 +46,7 @@ manage.py
|
||||
# migrations
|
||||
/rowers/migrations/
|
||||
/cvkbrno/migrations/
|
||||
/survey/migrations/
|
||||
|
||||
# secrets
|
||||
config.yaml
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
FROM rosti/python:3.6
|
||||
WORKDIR /srv/app/
|
||||
COPY . .
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/srv/bin/venv python3.6
|
||||
import os
|
||||
import sys
|
||||
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rowsandall_app.settings")
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
application = get_wsgi_application()
|
||||
|
||||
#execute_from_command_line(sys.argv)
|
||||
@@ -17,6 +17,7 @@ from .models import (
|
||||
# Register your models here so you can use them in the Admin module
|
||||
|
||||
|
||||
|
||||
# Rower details directly under the User
|
||||
class RowerInline(admin.StackedInline):
|
||||
model = Rower
|
||||
|
||||
@@ -196,3 +196,11 @@ def alert_get_stats(alert,nperiod=0):
|
||||
}
|
||||
|
||||
# run alert report
|
||||
|
||||
# check alert permission
|
||||
def checkalertowner(alert,user):
|
||||
if alert.manager == user:
|
||||
return True
|
||||
if alert.rower.user == user:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -18,6 +18,7 @@ from iso8601 import ParseError
|
||||
|
||||
import numpy
|
||||
import json
|
||||
from json.decoder import JSONDecodeError
|
||||
|
||||
from rowsandall_app.settings import (
|
||||
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET
|
||||
|
||||
+28
-12
@@ -1081,7 +1081,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
||||
makeprivate=False,
|
||||
oarlength=2.89, inboard=0.88,
|
||||
forceunit='lbs',
|
||||
consistencychecks=False):
|
||||
consistencychecks=False,
|
||||
impeller=False):
|
||||
|
||||
message = None
|
||||
powerperc = 100 * np.array([r.pw_ut2,
|
||||
@@ -1289,7 +1290,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
||||
startdatetime=workoutstartdatetime,
|
||||
inboard=inboard, oarlength=oarlength,
|
||||
timezone=timezone_str,
|
||||
privacy=privacy)
|
||||
privacy=privacy,
|
||||
impeller=impeller)
|
||||
try:
|
||||
w.save()
|
||||
except ValidationError:
|
||||
@@ -1421,24 +1423,30 @@ def handle_nonpainsled(f2, fileformat, summary=''):
|
||||
oarlength = 2.89
|
||||
inboard = 0.88
|
||||
hasrecognized = False
|
||||
impeller = False
|
||||
|
||||
row,hasrecognized,summary,fileformat = parsenonpainsled(fileformat,f2,summary)
|
||||
|
||||
# Handle c2log
|
||||
if (fileformat == 'c2log' or fileformat == 'rowprolog'):
|
||||
return (0,'',0,0,'')
|
||||
return (0,'',0,0,'',impeller)
|
||||
|
||||
if not hasrecognized:
|
||||
return (0,'',0,0,'')
|
||||
return (0,'',0,0,'',impeller)
|
||||
|
||||
f_to_be_deleted = f2
|
||||
# should delete file
|
||||
f2 = f2[:-4] + 'o.csv'
|
||||
try:
|
||||
row2 = rrdata(df = row.df)
|
||||
row2.write_csv(f2, gzip=True)
|
||||
except:
|
||||
return (0,'',0,0,'')
|
||||
row2 = rrdata(df = row.df)
|
||||
if 'speedcoach2' in fileformat:
|
||||
# impeller consistency
|
||||
impellerdata, consistent, ratio = row.impellerconsistent(threshold=0.3)
|
||||
if impellerdata and consistent:
|
||||
impeller = True
|
||||
if impellerdata and not consistent:
|
||||
row2.use_gpsdata()
|
||||
row2.write_csv(f2, gzip=True)
|
||||
|
||||
|
||||
# os.remove(f2)
|
||||
try:
|
||||
@@ -1449,7 +1457,7 @@ def handle_nonpainsled(f2, fileformat, summary=''):
|
||||
except:
|
||||
pass
|
||||
|
||||
return (f2, summary, oarlength, inboard, fileformat)
|
||||
return (f2, summary, oarlength, inboard, fileformat, impeller)
|
||||
|
||||
# Create new workout from file and store it in the database
|
||||
# This routine should be used everywhere in views.py and mailprocessing.py
|
||||
@@ -1464,6 +1472,7 @@ def new_workout_from_file(r, f2,
|
||||
makeprivate=False,
|
||||
notes=''):
|
||||
message = None
|
||||
impeller = False
|
||||
try:
|
||||
fileformat = get_file_type(f2)
|
||||
except (IOError,UnicodeDecodeError):
|
||||
@@ -1476,6 +1485,7 @@ def new_workout_from_file(r, f2,
|
||||
inboard = 0.88
|
||||
if len(fileformat) == 3 and fileformat[0] == 'zip':
|
||||
f_to_be_deleted = f2
|
||||
impeller = False
|
||||
workoutsbox = Mailbox.objects.filter(name='workouts')[0]
|
||||
msg = Message(mailbox=workoutsbox,
|
||||
from_header=r.user.email,
|
||||
@@ -1543,7 +1553,7 @@ def new_workout_from_file(r, f2,
|
||||
|
||||
# handle non-Painsled by converting it to painsled compatible CSV
|
||||
if (fileformat != 'csv'):
|
||||
f2, summary, oarlength, inboard, fileformat = handle_nonpainsled(
|
||||
f2, summary, oarlength, inboard, fileformat, impeller = handle_nonpainsled(
|
||||
f2,
|
||||
fileformat,
|
||||
summary=summary
|
||||
@@ -1571,7 +1581,8 @@ def new_workout_from_file(r, f2,
|
||||
summary=summary,
|
||||
inboard=inboard, oarlength=oarlength,
|
||||
title=title,
|
||||
forceunit='N'
|
||||
forceunit='N',
|
||||
impeller=impeller,
|
||||
)
|
||||
|
||||
return (id, message, f2)
|
||||
@@ -1782,6 +1793,11 @@ def delete_strokedata(id):
|
||||
dirname = 'media/strokedata_{id}.parquet.gz'.format(id=id)
|
||||
try:
|
||||
shutil.rmtree(dirname)
|
||||
except OSError:
|
||||
try:
|
||||
os.remove(dirname)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
+6
-1
@@ -31,6 +31,12 @@ formaxlabels = axlabels.copy()
|
||||
formaxlabels.pop('None')
|
||||
parchoices = list(sorted(formaxlabels.items(), key = lambda x:x[1]))
|
||||
|
||||
class SurveyForm(forms.Form):
|
||||
surveydone = forms.ChoiceField(
|
||||
required=True,
|
||||
choices=(('YES','YES'),('NO','NO')),
|
||||
label='Will you take a 2 minute survey to help improve rowsandall?',
|
||||
widget = forms.RadioSelect)
|
||||
|
||||
class FlexibleDecimalField(forms.DecimalField):
|
||||
|
||||
@@ -115,7 +121,6 @@ class EmailForm(forms.Form):
|
||||
lastname = forms.CharField(max_length=255)
|
||||
email = forms.EmailField()
|
||||
subject = forms.CharField(max_length=255)
|
||||
botcheck = forms.CharField(max_length=5)
|
||||
message = forms.CharField()
|
||||
|
||||
disqualificationreasons = (
|
||||
|
||||
@@ -86,6 +86,7 @@ def rdata(file, rower=rrower()):
|
||||
def make_new_workout_from_email(rower, datafile, name, cntr=0,testing=False):
|
||||
""" This one is used in processemail """
|
||||
workouttype = 'rower'
|
||||
impeller = False
|
||||
|
||||
try:
|
||||
datafilename = datafile.name
|
||||
@@ -139,7 +140,7 @@ def make_new_workout_from_email(rower, datafile, name, cntr=0,testing=False):
|
||||
if fileformat == 'att':
|
||||
return 0
|
||||
if fileformat != 'csv':
|
||||
filename_mediadir, summary, oarlength, inboard,fileformat = dataprep.handle_nonpainsled(
|
||||
filename_mediadir, summary, oarlength, inboard,fileformat,impeller = dataprep.handle_nonpainsled(
|
||||
'media/' + datafilename, fileformat, summary)
|
||||
if not filename_mediadir:
|
||||
return 0
|
||||
@@ -181,7 +182,7 @@ def make_new_workout_from_email(rower, datafile, name, cntr=0,testing=False):
|
||||
oarlength=oarlength,
|
||||
title=name,
|
||||
workoutsource=fileformat,
|
||||
notes=''
|
||||
notes='',impeller=impeller,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class Command(BaseCommand):
|
||||
|
||||
# advance next_run
|
||||
if not testing:
|
||||
alert.next_run = datetime.date.today() + datetime.timedelta(days=alert.period)
|
||||
alert.next_run = datetime.date.today() + datetime.timedelta(days=alert.period-1)
|
||||
alert.save()
|
||||
|
||||
if testing:
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ from math import log10
|
||||
|
||||
nometrics = [
|
||||
'originalvelo',
|
||||
'cumdist',
|
||||
# 'cumdist',
|
||||
'strokes_slsh_min',
|
||||
' WorkPerStroke (joules)',
|
||||
' activityIdx',
|
||||
@@ -258,7 +258,7 @@ rowingmetrics = (
|
||||
'ax_min': 0,
|
||||
'ax_max': 30,
|
||||
'default': 0,
|
||||
'sigfigs': 0,
|
||||
'sigfigs': 1,
|
||||
'mode':'water',
|
||||
'type': 'pro',
|
||||
'group': 'stroke'}),
|
||||
|
||||
+21
-1
@@ -1,4 +1,3 @@
|
||||
|
||||
from django.utils import timezone
|
||||
from rowers.models import Workout, PowerTimeFitnessMetric, Rower, PaidPlan
|
||||
import datetime
|
||||
@@ -98,8 +97,29 @@ allowed_paths = [
|
||||
'/rowers/me/gdpr-optin-confirm'
|
||||
'/rowers/exportallworkouts/',
|
||||
'/rowers/exportallworkouts',
|
||||
'/rowers/survey/'
|
||||
]
|
||||
|
||||
class SurveyMiddleWare(object):
|
||||
def __init__(self, get_response):
|
||||
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)
|
||||
nexturl = request.path
|
||||
if 'survey' in nexturl:
|
||||
nexturl = '/rowers/list-workouts'
|
||||
mustseesurvey = request.user.date_joined <= timezone.now()-datetime.timedelta(days=14) and not r.surveydone
|
||||
if mustseesurvey:
|
||||
return redirect(
|
||||
'/rowers/survey/?next=%s' % nexturl
|
||||
)
|
||||
|
||||
response = self.get_response(request)
|
||||
|
||||
return response
|
||||
|
||||
class GDPRMiddleWare(object):
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
+6
-3
@@ -730,6 +730,8 @@ class Rower(models.Model):
|
||||
# Privacy Data
|
||||
gdproptin = models.BooleanField(default=False)
|
||||
gdproptindate = models.DateTimeField(blank=True,null=True)
|
||||
surveydone = models.BooleanField(default=False)
|
||||
surveydonedate = models.DateTimeField(blank=True,null=True)
|
||||
|
||||
|
||||
# Heart Rate Zone data
|
||||
@@ -2734,6 +2736,7 @@ class Workout(models.Model):
|
||||
choices=privacychoices)
|
||||
rankingpiece = models.BooleanField(default=False,verbose_name='Ranking Piece')
|
||||
duplicate = models.BooleanField(default=False,verbose_name='Duplicate Workout')
|
||||
impeller = models.BooleanField(default=False,verbose_name='Impeller')
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
user = self.user
|
||||
@@ -3202,12 +3205,12 @@ class WorkoutForm(ModelForm):
|
||||
|
||||
# Used for the rowing physics calculations
|
||||
class AdvancedWorkoutForm(ModelForm):
|
||||
quick_calc = forms.BooleanField(initial=True,required=False)
|
||||
go_service = forms.BooleanField(initial=False,required=False,label='Experimental')
|
||||
#quick_calc = forms.BooleanField(initial=True,required=False)
|
||||
#go_service = forms.BooleanField(initial=False,required=False,label='Experimental')
|
||||
|
||||
class Meta:
|
||||
model = Workout
|
||||
fields = ['boattype','weightvalue','quick_calc']
|
||||
fields = ['boattype','weightvalue']
|
||||
|
||||
class RowerExportForm(ModelForm):
|
||||
class Meta:
|
||||
|
||||
@@ -706,6 +706,7 @@ def get_team(request):
|
||||
def get_dates_timeperiod(request,startdatestring='',enddatestring='',
|
||||
defaulttimeperiod='thisweek'):
|
||||
# set start end date according timeperiod
|
||||
# should always return datetime.date
|
||||
|
||||
timeperiod = request.GET.get('when')
|
||||
|
||||
@@ -720,8 +721,8 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
|
||||
startdate = dt.datetime.strptime(startdatestring,'%Y-%m-%d').date()
|
||||
enddate = dt.datetime.strptime(enddatestring,'%Y-%m-%d').date()
|
||||
except ValueError:
|
||||
startdate = parser.parse(startdatestring,fuzzy=True)
|
||||
enddate = parser.parse(enddatestring, fuzzy=True)
|
||||
startdate = parser.parse(startdatestring,fuzzy=True).date()
|
||||
enddate = parser.parse(enddatestring, fuzzy=True).date()
|
||||
|
||||
return startdate,enddate
|
||||
|
||||
|
||||
+4
-10
@@ -1465,19 +1465,11 @@ def handle_otwsetpower(self,f1, boattype, weightvalue,
|
||||
else:
|
||||
debug = False
|
||||
|
||||
if 'quick_calc' in kwargs:
|
||||
usetable = kwargs['quick_calc']
|
||||
else:
|
||||
usetable = False
|
||||
|
||||
if 'go_service' in kwargs:
|
||||
goservice = kwargs['go_service']
|
||||
else:
|
||||
goservice = False
|
||||
|
||||
kwargs['jobid'] = job_id
|
||||
|
||||
|
||||
|
||||
|
||||
weightvalue = float(weightvalue)
|
||||
|
||||
# check what the real file name is
|
||||
@@ -1518,6 +1510,8 @@ def handle_otwsetpower(self,f1, boattype, weightvalue,
|
||||
progressurl += "/rowers/record-progress/"
|
||||
progressurl += job_id+'/'
|
||||
|
||||
goservice = True
|
||||
|
||||
if goservice:
|
||||
# do something (this should return from go service)
|
||||
with grpc.insecure_channel(
|
||||
|
||||
+112
-93
@@ -3,115 +3,134 @@
|
||||
{% block main %}
|
||||
<h1>Contact us through email</h1>
|
||||
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
<li class="grid_2">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<form method="post" action="/rowers/email/send/">{% csrf_token %}
|
||||
<table>
|
||||
<tr><td>
|
||||
<label class="label">Name <span class="required">*</span></label>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "firstname" class="inputtext" maxlength="255" size="12" />
|
||||
<label class="spanlabel">First</label>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
</span>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "lastname" class="inputtext" maxlength="255" size="18" />
|
||||
<label class="spanlabel">Last</label>
|
||||
</span>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Email Address <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="email" class="inputtext" type="text" maxlength="255" size="35" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Subject <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="subject" class="inputtext" type="text" maxlength="255" size="45" />
|
||||
</td></tr>
|
||||
</table>
|
||||
<label class="label">You must answer <u>YES</u> to the question below to approve sending this email. <span class="required">*</span></label>
|
||||
<table>
|
||||
<tr><td>
|
||||
Do you want to send me an email?
|
||||
</td><td>
|
||||
<input name="botcheck" class="inputtext" type="text" maxlength="5" size="5" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Message <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<input type="submit" name="submitform" value="Send Message" />
|
||||
</td></tr>
|
||||
</table>
|
||||
</form>
|
||||
<form method="post" action="/rowers/email/send/" id="contactform">{% csrf_token %}
|
||||
<p>
|
||||
<table>
|
||||
<tr><td>
|
||||
<label>Name <span class="required">*</span></label>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "firstname" class="inputtext" maxlength="255" size="12" />
|
||||
<label>First</label>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
</span>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "lastname" class="inputtext" maxlength="255" size="18" />
|
||||
<label>Last</label>
|
||||
</span>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label>Email Address <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="email" class="inputtext" type="text" maxlength="255" size="35" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label>Subject <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="subject" class="inputtext" type="text" maxlength="255" size="45" />
|
||||
</td></tr>
|
||||
</table>
|
||||
<table>
|
||||
<input type="hidden" name="g-recaptcha-response" id='recaptcha'>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label>Message <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<input type="submit" name="submitform" value="Send Message" />
|
||||
</td></tr>
|
||||
</table>
|
||||
</p>
|
||||
</form>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Bug reporting, feature requests</h1>
|
||||
<h1>Bug reporting, feature requests</h1>
|
||||
|
||||
<p>
|
||||
Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request.
|
||||
<ul>
|
||||
<li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request.
|
||||
<ul>
|
||||
<li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Facebook Group</h1>
|
||||
<h1>Facebook Group</h1>
|
||||
|
||||
<p>We run a facebook group where you can post questions and report problems,
|
||||
especially if you think the wider user community benefits from the answers.</p>
|
||||
<ul>
|
||||
<li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<p>We run a facebook group where you can post questions and report problems,
|
||||
especially if you think the wider user community benefits from the answers.</p>
|
||||
<ul>
|
||||
<li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Twitter</h1>
|
||||
<li class="grid_2">
|
||||
<h1>Twitter</h1>
|
||||
|
||||
<p>You can also check me on Twitter:
|
||||
<ul>
|
||||
<li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a>
|
||||
</ul>
|
||||
When the site is down, this is the appropriate channel to look for apologies, updates, and offer help.
|
||||
</p>
|
||||
</li>
|
||||
<p>You can also check me on Twitter:
|
||||
<ul>
|
||||
<li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a>
|
||||
</ul>
|
||||
When the site is down, this is the appropriate channel to look for apologies, updates, and offer help.
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Rowsandall s.r.o.</h1>
|
||||
<li class="grid_2">
|
||||
<h1>Rowsandall s.r.o.</h1>
|
||||
|
||||
<p><strong>Rowsandall s.r.o.</strong><br />
|
||||
Nové sady 988/2<br />
|
||||
602 00 Brno<br />
|
||||
Czech Republic<br />
|
||||
IČ: 070 48 572<br />
|
||||
DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br />
|
||||
Datová schránka: 7897syr<br />
|
||||
Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br />
|
||||
The company is registered in the business register at the
|
||||
Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/>
|
||||
</p>
|
||||
<p><strong>Rowsandall s.r.o.</strong><br />
|
||||
Nové sady 988/2<br />
|
||||
602 00 Brno<br />
|
||||
Czech Republic<br />
|
||||
IČ: 070 48 572<br />
|
||||
DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br />
|
||||
Datová schránka: 7897syr<br />
|
||||
Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br />
|
||||
The company is registered in the business register at the
|
||||
Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/>
|
||||
</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script src="https://www.google.com/recaptcha/api.js?render=6LdRtMwUAAAAAGcKcFc28pGvmEb1wwDY27i0AX8B"></script>
|
||||
<script>
|
||||
// 3
|
||||
grecaptcha.ready(function() {
|
||||
// 4
|
||||
$('#contactform').submit(function(e){
|
||||
var form = this;
|
||||
// 5
|
||||
e.preventDefault()
|
||||
grecaptcha.execute('6LdRtMwUAAAAAGcKcFc28pGvmEb1wwDY27i0AX8B', {action: 'contactform'}).then(function(token) {
|
||||
// 6
|
||||
$('#recaptcha').val(token)
|
||||
// 7
|
||||
form.submit()
|
||||
});
|
||||
})
|
||||
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
{% block meta %}
|
||||
{% leaflet_js %}
|
||||
{% leaflet_css %}
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<script type="text/javascript" src="{% static 'js/videogauges.js' %}"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js"></script>
|
||||
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
@@ -38,6 +40,10 @@
|
||||
$(this).removeAttr('disabled');
|
||||
});
|
||||
});
|
||||
document.getElementById("smallscreen").style.display = "none";
|
||||
if ($(window).width() <= 950) {
|
||||
$("#smallscreen").show()
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
@@ -102,6 +108,12 @@ function copyText() {
|
||||
{% language 'en' %}
|
||||
<h1>Video Analysis for {{ workout.name }}</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4" id="smallscreen">
|
||||
<p>Your screen is too small to show the full functionality. Click
|
||||
<a href="/rowers/video/{{ analysis.id|encode }}/m">here</a>
|
||||
to get to a version that is better suited for small screens.
|
||||
</p>
|
||||
</li>
|
||||
{% if user.is_authenticated and user == workout.user.user and not locked %}
|
||||
<li class="grid_2">
|
||||
<p>Paste link to you tube video below</p>
|
||||
@@ -252,7 +264,7 @@ function copyText() {
|
||||
// catchangle = ctch[Math.round(datatime)];
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[Math.round(datatime)];
|
||||
// console.log(datatime,{{ id }}_now, "{{ metric.name }}")
|
||||
// console.log(datatime,{{ id }},{{ id }}_now, "{{ metric.name }}")
|
||||
{% endfor %}
|
||||
|
||||
|
||||
@@ -270,7 +282,9 @@ function copyText() {
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
@@ -370,13 +384,36 @@ function copyText() {
|
||||
</span> {{ metric.unit }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% for group in metricsgroups %}
|
||||
<li class="grid_2">
|
||||
<canvas id="{{ group }}"></canvas>
|
||||
</ul>
|
||||
<ul class="main-content">
|
||||
{% if 'basic' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="basic_spm"></div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
<li class="grid_1">
|
||||
<div id="basic_boatspeed"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'forcepower' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="forcepower_power"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'athlete' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="athlete_hr"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'stroke' in metricsgroups %}
|
||||
{% if workout.workouttype == 'water' %}
|
||||
<li class="grid_2" style="height:500px">
|
||||
<div style="width:100%;height:70%;" id="stroke_angles"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
{% if analysis and user.is_authenticated and user == analysis.workout.user.user %}
|
||||
<p>
|
||||
@@ -384,12 +421,88 @@ function copyText() {
|
||||
</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>We're building Gauges to show the video data based on the
|
||||
<a href="https://developers.google.com/chart">Google charts API</a>.
|
||||
You can contribute by developing your own gauge in
|
||||
<a href="https://jsfiddle.net/">JSFiddle</a> like
|
||||
<a href="https://jsfiddle.net/roosendaalsander/5xrez3bu/">this example</a>.
|
||||
Please send us the link to the JSFiddle example by email using the
|
||||
<a href="/rowers/email/">Contact Form</a> and we'll discuss the possibilities
|
||||
with you.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
<p> </p>
|
||||
|
||||
<script>
|
||||
$(document).ready( function() {
|
||||
$(window).load(function() {
|
||||
// initialize data fields
|
||||
console.log('initializing first value of data');
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[0];
|
||||
document.getElementById("{{ id }}").innerHTML = {{ id }}_now;
|
||||
document.getElementById("{{ id }}").className = 'bold';
|
||||
{% endfor %}
|
||||
document.getElementById("time").innerHTML = Math.round(videotime);
|
||||
var slider = document.getElementById("myRange");
|
||||
document.getElementById("datatime").innerHTML = slider.value;
|
||||
|
||||
// gauge settings
|
||||
{% if workout.workouttype != 'water' %}
|
||||
speedoptions.max = 7;
|
||||
speedoptions.redTo = 7;
|
||||
speedoptions.majorTicks = ['0','1','2','3','4','5','6','7'];
|
||||
{% endif %}
|
||||
|
||||
{% if 'basic' in metricsgroups %}
|
||||
spm_now = spm_values[0];
|
||||
boatspeed_now = boatspeed_values[0];
|
||||
set_basic();
|
||||
{% endif %}
|
||||
{% if 'forcepower' in metricsgroups %}
|
||||
poweroptions.max = {{ workout.user.pw_an|add:100|round100 }};
|
||||
poweroptions.greenFrom = {{ workout.user.pw_ut2 }};
|
||||
poweroptions.greenTo = {{ workout.user.pw_at }};
|
||||
poweroptions.yellowFrom = {{ workout.user.pw_at }};
|
||||
poweroptions.yellowTo = {{ workout.user.pw_an }};
|
||||
poweroptions.redFrom = {{ workout.user.pw_an }};
|
||||
poweroptions.redTo = {{ workout.user.pw_an|add:100|round100 }};
|
||||
poweroptions.majorTicks = {{ workout.user.pw_an|add:100|round100|majorticks }};
|
||||
{% if workout.workouttype == 'water' %}
|
||||
poweroptions.max = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100 }}
|
||||
poweroptions.greenFrom = {{ workout.user.pw_ut2|waterpower:workout.user }};
|
||||
poweroptions.greenTo = {{ workout.user.pw_at|waterpower:workout.user }};
|
||||
poweroptions.yellowFrom = {{ workout.user.pw_at|waterpower:workout.user }};
|
||||
poweroptions.yellowTo = {{ workout.user.pw_an|waterpower:workout.user }};
|
||||
poweroptions.redFrom = {{ workout.user.pw_an|waterpower:workout.user }};
|
||||
poweroptions.redTo = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100 }};
|
||||
poweroptions.majorTicks = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100|majorticks }};
|
||||
{% endif %}
|
||||
power_now = power_values[0];
|
||||
set_forcepower();
|
||||
{% endif %}
|
||||
{% if 'athlete' in metricsgroups %}
|
||||
hroptions.max = {{ workout.user.max|round20 }}
|
||||
hroptions.greenFrom = {{ workout.user.ut2 }}
|
||||
hroptions.greenTo = {{ workout.user.at }}
|
||||
hroptions.yellowFrom = {{ workout.user.at }}
|
||||
hroptions.yellowTo = {{ workout.user.an }}
|
||||
hroptions.redFrom = {{ workout.user.an }}
|
||||
hroptions.redTo = {{ workout.user.max }}
|
||||
hroptions.majorTicks = {{ workout.user.max|round20|hrmajorticks:workout.user.rest }}
|
||||
hr_now = hr_values[0];
|
||||
set_athlete();
|
||||
{% endif %}
|
||||
{% if 'stroke' in metricsgroups %}
|
||||
{% if workout.workouttype == 'water' %}
|
||||
anglesoptions.PieStartAngle = 90+catch_now;
|
||||
set_stroke();
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
// cookie reader
|
||||
function createCookie(name,value,days) {
|
||||
if (days) {
|
||||
@@ -496,7 +609,8 @@ function copyText() {
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
@@ -563,7 +677,9 @@ function copyText() {
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
@@ -691,6 +807,7 @@ dataplay.onclick = function() {
|
||||
// }
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endlanguage %}
|
||||
|
||||
|
||||
@@ -0,0 +1,689 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% load i18n %}
|
||||
{% load leaflet_tags %}
|
||||
|
||||
|
||||
|
||||
{% block title %}Workout Video{% endblock %}
|
||||
{% block og_title %}{{ analysis.name }}{% endblock %}
|
||||
{% block description %}Rowing Video Analysis:{{ analysis.name }}{% endblock %}
|
||||
{% block og_description %}Rowing Video Analysis:{{ analysis.name }}{% endblock %}
|
||||
{% block og_image %}
|
||||
{% if analysis %}
|
||||
<meta property="og:image" content="https://img.youtube.com/vi/{{ analysis.video_id }}/hqdefault.jpg" />
|
||||
<meta property="og:image:secure_url" content="https://img.youtube.com/vi/{{ analysis.video_id }}/hqdefault.jpg" />
|
||||
{% else %}
|
||||
<meta property="og:image" content="http://rowsandall.com/static/img/logo_r.png" />
|
||||
<meta property="og:image:secure_url" content="https://rowsandall.com/static/img/logo_r.png" />
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% if analysis %}
|
||||
{% block image_src %}
|
||||
<link rel="image_src" href="https://img.youtube.com/vi/{{ analysis.video_id }}/hqdefault.jpg" />
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
|
||||
{% block meta %}
|
||||
{% leaflet_js %}
|
||||
{% leaflet_css %}
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<script type="text/javascript" src="{% static 'js/videogauges.js' %}"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js"></script>
|
||||
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('form').submit(function(e) {
|
||||
$(':disabled').each(function(e) {
|
||||
$(this).removeAttr('disabled');
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
function copyText() {
|
||||
var tempInput = document.createElement("input");
|
||||
tempInput.style = "position: absolute; left: -1000px; top: -1000px";
|
||||
tempInput.value = "{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/m/";
|
||||
document.body.appendChild(tempInput);
|
||||
tempInput.select();
|
||||
document.execCommand("copy");
|
||||
alert("Copied to clipboard: " + tempInput.value);
|
||||
document.body.removeChild(tempInput);
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
|
||||
<style>
|
||||
.slidecontainer {
|
||||
width: 100%; /* Width of the outside container */
|
||||
}
|
||||
|
||||
.bold { font-weight: bold; }
|
||||
|
||||
/* The slider itself */
|
||||
.slider {
|
||||
-webkit-appearance: none; /* Override default CSS styles */
|
||||
appearance: none;
|
||||
width: 100%; /* Full-width */
|
||||
height: 25px; /* Specified height */
|
||||
background: #d3d3d3; /* Grey background */
|
||||
outline: none; /* Remove outline */
|
||||
opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */
|
||||
-webkit-transition: .2s; /* 0.2 seconds transition on hover */
|
||||
transition: opacity .2s;
|
||||
}
|
||||
|
||||
/* Mouse-over effects */
|
||||
.slider:hover {
|
||||
opacity: 1; /* Fully shown on mouse-over */
|
||||
}
|
||||
|
||||
/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */
|
||||
.slider::-webkit-slider-thumb {
|
||||
-webkit-appearance: none; /* Override default look */
|
||||
appearance: none;
|
||||
width: 25px; /* Set a specific slider handle width */
|
||||
height: 25px; /* Slider handle height */
|
||||
background: #4CAF50; /* Green background */
|
||||
cursor: pointer; /* Cursor on hover */
|
||||
}
|
||||
|
||||
.slider::-moz-range-thumb {
|
||||
width: 25px; /* Set a specific slider handle width */
|
||||
height: 25px; /* Slider handle height */
|
||||
background: #4CAF50; /* Green background */
|
||||
cursor: pointer; /* Cursor on hover */
|
||||
}
|
||||
</style>
|
||||
|
||||
{% language 'en' %}
|
||||
<h1>Video Analysis for {{ workout.name }}</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<p>Playing the video will advance the data in synchronization. Use the regular
|
||||
YouTube controls to move around in the video and play it.</p>
|
||||
<p>In this reduced view, you cannot edit the video analysis. There is a separate
|
||||
view for that <a href="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}">here</a>.
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<span class="fb-share-button" style="height:20px; vertical-align: top;"
|
||||
data-href="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/m/"
|
||||
data-layout="button" data-size="small" data-mobile-iframe="false">
|
||||
<a class="fb-xfbml-parse-ignore" target="_blank"
|
||||
href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/m/">
|
||||
Share</a>
|
||||
</span>
|
||||
<span>
|
||||
<a class="twitter-share-button"
|
||||
href="https://twitter.com/intent/tweet"
|
||||
data-url="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/m/"
|
||||
data-text="@rowsandall #rowingdata">Tweet</a>
|
||||
</span>
|
||||
<span>
|
||||
<button title="Copy Shareable Link" onclick="copyText()"
|
||||
style="color:#1c75bc;background:none;border:0;"><i class="fas fa-copy"></i></button>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="main-content">
|
||||
<li class="grid_3">
|
||||
<div id="theplot" class="flexplot mapdiv">
|
||||
{{ mapdiv | safe}}
|
||||
|
||||
</div>
|
||||
<div class="slidecontainer">
|
||||
<input type="range" min="0" max="{{ maxtime }}" value="{{ analysis.delay }}"
|
||||
id="myRange">
|
||||
</div>
|
||||
<div id="dataplay"></div>
|
||||
<!-- <div id="datastop"></div> -->
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<div id="player"></div>
|
||||
<script>
|
||||
// 1. Code for the map
|
||||
{{ mapscript | safe }}
|
||||
|
||||
|
||||
// 2. This code loads the IFrame Player API code asynchronously.
|
||||
var tag = document.createElement('script');
|
||||
|
||||
tag.src = "https://www.youtube.com/iframe_api";
|
||||
tag.removeAttribute('allowfullscreen');
|
||||
tag.setAttribute('donotallowfullscreen','')
|
||||
tag.setAttribute('playsinline','1')
|
||||
var firstScriptTag = document.getElementsByTagName('script')[0];
|
||||
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
||||
|
||||
// 3. This function creates an <iframe> (and YouTube player)
|
||||
// after the API code downloads.
|
||||
var player;
|
||||
var playing = false;
|
||||
var dataplaying = false;
|
||||
|
||||
var videotime = 0;
|
||||
var data = JSON.parse('{{ data|safe }}');
|
||||
{% for id, metric in metrics.items %}
|
||||
var {{ id }}_values = data["{{ id }}"];
|
||||
// console.log("{{ id }}_values",{{ id }}_values);
|
||||
{% endfor %}
|
||||
// var boatspeed = data["boatspeed"];
|
||||
var latitude = data["latitude"];
|
||||
var longitude = data["longitude"];
|
||||
// var spm = data["spm"];
|
||||
// var ctch = data["catch"];
|
||||
|
||||
function onYouTubeIframeAPIReady() {
|
||||
player = new YT.Player('player', {
|
||||
height: '315',
|
||||
width: '560',
|
||||
modestbranding: '1',
|
||||
playerVars: {'playsinline':'1'},
|
||||
videoId: '{{ video_id }}',
|
||||
events: {
|
||||
'onReady': onPlayerReady,
|
||||
'onStateChange': onPlayerStateChange
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 4. The API will call this function when the video player is ready.
|
||||
function onPlayerReady(event) {
|
||||
// event.target.playVideo();
|
||||
|
||||
|
||||
}
|
||||
|
||||
function updateTime() {
|
||||
var oldTime = videotime;
|
||||
var slider = document.getElementById("myRange");
|
||||
var lock = document.getElementById("lock");
|
||||
if(player && player.getCurrentTime) {
|
||||
videotime = player.getCurrentTime();
|
||||
var delay = document.getElementById("id_delay").value;
|
||||
if (lock.checked) {
|
||||
sliderpos = Math.round(videotime) + Math.round(delay);
|
||||
slider.value = sliderpos;
|
||||
}
|
||||
|
||||
|
||||
// gauge.set(catch_now);
|
||||
|
||||
}
|
||||
if(videotime !== oldTime) {
|
||||
onProgress(videotime);
|
||||
}
|
||||
}
|
||||
|
||||
timeupdater = setInterval(updateTime, 1000);
|
||||
|
||||
// when the time changes, this will be called.
|
||||
function onProgress(currentTime) {
|
||||
var slider = document.getElementById("myRange");
|
||||
var lock = document.getElementById("lock");
|
||||
videotime = player.getCurrentTime();
|
||||
var delay = document.getElementById("id_delay").value;
|
||||
var output = document.getElementById("id_delay");
|
||||
datatime = slider.value;
|
||||
|
||||
if (lock.checked) {
|
||||
if (!dataplaying) { // set data values
|
||||
sliderpos = Math.round(videotime) + Math.round(delay);
|
||||
slider.value = sliderpos;
|
||||
|
||||
// Setting Data
|
||||
// velo = boatspeed[Math.round(datatime)];
|
||||
lat = latitude[Math.round(datatime)];
|
||||
lon = longitude[Math.round(datatime)];
|
||||
// strokerate = spm[Math.round(datatime)];
|
||||
// catchangle = ctch[Math.round(datatime)];
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[Math.round(datatime)];
|
||||
// console.log(datatime,{{ id }},{{ id }}_now, "{{ metric.name }}")
|
||||
{% endfor %}
|
||||
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
// console.log(newLatLng);
|
||||
marker.setLatLng(newLatLng);
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
if (!dataplaying) {
|
||||
output.value = Math.round(datatime)-Math.round(videotime);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function stopVideo() {
|
||||
player.pauseVideo();
|
||||
playing = false;
|
||||
}
|
||||
|
||||
// call this function when player state changes
|
||||
function onPlayerStateChange(event) {
|
||||
if (event.data == YT.PlayerState.PLAYING && lock.checked) {
|
||||
var dataplay = document.getElementById("dataplay").childNodes[0];
|
||||
dataplay.value = String.fromCharCode(10074,10074);
|
||||
} else if (lock.checked) {
|
||||
var dataplay = document.getElementById("dataplay").childNodes[0];
|
||||
dataplay.value = String.fromCharCode(9658);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<input type="hidden" name="lock" id="lock" value="Lock">
|
||||
</li>
|
||||
</ul>
|
||||
<p> </p>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<input type="hidden" id="id_delay" value="{{ analysis.delay }}">
|
||||
</li>
|
||||
|
||||
<li class="grid_4" >
|
||||
<ul class="main-content">
|
||||
{% if 'basic' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="basic_spm"></div>
|
||||
</li>
|
||||
<li class="grid_1">
|
||||
<div id="basic_boatspeed"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'forcepower' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="forcepower_power"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'athlete' in metricsgroups %}
|
||||
<li class="grid_1">
|
||||
<div id="athlete_hr"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if 'stroke' in metricsgroups %}
|
||||
{% if workout.workouttype == 'water' %}
|
||||
<li class="grid_1" style="height:500px">
|
||||
<div style="width:100%;height:70%;" id="stroke_angles"></div>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
<p> </p>
|
||||
|
||||
<script>
|
||||
$(document).ready( function() {
|
||||
$(window).load(function() {
|
||||
// initialize data fields
|
||||
console.log('initializing first value of data');
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[0];
|
||||
|
||||
{% endfor %}
|
||||
|
||||
var slider = document.getElementById("myRange");
|
||||
|
||||
|
||||
// gauge settings
|
||||
{% if workout.workouttype != 'water' %}
|
||||
speedoptions.max = 7;
|
||||
speedoptions.redTo = 7;
|
||||
speedoptions.majorTicks = ['0','1','2','3','4','5','6','7'];
|
||||
{% endif %}
|
||||
|
||||
{% if 'basic' in metricsgroups %}
|
||||
spm_now = spm_values[0];
|
||||
boatspeed_now = boatspeed_values[0];
|
||||
set_basic();
|
||||
{% endif %}
|
||||
{% if 'forcepower' in metricsgroups %}
|
||||
poweroptions.max = {{ workout.user.pw_an|add:100|round100 }};
|
||||
poweroptions.greenFrom = {{ workout.user.pw_ut2 }};
|
||||
poweroptions.greenTo = {{ workout.user.pw_at }};
|
||||
poweroptions.yellowFrom = {{ workout.user.pw_at }};
|
||||
poweroptions.yellowTo = {{ workout.user.pw_an }};
|
||||
poweroptions.redFrom = {{ workout.user.pw_an }};
|
||||
poweroptions.redTo = {{ workout.user.pw_an|add:100|round100 }};
|
||||
poweroptions.majorTicks = {{ workout.user.pw_an|add:100|round100|majorticks }};
|
||||
{% if workout.workouttype == 'water' %}
|
||||
poweroptions.max = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100 }}
|
||||
poweroptions.greenFrom = {{ workout.user.pw_ut2|waterpower:workout.user }};
|
||||
poweroptions.greenTo = {{ workout.user.pw_at|waterpower:workout.user }};
|
||||
poweroptions.yellowFrom = {{ workout.user.pw_at|waterpower:workout.user }};
|
||||
poweroptions.yellowTo = {{ workout.user.pw_an|waterpower:workout.user }};
|
||||
poweroptions.redFrom = {{ workout.user.pw_an|waterpower:workout.user }};
|
||||
poweroptions.redTo = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100 }};
|
||||
poweroptions.majorTicks = {{ workout.user.pw_an|waterpower:workout.user|add:100|round100|majorticks }};
|
||||
{% endif %}
|
||||
power_now = power_values[0];
|
||||
set_forcepower();
|
||||
{% endif %}
|
||||
{% if 'athlete' in metricsgroups %}
|
||||
hroptions.max = {{ workout.user.max|round20 }}
|
||||
hroptions.greenFrom = {{ workout.user.ut2 }}
|
||||
hroptions.greenTo = {{ workout.user.at }}
|
||||
hroptions.yellowFrom = {{ workout.user.at }}
|
||||
hroptions.yellowTo = {{ workout.user.an }}
|
||||
hroptions.redFrom = {{ workout.user.an }}
|
||||
hroptions.redTo = {{ workout.user.max }}
|
||||
hroptions.majorTicks = {{ workout.user.max|round20|hrmajorticks:workout.user.rest }}
|
||||
hr_now = hr_values[0];
|
||||
set_athlete();
|
||||
{% endif %}
|
||||
{% if 'stroke' in metricsgroups %}
|
||||
{% if workout.workouttype == 'water' %}
|
||||
anglesoptions.PieStartAngle = 90+catch_now;
|
||||
set_stroke();
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
// cookie reader
|
||||
function createCookie(name,value,days) {
|
||||
if (days) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime()+(days*24*60*60*1000));
|
||||
var expires = "; expires="+date.toGMTString();
|
||||
}
|
||||
else var expires = "";
|
||||
document.cookie = name+"="+value+expires+"; path=/";
|
||||
}
|
||||
function readCookie(name) {
|
||||
var nameEQ = name + "=";
|
||||
var ca = document.cookie.split(';');
|
||||
for(var i=0;i < ca.length;i++) {
|
||||
var c = ca[i];
|
||||
while (c.charAt(0)==' ') c = c.substring(1,c.length);
|
||||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// lock
|
||||
var lock = document.getElementById("lock");
|
||||
var output = document.getElementById("id_delay");
|
||||
var cookie = readCookie("lock{{ workout.id }}");
|
||||
var delay = output.value;
|
||||
if (cookie=="true") {
|
||||
lock.checked = true;
|
||||
output.disabled = true;
|
||||
}
|
||||
|
||||
// lock.onchange nog doen
|
||||
|
||||
{% if locked %}
|
||||
lock.checked = true;
|
||||
output.disabled = true;
|
||||
{% endif %}
|
||||
|
||||
|
||||
// slider
|
||||
var slider = document.getElementById("myRange");
|
||||
{% if user.is_authenticated and user == workout.user.user %}
|
||||
document.getElementById("myRange").style.display = "block";
|
||||
{% else %}
|
||||
document.getElementById("myRange").style.display = "none";
|
||||
{% endif %}
|
||||
var output = document.getElementById("id_delay");
|
||||
|
||||
// Update the current slider value (each time you drag the slider handle)
|
||||
slider.oninput = function() {
|
||||
if (!lock.checked) {
|
||||
try {
|
||||
|
||||
delay = Math.round(slider.value)-Math.round(player.getCurrentTime());
|
||||
output.value = Math.round(slider.value)-Math.round(player.getCurrentTime()); // Display the default slider value
|
||||
}
|
||||
catch(err) {
|
||||
output.value = Math.round(slider.value);
|
||||
delay = Math.round(slider.value);
|
||||
}
|
||||
}
|
||||
clearInterval(timeupdater);
|
||||
var datatime = this.value
|
||||
var videotime = Math.round(player.getCurrentTime());
|
||||
if (lock.checked) {
|
||||
if (this.value-output.value > 0) {
|
||||
player.seekTo(this.value-output.value);
|
||||
videotime = this.value-output.value;
|
||||
} else {
|
||||
if (playing && !dataplaying) {
|
||||
player.seekTo(0);
|
||||
player.playVideo();
|
||||
}
|
||||
else if (!playing && !dataplaying) {
|
||||
player.seekTo(0);
|
||||
player.pauseVideo();
|
||||
playing = false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// console.log('changing, not checked');
|
||||
output.value = this.value-Math.round(player.getCurrentTime());
|
||||
}
|
||||
|
||||
// Setting Data
|
||||
// velo = boatspeed[Math.round(datatime)];
|
||||
lat = latitude[Math.round(datatime)];
|
||||
lon = longitude[Math.round(datatime)];
|
||||
// strokerate = spm[Math.round(datatime)];
|
||||
// catchangle = ctch[Math.round(datatime)];
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[Math.round(datatime)];
|
||||
// console.log(datatime,{{ id }}_now, "{{ metric.name }}")
|
||||
{% endfor %}
|
||||
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
// console.log(newLatLng);
|
||||
marker.setLatLng(newLatLng);
|
||||
} catch (e) {
|
||||
}
|
||||
timeupdater = setInterval(updateTime, 1000);
|
||||
}
|
||||
|
||||
output.oninput = function() {
|
||||
slider.value = this.value+Math.round(player.getCurrentTime());
|
||||
}
|
||||
|
||||
|
||||
// Update the current slider value (each time the slider is changed)
|
||||
slider.onchange = function() {
|
||||
clearInterval(timeupdater)
|
||||
if (lock.checked) {
|
||||
if (this.value-output.value > 0) {
|
||||
player.seekTo(this.value-output.value);
|
||||
if (playing) {
|
||||
player.playVideo();
|
||||
} else {
|
||||
player.pauseVideo();
|
||||
}
|
||||
} else {
|
||||
if (playing) {
|
||||
player.seekTo(0);
|
||||
player.playVideo();
|
||||
}
|
||||
else {
|
||||
player.seekTo(0);
|
||||
player.pauseVideo();
|
||||
playing = false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
output.value = this.value-Math.round(player.getCurrentTime());
|
||||
}
|
||||
var datatime = this.value
|
||||
var videotime = Math.round(player.getCurrentTime());
|
||||
//
|
||||
// Setting Data
|
||||
// velo = boatspeed[Math.round(datatime)];
|
||||
lat = latitude[Math.round(datatime)];
|
||||
lon = longitude[Math.round(datatime)];
|
||||
// strokerate = spm[Math.round(datatime)];
|
||||
// catchangle = ctch[Math.round(datatime)];
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[Math.round(datatime)];
|
||||
// console.log(datatime,{{ id }}_now, "{{ metric.name }}")
|
||||
{% endfor %}
|
||||
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
// console.log(newLatLng);
|
||||
marker.setLatLng(newLatLng);
|
||||
} catch (e) {
|
||||
console.log('error')
|
||||
}
|
||||
console.log('changed all')
|
||||
timeupdater = setInterval(updateTime, 1000);
|
||||
}
|
||||
|
||||
output.oninput = function() {
|
||||
slider.value = this.value+Math.round(player.getCurrentTime());
|
||||
}
|
||||
|
||||
// lock delay form field if checkbox checked
|
||||
lock.oninput = function() {
|
||||
if (this.checked) {
|
||||
output.disabled = true;
|
||||
createCookie("lock{{ workout.id}}","true",0);
|
||||
} else {
|
||||
output.disabled = false;
|
||||
createCookie("lock{{ workout.id }}","false",0);
|
||||
}
|
||||
}
|
||||
// Slider start stop
|
||||
// moet de buttons pas hieronder definieren en dan in de html
|
||||
// pluggen
|
||||
var timer;
|
||||
|
||||
|
||||
function clock() {
|
||||
timer = setInterval(myClock, 1000);
|
||||
var c = parseInt(slider.value,10);
|
||||
console.log('starting clock');
|
||||
|
||||
function myClock() {
|
||||
c = c+1;
|
||||
slider.value = c;
|
||||
|
||||
// update data fields
|
||||
lat = latitude[Math.round(c)];
|
||||
lon = longitude[Math.round(c)];
|
||||
{% for id, metric in metrics.items %}
|
||||
{{ id }}_now = {{ id }}_values[Math.round(c)];
|
||||
// console.log(datatime,{{ id }}_now, "{{ metric.name }}")
|
||||
{% endfor %}
|
||||
|
||||
|
||||
{% for group in metricsgroups %}
|
||||
try {
|
||||
set_{{ group }}();
|
||||
} catch (e) {}
|
||||
{% endfor %}
|
||||
try {
|
||||
var newLatLng = new L.LatLng(lat, lon);
|
||||
// console.log(newLatLng);
|
||||
marker.setLatLng(newLatLng);
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
if (lock.checked) {
|
||||
player.seekTo(c+parseInt(output.value));
|
||||
} else {
|
||||
delay = Math.round(slider.value)-Math.round(player.getCurrentTime());
|
||||
output.value = Math.round(slider.value)-Math.round(player.getCurrentTime());
|
||||
}
|
||||
|
||||
if (c == latitude.length) {
|
||||
clearInterval(timer);
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// onderstaande alleen als lock.checked
|
||||
var dataplay = document.createElement("input");
|
||||
dataplay.type = "button";
|
||||
dataplay.value = String.fromCharCode(9658);
|
||||
document.getElementById("dataplay").appendChild(dataplay);
|
||||
|
||||
// var datastop = document.createElement("input");
|
||||
// datastop.type = "button";
|
||||
// datastop.value = "Stop";
|
||||
// document.getElementById("datastop").appendChild(datastop)
|
||||
|
||||
|
||||
|
||||
dataplay.onclick = function() {
|
||||
if (lock.checked) {
|
||||
dataplaying = false;
|
||||
if (playing == false) {
|
||||
player.playVideo();
|
||||
dataplay.value = String.fromCharCode(10074,10074);
|
||||
playing = true;
|
||||
} else {
|
||||
player.pauseVideo();
|
||||
dataplay.value = String.fromCharCode(9658);
|
||||
playing = false;
|
||||
}
|
||||
} else {
|
||||
if (!dataplaying) {
|
||||
clock();
|
||||
dataplay.value = String.fromCharCode(10074,10074);
|
||||
dataplaying = true;
|
||||
if (lock.checked) {
|
||||
playing = true;
|
||||
}
|
||||
} else {
|
||||
clearInterval(timer);
|
||||
dataplay.value = String.fromCharCode(9658);
|
||||
dataplaying = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endlanguage %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
@@ -287,10 +287,25 @@
|
||||
<i class="fas fa-calculator-alt fa-fw"></i> OTW Power
|
||||
</a>
|
||||
</li>
|
||||
{% if 'speedcoach2' in workout.workoutsource %}
|
||||
<li id="advanced-usegps">
|
||||
<a href="/rowers/workout/{{ workout.id|encode }}/otwusegps/">
|
||||
<i class="fas fa-satellite"></i>
|
||||
{% if workout.impeller %} {% else %}• {% endif %}Use GPS data
|
||||
</a>
|
||||
</li>
|
||||
<li id="advanced-useimpeller">
|
||||
<a href="/rowers/workout/{{ workout.id|encode }}/otwuseimpeller/">
|
||||
<i class="fas fa-wind-turbine fa-rotate-180"></i>
|
||||
{% if workout.impeller %}• {% else %} {% endif %}Use Impeller data
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<li id="advanced-instroke">
|
||||
<a href="/rowers/workout/{{ workout.id|encode }}/instroke/">
|
||||
<i class="fas fa-search-plus fa-fw"></i> In-Stroke Metrics
|
||||
<i class="fas fa-search-plus fa-fw"></i>
|
||||
In-Stroke Metrics
|
||||
</a>
|
||||
</li>
|
||||
<li id="advanced-recalcsummary">
|
||||
|
||||
@@ -7,6 +7,17 @@
|
||||
Thank you. We have received the payment of € {{ amount }} for Rowsandall related services.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With your contribution, you are helping to keep this service to the rowing community
|
||||
running. As the founder and developer of the Rowsandall.com site I am very interested
|
||||
to know what you think of Rowsandall.com, as well as suggestions for improvements.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
So don't hesitate to respond to this email and let me know. I will read and respond to each
|
||||
email.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Please contact our customer service by replying to this email if you have any further
|
||||
questions regarding the payment.
|
||||
@@ -16,4 +27,3 @@
|
||||
Best Regards, the Rowsandall Team
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
{% extends "emailbase.html" %}
|
||||
|
||||
{% block body %}
|
||||
<p>Dear <strong>{{ first_name }}</strong>,</p>
|
||||
|
||||
<p>
|
||||
Welcome on the trial for the Self-Coach plan.
|
||||
</p>
|
||||
<p>
|
||||
As the developer of the Rowsandall.com site I am very interested to know what you think of Rowsandall.com. Especially, I'd like to understand how you started using the site, what you are looking for, and what you think could be improved.
|
||||
</p>
|
||||
<p>
|
||||
The Self-Coach functionality allows you to create training plans and sessions for you and your training group. Feel free to contact me any time you need help.
|
||||
</p>
|
||||
<p>
|
||||
I'd also love to hear a bit about your rowing background.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
So don't hesitate to respond to this email and let me know. I will read and respond to each
|
||||
email.
|
||||
</p>
|
||||
<p>
|
||||
Thank you very much for your help and for supporting <a href="rowsandall.com">rowsandall.com</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
Best Regards, the Rowsandall Team
|
||||
</p>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,33 @@
|
||||
{% extends "emailbase.html" %}
|
||||
|
||||
{% block body %}
|
||||
<p>Dear <strong>{{ first_name }}</strong>,</p>
|
||||
|
||||
<p>
|
||||
Welcome on the trial for the Pro plan.
|
||||
</p>
|
||||
<p>
|
||||
As the developer of the Rowsandall.com site I am very interested to know
|
||||
what you think of Rowsandall.com.
|
||||
Especially, I'd like to understand how you started using the site,
|
||||
what you are looking for, and what you think could be improved.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I'd also love to hear a bit about your rowing background.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
So don't hesitate to respond to this email and let me know. I will read and respond to each
|
||||
email.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Thank you very much for your help and for supporting <a href="rowsandall.com">rowsandall.com</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
Best Regards, the Rowsandall Team
|
||||
</p>
|
||||
{% endblock %}
|
||||
@@ -9,8 +9,20 @@
|
||||
You are now on the Rowsandall paid plan "{{ planname }}".
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With your contribution, you are helping to keep this service to the rowing community
|
||||
running. As the founder and developer of the Rowsandall.com site I am very interested
|
||||
to know what you think of Rowsandall.com, as well as suggestions for improvements.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
So don't hesitate to respond to this email and let me know. I will read and respond to each
|
||||
email.
|
||||
</p>
|
||||
|
||||
{% if recurring=='recurring' %}
|
||||
<p>
|
||||
Some more information about the subscription.
|
||||
The subscription cost is €{{ price }} per year.
|
||||
Your next charge is due on {{ end_of_billing_period }}. We will charge you automatically
|
||||
on that date.
|
||||
@@ -60,4 +72,3 @@
|
||||
Best Regards, the Rowsandall Team
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}File loading{% endblock %}
|
||||
|
||||
{% block meta %}
|
||||
<script type='text/javascript'
|
||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
||||
</script>
|
||||
<script type='text/javascript'
|
||||
src='https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js'>
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
var frm = $("#surveyform")
|
||||
|
||||
frm.submit(function(e) {
|
||||
// e.preventDefault()
|
||||
const formData = new FormData(e.target);
|
||||
console.log(formData.get('surveydone'));
|
||||
if (formData.get('surveydone')=='YES') {
|
||||
var a = window.open('https://wp.me/P8g86e-Bs', "survey");
|
||||
a.focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<form enctype="multipart/form-data" method="post" id="surveyform">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<input type="submit" name="submit" value="SUBMIT">
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,48 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
|
||||
|
||||
{% block meta %}
|
||||
<script type='text/javascript'
|
||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
var frm = $("#surveyform")
|
||||
|
||||
frm.submit(function(e) {
|
||||
e.preventDefault()
|
||||
const formData = new FormData(e.target);
|
||||
console.log(formData);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block main %}
|
||||
|
||||
<ul class="main-content">
|
||||
<li>
|
||||
<form enctype="multipart/form-data" method="post" id="surveyform">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<input type="submit" name="submit" value="SUBMIT">
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
@@ -121,6 +121,45 @@ def is_coach(rower,rowers):
|
||||
|
||||
return True
|
||||
|
||||
@register.filter
|
||||
def waterpower(x,rower):
|
||||
if rower is not None:
|
||||
return int(x*(100-rower.otwslack)/100.)
|
||||
return int(x)
|
||||
|
||||
@register.filter
|
||||
def round20(x):
|
||||
try:
|
||||
return int(20.*(1+int(int(x)/20)))
|
||||
except ValueError:
|
||||
return 20
|
||||
|
||||
@register.filter
|
||||
def round100(x):
|
||||
try:
|
||||
return int(100.*(1+int(int(x)/100)))
|
||||
except ValueError:
|
||||
return 100
|
||||
|
||||
@register.filter
|
||||
def majorticks(maxval):
|
||||
ticks = range(1+int(maxval/100.))
|
||||
newticks =[]
|
||||
for t in ticks:
|
||||
newticks.append(t*100)
|
||||
|
||||
return newticks
|
||||
|
||||
@register.filter
|
||||
def hrmajorticks(maxval,minval):
|
||||
ticks = range(int((maxval-minval)/20.)-1)
|
||||
newticks =[]
|
||||
for t in ticks:
|
||||
newticks.append(100+t*20)
|
||||
|
||||
print(newticks)
|
||||
return newticks
|
||||
|
||||
def strfdeltah(tdelta):
|
||||
hours, rest = divmod(tdelta.seconds,3600)
|
||||
minutes,seconds = divmod(rest,60)
|
||||
@@ -762,6 +801,3 @@ def previousworkout(workout,user):
|
||||
return encoder.encode_hex(ws[0].id)
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class VirtualEventViewTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
self.c = Client()
|
||||
@@ -36,7 +36,7 @@ class VirtualEventViewTest(TestCase):
|
||||
|
||||
self.rpiet = Rower.objects.create(user=self.upiet,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.piet_workouts = WorkoutFactory.create_batch(5, user=self.rpiet)
|
||||
@@ -49,7 +49,7 @@ class VirtualEventViewTest(TestCase):
|
||||
|
||||
self.rklaas = Rower.objects.create(user=self.uklaas,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.klaas_workouts = WorkoutFactory.create_batch(5, user=self.rklaas)
|
||||
@@ -62,7 +62,7 @@ class VirtualEventViewTest(TestCase):
|
||||
|
||||
self.rhenk = Rower.objects.create(user=self.uhenk,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.henk_workouts = WorkoutFactory.create_batch(5, user=self.rhenk)
|
||||
@@ -851,4 +851,3 @@ class VirtualEventViewTest(TestCase):
|
||||
# standalone
|
||||
# calculate course adherence
|
||||
# other background jobs
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ class WorkoutCompareTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -81,7 +81,7 @@ class BoxPlotTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -179,7 +179,7 @@ class ListWorkoutTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -230,7 +230,7 @@ class PlannedSessionTests(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -281,7 +281,7 @@ class ForcecurveTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -317,7 +317,7 @@ class CumStatsTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -354,7 +354,7 @@ class CumFlexTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -459,7 +459,7 @@ class MultiFlexTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -561,7 +561,7 @@ class HistoTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -650,7 +650,7 @@ class WorkoutCompareTestNew(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -739,7 +739,7 @@ class WorkoutBoxPlotTestNew(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -827,7 +827,7 @@ class WorkoutHistoTestNew(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -915,7 +915,7 @@ class WorkoutFlexallTestNew(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -1003,7 +1003,7 @@ class WorkoutStatsTestNew(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -1134,4 +1134,3 @@ class WorkoutStatsTestNew(TestCase):
|
||||
response = self.c.post('/rowers/user-analysis-select/',form_data)
|
||||
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class WorkoutViewTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -611,4 +611,3 @@ class WorkoutViewTest(TestCase):
|
||||
self.assertRedirects(response,
|
||||
expected_url=expected_url,
|
||||
status_code=302,target_status_code=200)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class SimpleViewTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
@@ -59,4 +59,3 @@ class SimpleViewTest(TestCase):
|
||||
self.assertRedirects(response,
|
||||
expected_url='/rowers/list-workouts/',
|
||||
status_code=302,target_status_code=200)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class CoursesTest(TestCase):
|
||||
self.u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
)
|
||||
@@ -78,4 +78,3 @@ class CoursesTest(TestCase):
|
||||
response.get('Content-Disposition'),
|
||||
'attachment; filename="course_1.kml"'
|
||||
)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ class OTWCPChartTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,sex='male',
|
||||
gdproptin=True,surveydone=True,sex='male',
|
||||
weightcategory='hwt',
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
@@ -113,7 +113,7 @@ class CPChartTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,sex='male',
|
||||
gdproptin=True,surveydone=True,sex='male',
|
||||
weightcategory='hwt',
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
@@ -322,5 +322,3 @@ class CPChartTest(TestCase):
|
||||
|
||||
response = self.c.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
|
||||
+14
-15
@@ -12,14 +12,14 @@ class EmailUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -73,14 +73,14 @@ class ZipEmailUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -135,14 +135,14 @@ class EmailUniCodeUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -196,14 +196,14 @@ class EmailBikeErgUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -257,14 +257,14 @@ class EmailBikeUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -321,14 +321,14 @@ class EmailTests(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -404,7 +404,7 @@ class EmailAdminUpload(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
birthdate = faker.profile()['birthdate']
|
||||
)
|
||||
@@ -412,7 +412,7 @@ class EmailAdminUpload(TestCase):
|
||||
self.theadmin = UserFactory(is_staff=True)
|
||||
self.rtheadmin = Rower.objects.create(user=self.theadmin,
|
||||
birthdate = faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -473,4 +473,3 @@ race 1
|
||||
result = results[0]
|
||||
|
||||
self.assertTrue(result.coursecompleted)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class EmpowerTest(TestCase):
|
||||
'sander@ds.ds',
|
||||
'koeinsloot',
|
||||
)
|
||||
r = Rower.objects.create(user=u,rowerplan='coach',gdproptin=True,
|
||||
r = Rower.objects.create(user=u,rowerplan='coach',gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now())
|
||||
self.c = Client()
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ class WorkoutViewTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
showfavoritechartnotes=True)
|
||||
|
||||
@@ -22,7 +22,7 @@ class C2Objects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -157,7 +157,7 @@ class C2ObjectsTokenExpired(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -236,7 +236,7 @@ class StravaObjects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -342,7 +342,7 @@ class STObjects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -490,7 +490,7 @@ class RunKeeperObjects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -583,7 +583,7 @@ class UAObjects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -686,7 +686,7 @@ class TPObjects(DjangoTestCase):
|
||||
self.u.first_name = 'John'
|
||||
self.u.last_name = 'Sander'
|
||||
self.u.save()
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
@@ -769,7 +769,7 @@ class AutoExportTests(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class InteractiveChartTest(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
self.nu = datetime.datetime.now()
|
||||
@@ -137,5 +137,3 @@ class InteractiveChartTest(TestCase):
|
||||
res = iplots.interactive_flex_chart2(self.wote.id,promember=1,
|
||||
xparam='distance',
|
||||
yparam1='pace',yparam2='spm')
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ class WorkoutTests(TestCase):
|
||||
self.u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
nu = datetime.datetime.now()
|
||||
@@ -37,7 +37,7 @@ class C2Tests(TestCase):
|
||||
self.u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
self.nu = datetime.datetime.now()
|
||||
@@ -77,6 +77,3 @@ class subroutinetests(TestCase):
|
||||
jsond = json.dumps(data)
|
||||
data = c2stuff.createc2workoutdata_as_splits(w)
|
||||
jsond = json.dumps(data)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -84,6 +84,3 @@ class NewUserRegistrationTest(TestCase):
|
||||
self.assertRedirects(response,
|
||||
expected_url='/login/',
|
||||
status_code=302,target_status_code=200)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -122,7 +122,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -185,7 +185,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -251,7 +251,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -289,7 +289,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -329,7 +329,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -350,7 +350,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -396,7 +396,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -441,7 +441,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -486,7 +486,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -536,7 +536,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -581,7 +581,7 @@ class PaymentTest(TestCase):
|
||||
u = UserFactory()
|
||||
r = Rower.objects.create(user=u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
paymentprocessor='braintree',
|
||||
@@ -620,4 +620,3 @@ class PaymentTest(TestCase):
|
||||
self.assertRedirects(response,
|
||||
expected_url = '/rowers/downgradecompleted/',
|
||||
status_code=302,target_status_code=200)
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.ufreecoach = UserFactory(username='coachuser')
|
||||
self.rfreecoach = Rower.objects.create(user=self.ufreecoach,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='freecoach',clubsize=100)
|
||||
|
||||
self.coachinggroup = CoachingGroup.objects.create()
|
||||
@@ -37,7 +37,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.uplan = UserFactory(username='planuser')
|
||||
self.rplan = Rower.objects.create(user=self.uplan,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan)
|
||||
@@ -49,7 +49,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.upro = UserFactory(username='prouser')
|
||||
self.rpro = Rower.objects.create(user=self.upro,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro_workouts = WorkoutFactory.create_batch(5, user=self.rpro)
|
||||
@@ -61,7 +61,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.uplan2 = UserFactory(username='planuser2')
|
||||
self.rplan2 = Rower.objects.create(user=self.uplan2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2)
|
||||
@@ -73,7 +73,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.upro2 = UserFactory(username='prouser2')
|
||||
self.rpro2 = Rower.objects.create(user=self.upro2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2)
|
||||
@@ -85,7 +85,7 @@ class PermissionsFreeCoach(TestCase):
|
||||
self.ubasic = UserFactory(username='basicuser')
|
||||
self.rbasic = Rower.objects.create(user=self.ubasic,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.ubasic_workouts = WorkoutFactory.create_batch(5, user=self.rbasic)
|
||||
@@ -201,7 +201,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.ucoach = UserFactory(username='coachuser')
|
||||
self.rcoach = Rower.objects.create(user=self.ucoach,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='coach',clubsize=10)
|
||||
|
||||
self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach)
|
||||
@@ -216,7 +216,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.uplan = UserFactory(username='planuser')
|
||||
self.rplan = Rower.objects.create(user=self.uplan,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan)
|
||||
@@ -228,7 +228,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.upro = UserFactory(username='prouser')
|
||||
self.rpro = Rower.objects.create(user=self.upro,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro_workouts = WorkoutFactory.create_batch(5, user=self.rpro)
|
||||
@@ -240,7 +240,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.uplan2 = UserFactory(username='planuser2')
|
||||
self.rplan2 = Rower.objects.create(user=self.uplan2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2)
|
||||
@@ -252,7 +252,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.upro2 = UserFactory(username='prouser2')
|
||||
self.rpro2 = Rower.objects.create(user=self.upro2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2)
|
||||
@@ -264,7 +264,7 @@ class PermissionsBasicsTests(TestCase):
|
||||
self.ubasic = UserFactory(username='basicuser')
|
||||
self.rbasic = Rower.objects.create(user=self.ubasic,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.ubasic_workouts = WorkoutFactory.create_batch(5, user=self.rbasic)
|
||||
@@ -461,7 +461,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.ucoach = UserFactory(username='coachuser')
|
||||
self.rcoach = Rower.objects.create(user=self.ucoach,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='coach',clubsize=10)
|
||||
|
||||
self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach)
|
||||
@@ -476,7 +476,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.uplan = UserFactory(username='planuser')
|
||||
self.rplan = Rower.objects.create(user=self.uplan,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan)
|
||||
@@ -488,7 +488,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.upro = UserFactory(username='prouser')
|
||||
self.rpro = Rower.objects.create(user=self.upro,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro_workouts = WorkoutFactory.create_batch(5, user=self.rpro)
|
||||
@@ -500,7 +500,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.uplan2 = UserFactory(username='planuser2')
|
||||
self.rplan2 = Rower.objects.create(user=self.uplan2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2)
|
||||
@@ -512,7 +512,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.upro2 = UserFactory(username='prouser2')
|
||||
self.rpro2 = Rower.objects.create(user=self.upro2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2)
|
||||
@@ -524,7 +524,7 @@ class PermissionsViewTests(TestCase):
|
||||
self.ubasic = UserFactory(username='basicuser')
|
||||
self.rbasic = Rower.objects.create(user=self.ubasic,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.ubasic_workouts = WorkoutFactory.create_batch(5, user=self.rbasic)
|
||||
@@ -1215,7 +1215,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.ucoach = UserFactory(username='coachuser')
|
||||
self.rcoach = Rower.objects.create(user=self.ucoach,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='coach',clubsize=10)
|
||||
|
||||
self.ucoach_workouts = WorkoutFactory.create_batch(5, user=self.rcoach)
|
||||
@@ -1230,7 +1230,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.uplan = UserFactory(username='planuser')
|
||||
self.rplan = Rower.objects.create(user=self.uplan,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan_workouts = WorkoutFactory.create_batch(5, user=self.rplan)
|
||||
@@ -1242,7 +1242,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.upro = UserFactory(username='prouser')
|
||||
self.rpro = Rower.objects.create(user=self.upro,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro_workouts = WorkoutFactory.create_batch(5, user=self.rpro)
|
||||
@@ -1254,7 +1254,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.uplan2 = UserFactory(username='planuser2')
|
||||
self.rplan2 = Rower.objects.create(user=self.uplan2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='plan')
|
||||
|
||||
self.uplan2_workouts = WorkoutFactory.create_batch(5, user=self.rplan2)
|
||||
@@ -1266,7 +1266,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.upro2 = UserFactory(username='prouser2')
|
||||
self.rpro2 = Rower.objects.create(user=self.upro2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='pro')
|
||||
|
||||
self.upro2_workouts = WorkoutFactory.create_batch(5, user=self.rpro2)
|
||||
@@ -1278,7 +1278,7 @@ class PermissionsCoachingTests(TestCase):
|
||||
self.ubasic = UserFactory(username='basicuser')
|
||||
self.rbasic = Rower.objects.create(user=self.ubasic,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,gdproptindate=timezone.now(),
|
||||
gdproptin=True,surveydone=True,gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
self.ubasic_workouts = WorkoutFactory.create_batch(5, user=self.rbasic)
|
||||
|
||||
@@ -17,7 +17,7 @@ class TrainingPlanTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -175,7 +175,7 @@ class SessionLinkTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -348,7 +348,7 @@ class SessionCompleteTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -603,7 +603,7 @@ class ChallengeCompleteTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -827,7 +827,7 @@ class MandatoryTestCompleteTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -1040,7 +1040,7 @@ class PlannedSessionsView(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
self.r.save()
|
||||
@@ -1049,7 +1049,7 @@ class PlannedSessionsView(TestCase):
|
||||
self.u2 = UserFactory(username='testbasicuser')
|
||||
self.r2 = Rower.objects.create(user=self.u2,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class TrialsTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
|
||||
@@ -64,6 +64,3 @@ class TrialsTest(TestCase):
|
||||
self.assertEqual(hasplannedsessions(self.u),True)
|
||||
self.assertEqual(iscoachmember(self.u),False)
|
||||
self.assertEqual(ispromember(self.u),True)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class DataTest(TestCase):
|
||||
u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,gdproptin=True,
|
||||
r = Rower.objects.create(user=u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now()
|
||||
)
|
||||
self.nu = datetime.datetime.now()
|
||||
|
||||
@@ -11,6 +11,24 @@ from django.http import Http404
|
||||
|
||||
from rowers.views import get_workout
|
||||
|
||||
class TestDateTime(TestCase):
|
||||
def setUp(self):
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
def test_get_dates(self):
|
||||
request = self.factory.get('/rowers/sessions/create/user/230/?startdate=13.01.2020&enddate=19.01.2020')
|
||||
startdate,enddate = get_dates_timeperiod(request)
|
||||
|
||||
teststart = datetime.date(2020,1,1)
|
||||
self.assertTrue(teststart<startdate)
|
||||
|
||||
testend = datetime.date(2020,12,12)
|
||||
self.assertTrue(testend>enddate)
|
||||
|
||||
|
||||
# tests simple functions from views.py
|
||||
class SimpleViewTest(TestCase):
|
||||
def setUp(self):
|
||||
@@ -18,7 +36,7 @@ class SimpleViewTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -108,7 +126,3 @@ class SimpleViewTest(TestCase):
|
||||
|
||||
login = self.c.login(username=self.u.username, password=self.password)
|
||||
self.assertEqual(login,False)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class PlotTests(TestCase):
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
r = Rower.objects.create(user=u,
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='basic')
|
||||
self.nu = datetime.datetime.now()
|
||||
|
||||
@@ -41,7 +41,7 @@ class TeamTest(TestCase):
|
||||
|
||||
r = Rower.objects.create(
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
user=u,
|
||||
@@ -264,7 +264,7 @@ class TeamTestLowLevel(TestCase):
|
||||
|
||||
r = Rower.objects.create(
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
user=u,
|
||||
@@ -353,5 +353,3 @@ class TeamTestLowLevel(TestCase):
|
||||
# cannot create invite for team you don't manage
|
||||
id, comment = create_invite(self.t, self.users[3],self.users[4])
|
||||
self.assertEqual(id,0)
|
||||
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class ForceUnits(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -164,7 +164,7 @@ class TestForceUnit(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class ViewTest(TestCase):
|
||||
self.u = User.objects.create_user('john',
|
||||
'sander@ds.ds',
|
||||
'koeinsloot')
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,
|
||||
self.r = Rower.objects.create(user=self.u,gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach',
|
||||
)
|
||||
@@ -783,4 +783,3 @@ class ViewTest(TestCase):
|
||||
os.remove(f_to_be_deleted+'.gz')
|
||||
except (FileNotFoundError,OSError):
|
||||
pass
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ class UserPreferencesTest(TestCase):
|
||||
|
||||
self.r = Rower.objects.create(user=self.u,
|
||||
birthdate=faker.profile()['birthdate'],
|
||||
gdproptin=True,
|
||||
gdproptin=True,surveydone=True,
|
||||
gdproptindate=timezone.now(),
|
||||
rowerplan='coach')
|
||||
|
||||
@@ -245,5 +245,3 @@ class UserPreferencesTest(TestCase):
|
||||
|
||||
response = self.c.post(url,form_data)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
|
||||
|
||||
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" ?>
|
||||
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.google.com/kml/ext/2.2">
|
||||
<Document>
|
||||
<name>Courses.kml</name>
|
||||
<Folder>
|
||||
<name>Courses</name>
|
||||
<Folder>
|
||||
<name>CrewNerd Examples - Uherské Hradiště</name>
|
||||
<open>1</open>
|
||||
<Placemark>
|
||||
<name>Start</name>
|
||||
<Polygon>
|
||||
<tessellate>1</tessellate>
|
||||
<outerBoundaryIs>
|
||||
<LinearRing>
|
||||
<coordinates>17.4893745389,49.109471228,0 17.4911067423,49.1094811918,0 17.4909527884,49.1103411557,0 17.4888918133,49.1102899098,0 17.4893745389,49.109471228,0 17.4893745389,49.109471228,0</coordinates>
|
||||
</LinearRing>
|
||||
</outerBoundaryIs>
|
||||
</Polygon>
|
||||
</Placemark>
|
||||
<Placemark>
|
||||
<name>Turn</name>
|
||||
<Polygon>
|
||||
<tessellate>1</tessellate>
|
||||
<outerBoundaryIs>
|
||||
<LinearRing>
|
||||
<coordinates>17.4836181002,49.0979347215,0 17.489332427,49.0981702202,0 17.4888058511,49.1024117428,0 17.4836162032,49.1030885423,0 17.4836181002,49.0979347215,0 17.4836181002,49.0979347215,0</coordinates>
|
||||
</LinearRing>
|
||||
</outerBoundaryIs>
|
||||
</Polygon>
|
||||
</Placemark>
|
||||
<Placemark>
|
||||
<name>Turn</name>
|
||||
<Polygon>
|
||||
<tessellate>1</tessellate>
|
||||
<outerBoundaryIs>
|
||||
<LinearRing>
|
||||
<coordinates>17.4928830266,49.0866607478,0 17.4973472737,49.0861776065,0 17.4994059869,49.0903340046,0 17.4942740099,49.0899098202,0 17.4928830266,49.0866607478,0 17.4928830266,49.0866607478,0</coordinates>
|
||||
</LinearRing>
|
||||
</outerBoundaryIs>
|
||||
</Polygon>
|
||||
</Placemark>
|
||||
<Placemark>
|
||||
<name>Finish</name>
|
||||
<Polygon>
|
||||
<tessellate>1</tessellate>
|
||||
<outerBoundaryIs>
|
||||
<LinearRing>
|
||||
<coordinates>17.4627698339,49.0723911762,0 17.4630054316,49.071305244,0 17.4643666779,49.0712945663,0 17.4641649495,49.0724875988,0 17.4627698339,49.0723911762,0 17.4627698339,49.0723911762,0</coordinates>
|
||||
</LinearRing>
|
||||
</outerBoundaryIs>
|
||||
</Polygon>
|
||||
</Placemark>
|
||||
</Folder>
|
||||
</Folder>
|
||||
</Document>
|
||||
</kml>
|
||||
@@ -283,6 +283,10 @@ urlpatterns = [
|
||||
re_path(r'^graph/(?P<pk>\d+)/delete/$',views.GraphDelete.as_view(),name='graph_delete'),
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-thumbnails/$',views.get_thumbnails,
|
||||
name='get_thumbnails'),
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/otwuseimpeller/$',views.otw_use_impeller,
|
||||
name='otw_use_impeller'),
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/otwusegps/$',views.otw_use_gps,
|
||||
name='otw_use_gps'),
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/toggle-ranking/$',views.workout_toggle_ranking,
|
||||
name='workout_toggle_ranking'),
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/get-testscript/$',views.get_testscript,
|
||||
@@ -346,6 +350,8 @@ urlpatterns = [
|
||||
re_path(r'^workout/(?P<id>\b[0-9A-Fa-f]+\b)/video/$',views.workout_video_create_view,
|
||||
name='workout_video_create_view'),
|
||||
re_path(r'^video/(?P<pk>\d+)/delete/$',views.VideoDelete.as_view(),name='video_delete'),
|
||||
re_path(r'^video/(?P<id>\w.+)/m/$',views.workout_video_view_mini,
|
||||
name='workout_video_view_mini'),
|
||||
re_path(r'^video/(?P<id>\w.+)/$',views.workout_video_view,
|
||||
name='workout_video_view'),
|
||||
re_path(r'^videos/',views.list_videos,name='list_videos'),
|
||||
@@ -443,6 +449,7 @@ urlpatterns = [
|
||||
re_path(r'^user-multiflex-data/$',views.multiflex_data,name='multiflex_data'),
|
||||
re_path(r'^me/deactivate/$',views.deactivate_user,name='deactivate_user'),
|
||||
re_path(r'^me/delete/$',views.remove_user,name='remove_user'),
|
||||
re_path(r'^survey/$',views.survey,name='survey'),
|
||||
re_path(r'^me/gdpr-optin-confirm/?/$',views.user_gdpr_confirm,name='user_gdpr_confirm'),
|
||||
re_path(r'^me/gdpr-optin-confirm/$',views.user_gdpr_confirm,name='user_gdpr_confirm'),
|
||||
re_path(r'^me/gdpr-optin/?/$',views.user_gdpr_optin,name='user_gdpr_optin'),
|
||||
|
||||
@@ -4322,9 +4322,10 @@ def agegrouprecordview(request,sex='male',weightcategory='hwt',
|
||||
})
|
||||
|
||||
# alert overview view
|
||||
@user_passes_test(ispromember, login_url="/rowers/paidplans",
|
||||
message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality",
|
||||
redirect_field_name=None)
|
||||
#@user_passes_test(ispromember, login_url="/rowers/paidplans",
|
||||
# message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality",
|
||||
# redirect_field_name=None)
|
||||
@login_required
|
||||
def alerts_view(request,userid=0):
|
||||
r = getrequestrower(request,userid=userid)
|
||||
|
||||
@@ -4436,9 +4437,7 @@ def alert_create_view(request,userid=0):
|
||||
})
|
||||
|
||||
# alert report view
|
||||
@user_passes_test(ispromember, login_url="/rowers/paidplans",
|
||||
message="This functionality requires a Pro plan or higher. If you are already a Pro user, please log in to access this functionality",
|
||||
redirect_field_name=None)
|
||||
@login_required()
|
||||
def alert_report_view(request,id=0,userid=0,nperiod=0):
|
||||
r = getrequestrower(request,userid=userid)
|
||||
if userid == 0:
|
||||
@@ -4453,7 +4452,7 @@ def alert_report_view(request,id=0,userid=0,nperiod=0):
|
||||
raise Http404("This alert doesn't exist")
|
||||
|
||||
|
||||
if alert.manager != request.user:
|
||||
if not checkalertowner(alert,request.user):
|
||||
raise PermissionDenied('You are not allowed to edit this Alert')
|
||||
|
||||
stats = alert_get_stats(alert,nperiod=nperiod)
|
||||
@@ -4505,7 +4504,7 @@ def alert_edit_view(request,id=0,userid=0):
|
||||
raise Http404("This alert doesn't exist")
|
||||
|
||||
|
||||
if alert.manager != request.user:
|
||||
if not alert.manager != request.user:
|
||||
raise PermissionDenied('You are not allowed to edit this Alert')
|
||||
|
||||
FilterFormSet = formset_factory(ConditionEditForm, formset=BaseConditionFormSet,extra=0)
|
||||
@@ -4603,6 +4602,7 @@ def alert_edit_view(request,id=0,userid=0):
|
||||
})
|
||||
|
||||
# alert delete view
|
||||
|
||||
class AlertDelete(DeleteView):
|
||||
login_requird = True
|
||||
model = Alert
|
||||
@@ -4650,6 +4650,9 @@ class AlertDelete(DeleteView):
|
||||
def get_object(self, *args, **kwargs):
|
||||
obj = super(AlertDelete, self).get_object(*args, **kwargs)
|
||||
|
||||
if obj.manager != self.request.user:
|
||||
raise PermissionDenied("You are not allowed to delete this Alert")
|
||||
|
||||
# some checks
|
||||
|
||||
return obj
|
||||
|
||||
@@ -445,8 +445,9 @@ def plannedsession_create_view(request,
|
||||
sps = get_sessions(r,startdate=startdate,enddate=enddate).exclude(
|
||||
sessiontype='race')
|
||||
|
||||
|
||||
sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True)
|
||||
sessiontemplates = PlannedSession.objects.filter(
|
||||
manager=request.user,
|
||||
is_template=True).order_by("name")
|
||||
|
||||
try:
|
||||
trainingplan = TrainingPlan.objects.filter(
|
||||
@@ -1511,11 +1512,11 @@ def plannedsession_teamclone_view(request,id=0):
|
||||
ps.name += ' (copy)'
|
||||
ps.is_template = False
|
||||
|
||||
deltadays = ps.enddate-ps.startdate
|
||||
deltadays = ps.preferreddate-ps.startdate
|
||||
|
||||
ps.startdate = timezone.now().date()
|
||||
ps.enddate = (timezone.now()+deltadays).date()
|
||||
ps.preferreddate = ps.preferreddate+deltadays
|
||||
ps.startdate = startdate
|
||||
ps.enddate = enddate
|
||||
ps.preferreddate = startdate+deltadays
|
||||
|
||||
ps.save()
|
||||
|
||||
|
||||
+27
-15
@@ -60,7 +60,7 @@ from rowers.forms import (
|
||||
MetricsForm,DisqualificationForm,disqualificationreasons,
|
||||
disqualifiers,SearchForm,BillingForm,PlanSelectForm,
|
||||
VideoAnalysisCreateForm,WorkoutSingleSelectForm,
|
||||
VideoAnalysisMetricsForm,
|
||||
VideoAnalysisMetricsForm,SurveyForm,
|
||||
)
|
||||
|
||||
from django.urls import reverse, reverse_lazy
|
||||
@@ -158,7 +158,8 @@ from rowsandall_app.settings import (
|
||||
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
|
||||
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET,
|
||||
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY,
|
||||
PAYMENT_PROCESSING_ON
|
||||
PAYMENT_PROCESSING_ON,
|
||||
RECAPTCHA_SITE_KEY, RECAPTCHA_SITE_SECRET
|
||||
)
|
||||
|
||||
#from rowers.tasks_standalone import addcomment2
|
||||
@@ -1073,28 +1074,39 @@ def add_defaultfavorites(r):
|
||||
f.save()
|
||||
return 1
|
||||
|
||||
|
||||
# Shows email form and sends it if submitted
|
||||
def sendmail(request):
|
||||
if request.method == 'POST':
|
||||
# test recaptcha
|
||||
response_string = request.POST.get('g-recaptcha-response')
|
||||
# replace below with settings
|
||||
recaptcha_secret = RECAPTCHA_SITE_SECRET
|
||||
url = 'https://www.google.com/recaptcha/api/siteverify'
|
||||
data = {
|
||||
'secret':recaptcha_secret,
|
||||
'response': response_string,
|
||||
}
|
||||
response = requests.post(url,data=data,verify=True)
|
||||
success = False
|
||||
if response.status_code == 200:
|
||||
success = response.json().get('success')
|
||||
|
||||
form = EmailForm(request.POST)
|
||||
if form.is_valid():
|
||||
if form.is_valid() and success:
|
||||
firstname = form.cleaned_data['firstname']
|
||||
lastname = form.cleaned_data['lastname']
|
||||
email = form.cleaned_data['email']
|
||||
subject = form.cleaned_data['subject']
|
||||
botcheck = form.cleaned_data['botcheck'].lower()
|
||||
subject = 'Rowsandall Contact Form:'+form.cleaned_data['subject']
|
||||
message = form.cleaned_data['message']
|
||||
if botcheck == 'yes':
|
||||
try:
|
||||
fullemail = firstname + " " + lastname + " " + "<" + email + ">"
|
||||
send_mail(subject, message, fullemail, ['info@rowsandall.com'])
|
||||
return HttpResponseRedirect('/rowers/email/thankyou/')
|
||||
except:
|
||||
return HttpResponseRedirect('/rowers/email/')
|
||||
else:
|
||||
messages.error(request,'You have to answer YES to the question')
|
||||
return HttpResponseRedirect('/rowers/email/')
|
||||
fullemail = firstname + " " + lastname + " " + "<" + email + ">"
|
||||
send_mail(subject, message, fullemail, ['info@rowsandall.com'])
|
||||
return HttpResponseRedirect('/rowers/email/thankyou/')
|
||||
else:
|
||||
if not success:
|
||||
messages.error(request,'Bots are not welcome')
|
||||
else:
|
||||
messages.error(request,'Something went wrong. Please try again')
|
||||
return HttpResponseRedirect('/rowers/email/')
|
||||
else:
|
||||
return HttpResponseRedirect('/rowers/email/')
|
||||
|
||||
@@ -5,6 +5,31 @@ from __future__ import unicode_literals
|
||||
|
||||
from rowers.views.statements import *
|
||||
|
||||
@login_required()
|
||||
def survey(request):
|
||||
|
||||
r = getrower(request.user)
|
||||
|
||||
surveyform = SurveyForm()
|
||||
|
||||
if request.method == 'POST':
|
||||
form = SurveyForm(request.POST)
|
||||
r.surveydone = True
|
||||
r.surveydonedate = timezone.now()
|
||||
r.save()
|
||||
|
||||
nexturl = request.GET.get('next')
|
||||
return HttpResponseRedirect(nexturl)
|
||||
|
||||
context = {
|
||||
'teams':get_my_teams(request.user),
|
||||
'rower':r,
|
||||
'form':surveyform,
|
||||
}
|
||||
|
||||
|
||||
return render(request,'survey.html',context)
|
||||
|
||||
@login_required()
|
||||
def start_trial_view(request):
|
||||
r = getrower(request.user)
|
||||
@@ -30,6 +55,13 @@ def start_trial_view(request):
|
||||
'Rowsandall Server <info@rowsandall.com>',
|
||||
['roosendaalsander@gmail.com'])
|
||||
|
||||
send_template_email('Rowsandall <info@rowsandall.com>',
|
||||
[r.user.email],
|
||||
'Welcome to the Rowsandall Pro Trial',
|
||||
'protrialewelcome.html',
|
||||
{'first_name':r.user.first_name,
|
||||
'last_name':r.user.last_name})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@login_required()
|
||||
@@ -58,6 +90,13 @@ def start_plantrial_view(request):
|
||||
'Rowsandall Server <info@rowsandall.com>',
|
||||
['roosendaalsander@gmail.com'])
|
||||
|
||||
send_template_email('Rowsandall <info@rowsandall.com>',
|
||||
[r.user.email],
|
||||
'Welcome to the Rowsandall Self-Coach Trial',
|
||||
'plantrialwelcome.html',
|
||||
{'first_name':r.user.first_name,
|
||||
'last_name':r.user.last_name})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Page where user can manage his favorite charts
|
||||
@@ -491,5 +530,3 @@ def rower_update_empower_view(
|
||||
'form':form,
|
||||
'rower':r
|
||||
})
|
||||
|
||||
|
||||
|
||||
+162
-16
@@ -48,6 +48,116 @@ def get_video_id(url):
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
# Show a video compared with data
|
||||
def workout_video_view_mini(request,id=''):
|
||||
try:
|
||||
id = encoder.decode_hex(id)
|
||||
analysis = VideoAnalysis.objects.get(id=id)
|
||||
except VideoAnalysis.DoesNotExist:
|
||||
raise Http404("Video Analysis does not exist")
|
||||
|
||||
w = analysis.workout
|
||||
delay = analysis.delay
|
||||
|
||||
if w.workouttype in mytypes.otwtypes:
|
||||
mode = 'water'
|
||||
else:
|
||||
mode = 'erg'
|
||||
|
||||
if request.user.is_authenticated:
|
||||
mayedit = checkworkoutuser(request.user,w) and isprorower(request.user.rower)
|
||||
rower = request.user.rower
|
||||
else:
|
||||
mayedit = False
|
||||
rower = None
|
||||
|
||||
# get video ID and offset
|
||||
if mayedit and request.method == 'POST':
|
||||
form = VideoAnalysisCreateForm(request.POST)
|
||||
metricsform = VideoAnalysisMetricsForm(request.POST,mode=mode)
|
||||
if form.is_valid() and metricsform.is_valid():
|
||||
video_id = form.cleaned_data['url']
|
||||
try:
|
||||
video_id = get_video_id(form.cleaned_data['url'])
|
||||
except (TypeError,ValueError):
|
||||
pass
|
||||
delay = form.cleaned_data['delay']
|
||||
metricsgroups = metricsform.cleaned_data['groups']
|
||||
if 'save_button' in request.POST:
|
||||
analysis.name = form.cleaned_data['name']
|
||||
analysis.video_id = video_id
|
||||
analysis.delay = delay
|
||||
analysis.metricsgroups = metricsgroups
|
||||
analysis.save()
|
||||
else:
|
||||
video_id = id
|
||||
delay = 0
|
||||
elif mayedit:
|
||||
form = VideoAnalysisCreateForm(
|
||||
initial = {
|
||||
'name':analysis.name,
|
||||
'delay': analysis.delay,
|
||||
'url': analysis.video_id,
|
||||
}
|
||||
)
|
||||
metricsform = VideoAnalysisMetricsForm(initial={'groups':analysis.metricsgroups},
|
||||
mode=mode)
|
||||
metricsgroups = analysis.metricsgroups
|
||||
video_id = analysis.video_id
|
||||
else:
|
||||
form = None
|
||||
metricsform = None
|
||||
metricsgroups = analysis.metricsgroups
|
||||
|
||||
data, metrics, maxtime = dataprep.get_video_data(w,groups=metricsgroups,mode=mode)
|
||||
hascoordinates = pd.Series(data['latitude']).std() > 0
|
||||
# create map
|
||||
if hascoordinates:
|
||||
mapscript, mapdiv = leaflet_chart_video(data['latitude'],data['longitude'],
|
||||
w.name)
|
||||
else:
|
||||
mapscript, mapdiv = interactive_chart_video(data)
|
||||
data['longitude'] = data['spm']
|
||||
data['latitude'] = list(range(len(data['spm'])))
|
||||
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url':'/rowers/list-workouts/',
|
||||
'name':'Workouts'
|
||||
},
|
||||
{
|
||||
'url':get_workout_default_page(request,encoder.encode_hex(w.id)),
|
||||
'name': w.name
|
||||
},
|
||||
{
|
||||
'url':reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(analysis.id)}),
|
||||
'name': 'Video Analysis'
|
||||
}
|
||||
|
||||
]
|
||||
|
||||
|
||||
return render(request,
|
||||
'embedded_video_mini.html',
|
||||
{
|
||||
'workout':w,
|
||||
'rower':rower,
|
||||
'data': json.dumps(data,default=default),
|
||||
'mapscript': mapscript,
|
||||
'mapdiv': mapdiv,
|
||||
'video_id': analysis.video_id,
|
||||
'form':form,
|
||||
'breadcrumbs':breadcrumbs,
|
||||
'analysis':analysis,
|
||||
'maxtime':maxtime,
|
||||
'metrics':metrics,
|
||||
'locked': True,
|
||||
'metricsform':metricsform,
|
||||
'metricsgroups': metricsgroups,
|
||||
'siteurl': settings.SITE_URL,
|
||||
})
|
||||
|
||||
|
||||
# Show a video compared with data
|
||||
def workout_video_view(request,id=''):
|
||||
@@ -346,18 +456,54 @@ def workout_forcecurve_view(request,id=0,workstrokesonly=False):
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
# Test asynchronous tasking and messaging
|
||||
#@login_required()
|
||||
#def workout_test_task_view(request,id=0):
|
||||
# row = Workout.objects.get(id=id)
|
||||
# res = myqueue(queuehigh,addcomment2,request.user.id,row.id)#
|
||||
#
|
||||
#
|
||||
# url = reverse('workout_edit_view',
|
||||
# kwargs = {
|
||||
# 'id':int(id),
|
||||
# })
|
||||
# return HttpResponseRedirect(url)
|
||||
# Switch from GPS to Impeller (only for SpeedCoach 2, if impeller data)
|
||||
@login_required
|
||||
def otw_use_impeller(request,id=0):
|
||||
w = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,w)==False):
|
||||
raise PermissionDenied("Access denied")
|
||||
|
||||
row = rdata(w.csvfilename)
|
||||
success = row.use_impellerdata()
|
||||
if success:
|
||||
row.write_csv(w.csvfilename)
|
||||
dataprep.update_strokedata(w.id,row.df)
|
||||
w.impeller = True
|
||||
w.save()
|
||||
messages.info(request,'The distance and speed data are now based on Impeller data')
|
||||
else:
|
||||
messages.error(request,'No impeller data found')
|
||||
|
||||
url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
# Switch from Impeller to GPS (only for SpeedCoach 2, if impeller data)
|
||||
@login_required
|
||||
def otw_use_gps(request,id=0):
|
||||
w = get_workout(id)
|
||||
|
||||
if (checkworkoutuser(request.user,w)==False):
|
||||
raise PermissionDenied("Access denied")
|
||||
|
||||
row = rdata(w.csvfilename)
|
||||
success = row.use_gpsdata()
|
||||
if success:
|
||||
row.write_csv(w.csvfilename)
|
||||
dataprep.update_strokedata(w.id,row.df)
|
||||
w.impeller = False
|
||||
w.save()
|
||||
messages.info(request,'The distance and speed data are now based on GPS data')
|
||||
else:
|
||||
messages.error(request,'No GPS data found')
|
||||
|
||||
url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
|
||||
# Show Stroke power histogram for a workout
|
||||
@login_required()
|
||||
@@ -2623,8 +2769,8 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
form = AdvancedWorkoutForm(request.POST)
|
||||
|
||||
if form.is_valid():
|
||||
quick_calc = form.cleaned_data['quick_calc']
|
||||
go_service = form.cleaned_data['go_service']
|
||||
#quick_calc = form.cleaned_data['quick_calc']
|
||||
#go_service = form.cleaned_data['go_service']
|
||||
boattype = form.cleaned_data['boattype']
|
||||
weightvalue = form.cleaned_data['weightvalue']
|
||||
w.boattype = boattype
|
||||
@@ -2669,8 +2815,8 @@ def workout_otwsetpower_view(request,id=0,message="",successmessage=""):
|
||||
first_name,last_name,emailaddress,encoder.decode_hex(id),
|
||||
ps=[r.p0,r.p1,r.p2,r.p3],
|
||||
ratio=r.cpratio,
|
||||
quick_calc = quick_calc,
|
||||
go_service=go_service,
|
||||
# quick_calc = quick_calc,
|
||||
# go_service=go_service,
|
||||
emailbounced = r.emailbounced
|
||||
)
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ ALLOWED_HOSTS = CFG['allowed_hosts']
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'rowers',
|
||||
'survey',
|
||||
# 'cvkbrno',
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
@@ -97,6 +98,7 @@ MIDDLEWARE = [
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'tz_detect.middleware.TimezoneMiddleware',
|
||||
'rowers.middleware.SurveyMiddleWare',
|
||||
'rowers.middleware.GDPRMiddleWare',
|
||||
'rowers.middleware.PowerTimeFitnessMetricMiddleWare',
|
||||
'rowers.middleware.RowerPlanMiddleWare',
|
||||
@@ -494,3 +496,13 @@ try:
|
||||
CELERY = CFG['use_celery']
|
||||
except KeyError:
|
||||
CELERY = False
|
||||
|
||||
|
||||
# Recaptcha
|
||||
|
||||
try:
|
||||
RECAPTCHA_SITE_KEY = CFG['recaptcha_site_key']
|
||||
RECAPTCHA_SITE_SECRET = CFG['recaptcha_site_secret']
|
||||
except KeyError:
|
||||
RECAPTCHA_SITE_KEY = ''
|
||||
RECAPTCHA_SITE_SECRET = ''
|
||||
|
||||
@@ -60,7 +60,7 @@ DEBUG = True
|
||||
|
||||
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
|
||||
|
||||
ALLOWED_HOSTS = ['localhost']
|
||||
ALLOWED_HOSTS = ['localhost','127.0.0.1']
|
||||
|
||||
# INSTALLED_APPS += ['debug_toolbar',]
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ from django.views.generic import TemplateView
|
||||
from rowsandall_app.views import rootview, landingview
|
||||
from django.contrib.auth import views as auth_views
|
||||
from rowers import views as rowersviews
|
||||
from survey import views as surveyviews
|
||||
|
||||
import django
|
||||
|
||||
@@ -65,6 +66,7 @@ urlpatterns += [
|
||||
{'next_page': '/'},
|
||||
name='logout',),
|
||||
re_path(r'^rowers/',include('rowers.urls')),
|
||||
re_path(r'^survey/',include('survey.urls')),
|
||||
# re_path(r'^cvkbrno/',include('cvkbrno.urls')),
|
||||
# re_path(r'^admin/rq/',include('django_rq_dashboard.urls')),
|
||||
re_path(r'^call\_back',rowersviews.rower_process_callback),
|
||||
|
||||
@@ -1,434 +0,0 @@
|
||||
,Stroke Data CSV,Stroke Data TCX,TRIMP Training Load,TSS Training Load,date,distance (m),duration ,name,notes,timezone,type,weight (kg),weight category
|
||||
0,https://rowsandall.com/rowers/workout/2542/emailcsv,https://rowsandall.com/rowers/workout/2542/emailtcx,0,0,1970-01-01 00:00:00+00:00,9578,00:47:55.400000,Test Auto Sync Pro User,,Europe/Prague,rower,80.0,lwt
|
||||
1,https://rowsandall.com/rowers/workout/2500/emailcsv,https://rowsandall.com/rowers/workout/2500/emailtcx,0,0,2014-02-26 20:32:33+00:00,65,00:00:02,Sample Workout JSON,,UTC,water,80.0,lwt
|
||||
2,https://rowsandall.com/rowers/workout/3033/emailcsv,https://rowsandall.com/rowers/workout/3033/emailtcx,95,264,2015-06-02 06:29:02+00:00,14002,00:59:37.700000,Test P,,Europe/Prague,water,80.0,hwt
|
||||
3,https://rowsandall.com/rowers/workout/2501/emailcsv,https://rowsandall.com/rowers/workout/2501/emailtcx,0,0,2016-04-02 08:15:08+00:00,10269,01:05:24,Completed a workout (generic) 6.35 mi on 04/02/16,,Europe/Prague,water,80.0,lwt
|
||||
4,https://rowsandall.com/rowers/workout/2408/emailcsv,https://rowsandall.com/rowers/workout/2408/emailtcx,0,0,2016-07-30 08:40:36+00:00,1001,00:03:41,Comparison,,Europe/Berlin,rower,80.0,lwt
|
||||
5,https://rowsandall.com/rowers/workout/3032/emailcsv,https://rowsandall.com/rowers/workout/3032/emailtcx,0,0,2016-07-31 12:35:01+00:00,1111,00:04:32.700000,,,Europe/Prague,water,80.0,hwt
|
||||
6,https://rowsandall.com/rowers/workout/2572/emailcsv,https://rowsandall.com/rowers/workout/2572/emailtcx,0,0,2016-11-28 08:37:02+00:00,499,00:01:58,BC,,Europe/Prague,rower,80.0,lwt
|
||||
7,https://rowsandall.com/rowers/workout/2379/emailcsv,https://rowsandall.com/rowers/workout/2379/emailtcx,0,0,2017-10-27 16:14:42+00:00,742,00:02:25,Test Weba,,Europe/Prague,water,80.0,lwt
|
||||
8,https://rowsandall.com/rowers/workout/2380/emailcsv,https://rowsandall.com/rowers/workout/2380/emailtcx,0,0,2017-10-27 16:14:42+00:00,742,00:02:25,Test Weba,,Europe/Belgrade,water,80.0,lwt
|
||||
9,https://rowsandall.com/rowers/workout/2521/emailcsv,https://rowsandall.com/rowers/workout/2521/emailtcx,0,0,2017-11-09 09:15:32+00:00,49842,02:19:37,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
10,https://rowsandall.com/rowers/workout/2524/emailcsv,https://rowsandall.com/rowers/workout/2524/emailtcx,0,0,2017-11-09 09:15:32+00:00,49842,02:19:37,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
11,https://rowsandall.com/rowers/workout/2527/emailcsv,https://rowsandall.com/rowers/workout/2527/emailtcx,0,0,2017-11-09 09:15:32+00:00,49842,02:19:37,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
12,https://rowsandall.com/rowers/workout/2531/emailcsv,https://rowsandall.com/rowers/workout/2531/emailtcx,0,0,2017-11-09 09:15:32+00:00,49842,02:19:37,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
13,https://rowsandall.com/rowers/workout/2523/emailcsv,https://rowsandall.com/rowers/workout/2523/emailtcx,0,0,2017-11-09 15:15:32+00:00,0,02:28:28,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
14,https://rowsandall.com/rowers/workout/2526/emailcsv,https://rowsandall.com/rowers/workout/2526/emailtcx,0,0,2017-11-09 15:15:32+00:00,0,02:28:28,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
15,https://rowsandall.com/rowers/workout/2529/emailcsv,https://rowsandall.com/rowers/workout/2529/emailtcx,0,0,2017-11-09 15:15:32+00:00,0,02:28:28,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
16,https://rowsandall.com/rowers/workout/2533/emailcsv,https://rowsandall.com/rowers/workout/2533/emailtcx,0,0,2017-11-09 15:15:32+00:00,0,02:28:28,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
17,https://rowsandall.com/rowers/workout/2520/emailcsv,https://rowsandall.com/rowers/workout/2520/emailtcx,0,0,2017-11-09 18:15:32+00:00,10016,01:06:03,Polar Import,,Europe/Helsinki,rower,80.0,lwt
|
||||
18,https://rowsandall.com/rowers/workout/2522/emailcsv,https://rowsandall.com/rowers/workout/2522/emailtcx,0,0,2017-11-09 18:15:32+00:00,10016,01:06:03,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
19,https://rowsandall.com/rowers/workout/2525/emailcsv,https://rowsandall.com/rowers/workout/2525/emailtcx,0,0,2017-11-09 18:15:32+00:00,10016,01:06:03,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
20,https://rowsandall.com/rowers/workout/2528/emailcsv,https://rowsandall.com/rowers/workout/2528/emailtcx,0,0,2017-11-09 18:15:32+00:00,10016,01:06:03,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
21,https://rowsandall.com/rowers/workout/2532/emailcsv,https://rowsandall.com/rowers/workout/2532/emailtcx,0,0,2017-11-09 18:15:32+00:00,10016,01:06:03,Import from Polar Flow,imported through email,Europe/Helsinki,water,80.0,lwt
|
||||
22,https://rowsandall.com/rowers/workout/2494/emailcsv,https://rowsandall.com/rowers/workout/2494/emailtcx,0,0,2017-11-12 10:25:00+00:00,10526,00:44:01.700000,Race,,Europe/Rome,water,80.0,lwt
|
||||
23,https://rowsandall.com/rowers/workout/2496/emailcsv,https://rowsandall.com/rowers/workout/2496/emailtcx,0,0,2017-11-12 10:25:00+00:00,10526,00:44:01.700000,Race,,Europe/Rome,water,80.0,lwt
|
||||
24,https://rowsandall.com/rowers/workout/2497/emailcsv,https://rowsandall.com/rowers/workout/2497/emailtcx,0,0,2017-11-12 10:25:00+00:00,10526,00:44:01.700000,SpdCoach 2,,Europe/Rome,rower,80.0,lwt
|
||||
25,https://rowsandall.com/rowers/workout/2498/emailcsv,https://rowsandall.com/rowers/workout/2498/emailtcx,0,0,2017-11-12 10:25:00+00:00,10526,00:44:01.700000,boat speed test,,Europe/Rome,water,80.0,lwt
|
||||
26,https://rowsandall.com/rowers/workout/2499/emailcsv,https://rowsandall.com/rowers/workout/2499/emailtcx,0,0,2017-11-12 10:25:00+00:00,10526,00:44:01.700000,Boat Speed test 2,,Europe/Rome,water,80.0,lwt
|
||||
27,https://rowsandall.com/rowers/workout/2724/emailcsv,https://rowsandall.com/rowers/workout/2724/emailtcx,0,0,2018-01-01 09:27:47+00:00,5000,00:18:37,C2 Import Workout from 2018-01-01 09:27:47+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
28,https://rowsandall.com/rowers/workout/2723/emailcsv,https://rowsandall.com/rowers/workout/2723/emailtcx,0,0,2018-01-01 09:48:09+00:00,2963,00:13:29,C2 Import Workout from 2018-01-01 09:48:09+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
29,https://rowsandall.com/rowers/workout/2722/emailcsv,https://rowsandall.com/rowers/workout/2722/emailtcx,0,0,2018-01-02 18:22:08+00:00,14183,00:59:49.900000,C2 Import Workout from 2018-01-02 18:22:08+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
30,https://rowsandall.com/rowers/workout/2721/emailcsv,https://rowsandall.com/rowers/workout/2721/emailtcx,0,0,2018-01-03 16:24:47+00:00,4821,00:20:04.500000,C2 Import Workout from 2018-01-03 16:24:47+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
31,https://rowsandall.com/rowers/workout/2720/emailcsv,https://rowsandall.com/rowers/workout/2720/emailtcx,0,0,2018-01-03 16:46:19+00:00,2000,00:07:07.500000,C2 Import Workout from 2018-01-03 16:46:19+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
32,https://rowsandall.com/rowers/workout/2719/emailcsv,https://rowsandall.com/rowers/workout/2719/emailtcx,0,0,2018-01-03 16:57:04+00:00,2997,00:13:35.100000,C2 Import Workout from 2018-01-03 16:57:04+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
33,https://rowsandall.com/rowers/workout/2718/emailcsv,https://rowsandall.com/rowers/workout/2718/emailtcx,0,0,2018-01-06 13:59:30+00:00,4722,00:20:06.200000,C2 Import Workout from 2018-01-06 13:59:30+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
34,https://rowsandall.com/rowers/workout/2717/emailcsv,https://rowsandall.com/rowers/workout/2717/emailtcx,0,0,2018-01-06 14:20:43+00:00,1171,00:04:00,C2 Import Workout from 2018-01-06 14:20:43+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
35,https://rowsandall.com/rowers/workout/2716/emailcsv,https://rowsandall.com/rowers/workout/2716/emailtcx,0,0,2018-01-06 14:25:53+00:00,8006,00:36:13.600000,C2 Import Workout from 2018-01-06 14:25:53+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
36,https://rowsandall.com/rowers/workout/2715/emailcsv,https://rowsandall.com/rowers/workout/2715/emailtcx,0,0,2018-01-07 14:03:51+00:00,2520,00:10:42.700000,C2 Import Workout from 2018-01-07 14:03:51+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
37,https://rowsandall.com/rowers/workout/2714/emailcsv,https://rowsandall.com/rowers/workout/2714/emailtcx,0,0,2018-01-07 14:18:45+00:00,9996,00:42:35.100000,C2 Import Workout from 2018-01-07 14:18:45+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
38,https://rowsandall.com/rowers/workout/2713/emailcsv,https://rowsandall.com/rowers/workout/2713/emailtcx,0,0,2018-01-09 18:22:19+00:00,5267,00:22:34.200000,C2 Import Workout from 2018-01-09 18:22:19+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
39,https://rowsandall.com/rowers/workout/2712/emailcsv,https://rowsandall.com/rowers/workout/2712/emailtcx,0,0,2018-01-09 18:46:20+00:00,1000,00:03:21.400000,C2 Import Workout from 2018-01-09 18:46:20+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
40,https://rowsandall.com/rowers/workout/2711/emailcsv,https://rowsandall.com/rowers/workout/2711/emailtcx,0,0,2018-01-09 18:51:03+00:00,2300,00:10:04.500000,C2 Import Workout from 2018-01-09 18:51:03+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
41,https://rowsandall.com/rowers/workout/2710/emailcsv,https://rowsandall.com/rowers/workout/2710/emailtcx,0,0,2018-01-12 16:09:10+00:00,2008,00:08:39.100000,C2 Import Workout from 2018-01-12 16:09:10+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
42,https://rowsandall.com/rowers/workout/2709/emailcsv,https://rowsandall.com/rowers/workout/2709/emailtcx,0,0,2018-01-12 16:19:00+00:00,500,00:01:33.400000,C2 Import Workout from 2018-01-12 16:19:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
43,https://rowsandall.com/rowers/workout/2708/emailcsv,https://rowsandall.com/rowers/workout/2708/emailtcx,0,0,2018-01-12 16:21:06+00:00,2002,00:09:25.600000,C2 Import Workout from 2018-01-12 16:21:06+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
44,https://rowsandall.com/rowers/workout/2707/emailcsv,https://rowsandall.com/rowers/workout/2707/emailtcx,0,0,2018-01-12 16:31:08+00:00,100,00:00:17.600000,C2 Import Workout from 2018-01-12 16:31:08+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
45,https://rowsandall.com/rowers/workout/2706/emailcsv,https://rowsandall.com/rowers/workout/2706/emailtcx,0,0,2018-01-12 16:31:58+00:00,2011,00:08:56.600000,C2 Import Workout from 2018-01-12 16:31:58+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
46,https://rowsandall.com/rowers/workout/2705/emailcsv,https://rowsandall.com/rowers/workout/2705/emailtcx,0,0,2018-01-13 12:40:00+00:00,2000,00:06:55.800000,C2 Import Workout from 2018-01-13 12:40:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
47,https://rowsandall.com/rowers/workout/2704/emailcsv,https://rowsandall.com/rowers/workout/2704/emailtcx,0,0,2018-01-16 18:40:49+00:00,2007,00:08:30.800000,C2 Import Workout from 2018-01-16 18:40:49+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
48,https://rowsandall.com/rowers/workout/2703/emailcsv,https://rowsandall.com/rowers/workout/2703/emailtcx,0,0,2018-01-16 18:50:09+00:00,333,00:01:00,C2 Import Workout from 2018-01-16 18:50:09+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
49,https://rowsandall.com/rowers/workout/2702/emailcsv,https://rowsandall.com/rowers/workout/2702/emailtcx,0,0,2018-01-16 18:51:41+00:00,6820,00:31:22.200000,C2 Import Workout from 2018-01-16 18:51:41+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
50,https://rowsandall.com/rowers/workout/2701/emailcsv,https://rowsandall.com/rowers/workout/2701/emailtcx,0,0,2018-01-16 19:24:23+00:00,2008,00:09:01.100000,C2 Import Workout from 2018-01-16 19:24:23+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
51,https://rowsandall.com/rowers/workout/2700/emailcsv,https://rowsandall.com/rowers/workout/2700/emailtcx,0,0,2018-01-18 19:01:45+00:00,2007,00:08:27.600000,C2 Import Workout from 2018-01-18 19:01:45+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
52,https://rowsandall.com/rowers/workout/2699/emailcsv,https://rowsandall.com/rowers/workout/2699/emailtcx,0,0,2018-01-18 19:10:50+00:00,6918,00:29:14.200000,C2 Import Workout from 2018-01-18 19:10:50+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
53,https://rowsandall.com/rowers/workout/2698/emailcsv,https://rowsandall.com/rowers/workout/2698/emailtcx,0,0,2018-01-18 19:40:40+00:00,1217,00:06:11.100000,C2 Import Workout from 2018-01-18 19:40:40+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
54,https://rowsandall.com/rowers/workout/2697/emailcsv,https://rowsandall.com/rowers/workout/2697/emailtcx,0,0,2018-01-18 19:47:32+00:00,6697,00:29:16.700000,C2 Import Workout from 2018-01-18 19:47:32+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
55,https://rowsandall.com/rowers/workout/2696/emailcsv,https://rowsandall.com/rowers/workout/2696/emailtcx,0,0,2018-01-18 20:17:58+00:00,1997,00:09:10.700000,C2 Import Workout from 2018-01-18 20:17:58+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
56,https://rowsandall.com/rowers/workout/2692/emailcsv,https://rowsandall.com/rowers/workout/2692/emailtcx,0,0,2018-01-19 00:00:00+00:00,200,00:02:00.200000,C2 Import Workout from 2018-01-19 00:00:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
57,https://rowsandall.com/rowers/workout/2693/emailcsv,https://rowsandall.com/rowers/workout/2693/emailtcx,0,0,2018-01-19 00:00:00+00:00,200,00:01:55,C2 Import Workout from 2018-01-19 00:00:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
58,https://rowsandall.com/rowers/workout/2694/emailcsv,https://rowsandall.com/rowers/workout/2694/emailtcx,0,0,2018-01-19 00:00:00+00:00,200,00:02:00,C2 Import Workout from 2018-01-19 00:00:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
59,https://rowsandall.com/rowers/workout/2695/emailcsv,https://rowsandall.com/rowers/workout/2695/emailtcx,0,0,2018-01-19 00:00:00+00:00,200,00:01:10,C2 Import Workout from 2018-01-19 00:00:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
60,https://rowsandall.com/rowers/workout/2691/emailcsv,https://rowsandall.com/rowers/workout/2691/emailtcx,0,0,2018-01-20 13:22:31+00:00,19381,01:20:39.100000,C2 Import Workout from 2018-01-20 13:22:31+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
61,https://rowsandall.com/rowers/workout/2690/emailcsv,https://rowsandall.com/rowers/workout/2690/emailtcx,0,0,2018-01-24 18:55:23+00:00,210,00:01:43.400000,C2 Import Workout from 2018-01-24 18:55:23+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
62,https://rowsandall.com/rowers/workout/2689/emailcsv,https://rowsandall.com/rowers/workout/2689/emailtcx,0,0,2018-01-24 18:59:06+00:00,2110,00:08:42.700000,C2 Import Workout from 2018-01-24 18:59:06+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
63,https://rowsandall.com/rowers/workout/2688/emailcsv,https://rowsandall.com/rowers/workout/2688/emailtcx,0,0,2018-01-24 19:08:04+00:00,6081,00:25:10,C2 Import Workout from 2018-01-24 19:08:04+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
64,https://rowsandall.com/rowers/workout/2687/emailcsv,https://rowsandall.com/rowers/workout/2687/emailtcx,0,0,2018-01-24 19:24:18+00:00,14426,01:00:12.600000,C2 Import Workout from 2018-01-24 19:24:18+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
65,https://rowsandall.com/rowers/workout/2686/emailcsv,https://rowsandall.com/rowers/workout/2686/emailtcx,0,0,2018-01-27 13:23:26+00:00,14981,01:01:39.600000,C2 Import Workout from 2018-01-27 13:23:26+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
66,https://rowsandall.com/rowers/workout/2685/emailcsv,https://rowsandall.com/rowers/workout/2685/emailtcx,0,0,2018-01-27 14:25:07+00:00,18338,01:15:22.800000,C2 Import Workout from 2018-01-27 14:25:07+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
67,https://rowsandall.com/rowers/workout/2684/emailcsv,https://rowsandall.com/rowers/workout/2684/emailtcx,0,0,2018-02-03 14:20:18+00:00,12181,00:51:46,C2 Import Workout from 2018-02-03 14:20:18+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
68,https://rowsandall.com/rowers/workout/2683/emailcsv,https://rowsandall.com/rowers/workout/2683/emailtcx,0,0,2018-02-06 17:54:01+00:00,7210,00:31:09,C2 Import Workout from 2018-02-06 17:54:01+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
69,https://rowsandall.com/rowers/workout/2682/emailcsv,https://rowsandall.com/rowers/workout/2682/emailtcx,0,0,2018-02-10 09:10:14+00:00,3040,00:12:47.200000,C2 Import Workout from 2018-02-10 09:10:14+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
70,https://rowsandall.com/rowers/workout/2681/emailcsv,https://rowsandall.com/rowers/workout/2681/emailtcx,0,0,2018-02-10 09:23:52+00:00,9305,00:40:50.900000,C2 Import Workout from 2018-02-10 09:23:52+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
71,https://rowsandall.com/rowers/workout/2680/emailcsv,https://rowsandall.com/rowers/workout/2680/emailtcx,0,0,2018-02-10 10:06:00+00:00,2009,00:09:04.200000,C2 Import Workout from 2018-02-10 10:06:00+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
72,https://rowsandall.com/rowers/workout/2679/emailcsv,https://rowsandall.com/rowers/workout/2679/emailtcx,0,0,2018-02-11 16:57:32+00:00,14430,01:01:23,C2 Import Workout from 2018-02-11 16:57:32+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
73,https://rowsandall.com/rowers/workout/2335/emailcsv,https://rowsandall.com/rowers/workout/2335/emailtcx,0,0,2018-02-12 05:02:06+00:00,3872,00:27:12.200000,SpdCoach 1,,America/Los_Angeles,water,80.0,lwt
|
||||
74,https://rowsandall.com/rowers/workout/2338/emailcsv,https://rowsandall.com/rowers/workout/2338/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
75,https://rowsandall.com/rowers/workout/2339/emailcsv,https://rowsandall.com/rowers/workout/2339/emailtcx,0,0,2018-02-12 05:02:06+00:00,7522,09:41:48.200000,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
76,https://rowsandall.com/rowers/workout/2341/emailcsv,https://rowsandall.com/rowers/workout/2341/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
77,https://rowsandall.com/rowers/workout/2342/emailcsv,https://rowsandall.com/rowers/workout/2342/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
78,https://rowsandall.com/rowers/workout/2343/emailcsv,https://rowsandall.com/rowers/workout/2343/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
79,https://rowsandall.com/rowers/workout/2410/emailcsv,https://rowsandall.com/rowers/workout/2410/emailtcx,0,0,2018-02-12 05:02:06+00:00,3872,00:27:12.200000,Test,,America/Los_Angeles,water,80.0,lwt
|
||||
80,https://rowsandall.com/rowers/workout/2414/emailcsv,https://rowsandall.com/rowers/workout/2414/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
81,https://rowsandall.com/rowers/workout/2416/emailcsv,https://rowsandall.com/rowers/workout/2416/emailtcx,0,0,2018-02-12 05:02:06+00:00,3872,00:27:12.200000,Test aaaa,,America/Los_Angeles,water,80.0,lwt
|
||||
82,https://rowsandall.com/rowers/workout/2417/emailcsv,https://rowsandall.com/rowers/workout/2417/emailtcx,0,0,2018-02-12 05:02:06+00:00,9336,09:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
83,https://rowsandall.com/rowers/workout/2418/emailcsv,https://rowsandall.com/rowers/workout/2418/emailtcx,0,0,2018-02-12 05:02:06+00:00,3872,00:27:12.200000,Test i,,America/Los_Angeles,water,80.0,lwt
|
||||
84,https://rowsandall.com/rowers/workout/2419/emailcsv,https://rowsandall.com/rowers/workout/2419/emailtcx,0,0,2018-02-12 05:02:06+00:00,11394,09:42:05.500000,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
85,https://rowsandall.com/rowers/workout/2420/emailcsv,https://rowsandall.com/rowers/workout/2420/emailtcx,0,0,2018-02-12 13:55:06+00:00,3872,00:27:12.200000,Test ii,,America/Los_Angeles,water,80.0,lwt
|
||||
86,https://rowsandall.com/rowers/workout/2421/emailcsv,https://rowsandall.com/rowers/workout/2421/emailtcx,0,0,2018-02-12 13:55:06+00:00,350236,00:49:05.500000,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
87,https://rowsandall.com/rowers/workout/2344/emailcsv,https://rowsandall.com/rowers/workout/2344/emailtcx,0,0,2018-02-12 14:02:06+00:00,3872,00:27:12.200000,SpdCoach Sessions,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
88,https://rowsandall.com/rowers/workout/2347/emailcsv,https://rowsandall.com/rowers/workout/2347/emailtcx,0,0,2018-02-12 14:02:06+00:00,9336,00:58:35,Joined Workout,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
89,https://rowsandall.com/rowers/workout/2411/emailcsv,https://rowsandall.com/rowers/workout/2411/emailtcx,0,0,2018-02-12 14:02:06+00:00,3872,00:27:12.200000,Test 2,,America/Los_Angeles,water,80.0,lwt
|
||||
90,https://rowsandall.com/rowers/workout/2415/emailcsv,https://rowsandall.com/rowers/workout/2415/emailtcx,0,0,2018-02-12 14:02:06+00:00,9336,00:58:35,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
91,https://rowsandall.com/rowers/workout/2430/emailcsv,https://rowsandall.com/rowers/workout/2430/emailtcx,0,0,2018-02-12 14:02:06+00:00,3872,00:27:12.200000,Water,,America/Los_Angeles,water,80.0,lwt
|
||||
92,https://rowsandall.com/rowers/workout/2445/emailcsv,https://rowsandall.com/rowers/workout/2445/emailtcx,0,0,2018-02-12 14:02:06+00:00,3872,00:27:12.200000,Test P,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
93,https://rowsandall.com/rowers/workout/2449/emailcsv,https://rowsandall.com/rowers/workout/2449/emailtcx,0,0,2018-02-12 14:02:06+00:00,3872,00:27:12.200000,Water 2x,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
94,https://rowsandall.com/rowers/workout/2412/emailcsv,https://rowsandall.com/rowers/workout/2412/emailtcx,0,0,2018-02-12 14:22:01+00:00,3650,00:14:53.200000,Test 3,,America/Los_Angeles,water,80.0,lwt
|
||||
95,https://rowsandall.com/rowers/workout/2336/emailcsv,https://rowsandall.com/rowers/workout/2336/emailtcx,0,0,2018-02-12 14:29:01+00:00,3650,00:14:53.200000,SpdCoach 2,"
|
||||
Summary for your location at 2018-02-12T14:55:00Z: Temperature 9.0C/48.2F. Wind: 2.5 m/s (5.0 kt). Wind Bearing: 280.0 degrees",America/Los_Angeles,water,80.0,lwt
|
||||
96,https://rowsandall.com/rowers/workout/2340/emailcsv,https://rowsandall.com/rowers/workout/2340/emailtcx,0,0,2018-02-12 14:29:01+00:00,5464,00:31:40,Joined Workout,,America/Los_Angeles,water,80.0,lwt
|
||||
97,https://rowsandall.com/rowers/workout/2345/emailcsv,https://rowsandall.com/rowers/workout/2345/emailtcx,0,0,2018-02-12 14:29:01+00:00,3650,00:14:53.200000,SpdCoach Sessions (2),imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
98,https://rowsandall.com/rowers/workout/2433/emailcsv,https://rowsandall.com/rowers/workout/2433/emailtcx,0,0,2018-02-12 14:29:01+00:00,3650,00:14:53.200000,Test,,America/Los_Angeles,rower,80.0,lwt
|
||||
99,https://rowsandall.com/rowers/workout/2442/emailcsv,https://rowsandall.com/rowers/workout/2442/emailtcx,0,0,2018-02-12 14:29:01+00:00,3650,00:14:53.200000,Water,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
100,https://rowsandall.com/rowers/workout/2444/emailcsv,https://rowsandall.com/rowers/workout/2444/emailtcx,0,0,2018-02-12 14:29:01+00:00,3650,00:14:53.200000,SpdCoach 2,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
101,https://rowsandall.com/rowers/workout/2337/emailcsv,https://rowsandall.com/rowers/workout/2337/emailtcx,0,0,2018-02-12 14:49:02+00:00,1814,00:11:39,SpdCoach 3,,America/Los_Angeles,water,80.0,lwt
|
||||
102,https://rowsandall.com/rowers/workout/2346/emailcsv,https://rowsandall.com/rowers/workout/2346/emailtcx,0,0,2018-02-12 14:49:02+00:00,1814,00:11:39,SpdCoach Sessions (3),imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
103,https://rowsandall.com/rowers/workout/2413/emailcsv,https://rowsandall.com/rowers/workout/2413/emailtcx,0,0,2018-02-12 14:49:02+00:00,1814,00:11:39,Test 4,,America/Los_Angeles,water,80.0,lwt
|
||||
104,https://rowsandall.com/rowers/workout/2443/emailcsv,https://rowsandall.com/rowers/workout/2443/emailtcx,0,0,2018-02-12 14:49:02+00:00,1814,00:11:39,water weer,imported through email,America/Los_Angeles,water,80.0,lwt
|
||||
105,https://rowsandall.com/rowers/workout/2678/emailcsv,https://rowsandall.com/rowers/workout/2678/emailtcx,0,0,2018-02-12 18:39:42+00:00,2014,00:08:37.700000,C2 Import Workout from 2018-02-12 18:39:42+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
106,https://rowsandall.com/rowers/workout/2677/emailcsv,https://rowsandall.com/rowers/workout/2677/emailtcx,0,0,2018-02-12 18:49:03+00:00,10562,00:46:12.400000,C2 Import Workout from 2018-02-12 18:49:03+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
107,https://rowsandall.com/rowers/workout/2676/emailcsv,https://rowsandall.com/rowers/workout/2676/emailtcx,0,0,2018-02-12 19:36:43+00:00,1998,00:09:39.800000,C2 Import Workout from 2018-02-12 19:36:43+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
108,https://rowsandall.com/rowers/workout/2675/emailcsv,https://rowsandall.com/rowers/workout/2675/emailtcx,0,0,2018-02-15 18:16:50+00:00,12440,00:51:41.500000,C2 Import Workout from 2018-02-15 18:16:50+00:00,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
109,https://rowsandall.com/rowers/workout/2674/emailcsv,https://rowsandall.com/rowers/workout/2674/emailtcx,0,0,2018-02-15 19:08:28+00:00,14477,01:00:21.800000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
110,https://rowsandall.com/rowers/workout/2673/emailcsv,https://rowsandall.com/rowers/workout/2673/emailtcx,0,0,2018-02-16 14:24:03+00:00,3012,00:12:58.800000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
111,https://rowsandall.com/rowers/workout/2672/emailcsv,https://rowsandall.com/rowers/workout/2672/emailtcx,0,0,2018-02-16 14:37:40+00:00,5277,00:23:00,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
112,https://rowsandall.com/rowers/workout/2671/emailcsv,https://rowsandall.com/rowers/workout/2671/emailtcx,0,0,2018-02-16 15:01:29+00:00,1036,00:05:03.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
113,https://rowsandall.com/rowers/workout/2670/emailcsv,https://rowsandall.com/rowers/workout/2670/emailtcx,0,0,2018-02-16 15:07:03+00:00,5113,00:23:22,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
114,https://rowsandall.com/rowers/workout/2669/emailcsv,https://rowsandall.com/rowers/workout/2669/emailtcx,0,0,2018-02-16 15:34:40+00:00,1259,00:05:48.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
115,https://rowsandall.com/rowers/workout/2668/emailcsv,https://rowsandall.com/rowers/workout/2668/emailtcx,0,0,2018-02-18 13:30:59+00:00,13541,00:56:07.300000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
116,https://rowsandall.com/rowers/workout/2667/emailcsv,https://rowsandall.com/rowers/workout/2667/emailtcx,0,0,2018-02-20 18:08:13+00:00,2008,00:08:36.300000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
117,https://rowsandall.com/rowers/workout/2666/emailcsv,https://rowsandall.com/rowers/workout/2666/emailtcx,0,0,2018-02-20 18:17:17+00:00,10914,00:48:06.100000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
118,https://rowsandall.com/rowers/workout/2665/emailcsv,https://rowsandall.com/rowers/workout/2665/emailtcx,0,0,2018-02-20 19:06:36+00:00,1513,00:07:37.300000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
119,https://rowsandall.com/rowers/workout/2381/emailcsv,https://rowsandall.com/rowers/workout/2381/emailtcx,0,0,2018-02-21 06:26:01+00:00,6119,00:27:20.200000,3x2km Racice,,Europe/Prague,water,80.0,lwt
|
||||
120,https://rowsandall.com/rowers/workout/2384/emailcsv,https://rowsandall.com/rowers/workout/2384/emailtcx,0,0,2018-02-22 09:32:01+00:00,8000,00:35:08.500000,8k trial,,Europe/Prague,water,80.0,lwt
|
||||
121,https://rowsandall.com/rowers/workout/2664/emailcsv,https://rowsandall.com/rowers/workout/2664/emailtcx,0,0,2018-02-22 18:40:03+00:00,11481,00:49:17.400000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
122,https://rowsandall.com/rowers/workout/2663/emailcsv,https://rowsandall.com/rowers/workout/2663/emailtcx,0,0,2018-02-23 15:12:10+00:00,2008,00:08:44.800000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
123,https://rowsandall.com/rowers/workout/2383/emailcsv,https://rowsandall.com/rowers/workout/2383/emailtcx,0,0,2018-02-23 15:17:03+00:00,5918,00:25:10.700000,Horin,,Europe/Prague,water,80.0,lwt
|
||||
124,https://rowsandall.com/rowers/workout/2662/emailcsv,https://rowsandall.com/rowers/workout/2662/emailtcx,0,0,2018-02-23 15:21:44+00:00,8804,00:39:58,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
125,https://rowsandall.com/rowers/workout/2661/emailcsv,https://rowsandall.com/rowers/workout/2661/emailtcx,0,0,2018-02-23 16:02:23+00:00,2008,00:09:05,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
126,https://rowsandall.com/rowers/workout/2385/emailcsv,https://rowsandall.com/rowers/workout/2385/emailtcx,0,0,2018-02-24 11:58:09+00:00,17045,01:35:59,Washington,,America/New_York,water,80.0,lwt
|
||||
127,https://rowsandall.com/rowers/workout/2660/emailcsv,https://rowsandall.com/rowers/workout/2660/emailtcx,0,0,2018-02-24 15:07:07+00:00,14544,01:01:04.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
128,https://rowsandall.com/rowers/workout/2386/emailcsv,https://rowsandall.com/rowers/workout/2386/emailtcx,0,0,2018-02-25 12:24:59+00:00,6182,00:26:24.400000,9x500m/70sec,,Europe/Prague,rower,80.0,lwt
|
||||
129,https://rowsandall.com/rowers/workout/2659/emailcsv,https://rowsandall.com/rowers/workout/2659/emailtcx,0,0,2018-02-25 14:15:13+00:00,16623,01:22:28,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
130,https://rowsandall.com/rowers/workout/2400/emailcsv,https://rowsandall.com/rowers/workout/2400/emailtcx,0,0,2018-02-25 22:45:28+00:00,4175,00:25:07.700000,Test CP,,Europe/Prague,rower,80.0,lwt
|
||||
131,https://rowsandall.com/rowers/workout/2387/emailcsv,https://rowsandall.com/rowers/workout/2387/emailtcx,0,0,2018-02-27 13:19:44+00:00,2206,00:10:00,StatsError,,Europe/Prague,rower,80.0,lwt
|
||||
132,https://rowsandall.com/rowers/workout/2658/emailcsv,https://rowsandall.com/rowers/workout/2658/emailtcx,0,0,2018-02-27 16:32:56+00:00,13549,00:56:44.900000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
133,https://rowsandall.com/rowers/workout/2657/emailcsv,https://rowsandall.com/rowers/workout/2657/emailtcx,0,0,2018-03-03 13:50:12+00:00,2012,00:08:42.700000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
134,https://rowsandall.com/rowers/workout/2656/emailcsv,https://rowsandall.com/rowers/workout/2656/emailtcx,0,0,2018-03-03 14:00:26+00:00,6270,00:26:41.700000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
135,https://rowsandall.com/rowers/workout/2655/emailcsv,https://rowsandall.com/rowers/workout/2655/emailtcx,0,0,2018-03-03 14:27:41+00:00,999,00:05:44.100000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
136,https://rowsandall.com/rowers/workout/2395/emailcsv,https://rowsandall.com/rowers/workout/2395/emailtcx,0,0,2018-03-03 14:33:51+00:00,6098,00:26:35.400000,Flex chart not working,,Europe/Prague,rower,80.0,lwt
|
||||
137,https://rowsandall.com/rowers/workout/2654/emailcsv,https://rowsandall.com/rowers/workout/2654/emailtcx,0,0,2018-03-03 14:33:51+00:00,6098,00:26:35.400000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
138,https://rowsandall.com/rowers/workout/2653/emailcsv,https://rowsandall.com/rowers/workout/2653/emailtcx,0,0,2018-03-03 15:01:34+00:00,1559,00:07:16.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
139,https://rowsandall.com/rowers/workout/2392/emailcsv,https://rowsandall.com/rowers/workout/2392/emailtcx,0,0,2018-03-05 13:51:23+00:00,13802,01:06:00,Mike's average workout,,Europe/Prague,rower,80.0,lwt
|
||||
140,https://rowsandall.com/rowers/workout/2396/emailcsv,https://rowsandall.com/rowers/workout/2396/emailtcx,0,0,2018-03-05 13:51:23+00:00,4058,00:17:00,Mike's average workout (1),,Europe/Prague,rower,80.0,lwt
|
||||
141,https://rowsandall.com/rowers/workout/2397/emailcsv,https://rowsandall.com/rowers/workout/2397/emailtcx,0,0,2018-03-05 14:08:23+00:00,9738,00:49:00,Mike's average workout (2),,Europe/Prague,rower,80.0,lwt
|
||||
142,https://rowsandall.com/rowers/workout/2389/emailcsv,https://rowsandall.com/rowers/workout/2389/emailtcx,0,0,2018-03-05 17:48:31+00:00,7022,00:29:44.400000,test,wat een kutsessie,Europe/Prague,rower,80.0,lwt
|
||||
143,https://rowsandall.com/rowers/workout/2652/emailcsv,https://rowsandall.com/rowers/workout/2652/emailtcx,0,0,2018-03-05 17:48:31+00:00,7022,00:29:45.900000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
144,https://rowsandall.com/rowers/workout/2390/emailcsv,https://rowsandall.com/rowers/workout/2390/emailtcx,0,0,2018-03-05 17:50:46+00:00,5019,00:31:27.500000,,,Europe/Prague,rower,80.0,lwt
|
||||
145,https://rowsandall.com/rowers/workout/2651/emailcsv,https://rowsandall.com/rowers/workout/2651/emailtcx,0,0,2018-03-08 18:34:05+00:00,2010,00:08:38.700000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
146,https://rowsandall.com/rowers/workout/2650/emailcsv,https://rowsandall.com/rowers/workout/2650/emailtcx,0,0,2018-03-08 18:43:29+00:00,10444,00:46:52.300000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
147,https://rowsandall.com/rowers/workout/2649/emailcsv,https://rowsandall.com/rowers/workout/2649/emailtcx,0,0,2018-03-08 19:31:31+00:00,269,00:01:42,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
148,https://rowsandall.com/rowers/workout/2398/emailcsv,https://rowsandall.com/rowers/workout/2398/emailtcx,0,0,2018-03-09 11:52:48+00:00,4160,00:13:00,test template,"Dit zijn de notes
|
||||
Sommige zinnen zijn heel heel heel heel heel heel heel heel lang Sommige zinnen zijn heel heel heel heel heel heel heel heel lang Sommige zinnen zijn heel heel heel heel heel heel heel heel lang Sommige zinnen zijn heel heel heel heel heel heel heel heel lang
|
||||
LAngwoordzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",Europe/Prague,rower,80.0,lwt
|
||||
149,https://rowsandall.com/rowers/workout/2399/emailcsv,https://rowsandall.com/rowers/workout/2399/emailtcx,0,0,2018-03-09 11:59:13+00:00,4160,00:13:00,Test P,,Europe/Prague,rower,80.0,lwt
|
||||
150,https://rowsandall.com/rowers/workout/2401/emailcsv,https://rowsandall.com/rowers/workout/2401/emailtcx,0,0,2018-03-13 07:32:40+00:00,6479,00:30:27.300000,high power values?,,Europe/Prague,rower,80.0,lwt
|
||||
151,https://rowsandall.com/rowers/workout/2648/emailcsv,https://rowsandall.com/rowers/workout/2648/emailtcx,0,0,2018-03-13 18:18:31+00:00,2009,00:08:30,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
152,https://rowsandall.com/rowers/workout/2404/emailcsv,https://rowsandall.com/rowers/workout/2404/emailtcx,0,0,2018-03-13 18:28:00.900000+00:00,9996,00:40:00,C2 Rower Timed. 10.0,"C2 Rower Timed. 10.0km, 40.00 min. (PainSled)",Europe/Prague,rower,80.0,lwt
|
||||
153,https://rowsandall.com/rowers/workout/2405/emailcsv,https://rowsandall.com/rowers/workout/2405/emailtcx,0,0,2018-03-13 18:28:00.900000+00:00,10850,00:45:32.400000,C2 Rower Timed. 10.0,"C2 Rower Timed. 10.0km, 40.00 min. (PainSled)",Europe/Prague,rower,80.0,lwt
|
||||
154,https://rowsandall.com/rowers/workout/2647/emailcsv,https://rowsandall.com/rowers/workout/2647/emailtcx,0,0,2018-03-13 18:28:01+00:00,10864,00:46:12.800000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
155,https://rowsandall.com/rowers/workout/2646/emailcsv,https://rowsandall.com/rowers/workout/2646/emailtcx,0,0,2018-03-13 19:15:15+00:00,1015,00:05:05.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
156,https://rowsandall.com/rowers/workout/2645/emailcsv,https://rowsandall.com/rowers/workout/2645/emailtcx,0,0,2018-03-13 19:18:21+00:00,2009,00:08:29.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,hwt
|
||||
157,https://rowsandall.com/rowers/workout/2644/emailcsv,https://rowsandall.com/rowers/workout/2644/emailtcx,0,0,2018-03-13 19:28:00+00:00,9996,00:40:00,Imported workout,imported from Concept2 log,UTC,rower,80.0,hwt
|
||||
158,https://rowsandall.com/rowers/workout/2402/emailcsv,https://rowsandall.com/rowers/workout/2402/emailtcx,0,0,2018-03-13 21:15:46+00:00,1311,00:13:04.100000,Stroke Count,,Europe/Prague,rower,80.0,lwt
|
||||
159,https://rowsandall.com/rowers/workout/2403/emailcsv,https://rowsandall.com/rowers/workout/2403/emailtcx,0,0,2018-03-14 19:33:20+00:00,10850,00:45:32.400000,4x10min,,Europe/Prague,rower,80.0,lwt
|
||||
160,https://rowsandall.com/rowers/workout/2406/emailcsv,https://rowsandall.com/rowers/workout/2406/emailtcx,0,0,2018-03-15 06:22:52+00:00,336,00:01:00,Test 1 minute,,Europe/Prague,rower,80.0,lwt
|
||||
161,https://rowsandall.com/rowers/workout/2422/emailcsv,https://rowsandall.com/rowers/workout/2422/emailtcx,0,0,2018-03-15 06:22:52+00:00,8136,23:59:59.900000,Joined Workout,,Europe/Prague,rower,80.0,lwt
|
||||
162,https://rowsandall.com/rowers/workout/2407/emailcsv,https://rowsandall.com/rowers/workout/2407/emailtcx,0,0,2018-03-15 06:23:09+00:00,7800,00:30:00,Thirty Dirty,,Europe/Prague,rower,80.0,lwt
|
||||
163,https://rowsandall.com/rowers/workout/2434/emailcsv,https://rowsandall.com/rowers/workout/2434/emailtcx,0,0,2018-03-15 06:25:09+00:00,7800,23:59:59.900000,30 min,,Europe/Prague,rower,80.0,lwt
|
||||
164,https://rowsandall.com/rowers/workout/2643/emailcsv,https://rowsandall.com/rowers/workout/2643/emailtcx,0,0,2018-03-15 18:48:48+00:00,2013,00:08:36.700000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
165,https://rowsandall.com/rowers/workout/2425/emailcsv,https://rowsandall.com/rowers/workout/2425/emailtcx,0,0,2018-03-15 18:58:08+00:00,10169,00:44:31.200000,Joined Workout,,Europe/Prague,rower,80.0,lwt
|
||||
166,https://rowsandall.com/rowers/workout/2438/emailcsv,https://rowsandall.com/rowers/workout/2438/emailtcx,0,0,2018-03-15 18:58:08+00:00,8157,00:34:21.600000,Test,imported through email,Europe/Prague,rower,80.0,lwt
|
||||
167,https://rowsandall.com/rowers/workout/2642/emailcsv,https://rowsandall.com/rowers/workout/2642/emailtcx,0,0,2018-03-15 18:58:08+00:00,8157,00:34:21.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
168,https://rowsandall.com/rowers/workout/2423/emailcsv,https://rowsandall.com/rowers/workout/2423/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,6x4min,,Europe/Prague,rower,80.0,lwt
|
||||
169,https://rowsandall.com/rowers/workout/2431/emailcsv,https://rowsandall.com/rowers/workout/2431/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,Indoor,,Europe/Prague,rower,80.0,lwt
|
||||
170,https://rowsandall.com/rowers/workout/2432/emailcsv,https://rowsandall.com/rowers/workout/2432/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,test,,Europe/Prague,rower,80.0,lwt
|
||||
171,https://rowsandall.com/rowers/workout/2435/emailcsv,https://rowsandall.com/rowers/workout/2435/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,Test,,Europe/Prague,rower,80.0,lwt
|
||||
172,https://rowsandall.com/rowers/workout/2436/emailcsv,https://rowsandall.com/rowers/workout/2436/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,r,,Europe/Prague,rower,80.0,lwt
|
||||
173,https://rowsandall.com/rowers/workout/2437/emailcsv,https://rowsandall.com/rowers/workout/2437/emailtcx,0,0,2018-03-15 18:58:08.620390+00:00,8157,00:34:21.600000,a,,Europe/Prague,rower,80.0,lwt
|
||||
174,https://rowsandall.com/rowers/workout/2440/emailcsv,https://rowsandall.com/rowers/workout/2440/emailtcx,0,0,2018-03-15 19:33:15+00:00,2012,00:09:24.300000,another one,imported through email,Europe/Prague,rower,80.0,lwt
|
||||
175,https://rowsandall.com/rowers/workout/2641/emailcsv,https://rowsandall.com/rowers/workout/2641/emailtcx,0,0,2018-03-15 19:33:15+00:00,2012,00:09:24.300000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
176,https://rowsandall.com/rowers/workout/2424/emailcsv,https://rowsandall.com/rowers/workout/2424/emailtcx,0,0,2018-03-15 19:33:15.009331+00:00,2012,00:09:24.400000,6x4min,,Europe/Prague,rower,80.0,lwt
|
||||
177,https://rowsandall.com/rowers/workout/2429/emailcsv,https://rowsandall.com/rowers/workout/2429/emailtcx,0,0,2018-03-16 12:04:52+00:00,9595,00:54:45,Joined Workout,,America/New_York,rower,80.0,lwt
|
||||
178,https://rowsandall.com/rowers/workout/2426/emailcsv,https://rowsandall.com/rowers/workout/2426/emailtcx,0,0,2018-03-16 12:09:23+00:00,9269,00:50:14,Test P,,America/New_York,rower,80.0,lwt
|
||||
179,https://rowsandall.com/rowers/workout/2428/emailcsv,https://rowsandall.com/rowers/workout/2428/emailtcx,0,0,2018-03-16 12:09:23+00:00,9269,00:50:14,,,America/New_York,rower,80.0,lwt
|
||||
180,https://rowsandall.com/rowers/workout/2427/emailcsv,https://rowsandall.com/rowers/workout/2427/emailtcx,0,0,2018-03-16 13:00:52+00:00,326,00:04:03,Water Workout,,America/New_York,water,80.0,lwt
|
||||
181,https://rowsandall.com/rowers/workout/2640/emailcsv,https://rowsandall.com/rowers/workout/2640/emailtcx,0,0,2018-03-17 14:14:56+00:00,15231,01:03:19.100000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
182,https://rowsandall.com/rowers/workout/2639/emailcsv,https://rowsandall.com/rowers/workout/2639/emailtcx,0,0,2018-03-18 14:03:27+00:00,3876,00:16:16.200000,Imported workout,imported from Concept2 log,UTC,slides,80.0,lwt
|
||||
183,https://rowsandall.com/rowers/workout/2638/emailcsv,https://rowsandall.com/rowers/workout/2638/emailtcx,0,0,2018-03-18 14:20:52+00:00,6000,00:22:17.500000,Imported workout,imported from Concept2 log,UTC,slides,80.0,lwt
|
||||
184,https://rowsandall.com/rowers/workout/2637/emailcsv,https://rowsandall.com/rowers/workout/2637/emailtcx,0,0,2018-03-18 14:44:46+00:00,4163,00:19:13.200000,Imported workout,imported from Concept2 log,UTC,slides,80.0,lwt
|
||||
185,https://rowsandall.com/rowers/workout/2636/emailcsv,https://rowsandall.com/rowers/workout/2636/emailtcx,0,0,2018-03-22 18:38:59+00:00,2007,00:08:43.800000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
186,https://rowsandall.com/rowers/workout/2635/emailcsv,https://rowsandall.com/rowers/workout/2635/emailtcx,0,0,2018-03-22 18:48:29+00:00,6770,00:29:38.200000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
187,https://rowsandall.com/rowers/workout/2634/emailcsv,https://rowsandall.com/rowers/workout/2634/emailtcx,0,0,2018-03-22 19:18:50+00:00,2010,00:08:46.700000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
188,https://rowsandall.com/rowers/workout/2633/emailcsv,https://rowsandall.com/rowers/workout/2633/emailtcx,0,0,2018-03-24 09:20:07+00:00,15446,01:22:56.300000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
189,https://rowsandall.com/rowers/workout/2451/emailcsv,https://rowsandall.com/rowers/workout/2451/emailtcx,0,0,2018-03-25 09:59:12+00:00,29000,01:50:13,test,,Europe/Zurich,rower,80.0,lwt
|
||||
190,https://rowsandall.com/rowers/workout/2452/emailcsv,https://rowsandall.com/rowers/workout/2452/emailtcx,0,0,2018-03-25 09:59:12+00:00,29000,01:50:13,Background processing test,imported through email,Europe/Zurich,water,80.0,lwt
|
||||
191,https://rowsandall.com/rowers/workout/2632/emailcsv,https://rowsandall.com/rowers/workout/2632/emailtcx,0,0,2018-03-25 14:29:09+00:00,6664,00:46:07,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
192,https://rowsandall.com/rowers/workout/2453/emailcsv,https://rowsandall.com/rowers/workout/2453/emailtcx,0,0,2018-03-29 13:45:00+00:00,2000,07:25:00,test api,string,UTC,water,80.0,lwt
|
||||
193,https://rowsandall.com/rowers/workout/2454/emailcsv,https://rowsandall.com/rowers/workout/2454/emailtcx,0,0,2018-04-02 11:02:55+00:00,3848,00:22:14.200000,RP3 curve,,Europe/Prague,rower,80.0,lwt
|
||||
194,https://rowsandall.com/rowers/workout/2455/emailcsv,https://rowsandall.com/rowers/workout/2455/emailtcx,0,0,2018-04-02 11:04:18+00:00,3848,00:22:14.200000,,,Europe/Prague,rower,80.0,lwt
|
||||
195,https://rowsandall.com/rowers/workout/2631/emailcsv,https://rowsandall.com/rowers/workout/2631/emailtcx,0,0,2018-04-03 14:34:01+00:00,2822,00:14:43.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
196,https://rowsandall.com/rowers/workout/2630/emailcsv,https://rowsandall.com/rowers/workout/2630/emailtcx,0,0,2018-04-03 14:50:01+00:00,7505,00:39:46.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
197,https://rowsandall.com/rowers/workout/2456/emailcsv,https://rowsandall.com/rowers/workout/2456/emailtcx,0,0,2018-04-03 15:50:52+00:00,7200,00:37:44,In Stroke,,Europe/Prague,water,80.0,lwt
|
||||
198,https://rowsandall.com/rowers/workout/2457/emailcsv,https://rowsandall.com/rowers/workout/2457/emailtcx,0,0,2018-04-03 15:50:52+00:00,7200,00:37:44,In Stroke 2,,Europe/Prague,water,80.0,lwt
|
||||
199,https://rowsandall.com/rowers/workout/2629/emailcsv,https://rowsandall.com/rowers/workout/2629/emailtcx,0,0,2018-04-04 18:30:27+00:00,27,00:00:03.200000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
200,https://rowsandall.com/rowers/workout/2628/emailcsv,https://rowsandall.com/rowers/workout/2628/emailtcx,0,0,2018-04-04 19:00:43+00:00,8309,00:48:07.400000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
201,https://rowsandall.com/rowers/workout/2458/emailcsv,https://rowsandall.com/rowers/workout/2458/emailtcx,0,0,2018-04-07 07:41:02+00:00,10568,01:06:08.800000,2x3km fail,,Europe/Prague,water,80.0,lwt
|
||||
202,https://rowsandall.com/rowers/workout/2460/emailcsv,https://rowsandall.com/rowers/workout/2460/emailtcx,0,0,2018-04-07 07:41:02+00:00,10568,01:06:08.800000,Update,,Europe/Prague,water,80.0,lwt
|
||||
203,https://rowsandall.com/rowers/workout/2627/emailcsv,https://rowsandall.com/rowers/workout/2627/emailtcx,0,0,2018-04-07 07:41:02+00:00,2243,00:12:20.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
204,https://rowsandall.com/rowers/workout/2626/emailcsv,https://rowsandall.com/rowers/workout/2626/emailtcx,0,0,2018-04-07 07:55:02+00:00,3167,00:16:59.800000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
205,https://rowsandall.com/rowers/workout/2625/emailcsv,https://rowsandall.com/rowers/workout/2625/emailtcx,0,0,2018-04-07 08:14:02+00:00,2977,00:14:58,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
206,https://rowsandall.com/rowers/workout/2623/emailcsv,https://rowsandall.com/rowers/workout/2623/emailtcx,0,0,2018-04-07 08:33:03+00:00,2180,00:14:07.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
207,https://rowsandall.com/rowers/workout/2622/emailcsv,https://rowsandall.com/rowers/workout/2622/emailtcx,0,0,2018-04-10 17:38:22+00:00,11703,00:48:59.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
208,https://rowsandall.com/rowers/workout/2621/emailcsv,https://rowsandall.com/rowers/workout/2621/emailtcx,0,0,2018-04-10 18:27:53+00:00,17284,01:11:55.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
209,https://rowsandall.com/rowers/workout/2620/emailcsv,https://rowsandall.com/rowers/workout/2620/emailtcx,0,0,2018-04-11 18:37:27+00:00,10122,01:15:44.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
210,https://rowsandall.com/rowers/workout/2619/emailcsv,https://rowsandall.com/rowers/workout/2619/emailtcx,0,0,2018-04-12 16:17:02+00:00,10408,00:53:45.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
211,https://rowsandall.com/rowers/workout/2618/emailcsv,https://rowsandall.com/rowers/workout/2618/emailtcx,0,0,2018-04-15 08:34:05+00:00,11129,01:03:38,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
212,https://rowsandall.com/rowers/workout/2617/emailcsv,https://rowsandall.com/rowers/workout/2617/emailtcx,0,0,2018-04-18 13:43:04+00:00,1942,00:10:55.300000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
213,https://rowsandall.com/rowers/workout/2616/emailcsv,https://rowsandall.com/rowers/workout/2616/emailtcx,0,0,2018-04-18 13:57:01+00:00,7979,00:36:10.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
214,https://rowsandall.com/rowers/workout/2615/emailcsv,https://rowsandall.com/rowers/workout/2615/emailtcx,0,0,2018-04-18 14:49:06+00:00,1512,00:08:27.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
215,https://rowsandall.com/rowers/workout/2614/emailcsv,https://rowsandall.com/rowers/workout/2614/emailtcx,0,0,2018-04-20 15:51:41+00:00,9748,01:06:50.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
216,https://rowsandall.com/rowers/workout/2613/emailcsv,https://rowsandall.com/rowers/workout/2613/emailtcx,0,0,2018-04-21 15:38:04+00:00,5254,00:27:02.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
217,https://rowsandall.com/rowers/workout/2612/emailcsv,https://rowsandall.com/rowers/workout/2612/emailtcx,0,0,2018-04-22 07:15:01+00:00,12282,01:08:28.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
218,https://rowsandall.com/rowers/workout/2471/emailcsv,https://rowsandall.com/rowers/workout/2471/emailtcx,0,0,2018-04-23 11:00:00+00:00,1017,00:03:55.200000,7x150min/1min,,America/New_York,water,80.0,lwt
|
||||
219,https://rowsandall.com/rowers/workout/2472/emailcsv,https://rowsandall.com/rowers/workout/2472/emailtcx,0,0,2018-04-23 11:00:00+00:00,1017,00:03:55.200000,7x15min test 2,,America/New_York,water,80.0,lwt
|
||||
220,https://rowsandall.com/rowers/workout/2473/emailcsv,https://rowsandall.com/rowers/workout/2473/emailtcx,0,0,2018-04-23 11:00:00+00:00,1017,00:03:55.200000,7x150min/1min,,America/New_York,water,80.0,lwt
|
||||
221,https://rowsandall.com/rowers/workout/2474/emailcsv,https://rowsandall.com/rowers/workout/2474/emailtcx,0,0,2018-04-23 11:00:00+00:00,1017,00:03:55,test firmware,,America/New_York,water,80.0,lwt
|
||||
222,https://rowsandall.com/rowers/workout/2478/emailcsv,https://rowsandall.com/rowers/workout/2478/emailtcx,0,0,2018-04-23 11:00:00+00:00,1017,00:03:55.200000,Firmware 2,,America/New_York,water,80.0,lwt
|
||||
223,https://rowsandall.com/rowers/workout/2611/emailcsv,https://rowsandall.com/rowers/workout/2611/emailtcx,0,0,2018-04-23 17:46:25+00:00,13558,00:58:11.900000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
224,https://rowsandall.com/rowers/workout/2465/emailcsv,https://rowsandall.com/rowers/workout/2465/emailtcx,0,0,2018-04-23 20:42:00+00:00,8000,00:36:01.500000,Racice,,Europe/Prague,water,80.0,lwt
|
||||
225,https://rowsandall.com/rowers/workout/2610/emailcsv,https://rowsandall.com/rowers/workout/2610/emailtcx,0,0,2018-04-24 12:12:03+00:00,2959,00:16:42.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
226,https://rowsandall.com/rowers/workout/2609/emailcsv,https://rowsandall.com/rowers/workout/2609/emailtcx,0,0,2018-04-24 12:32:00+00:00,7516,00:38:49.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
227,https://rowsandall.com/rowers/workout/2466/emailcsv,https://rowsandall.com/rowers/workout/2466/emailtcx,0,0,2018-04-24 13:35:30+00:00,9420,00:48:00,,,Europe/Prague,water,80.0,lwt
|
||||
228,https://rowsandall.com/rowers/workout/2608/emailcsv,https://rowsandall.com/rowers/workout/2608/emailtcx,0,0,2018-04-25 17:50:26+00:00,10171,01:12:33.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
229,https://rowsandall.com/rowers/workout/2470/emailcsv,https://rowsandall.com/rowers/workout/2470/emailtcx,0,0,2018-04-25 22:59:01+00:00,4159,00:26:43.200000,SpeedCoach 7x150m,,America/New_York,water,80.0,lwt
|
||||
230,https://rowsandall.com/rowers/workout/2607/emailcsv,https://rowsandall.com/rowers/workout/2607/emailtcx,0,0,2018-04-26 16:18:01+00:00,2016,00:12:30.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
231,https://rowsandall.com/rowers/workout/2606/emailcsv,https://rowsandall.com/rowers/workout/2606/emailtcx,0,0,2018-04-26 16:33:00+00:00,4605,00:22:35.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
232,https://rowsandall.com/rowers/workout/2605/emailcsv,https://rowsandall.com/rowers/workout/2605/emailtcx,0,0,2018-04-26 16:56:03+00:00,1301,00:07:07.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
233,https://rowsandall.com/rowers/workout/2604/emailcsv,https://rowsandall.com/rowers/workout/2604/emailtcx,0,0,2018-04-28 08:02:01+00:00,11924,01:18:20.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
234,https://rowsandall.com/rowers/workout/2469/emailcsv,https://rowsandall.com/rowers/workout/2469/emailtcx,0,0,2018-04-29 07:22:01+00:00,8040,00:50:06,Test P,,America/New_York,water,80.0,lwt
|
||||
235,https://rowsandall.com/rowers/workout/2603/emailcsv,https://rowsandall.com/rowers/workout/2603/emailtcx,0,0,2018-04-29 07:22:01+00:00,8040,00:50:05.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
236,https://rowsandall.com/rowers/workout/2559/emailcsv,https://rowsandall.com/rowers/workout/2559/emailtcx,0,0,2018-05-03 16:02:08+00:00,10909,01:00:35,Intervals Tests (6),imported through email,Europe/Amsterdam,water,80.0,lwt
|
||||
237,https://rowsandall.com/rowers/workout/2602/emailcsv,https://rowsandall.com/rowers/workout/2602/emailtcx,0,0,2018-05-04 05:47:04+00:00,3472,00:18:53.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
238,https://rowsandall.com/rowers/workout/2479/emailcsv,https://rowsandall.com/rowers/workout/2479/emailtcx,0,0,2018-05-04 06:07:04+00:00,5997,00:25:53.900000,Zip test,imported through email,Europe/Prague,water,80.0,lwt
|
||||
239,https://rowsandall.com/rowers/workout/2481/emailcsv,https://rowsandall.com/rowers/workout/2481/emailtcx,0,0,2018-05-04 06:07:04+00:00,5997,00:25:53.900000,Zip test 2,imported through email,Europe/Prague,water,80.0,lwt
|
||||
240,https://rowsandall.com/rowers/workout/2483/emailcsv,https://rowsandall.com/rowers/workout/2483/emailtcx,0,0,2018-05-04 06:07:04+00:00,5997,00:25:53.900000,Test Zip 3,imported through email,Europe/Prague,water,80.0,lwt
|
||||
241,https://rowsandall.com/rowers/workout/2601/emailcsv,https://rowsandall.com/rowers/workout/2601/emailtcx,0,0,2018-05-04 06:07:04+00:00,5997,00:25:53.900000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
242,https://rowsandall.com/rowers/workout/2860/emailcsv,https://rowsandall.com/rowers/workout/2860/emailtcx,0,0,2018-05-04 06:07:04+00:00,5997,00:25:53.900000,Zip test,"imported through email
|
||||
from speedcoach2v2.15 via rowsandall.com",Europe/Prague,water,80.0,hwt
|
||||
243,https://rowsandall.com/rowers/workout/2600/emailcsv,https://rowsandall.com/rowers/workout/2600/emailtcx,0,0,2018-05-04 06:35:04+00:00,1009,00:06:44.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
244,https://rowsandall.com/rowers/workout/2599/emailcsv,https://rowsandall.com/rowers/workout/2599/emailtcx,0,0,2018-05-05 07:06:02+00:00,11180,01:01:01.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
245,https://rowsandall.com/rowers/workout/2598/emailcsv,https://rowsandall.com/rowers/workout/2598/emailtcx,0,0,2018-05-05 08:11:04+00:00,1152,00:06:56.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
246,https://rowsandall.com/rowers/workout/2597/emailcsv,https://rowsandall.com/rowers/workout/2597/emailtcx,0,0,2018-05-07 15:41:06+00:00,11019,01:00:40.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
247,https://rowsandall.com/rowers/workout/2490/emailcsv,https://rowsandall.com/rowers/workout/2490/emailtcx,0,0,2018-05-10 09:11:24+00:00,15263,01:39:34,Naarden goed,,Europe/Amsterdam,water,80.0,lwt
|
||||
248,https://rowsandall.com/rowers/workout/2491/emailcsv,https://rowsandall.com/rowers/workout/2491/emailtcx,0,0,2018-05-10 09:11:24+00:00,7378,00:44:59,Naarden goed (1),,Europe/Amsterdam,water,80.0,lwt
|
||||
249,https://rowsandall.com/rowers/workout/2492/emailcsv,https://rowsandall.com/rowers/workout/2492/emailtcx,0,0,2018-05-10 09:56:24+00:00,7876,00:54:33,Naarden goed (2),,Europe/Amsterdam,water,80.0,lwt
|
||||
250,https://rowsandall.com/rowers/workout/2596/emailcsv,https://rowsandall.com/rowers/workout/2596/emailtcx,0,0,2018-05-10 16:15:02+00:00,11983,01:01:26,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
251,https://rowsandall.com/rowers/workout/2485/emailcsv,https://rowsandall.com/rowers/workout/2485/emailtcx,0,0,2018-05-10 16:55:01+00:00,8000,00:36:01.500000,6k,,Europe/Prague,water,80.0,lwt
|
||||
252,https://rowsandall.com/rowers/workout/2486/emailcsv,https://rowsandall.com/rowers/workout/2486/emailtcx,0,0,2018-05-10 16:55:01+00:00,8000,00:36:01.500000,Racice 2,,Europe/Prague,water,80.0,lwt
|
||||
253,https://rowsandall.com/rowers/workout/2488/emailcsv,https://rowsandall.com/rowers/workout/2488/emailtcx,0,0,2018-05-11 07:02:52+00:00,15364,01:22:34,Naarden 1,,Europe/Amsterdam,water,80.0,lwt
|
||||
254,https://rowsandall.com/rowers/workout/2504/emailcsv,https://rowsandall.com/rowers/workout/2504/emailtcx,0,0,2018-05-12 10:01:00+00:00,16814,01:42:53,DC,"Summary for your location at 2018-05-12T12:52:00Z: Temperature 21.1C/69.9F. Wind: 3.0 m/s (6.0 kt). Wind Bearing: 30.0 degrees
|
||||
Summary for your location at 2018-05-12T10:52:00Z: Temperature 19.4C/66.9F. Wind: 3.0 m/s (6.0 kt). Wind Bearing: 40.0 degrees
|
||||
Summary for your location at 2018-05-12T11:52:00Z: Temperature 20.6C/69.0F. Wind: 3.6 m/s (7.0 kt). Wind Bearing: 20.0 degrees
|
||||
Summary for your location at 2018-05-12T10:52:26+00:00: Clear. Temperature 64.52F/18.0C. Wind: 0.96 m/s. Wind Bearing: 29 degrees",America/New_York,water,80.0,lwt
|
||||
255,https://rowsandall.com/rowers/workout/2931/emailcsv,https://rowsandall.com/rowers/workout/2931/emailtcx,0,0,2018-05-12 14:22:12+00:00,6510,00:46:56,Test P,,Europe/Bratislava,water,80.0,hwt
|
||||
256,https://rowsandall.com/rowers/workout/2513/emailcsv,https://rowsandall.com/rowers/workout/2513/emailtcx,0,0,2018-05-13 07:57:02+00:00,4605,00:35:11.700000,Quad,,Europe/Bratislava,water,80.0,lwt
|
||||
257,https://rowsandall.com/rowers/workout/2595/emailcsv,https://rowsandall.com/rowers/workout/2595/emailtcx,0,0,2018-05-13 07:57:02+00:00,4605,00:35:11.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
258,https://rowsandall.com/rowers/workout/2502/emailcsv,https://rowsandall.com/rowers/workout/2502/emailtcx,0,0,2018-05-13 09:22:49+00:00,973,00:03:53.900000,Completed a workout (generic) 0.6 mi on 05/13/18,,Europe/Bratislava,water,80.0,lwt
|
||||
259,https://rowsandall.com/rowers/workout/2503/emailcsv,https://rowsandall.com/rowers/workout/2503/emailtcx,0,0,2018-05-13 09:22:49+00:00,973,00:03:53.900000,Completed a workout (generic) 0.6 mi on 05/13/18,,Europe/Bratislava,water,80.0,lwt
|
||||
260,https://rowsandall.com/rowers/workout/2594/emailcsv,https://rowsandall.com/rowers/workout/2594/emailtcx,0,0,2018-05-13 16:50:32+00:00,2723,00:27:17.200000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
261,https://rowsandall.com/rowers/workout/2593/emailcsv,https://rowsandall.com/rowers/workout/2593/emailtcx,0,0,2018-05-13 16:51:01+00:00,5929,00:43:44.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
262,https://rowsandall.com/rowers/workout/2855/emailcsv,https://rowsandall.com/rowers/workout/2855/emailtcx,0,0,2018-05-14 13:53:04+00:00,6091,00:25:00.200000,Hradiste,"
|
||||
from csv via rowsandall.com",Europe/Prague,water,80.0,lwt
|
||||
263,https://rowsandall.com/rowers/workout/2963/emailcsv,https://rowsandall.com/rowers/workout/2963/emailtcx,0,0,2018-05-14 13:53:04+00:00,6091,00:25:00.200000,Hradiste,"
|
||||
from csv via rowsandall.com",Europe/Prague,water,80.0,hwt
|
||||
264,https://rowsandall.com/rowers/workout/2493/emailcsv,https://rowsandall.com/rowers/workout/2493/emailtcx,0,0,2018-05-15 10:35:00+00:00,10526,00:44:01.700000,Turin,,Europe/Rome,water,80.0,lwt
|
||||
265,https://rowsandall.com/rowers/workout/2489/emailcsv,https://rowsandall.com/rowers/workout/2489/emailtcx,0,0,2018-05-17 17:40:00+00:00,15364,01:22:34,Naarden 2,,Europe/Amsterdam,water,80.0,lwt
|
||||
266,https://rowsandall.com/rowers/workout/2464/emailcsv,https://rowsandall.com/rowers/workout/2464/emailtcx,0,0,2018-05-18 13:02:00+00:00,6091,00:25:00.200000,Hradiste,"Failed to download METAR data
|
||||
Failed to download METAR data
|
||||
Failed to download METAR data
|
||||
Failed to download METAR data
|
||||
Failed to download METAR data",Europe/Prague,water,80.0,lwt
|
||||
267,https://rowsandall.com/rowers/workout/2505/emailcsv,https://rowsandall.com/rowers/workout/2505/emailtcx,0,0,2018-05-19 11:55:34+00:00,14274,01:12:33.600000,Roos,,America/New_York,water,80.0,lwt
|
||||
268,https://rowsandall.com/rowers/workout/2506/emailcsv,https://rowsandall.com/rowers/workout/2506/emailtcx,0,0,2018-05-19 11:55:34+00:00,7384,00:33:59.800000,Roos (1),,America/New_York,water,80.0,lwt
|
||||
269,https://rowsandall.com/rowers/workout/2507/emailcsv,https://rowsandall.com/rowers/workout/2507/emailtcx,0,0,2018-05-19 12:29:34+00:00,6885,00:38:32.200000,Roos (2),,America/New_York,water,80.0,lwt
|
||||
270,https://rowsandall.com/rowers/workout/2511/emailcsv,https://rowsandall.com/rowers/workout/2511/emailtcx,0,0,2018-05-27 10:17:01+00:00,10663,00:59:29.700000,Test P,,Europe/Prague,water,80.0,lwt
|
||||
271,https://rowsandall.com/rowers/workout/2518/emailcsv,https://rowsandall.com/rowers/workout/2518/emailtcx,0,0,2018-05-27 10:17:01+00:00,10663,00:59:29.700000,dubbel,,Europe/Prague,water,80.0,lwt
|
||||
272,https://rowsandall.com/rowers/workout/2592/emailcsv,https://rowsandall.com/rowers/workout/2592/emailtcx,0,0,2018-05-27 10:17:01+00:00,10663,00:59:29.600000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
273,https://rowsandall.com/rowers/workout/2591/emailcsv,https://rowsandall.com/rowers/workout/2591/emailtcx,0,0,2018-05-28 15:11:01+00:00,9642,00:56:16.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
274,https://rowsandall.com/rowers/workout/2514/emailcsv,https://rowsandall.com/rowers/workout/2514/emailtcx,0,0,2018-05-30 18:05:25+00:00,11237,01:04:45.500000,Eight,imported through email,Europe/Prague,water,80.0,lwt
|
||||
275,https://rowsandall.com/rowers/workout/2516/emailcsv,https://rowsandall.com/rowers/workout/2516/emailtcx,0,0,2018-05-30 18:05:25+00:00,11237,01:04:45.500000,Twee Zonder,imported through email,Europe/Prague,water,80.0,lwt
|
||||
276,https://rowsandall.com/rowers/workout/2590/emailcsv,https://rowsandall.com/rowers/workout/2590/emailtcx,0,0,2018-05-30 18:05:25+00:00,11237,01:04:45.500000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
277,https://rowsandall.com/rowers/workout/2512/emailcsv,https://rowsandall.com/rowers/workout/2512/emailtcx,0,0,2018-05-31 16:30:07+00:00,8837,00:47:42.500000,Test,,Europe/Prague,water,80.0,lwt
|
||||
278,https://rowsandall.com/rowers/workout/2589/emailcsv,https://rowsandall.com/rowers/workout/2589/emailtcx,0,0,2018-05-31 16:30:07+00:00,8837,00:47:42.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
279,https://rowsandall.com/rowers/workout/2508/emailcsv,https://rowsandall.com/rowers/workout/2508/emailtcx,0,0,2018-06-01 07:57:02+00:00,4605,00:35:11.700000,Piestany,,Europe/Bratislava,water,80.0,lwt
|
||||
280,https://rowsandall.com/rowers/workout/2510/emailcsv,https://rowsandall.com/rowers/workout/2510/emailtcx,0,0,2018-06-01 08:02:02+00:00,3975,00:30:08.700000,Piestany (2),,Europe/Bratislava,water,80.0,lwt
|
||||
281,https://rowsandall.com/rowers/workout/2509/emailcsv,https://rowsandall.com/rowers/workout/2509/emailtcx,0,0,2018-06-01 11:30:07+00:00,8837,00:47:42.500000,Test,,Europe/Prague,water,80.0,lwt
|
||||
282,https://rowsandall.com/rowers/workout/2569/emailcsv,https://rowsandall.com/rowers/workout/2569/emailtcx,0,0,2018-06-01 15:00:00+00:00,11237,01:04:45.500000,Acht Intervals,,Europe/Prague,water,80.0,lwt
|
||||
283,https://rowsandall.com/rowers/workout/2588/emailcsv,https://rowsandall.com/rowers/workout/2588/emailtcx,0,0,2018-06-02 17:00:07+00:00,12511,01:07:58,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
284,https://rowsandall.com/rowers/workout/2587/emailcsv,https://rowsandall.com/rowers/workout/2587/emailtcx,0,0,2018-06-03 07:57:02+00:00,10830,01:04:35.900000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
285,https://rowsandall.com/rowers/workout/2586/emailcsv,https://rowsandall.com/rowers/workout/2586/emailtcx,0,0,2018-06-03 15:50:25+00:00,6125,00:48:38.600000,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
286,https://rowsandall.com/rowers/workout/2535/emailcsv,https://rowsandall.com/rowers/workout/2535/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Test - Delete,,Europe/Prague,rower,80.0,lwt
|
||||
287,https://rowsandall.com/rowers/workout/2536/emailcsv,https://rowsandall.com/rowers/workout/2536/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Test Sync - Delete,"
|
||||
from tcx via rowsandall.com",Europe/Prague,rower,80.0,lwt
|
||||
288,https://rowsandall.com/rowers/workout/2537/emailcsv,https://rowsandall.com/rowers/workout/2537/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Test P,"
|
||||
from tcx via rowsandall.com",Europe/Prague,rower,80.0,lwt
|
||||
289,https://rowsandall.com/rowers/workout/2538/emailcsv,https://rowsandall.com/rowers/workout/2538/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Test P,imported through email,Europe/Prague,rower,80.0,lwt
|
||||
290,https://rowsandall.com/rowers/workout/2539/emailcsv,https://rowsandall.com/rowers/workout/2539/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Test P,"imported through email
|
||||
from tcx via rowsandall.com",Europe/Prague,rower,80.0,lwt
|
||||
291,https://rowsandall.com/rowers/workout/2540/emailcsv,https://rowsandall.com/rowers/workout/2540/emailtcx,0,0,2018-06-05 13:07:02+00:00,0,00:05:01,Workout from Background Queue,imported through email,Europe/Prague,rower,80.0,lwt
|
||||
292,https://rowsandall.com/rowers/workout/2624/emailcsv,https://rowsandall.com/rowers/workout/2624/emailtcx,0,0,2018-06-05 13:51:01.900000+00:00,12744,01:08:22.100000,imported through ema,imported through email,Europe/Prague,water,80.0,lwt
|
||||
293,https://rowsandall.com/rowers/workout/2534/emailcsv,https://rowsandall.com/rowers/workout/2534/emailtcx,0,0,2018-06-05 14:05:02+00:00,0,00:01:33,Import from Polar Flow,imported through email,Europe/Prague,rower,80.0,lwt
|
||||
294,https://rowsandall.com/rowers/workout/2519/emailcsv,https://rowsandall.com/rowers/workout/2519/emailtcx,0,0,2018-06-05 14:09:57+00:00,0,00:03:38,TCX from Polar API,,Europe/Prague,water,80.0,lwt
|
||||
295,https://rowsandall.com/rowers/workout/2546/emailcsv,https://rowsandall.com/rowers/workout/2546/emailtcx,0,0,2018-06-05 15:51:01+00:00,12744,01:08:22.200000,8x glad,,Europe/Prague,water,80.0,lwt
|
||||
296,https://rowsandall.com/rowers/workout/2547/emailcsv,https://rowsandall.com/rowers/workout/2547/emailtcx,0,0,2018-06-05 15:51:01+00:00,12746,01:08:22.200000,1x glad,,Europe/Prague,c-boat,80.0,lwt
|
||||
297,https://rowsandall.com/rowers/workout/2548/emailcsv,https://rowsandall.com/rowers/workout/2548/emailtcx,0,68,2018-06-05 15:51:01+00:00,12744,01:08:22.200000,1x glad,,Europe/Prague,water,80.0,lwt
|
||||
298,https://rowsandall.com/rowers/workout/2549/emailcsv,https://rowsandall.com/rowers/workout/2549/emailtcx,0,0,2018-06-05 15:51:01+00:00,12746,01:08:22.200000,test,,Europe/Prague,water,80.0,lwt
|
||||
299,https://rowsandall.com/rowers/workout/2550/emailcsv,https://rowsandall.com/rowers/workout/2550/emailtcx,0,0,2018-06-05 15:51:01+00:00,12746,01:08:22.200000,test tcx,,Europe/Prague,water,80.0,lwt
|
||||
300,https://rowsandall.com/rowers/workout/2552/emailcsv,https://rowsandall.com/rowers/workout/2552/emailtcx,0,0,2018-06-05 15:51:01+00:00,6522,00:33:00,8x glad (1),,Europe/Prague,water,80.0,lwt
|
||||
301,https://rowsandall.com/rowers/workout/2585/emailcsv,https://rowsandall.com/rowers/workout/2585/emailtcx,0,0,2018-06-05 15:51:01+00:00,12744,01:08:22.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
302,https://rowsandall.com/rowers/workout/2553/emailcsv,https://rowsandall.com/rowers/workout/2553/emailtcx,0,0,2018-06-05 16:24:01+00:00,6213,00:35:19.500000,8x glad (2),,Europe/Prague,water,80.0,lwt
|
||||
303,https://rowsandall.com/rowers/workout/2584/emailcsv,https://rowsandall.com/rowers/workout/2584/emailtcx,0,0,2018-06-06 17:40:24+00:00,5273,00:42:59,Imported workout,imported from Concept2 log,UTC,rower,80.0,lwt
|
||||
304,https://rowsandall.com/rowers/workout/2545/emailcsv,https://rowsandall.com/rowers/workout/2545/emailtcx,0,0,2018-06-08 07:25:33+00:00,1994,00:01:59.400000,Test,,Europe/Prague,rower,80.0,hwt
|
||||
305,https://rowsandall.com/rowers/workout/2560/emailcsv,https://rowsandall.com/rowers/workout/2560/emailtcx,0,0,2018-06-11 15:21:01+00:00,10369,00:56:21.400000,Intervals Tests (7),imported through email,Europe/Prague,water,80.0,lwt
|
||||
306,https://rowsandall.com/rowers/workout/2568/emailcsv,https://rowsandall.com/rowers/workout/2568/emailtcx,0,11,2018-06-11 15:21:01+00:00,10369,00:56:21.400000,3/2/1,"
|
||||
5x5min/5min
|
||||
5x5min/5min",Europe/Prague,water,80.0,lwt
|
||||
307,https://rowsandall.com/rowers/workout/2583/emailcsv,https://rowsandall.com/rowers/workout/2583/emailtcx,0,0,2018-06-11 15:21:01+00:00,10369,00:56:21.400000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
308,https://rowsandall.com/rowers/workout/2554/emailcsv,https://rowsandall.com/rowers/workout/2554/emailtcx,0,0,2018-06-13 14:18:19+00:00,16543,01:30:01.300000,Intervals Tests,,America/New_York,rower,80.0,lwt
|
||||
309,https://rowsandall.com/rowers/workout/2555/emailcsv,https://rowsandall.com/rowers/workout/2555/emailtcx,0,0,2018-06-13 14:18:35+00:00,12205,01:03:29.500000,Intervals Tests (2),,America/New_York,rower,80.0,lwt
|
||||
310,https://rowsandall.com/rowers/workout/2556/emailcsv,https://rowsandall.com/rowers/workout/2556/emailtcx,0,0,2018-06-13 14:18:48+00:00,9016,00:48:28.100000,Intervals Tests (3),"
|
||||
9x1km",America/New_York,rower,80.0,lwt
|
||||
311,https://rowsandall.com/rowers/workout/2557/emailcsv,https://rowsandall.com/rowers/workout/2557/emailtcx,0,0,2018-06-13 14:19:01+00:00,4789,00:22:05,Intervals Tests (4),,America/New_York,rower,80.0,lwt
|
||||
312,https://rowsandall.com/rowers/workout/2558/emailcsv,https://rowsandall.com/rowers/workout/2558/emailtcx,0,0,2018-06-13 14:19:19+00:00,0,00:22:54,Intervals Tests (5),,Europe/Prague,rower,80.0,lwt
|
||||
313,https://rowsandall.com/rowers/workout/2582/emailcsv,https://rowsandall.com/rowers/workout/2582/emailtcx,0,0,2018-06-13 16:11:02+00:00,4191,00:23:36.400000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
314,https://rowsandall.com/rowers/workout/2581/emailcsv,https://rowsandall.com/rowers/workout/2581/emailtcx,0,0,2018-06-15 08:05:04+00:00,7301,00:39:44.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
315,https://rowsandall.com/rowers/workout/2580/emailcsv,https://rowsandall.com/rowers/workout/2580/emailtcx,0,0,2018-06-16 08:04:00+00:00,5182,00:40:48.100000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
316,https://rowsandall.com/rowers/workout/2579/emailcsv,https://rowsandall.com/rowers/workout/2579/emailtcx,0,0,2018-06-16 13:17:06+00:00,8196,00:52:10.500000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
317,https://rowsandall.com/rowers/workout/2950/emailcsv,https://rowsandall.com/rowers/workout/2950/emailtcx,0,0,2018-06-17 10:23:24+00:00,6004,01:00:54,Lunch Run,,Europe/Vienna,water,80.0,hwt
|
||||
318,https://rowsandall.com/rowers/workout/2954/emailcsv,https://rowsandall.com/rowers/workout/2954/emailtcx,0,0,2018-06-17 10:23:24+00:00,6004,01:00:54,Lunch Run,,Europe/Vienna,water,80.0,hwt
|
||||
319,https://rowsandall.com/rowers/workout/3035/emailcsv,https://rowsandall.com/rowers/workout/3035/emailtcx,0,17,2018-06-17 10:23:24+00:00,6004,01:00:54,Lunch Run, ,Europe/Vienna,other,80.0,hwt
|
||||
320,https://rowsandall.com/rowers/workout/2578/emailcsv,https://rowsandall.com/rowers/workout/2578/emailtcx,0,0,2018-06-18 16:05:05+00:00,10313,00:55:54.900000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
321,https://rowsandall.com/rowers/workout/2948/emailcsv,https://rowsandall.com/rowers/workout/2948/emailtcx,0,0,2018-06-18 16:05:05+00:00,10313,00:55:54,Steady,,Europe/Prague,water,80.0,hwt
|
||||
322,https://rowsandall.com/rowers/workout/2952/emailcsv,https://rowsandall.com/rowers/workout/2952/emailtcx,0,0,2018-06-18 16:05:05+00:00,10313,00:55:54,Steady,,Europe/Prague,water,80.0,hwt
|
||||
323,https://rowsandall.com/rowers/workout/2573/emailcsv,https://rowsandall.com/rowers/workout/2573/emailtcx,0,0,2018-06-19 05:57:02+00:00,10437,00:56:06.900000,Pink,,Europe/Prague,water,80.0,lwt
|
||||
324,https://rowsandall.com/rowers/workout/2577/emailcsv,https://rowsandall.com/rowers/workout/2577/emailtcx,0,0,2018-06-19 05:57:02+00:00,10437,00:56:06.900000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
325,https://rowsandall.com/rowers/workout/2946/emailcsv,https://rowsandall.com/rowers/workout/2946/emailtcx,0,0,2018-06-19 05:57:04+00:00,10437,00:56:04,3x6min,,Europe/Prague,water,80.0,hwt
|
||||
326,https://rowsandall.com/rowers/workout/2570/emailcsv,https://rowsandall.com/rowers/workout/2570/emailtcx,0,0,2018-06-19 15:11:14.220000+00:00,7538,00:56:14.600000,Test,,Europe/Vienna,water,80.0,lwt
|
||||
327,https://rowsandall.com/rowers/workout/2571/emailcsv,https://rowsandall.com/rowers/workout/2571/emailtcx,0,0,2018-06-20 18:24:08+00:00,7538,00:56:14.500000,Ritmo,,Europe/Vienna,water,80.0,lwt
|
||||
328,https://rowsandall.com/rowers/workout/2858/emailcsv,https://rowsandall.com/rowers/workout/2858/emailtcx,0,0,2018-06-22 04:33:02.500000+00:00,3344,00:16:55.700000,imported through ema,imported through email,Europe/Prague,water,80.0,hwt
|
||||
329,https://rowsandall.com/rowers/workout/2576/emailcsv,https://rowsandall.com/rowers/workout/2576/emailtcx,0,0,2018-06-22 05:41:04+00:00,9298,00:50:44,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
330,https://rowsandall.com/rowers/workout/2944/emailcsv,https://rowsandall.com/rowers/workout/2944/emailtcx,0,0,2018-06-22 05:41:04+00:00,9298,00:50:44,Steady,,Europe/Prague,water,80.0,hwt
|
||||
331,https://rowsandall.com/rowers/workout/2575/emailcsv,https://rowsandall.com/rowers/workout/2575/emailtcx,0,0,2018-06-22 06:33:01+00:00,3344,00:16:55.700000,Imported workout,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
332,https://rowsandall.com/rowers/workout/2942/emailcsv,https://rowsandall.com/rowers/workout/2942/emailtcx,27,11,2018-06-22 06:33:02+00:00,3344,00:16:54,Steady (2),,Europe/Prague,water,80.0,hwt
|
||||
333,https://rowsandall.com/rowers/workout/2940/emailcsv,https://rowsandall.com/rowers/workout/2940/emailtcx,0,0,2018-06-22 10:45:04+00:00,7540,00:56:14,test delete,,Europe/Vienna,water,80.0,hwt
|
||||
334,https://rowsandall.com/rowers/workout/2725/emailcsv,https://rowsandall.com/rowers/workout/2725/emailtcx,0,0,2018-06-22 12:17:56+00:00,15642,01:15:00,Mike,"
|
||||
3x20min/5min",Europe/Prague,water,80.0,lwt
|
||||
335,https://rowsandall.com/rowers/workout/2726/emailcsv,https://rowsandall.com/rowers/workout/2726/emailtcx,0,0,2018-06-22 12:17:56+00:00,15642,01:15:00,Mike test,,Europe/Prague,water,80.0,lwt
|
||||
336,https://rowsandall.com/rowers/workout/2848/emailcsv,https://rowsandall.com/rowers/workout/2848/emailtcx,0,0,2018-06-24 05:34:07+00:00,10194,00:57:48.900000,Imported,,Europe/Prague,water,80.0,lwt
|
||||
337,https://rowsandall.com/rowers/workout/2849/emailcsv,https://rowsandall.com/rowers/workout/2849/emailtcx,0,0,2018-06-24 05:34:07.200000+00:00,10194,00:57:48.900000,Imported,,Europe/Prague,water,80.0,lwt
|
||||
338,https://rowsandall.com/rowers/workout/2957/emailcsv,https://rowsandall.com/rowers/workout/2957/emailtcx,0,0,2018-06-24 05:34:07.200000+00:00,10194,00:57:48.900000,Imported,,Europe/Prague,water,80.0,hwt
|
||||
339,https://rowsandall.com/rowers/workout/2938/emailcsv,https://rowsandall.com/rowers/workout/2938/emailtcx,0,0,2018-06-24 07:34:07+00:00,10194,00:57:43,Double,,Europe/Prague,water,80.0,hwt
|
||||
340,https://rowsandall.com/rowers/workout/3059/emailcsv,https://rowsandall.com/rowers/workout/3059/emailtcx,0,0,2018-06-26 15:06:01+00:00,10393,01:00:55.900000,C2 Import Workout from 2018-06-26 15:06:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
341,https://rowsandall.com/rowers/workout/2936/emailcsv,https://rowsandall.com/rowers/workout/2936/emailtcx,42,30,2018-06-26 15:06:04+00:00,5651,00:31:24,Sprintervals,,Europe/Prague,water,80.0,hwt
|
||||
342,https://rowsandall.com/rowers/workout/2934/emailcsv,https://rowsandall.com/rowers/workout/2934/emailtcx,0,0,2018-06-26 15:38:08+00:00,1056,00:05:12,Sprintervals (2),,Europe/Brussels,water,80.0,hwt
|
||||
343,https://rowsandall.com/rowers/workout/2932/emailcsv,https://rowsandall.com/rowers/workout/2932/emailtcx,0,0,2018-06-26 15:44:06+00:00,3684,00:22:50,Sprintervals (3),,Europe/Prague,water,80.0,hwt
|
||||
344,https://rowsandall.com/rowers/workout/2959/emailcsv,https://rowsandall.com/rowers/workout/2959/emailtcx,160,38,2018-06-30 05:31:02.200000+00:00,13878,01:21:16.600000,,"
|
||||
from speedcoach2v2.15 via rowsandall.com",Europe/Prague,water,80.0,hwt
|
||||
345,https://rowsandall.com/rowers/workout/2958/emailcsv,https://rowsandall.com/rowers/workout/2958/emailtcx,0,0,2018-06-30 07:31:01+00:00,13878,01:21:16.600000,C2 Import Workout from 2018-06-30 07:31:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
346,https://rowsandall.com/rowers/workout/3030/emailcsv,https://rowsandall.com/rowers/workout/3030/emailtcx,80,6031,2018-07-01 11:57:30+00:00,12879,00:57:00,Ride to pub, ,Europe/Prague,other,80.0,hwt
|
||||
347,https://rowsandall.com/rowers/workout/3031/emailcsv,https://rowsandall.com/rowers/workout/3031/emailtcx,0,0,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Test P,,Europe/Prague,water,80.0,hwt
|
||||
348,https://rowsandall.com/rowers/workout/3058/emailcsv,https://rowsandall.com/rowers/workout/3058/emailtcx,0,0,2018-07-02 16:21:01+00:00,2858,00:15:40.600000,C2 Import Workout from 2018-07-02 16:21:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
349,https://rowsandall.com/rowers/workout/3063/emailcsv,https://rowsandall.com/rowers/workout/3063/emailtcx,120,79,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Test Strava Export,,Europe/Prague,water,80.0,hwt
|
||||
350,https://rowsandall.com/rowers/workout/3064/emailcsv,https://rowsandall.com/rowers/workout/3064/emailtcx,120,79,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Test Strava Export,,Europe/Prague,water,80.0,hwt
|
||||
351,https://rowsandall.com/rowers/workout/3065/emailcsv,https://rowsandall.com/rowers/workout/3065/emailtcx,0,0,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Test Strava Export,,Europe/Prague,water,80.0,hwt
|
||||
352,https://rowsandall.com/rowers/workout/3066/emailcsv,https://rowsandall.com/rowers/workout/3066/emailtcx,120,79,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Test Strava Export,,Europe/Prague,water,80.0,hwt
|
||||
353,https://rowsandall.com/rowers/workout/3068/emailcsv,https://rowsandall.com/rowers/workout/3068/emailtcx,0,0,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Should be exported To Strava,,Europe/Prague,water,80.0,hwt
|
||||
354,https://rowsandall.com/rowers/workout/3070/emailcsv,https://rowsandall.com/rowers/workout/3070/emailtcx,120,79,2018-07-02 16:21:01+00:00,12532,01:09:16.500000,Should Not Be Exported To Strava,,Europe/Prague,water,80.0,hwt
|
||||
355,https://rowsandall.com/rowers/workout/3057/emailcsv,https://rowsandall.com/rowers/workout/3057/emailtcx,0,0,2018-07-02 16:40:02+00:00,2001,00:08:29,C2 Import Workout from 2018-07-02 16:40:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
356,https://rowsandall.com/rowers/workout/3056/emailcsv,https://rowsandall.com/rowers/workout/3056/emailtcx,0,0,2018-07-02 16:50:02+00:00,2136,00:09:16.200000,C2 Import Workout from 2018-07-02 16:50:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
357,https://rowsandall.com/rowers/workout/3055/emailcsv,https://rowsandall.com/rowers/workout/3055/emailtcx,0,0,2018-07-02 17:01:02+00:00,2058,00:08:38.800000,C2 Import Workout from 2018-07-02 17:01:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
358,https://rowsandall.com/rowers/workout/3008/emailcsv,https://rowsandall.com/rowers/workout/3008/emailtcx,22,0,2018-07-02 17:01:05+00:00,2058,00:08:35,2ks with focus (4),,Europe/Prague,water,80.0,hwt
|
||||
359,https://rowsandall.com/rowers/workout/3028/emailcsv,https://rowsandall.com/rowers/workout/3028/emailtcx,22,0,2018-07-02 17:01:05+00:00,2058,00:08:35,2ks with focus (4),,Europe/Prague,water,80.0,hwt
|
||||
360,https://rowsandall.com/rowers/workout/3054/emailcsv,https://rowsandall.com/rowers/workout/3054/emailtcx,0,0,2018-07-02 17:11:02+00:00,2149,00:09:47.300000,C2 Import Workout from 2018-07-02 17:11:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
361,https://rowsandall.com/rowers/workout/3006/emailcsv,https://rowsandall.com/rowers/workout/3006/emailtcx,27,0,2018-07-02 17:11:05+00:00,2149,00:09:44,2ks with focus (5),,Europe/Prague,water,80.0,hwt
|
||||
362,https://rowsandall.com/rowers/workout/3026/emailcsv,https://rowsandall.com/rowers/workout/3026/emailtcx,27,0,2018-07-02 17:11:05+00:00,2149,00:09:44,2ks with focus (5),,Europe/Prague,water,80.0,hwt
|
||||
363,https://rowsandall.com/rowers/workout/3053/emailcsv,https://rowsandall.com/rowers/workout/3053/emailtcx,0,0,2018-07-02 17:24:02+00:00,1328,00:06:15.500000,C2 Import Workout from 2018-07-02 17:24:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
364,https://rowsandall.com/rowers/workout/3004/emailcsv,https://rowsandall.com/rowers/workout/3004/emailtcx,10,0,2018-07-02 17:24:05+00:00,1328,00:06:12,2ks with focus (6),,Europe/Prague,water,80.0,hwt
|
||||
365,https://rowsandall.com/rowers/workout/3024/emailcsv,https://rowsandall.com/rowers/workout/3024/emailtcx,10,0,2018-07-02 17:24:05+00:00,1328,00:06:12,2ks with focus (6),,Europe/Prague,water,80.0,hwt
|
||||
366,https://rowsandall.com/rowers/workout/2964/emailcsv,https://rowsandall.com/rowers/workout/2964/emailtcx,0,0,2018-07-04 15:06:42+00:00,7350,00:31:07,Test,,Europe/Prague,rower,80.0,hwt
|
||||
367,https://rowsandall.com/rowers/workout/2965/emailcsv,https://rowsandall.com/rowers/workout/2965/emailtcx,0,103,2018-07-04 16:19:01+00:00,10471,01:00:27.200000,Test TRIMP,,Europe/Prague,water,80.0,hwt
|
||||
368,https://rowsandall.com/rowers/workout/2966/emailcsv,https://rowsandall.com/rowers/workout/2966/emailtcx,0,98,2018-07-04 16:19:01+00:00,10471,01:00:27.200000,Test Rscore,,Europe/Prague,water,80.0,hwt
|
||||
369,https://rowsandall.com/rowers/workout/3052/emailcsv,https://rowsandall.com/rowers/workout/3052/emailtcx,0,0,2018-07-04 16:19:01+00:00,10471,01:00:27.100000,C2 Import Workout from 2018-07-04 16:19:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
370,https://rowsandall.com/rowers/workout/2967/emailcsv,https://rowsandall.com/rowers/workout/2967/emailtcx,0,96,2018-07-04 16:19:02+00:00,10471,01:00:26,Startjes,"
|
||||
from csv via rowsandall.com",Europe/Prague,water,80.0,hwt
|
||||
371,https://rowsandall.com/rowers/workout/3002/emailcsv,https://rowsandall.com/rowers/workout/3002/emailtcx,0,98,2018-07-04 16:19:02+00:00,10471,01:00:26,Startjes,,Europe/Prague,water,80.0,hwt
|
||||
372,https://rowsandall.com/rowers/workout/3022/emailcsv,https://rowsandall.com/rowers/workout/3022/emailtcx,0,98,2018-07-04 16:19:02+00:00,10471,01:00:26,Startjes,,Europe/Prague,water,80.0,hwt
|
||||
373,https://rowsandall.com/rowers/workout/3051/emailcsv,https://rowsandall.com/rowers/workout/3051/emailtcx,0,0,2018-07-07 07:43:02+00:00,2874,00:16:39.700000,C2 Import Workout from 2018-07-07 07:43:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
374,https://rowsandall.com/rowers/workout/3000/emailcsv,https://rowsandall.com/rowers/workout/3000/emailtcx,17,0,2018-07-07 07:43:03+00:00,2874,00:16:38,2x race prep,,Europe/Prague,water,80.0,hwt
|
||||
375,https://rowsandall.com/rowers/workout/3020/emailcsv,https://rowsandall.com/rowers/workout/3020/emailtcx,17,0,2018-07-07 07:43:03+00:00,2874,00:16:38,2x race prep,,Europe/Prague,water,80.0,hwt
|
||||
376,https://rowsandall.com/rowers/workout/3050/emailcsv,https://rowsandall.com/rowers/workout/3050/emailtcx,0,0,2018-07-07 08:01:01+00:00,743,00:02:45.500000,C2 Import Workout from 2018-07-07 08:01:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
377,https://rowsandall.com/rowers/workout/2998/emailcsv,https://rowsandall.com/rowers/workout/2998/emailtcx,2,0,2018-07-07 08:01:02+00:00,743,00:02:44,2x race prep (2),,Europe/Prague,bike,80.0,hwt
|
||||
378,https://rowsandall.com/rowers/workout/3018/emailcsv,https://rowsandall.com/rowers/workout/3018/emailtcx,2,0,2018-07-07 08:01:02+00:00,743,00:02:44,2x race prep (2),,Europe/Prague,water,80.0,hwt
|
||||
379,https://rowsandall.com/rowers/workout/3049/emailcsv,https://rowsandall.com/rowers/workout/3049/emailtcx,0,0,2018-07-07 08:05:03+00:00,2827,00:15:21.800000,C2 Import Workout from 2018-07-07 08:05:03+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
380,https://rowsandall.com/rowers/workout/2996/emailcsv,https://rowsandall.com/rowers/workout/2996/emailtcx,21,0,2018-07-07 08:05:06+00:00,2827,00:15:18,2x race prep (3),,Europe/Prague,water,80.0,hwt
|
||||
381,https://rowsandall.com/rowers/workout/3016/emailcsv,https://rowsandall.com/rowers/workout/3016/emailtcx,21,0,2018-07-07 08:05:06+00:00,2827,00:15:18,2x race prep (3),,Europe/Prague,water,80.0,hwt
|
||||
382,https://rowsandall.com/rowers/workout/3048/emailcsv,https://rowsandall.com/rowers/workout/3048/emailtcx,0,0,2018-07-07 08:22:01+00:00,749,00:03:12.500000,C2 Import Workout from 2018-07-07 08:22:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
383,https://rowsandall.com/rowers/workout/2994/emailcsv,https://rowsandall.com/rowers/workout/2994/emailtcx,4,0,2018-07-07 08:22:02+00:00,749,00:03:11,2x race prep (4),,Europe/Prague,water,80.0,hwt
|
||||
384,https://rowsandall.com/rowers/workout/3014/emailcsv,https://rowsandall.com/rowers/workout/3014/emailtcx,4,0,2018-07-07 08:22:02+00:00,749,00:03:11,2x race prep (4),,Europe/Prague,water,80.0,hwt
|
||||
385,https://rowsandall.com/rowers/workout/3047/emailcsv,https://rowsandall.com/rowers/workout/3047/emailtcx,0,0,2018-07-07 08:27:03+00:00,2058,00:11:55.800000,C2 Import Workout from 2018-07-07 08:27:03+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
386,https://rowsandall.com/rowers/workout/2992/emailcsv,https://rowsandall.com/rowers/workout/2992/emailtcx,13,14,2018-07-07 08:27:06+00:00,2058,00:11:52,2x race prep (5),,Europe/Prague,water,75.0,hwt
|
||||
387,https://rowsandall.com/rowers/workout/3012/emailcsv,https://rowsandall.com/rowers/workout/3012/emailtcx,13,15,2018-07-07 08:27:06+00:00,2058,00:11:52,2x race prep (5),,Europe/Prague,water,80.0,hwt
|
||||
388,https://rowsandall.com/rowers/workout/2969/emailcsv,https://rowsandall.com/rowers/workout/2969/emailtcx,100,116,2018-07-08 13:17:02+00:00,10372,01:00:18.100000,HRTSS,,Europe/Prague,water,80.0,hwt
|
||||
389,https://rowsandall.com/rowers/workout/3046/emailcsv,https://rowsandall.com/rowers/workout/3046/emailtcx,0,0,2018-07-08 13:17:02+00:00,10372,01:00:18,C2 Import Workout from 2018-07-08 13:17:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
390,https://rowsandall.com/rowers/workout/3034/emailcsv,https://rowsandall.com/rowers/workout/3034/emailtcx,0,0,2018-07-08 13:17:08+00:00,10372,01:00:12,Tempovky,,Europe/Prague,water,80.0,hwt
|
||||
391,https://rowsandall.com/rowers/workout/3045/emailcsv,https://rowsandall.com/rowers/workout/3045/emailtcx,0,0,2018-07-13 13:08:00+00:00,2481,00:13:41,C2 Import Workout from 2018-07-13 13:08:00+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
392,https://rowsandall.com/rowers/workout/3044/emailcsv,https://rowsandall.com/rowers/workout/3044/emailtcx,0,0,2018-07-13 13:23:01+00:00,4085,00:22:09.200000,C2 Import Workout from 2018-07-13 13:23:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
393,https://rowsandall.com/rowers/workout/3043/emailcsv,https://rowsandall.com/rowers/workout/3043/emailtcx,0,0,2018-07-14 08:59:02+00:00,7051,00:50:00.500000,C2 Import Workout from 2018-07-14 08:59:02+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
394,https://rowsandall.com/rowers/workout/3042/emailcsv,https://rowsandall.com/rowers/workout/3042/emailtcx,0,0,2018-07-14 13:33:00+00:00,4471,00:51:42.100000,C2 Import Workout from 2018-07-14 13:33:00+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
395,https://rowsandall.com/rowers/workout/3041/emailcsv,https://rowsandall.com/rowers/workout/3041/emailtcx,0,0,2018-07-14 15:48:01+00:00,4486,00:56:58.100000,C2 Import Workout from 2018-07-14 15:48:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
396,https://rowsandall.com/rowers/workout/3040/emailcsv,https://rowsandall.com/rowers/workout/3040/emailtcx,0,0,2018-07-15 06:10:01+00:00,4233,00:29:17,C2 Import Workout from 2018-07-15 06:10:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
397,https://rowsandall.com/rowers/workout/3039/emailcsv,https://rowsandall.com/rowers/workout/3039/emailtcx,0,0,2018-07-15 09:01:01+00:00,4978,00:41:45,C2 Import Workout from 2018-07-15 09:01:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
398,https://rowsandall.com/rowers/workout/3038/emailcsv,https://rowsandall.com/rowers/workout/3038/emailtcx,0,0,2018-07-18 05:00:01+00:00,11159,00:59:58,C2 Import Workout from 2018-07-18 05:00:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
399,https://rowsandall.com/rowers/workout/3037/emailcsv,https://rowsandall.com/rowers/workout/3037/emailtcx,0,0,2018-07-20 09:29:01+00:00,8436,00:45:44.500000,C2 Import Workout from 2018-07-20 09:29:01+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
400,https://rowsandall.com/rowers/workout/3036/emailcsv,https://rowsandall.com/rowers/workout/3036/emailtcx,0,0,2018-07-21 05:13:03+00:00,9639,00:54:19.500000,C2 Import Workout from 2018-07-21 05:13:03+00:00,imported from Concept2 log,UTC,water,80.0,lwt
|
||||
401,https://rowsandall.com/rowers/workout/3061/emailcsv,https://rowsandall.com/rowers/workout/3061/emailtcx,77,43,2018-08-17 05:16:03+00:00,8315,00:45:11.400000,Brnenske 2k,,Europe/Prague,water,80.0,hwt
|
||||
402,https://rowsandall.com/rowers/workout/3075/emailcsv,https://rowsandall.com/rowers/workout/3075/emailtcx,83,28,2018-08-18 07:54:04+00:00,9590,00:55:08,Technique 2x, ,Europe/Prague,water,80.0,hwt
|
||||
403,https://rowsandall.com/rowers/workout/3074/emailcsv,https://rowsandall.com/rowers/workout/3074/emailtcx,94,17,2018-08-26 22:00:01.500000+00:00,9903,00:54:36,Imported,,Europe/Prague,bike,80.0,hwt
|
||||
404,https://rowsandall.com/rowers/workout/3076/emailcsv,https://rowsandall.com/rowers/workout/3076/emailtcx,94,1104,2018-08-26 22:00:01.500000+00:00,9903,00:54:36,Imported,,Europe/Prague,bike,80.0,hwt
|
||||
405,https://rowsandall.com/rowers/workout/3072/emailcsv,https://rowsandall.com/rowers/workout/3072/emailtcx,0,0,2018-08-27 14:36:47+00:00,5855,00:14:58.700000,Bike Erg,,Europe/Prague,bikeerg,80.0,hwt
|
||||
406,https://rowsandall.com/rowers/workout/3073/emailcsv,https://rowsandall.com/rowers/workout/3073/emailtcx,15,4,2018-08-27 14:36:47+00:00,5855,00:14:58.700000,Bike Erg,,Europe/Prague,bike,80.0,hwt
|
||||
407,https://rowsandall.com/rowers/workout/3077/emailcsv,https://rowsandall.com/rowers/workout/3077/emailtcx,0,51,2018-09-11 05:31:02+00:00,7490,00:35:07.500000,7.5k,,Europe/Prague,water,80.0,hwt
|
||||
408,https://rowsandall.com/rowers/workout/3080/emailcsv,https://rowsandall.com/rowers/workout/3080/emailtcx,0,0,2018-09-12 04:17:04+00:00,5921,00:34:50,Sofia part II, ,Europe/Sofia,other,80.0,hwt
|
||||
409,https://rowsandall.com/rowers/workout/3079/emailcsv,https://rowsandall.com/rowers/workout/3079/emailtcx,87,60,2018-09-13 12:15:58+00:00,23476,00:59:59.700000,Mike 2,,Europe/Prague,rower,80.0,hwt
|
||||
410,https://rowsandall.com/rowers/workout/3078/emailcsv,https://rowsandall.com/rowers/workout/3078/emailtcx,94,59,2018-09-14 13:02:04+00:00,24267,00:59:57.200000,Mike,,Europe/Prague,rower,80.0,hwt
|
||||
|
+203
-54
@@ -1,60 +1,209 @@
|
||||
// var opts = {
|
||||
// lines: 12,
|
||||
// angle: 0.15,
|
||||
// lineWidth: 0.44,
|
||||
// pointer: {
|
||||
// length: 0.9,
|
||||
// strokeWidth: 0.035,
|
||||
// color: '#000000'
|
||||
// },
|
||||
// limitMax: 'false',
|
||||
// // percentColors: [[0.0, "#a9d70b" ], [0.50, "#a9d70b"], [1.0, "#a9d70b"]], // !!!!
|
||||
// strokeColor: '#E0E0E0',
|
||||
// generateGradient: true
|
||||
// };
|
||||
// var target = document.getElementById('angles');
|
||||
// var gauge = new Gauge(target).setOptions(opts);
|
||||
// gauge.maxValue = 90;
|
||||
// gauge.minValue = -90;
|
||||
// gauge.animationSpeed = 5;
|
||||
// gauge.set(-75);
|
||||
google.charts.load('current', {'packages':['gauge','corechart']});
|
||||
google.charts.setOnLoadCallback(drawSPMChart);
|
||||
google.charts.setOnLoadCallback(drawSpeedChart);
|
||||
google.charts.setOnLoadCallback(drawPowerChart);
|
||||
google.charts.setOnLoadCallback(drawHRChart);
|
||||
google.charts.setOnLoadCallback(drawStrokeAngleChart);
|
||||
|
||||
// https://github.com/bernii/gauge.js/issues/193
|
||||
var spmdata = [
|
||||
['Label', 'Value'],
|
||||
['SPM', 21],
|
||||
];
|
||||
|
||||
var speeddata = [
|
||||
['Label', 'Value'],
|
||||
['V m/s', 0],
|
||||
];
|
||||
|
||||
var opts = {
|
||||
angle: 0, // The span of the gauge arc
|
||||
lineWidth: 0.2, // The line thickness
|
||||
radiusScale: 0.89, // Relative radius
|
||||
pointer: {
|
||||
length: 0.54, // // Relative to gauge radius
|
||||
strokeWidth: 0.053, // The thickness
|
||||
color: '#000000' // Fill color
|
||||
},
|
||||
limitMax: false, // If false, max value increases automatically if value > maxValue
|
||||
limitMin: false, // If true, the min value of the gauge will be fixed
|
||||
colorStart: '#6FADCF', // Colors
|
||||
colorStop: '#8FC0DA', // just experiment with them
|
||||
strokeColor: '#E0E0E0', // to see which ones work best for you
|
||||
generateGradient: true,
|
||||
highDpiSupport: true, // High resolution support
|
||||
staticZones: [
|
||||
{strokeStyle: "#00FF00", min: 0, max: 2}, // Greem
|
||||
{strokeStyle: "#0000FF", min: 2, max: 3}, // Blue`
|
||||
{strokeStyle: "#00FFFF", min: 3, max: 4}, // Cyan
|
||||
{strokeStyle: "#FFDD00", min: 4, max: 5}, // Orange
|
||||
{strokeStyle: "#FF0000", min: 5, max: 6} // Red
|
||||
],
|
||||
var powerdata = [
|
||||
['Label','Value'],
|
||||
['PWR',150],
|
||||
]
|
||||
|
||||
};
|
||||
var target = document.getElementById('basic'); // your canvas element
|
||||
var gaugeboatspeed = new Gauge(target).setOptions(opts); // create sexy gauge!
|
||||
gaugeboatspeed.maxValue = 6; // set max gauge value
|
||||
gaugeboatspeed.setMinValue(0); // Prefer setter over gauge.minValue = 0
|
||||
gaugeboatspeed.animationSpeed = 10; // set animation speed (32 is default value)
|
||||
gaugeboatspeed.set(0); // set actual value
|
||||
var hrdata = [
|
||||
['Label','Value'],
|
||||
['HR',110],
|
||||
]
|
||||
|
||||
// Define set_basic(values) so that gauges can be set by metricsgroups
|
||||
function set_basic() {
|
||||
gaugeboatspeed.set(boatspeed_now);
|
||||
var angledata = [
|
||||
['Angle', 'deg'],
|
||||
['slip', 10 ],
|
||||
['load', 50],
|
||||
['unload', 50],
|
||||
['wash', 10],
|
||||
['recovery',240 ]
|
||||
]
|
||||
|
||||
var anglesoptions = {
|
||||
title: 'Stroke Angles',
|
||||
legend: 'none',
|
||||
pieHole: 0.5,
|
||||
chartArea: { width: "100%" },
|
||||
pieStartAngle: 35,
|
||||
pieSliceText: 'value',
|
||||
pieSliceTextStyle: {color:'black',fontSize:12},
|
||||
slices: {
|
||||
0: { color: 'lightblue' },
|
||||
1: { color: 'lightgreen' },
|
||||
2: { color: 'yellow'},
|
||||
3: { color: 'orange'},
|
||||
4: { color: 'transparent', textStyle: {color:'transparent'}}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var hroptions = {
|
||||
min: 100, max: 200,
|
||||
width: 400, height: 120,
|
||||
greenFrom: 100, greenTo: 135,
|
||||
yellowFrom: 135,yellowTo: 157,
|
||||
redFrom: 157, redTo: 200,
|
||||
minorTicks: 5
|
||||
};
|
||||
|
||||
|
||||
var spmoptions = {
|
||||
min:0, max: 50,
|
||||
width: 400, height: 120,
|
||||
greenFrom: 20, greenTo: 30,
|
||||
yellowFrom: 30,yellowTo: 40,
|
||||
redFrom: 40, redTo: 50,
|
||||
majorTicks: ['0','10','20','30','40','50'],
|
||||
minorTicks: 10
|
||||
};
|
||||
|
||||
var speedoptions = {
|
||||
min:0, max: 6,
|
||||
width: 400, height: 120,
|
||||
greenFrom: 2, greenTo: 4,
|
||||
yellowFrom: 4,yellowTo: 5,
|
||||
redFrom: 5, redTo: 6,
|
||||
majorTicks: ['0','1','2','3','4','5','6'],
|
||||
minorTicks: 10
|
||||
};
|
||||
|
||||
var poweroptions = {
|
||||
min: 0, max: 1000,
|
||||
width: 400, height: 120,
|
||||
greenFrom: 100, greenTo: 200,
|
||||
yellowFrom: 200,yellowTo: 400,
|
||||
redFrom: 400, redTo: 1000,
|
||||
majorTicks: ['0','200','400','600','800','1000'],
|
||||
minorTicks: 5
|
||||
};
|
||||
|
||||
|
||||
var dataspm = null;
|
||||
var dataspeed = null;
|
||||
var spmchart = null;
|
||||
var speedchart = null;
|
||||
var powerchart = null;
|
||||
var datapower = null;
|
||||
var dataangles = null;
|
||||
|
||||
// SPM chart
|
||||
function drawSPMChart() {
|
||||
console.log('first draw SPM chart');
|
||||
dataspm = new google.visualization.arrayToDataTable(spmdata);
|
||||
|
||||
|
||||
try {
|
||||
spmchart = new google.visualization.Gauge(document.getElementById('basic_spm'));
|
||||
spmchart.draw(dataspm,spmoptions);
|
||||
} catch(err) {
|
||||
|
||||
}
|
||||
// spmchart.draw(data, spmoptions);
|
||||
|
||||
// Define set_basic(values) so that gauges can be set by metricsgroups
|
||||
|
||||
};
|
||||
|
||||
// Speed Chart
|
||||
function drawSpeedChart() {
|
||||
dataspeed = new google.visualization.arrayToDataTable(speeddata);
|
||||
|
||||
try {
|
||||
speedchart = new google.visualization.Gauge(document.getElementById('basic_boatspeed'));
|
||||
speedchart.draw(dataspeed,speedoptions);
|
||||
} catch(err) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Power chart
|
||||
function drawPowerChart() {
|
||||
datapower = new google.visualization.arrayToDataTable(powerdata);
|
||||
try {
|
||||
powerchart = new google.visualization.Gauge(document.getElementById('forcepower_power'));
|
||||
powerchart.draw(datapower,poweroptions)
|
||||
} catch(err) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// HR chart
|
||||
function drawHRChart() {
|
||||
datahr = new google.visualization.arrayToDataTable(hrdata);
|
||||
try {
|
||||
hrchart = new google.visualization.Gauge(document.getElementById('athlete_hr'));
|
||||
hrchart.draw(datahr,hroptions);
|
||||
} catch(err) {
|
||||
console.log('no hr div');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Stroke angle chart
|
||||
function drawStrokeAngleChart() {
|
||||
dataangles = new google.visualization.arrayToDataTable(angledata);
|
||||
try {
|
||||
angleschart = new google.visualization.PieChart(document.getElementById('stroke_angles'));
|
||||
angleschart.draw(dataangles,anglesoptions);
|
||||
} catch(err) {
|
||||
console.log('no angles div');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function set_basic() {
|
||||
dataspm.setCell(0,1,spm_now);
|
||||
spmchart.draw(dataspm, spmoptions);
|
||||
|
||||
dataspeed.setCell(0,1,boatspeed_now);
|
||||
speedchart.draw(dataspeed,speedoptions);
|
||||
}
|
||||
|
||||
function set_athlete() {
|
||||
datahr.setCell(0,1,hr_now);
|
||||
try {
|
||||
hrchart.draw(datahr,hroptions);
|
||||
} catch(err) {}
|
||||
}
|
||||
|
||||
function set_stroke() {
|
||||
var piestartangle = 90+catch_now;
|
||||
var load = Math.max(-catch_now-slip_now+peakforceangle_now);
|
||||
var unload = Math.max(finish_now-wash_now-peakforceangle_now) ;
|
||||
var recovery = Math.max(360+catch_now-finish_now);
|
||||
// console.log('load ',load,'; unload ',unload,'; recovery ',recovery,'; pie start angle ',piestartangle);
|
||||
dataangles.setCell(0,1,slip_now);
|
||||
dataangles.setCell(1,1,load);
|
||||
dataangles.setCell(2,1,unload);
|
||||
dataangles.setCell(3,1,wash_now);
|
||||
dataangles.setCell(4,1,recovery);
|
||||
anglesoptions.pieStartAngle = piestartangle;
|
||||
try {
|
||||
angleschart.draw(dataangles,anglesoptions);
|
||||
} catch(err) {
|
||||
console.log('failed: ',err);
|
||||
}
|
||||
}
|
||||
|
||||
function set_forcepower() {
|
||||
datapower.setCell(0,1,power_now);
|
||||
try {
|
||||
powerchart.draw(datapower,poweroptions);
|
||||
} catch(err) {}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
from .models import Response
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.admin import UserAdmin
|
||||
|
||||
class ResponseInline(admin.StackedInline):
|
||||
model = Response
|
||||
fieldsets = (
|
||||
('User Details',{'fields':('plan','username','email')}),
|
||||
('Used Features',
|
||||
{'fields:':
|
||||
('logging','technical',
|
||||
'trend','planning','racing','coaching','export','video','interval')}),
|
||||
('Paid Plan Questions',
|
||||
{'fields':('capabilities','fallshort','considered','features')})
|
||||
)
|
||||
|
||||
class ResponseAdmin(admin.ModelAdmin):
|
||||
#inlines = (ResponseInline,)
|
||||
list_display = ('plan','id','date','capabilities')
|
||||
|
||||
admin.site.register(Response,ResponseAdmin)
|
||||
@@ -0,0 +1,4 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
class SurveyConfig(AppConfig):
|
||||
name = 'app'
|
||||
@@ -0,0 +1,125 @@
|
||||
from django.contrib.auth.models import User
|
||||
from django import forms
|
||||
from django.forms import ModelForm
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from rowers.database import *
|
||||
import datetime
|
||||
|
||||
def current_day():
|
||||
return (datetime.datetime.now(tz=timezone.utc)).date()
|
||||
|
||||
class Response(models.Model):
|
||||
planchoices = (
|
||||
('basic','Free Athlete'),
|
||||
('freecoach','Free Coach'),
|
||||
('pro','Pro'),
|
||||
('plan','Self-Coach'),
|
||||
('coach','coach'),
|
||||
)
|
||||
plan = models.CharField(max_length=150,choices=planchoices,default='basic')
|
||||
username = models.CharField(max_length=150,unique=True,verbose_name='User Name',blank=True,null=True)
|
||||
email = models.EmailField(max_length=150,verbose_name='User Email',blank=True,null=True)
|
||||
date = models.DateField(default=current_day,verbose_name='survey date')
|
||||
nrworkouts = models.IntegerField(default=0,verbose_name='nr of workouts per week')
|
||||
nrworkoutsR = models.IntegerField(default=0,verbose_name='nr of workouts per week on Rowsandall')
|
||||
|
||||
hearchoices = (
|
||||
('wordofmouth','Word of mouth'),
|
||||
('socialmedia','Social Media (Facebook, Twitter)'),
|
||||
('otherinternet','Other internet'),
|
||||
('coach','From my Coach/Coachee'),
|
||||
('other','Other')
|
||||
)
|
||||
|
||||
heard = models.CharField(max_length=150,blank=True,null=True,
|
||||
default=None,
|
||||
choices=hearchoices,verbose_name="How did you hear about Rowsandall")
|
||||
|
||||
logging = models.BooleanField(default=False,verbose_name='Logging Workouts')
|
||||
technial = models.BooleanField(default=False,verbose_name='Technical Analysis of workouts')
|
||||
trend = models.BooleanField(default=False,verbose_name='Trend Analysis of workouts')
|
||||
planning = models.BooleanField(default=False,verbose_name='Training planning')
|
||||
racing = models.BooleanField(default=False,verbose_name='Online racing')
|
||||
coaching = models.BooleanField(default=False,verbose_name='Coaching')
|
||||
export = models.BooleanField(default=False,verbose_name='Exporting data to other sites')
|
||||
video = models.BooleanField(default=False,verbose_name='Video Analysis')
|
||||
interval = models.BooleanField(default=False,verbose_name='Interval editor')
|
||||
|
||||
capabilities = models.NullBooleanField(default=None,null=True,blank=True,
|
||||
verbose_name='Did you get the capabilities and features that you expected out of Rowsandall')
|
||||
|
||||
fallshort = models.TextField(max_length=300,blank=True,verbose_name='Where did Rowsandall fall short of your expectations?')
|
||||
|
||||
considerchoices = (
|
||||
('no','No'),
|
||||
('pro','Yes: Pro'),
|
||||
('plan','Yes: Self-Coach'),
|
||||
('coach','Yes: Coach')
|
||||
)
|
||||
|
||||
considered = models.CharField(max_length=150,choices=considerchoices,default=None,null=True,blank=True,
|
||||
verbose_name='If you are on a Free plan, did you consider one of the paid plans?')
|
||||
|
||||
features = models.TextField(max_length=300,blank=True,
|
||||
verbose_name="What combination of features would entice you to upgrade to a paid plan")
|
||||
|
||||
agreechoices = (
|
||||
('completely_disagree','Completely Disagree'),
|
||||
('disagree','Disagree'),
|
||||
('neutral','Neither agree nor disagree'),
|
||||
('agree','Agree'),
|
||||
('completely_agree','Completely Agree'),
|
||||
)
|
||||
|
||||
pricing = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="The pricing for plans is clear and understandable"
|
||||
)
|
||||
|
||||
subscription = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="I feel like I get a good value for the price of the subscription"
|
||||
)
|
||||
|
||||
advanced = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="I feel like the advanced features of Rowsandall are easy to use"
|
||||
)
|
||||
|
||||
mobile = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="It is easy to use Rowsandall from a mobile device"
|
||||
)
|
||||
|
||||
developer1 = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="I feel like the developer of Rowsandall is responsive to problems and resolves them quickly"
|
||||
)
|
||||
|
||||
developer2 = models.CharField(
|
||||
max_length=150,choices=agreechoices,default=None,null=True,blank=True,
|
||||
verbose_name="I feel like the developer of Rowsandall is responsive to ideas for new features and capabilities"
|
||||
)
|
||||
|
||||
sugchoices = (
|
||||
('bug','Resolve a bug'),
|
||||
('newfeature','Add a new feature'),
|
||||
('improve','Improve the ease of use of the site'),
|
||||
('easy','Make the site easier to use on mobile devices'),
|
||||
('other','Other')
|
||||
)
|
||||
|
||||
bug = models.BooleanField(default=False,verbose_name='Resolve a bug')
|
||||
newfeature = models.BooleanField(default=False,verbose_name='Add a new feature')
|
||||
improve = models.BooleanField(default=False,verbose_name='Improve the ease of use of the site')
|
||||
easu = models.BooleanField(default=False,verbose_name='Make the site easier to use on mobile devices')
|
||||
other = models.BooleanField(default=False,verbose_name='Other')
|
||||
|
||||
suggestiontext = models.TextField(
|
||||
max_length=300,default=None,null=True,blank=True,
|
||||
verbose_name='My suggestion is (please write a short description of your suggestion)'
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
from django.conf import settings
|
||||
from django.conf.urls import url, include
|
||||
from django.urls import path, re_path
|
||||
|
||||
import survey.views as views
|
||||
|
||||
urlpatterns = [
|
||||
#re_path(r'^responses/$',views.ResponseList.as_view(),name='responses_view'),
|
||||
#re_path(r'^response/(?P<pk>\d+)/$',views.ResponseDetail.as_view(),name='response_view')
|
||||
]
|
||||
@@ -0,0 +1,34 @@
|
||||
from django.shortcuts import render
|
||||
from django.template.loader import render_to_string
|
||||
|
||||
from django.views.generic.edit import UpdateView,DeleteView,CreateView
|
||||
from django.views.generic import ListView,DetailView
|
||||
|
||||
from django.http import (
|
||||
HttpResponse, HttpResponseRedirect,
|
||||
JsonResponse,
|
||||
HttpResponseForbidden, HttpResponseNotAllowed,
|
||||
HttpResponseNotFound,Http404
|
||||
)
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
|
||||
from survey.models import Response
|
||||
|
||||
class ResponseList(ListView):
|
||||
model = Response
|
||||
template_name = 'response_list.view'
|
||||
|
||||
class ResponseCreate(CreateView):
|
||||
login_required = True
|
||||
model = Response
|
||||
template_name = 'response_create.html'
|
||||
|
||||
class ResponseUpdate(UpdateView):
|
||||
login_required = True
|
||||
model = Response
|
||||
template_name = 'response_update.html'
|
||||
|
||||
class ResponseDetail(DetailView):
|
||||
login_required = True
|
||||
model = Response
|
||||
template_name = 'response.html'
|
||||
@@ -43,11 +43,13 @@
|
||||
<link rel="stylesheet" href="/static/css/resetnew.css" />
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
|
||||
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="/static/css/styles2.min.css">
|
||||
<link rel="stylesheet" href="/static/css/text2.css" />
|
||||
<link rel="stylesheet" href="/static/css/rowsandall2.min.css" />
|
||||
{% block meta %} {% endblock %}
|
||||
<div id="fb-root"></div>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
|
||||
<script>(function(d, s, id) {
|
||||
var js, fjs = d.getElementsByTagName(s)[0];
|
||||
if (d.getElementById(id)) return;
|
||||
@@ -325,6 +327,11 @@
|
||||
</p>
|
||||
{% endif %}
|
||||
{% block ad %}
|
||||
<div class="site-announcement-box">
|
||||
<div class="site-announcement-white">
|
||||
<a href="https://wp.me/P8g86e-Bs">Please take 2 minutes to fill out the survey!</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="id_blogs">
|
||||
</div>
|
||||
<a href="https://pryglrowing.com">
|
||||
|
||||
Reference in New Issue
Block a user