From 440bda7d9a2a00481b2ddea23d96d9527cacb5df Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 15 Apr 2019 08:33:59 -0700 Subject: [PATCH 1/7] gi --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 51503c01..dfb7fe92 100644 --- a/requirements.txt +++ b/requirements.txt @@ -132,6 +132,7 @@ pip-upgrader==1.4.6 pluggy==0.9.0 prometheus-client==0.6.0 prompt-toolkit==2.0.9 +psycopg2==2.8.1 ptyprocess==0.6.0 py==1.8.0 pycparser==2.19 @@ -159,7 +160,7 @@ ratelim==0.1.6 redis==3.2.1 requests==2.21.0 requests-oauthlib==1.2.0 -rowingdata==2.2.6 +rowingdata==2.2.7 rowingphysics==0.5.0 rq==0.13.0 scipy==1.2.1 From adeee4bb6a1d5b87f14d7f91f807a266169e06b1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 21 Apr 2019 16:15:38 +0200 Subject: [PATCH 2/7] tested on linux --- rowers/tests/testdata/testdata.csv.gz | Bin 12534 -> 12523 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 46e7e294babe0f0a954b659f547a18802b87a153..67407511319f67d6f9997676e13c3393c59fa4bd 100644 GIT binary patch literal 12523 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 Date: Mon, 22 Apr 2019 14:40:06 +0200 Subject: [PATCH 3/7] small bug fix in dataprep --- rowers/dataprep.py | 2 +- rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12523 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 871087d9..897805b3 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -2231,7 +2231,7 @@ def dataprep(rowdatadf, id=0, bands=True, barchart=True, otwpower=True, time_increments = rowdatadf.loc[:, ' ElapsedTime (sec)'].diff() try: time_increments.iloc[0] = time_increments.iloc[1] - except KeyError: + except (KeyError, IndexError): time_increments.iloc[0] = 1. time_increments = 0.5 * time_increments + 0.5 * np.abs(time_increments) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 67407511319f67d6f9997676e13c3393c59fa4bd..5f55865ed8ef20622dd09e8243e6a6308674337a 100644 GIT binary patch delta 16 YcmaEz_&SkYzMF&N;+DM|*`F8y06<0uXaE2J delta 16 XcmaEz_&SkYzMF&NQq`V~>`x2;KI{iB From feb6393eaa9b01359f5eacc5d2bd14c9a0b7713b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 23 Apr 2019 21:44:21 +0200 Subject: [PATCH 4/7] tested with rowingdata v2.3.0 --- requirements.txt | 19 ++++++++----------- rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12523 bytes 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/requirements.txt b/requirements.txt index dfb7fe92..c8108737 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,13 +8,13 @@ atomicwrites==1.3.0 attrs==19.1.0 backcall==0.1.0 beautifulsoup4==4.7.1 -billiard==3.6.0.0 +billiard==3.5.0.5 bleach==3.1.0 bokeh==1.0.4 boto==2.49.0 braintree==3.51.0 cairocffi==1.0.2 -celery==4.3.0 +celery==4.2.2 certifi==2019.3.9 cffi==1.12.2 chardet==3.0.4 @@ -46,10 +46,9 @@ django-leaflet==0.24.0 django-mailbox==4.7.1 django-oauth-toolkit==1.2.0 django-oauth2-provider==0.2.6.1 -django-redis==4.10.0 django-rest-framework==0.1.0 django-rest-swagger==2.2.0 -django-rq==1.3.1 +django-rq==2.0 django-rq-dashboard==0.3.3 django-ses==0.8.10 django-shell-plus==1.1.7 @@ -67,9 +66,7 @@ Faker==1.0.4 fitparse==1.1.0 Flask==1.0.2 future==0.17.1 -GDAL==2.3.3 geocoder==1.38.1 -geos==0.2.1 holoviews==1.11.3 html5lib==1.0.1 htmlmin==0.1.12 @@ -99,7 +96,7 @@ jupyterlab==0.35.4 jupyterlab-server==0.3.0 keyring==18.0.0 kiwisolver==1.0.1 -kombu==4.5.0 +kombu==4.3.0 lxml==4.3.2 Markdown==3.0.1 MarkupSafe==1.1.1 @@ -132,9 +129,9 @@ pip-upgrader==1.4.6 pluggy==0.9.0 prometheus-client==0.6.0 prompt-toolkit==2.0.9 -psycopg2==2.8.1 ptyprocess==0.6.0 py==1.8.0 +pycairo==1.18.0 pycparser==2.19 Pygments==2.3.1 pyparsing==2.3.1 @@ -162,7 +159,8 @@ requests==2.21.0 requests-oauthlib==1.2.0 rowingdata==2.2.7 rowingphysics==0.5.0 -rq==0.13.0 +rq==1.0 +rq-dashboard==0.4.0 scipy==1.2.1 SecretStorage==3.1.1 Send2Trash==1.5.0 @@ -190,9 +188,8 @@ VerbalExpressions==0.0.2 vine==1.3.0 wcwidth==0.1.7 webencodings==0.5.1 -Werkzeug==0.15.1 +Werkzeug==0.15.2 widgetsnbextension==3.4.2 -winkerberos==0.7.0 xmltodict==0.12.0 yamjam==0.1.7 yamllint==1.15.0 diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 5f55865ed8ef20622dd09e8243e6a6308674337a..4f2620a2fab08046786366831eee9a9a7c45c076 100644 GIT binary patch delta 16 XcmaEz_&SkYzMF&NUDp1M>`x2;KVJtu delta 16 YcmaEz_&SkYzMF&N;+DM|*`F8y06<0uXaE2J From 7c76e6ef77d3d2f187da32d05f2cf752004f22e7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 24 Apr 2019 23:08:51 +0200 Subject: [PATCH 5/7] recreated --- rowers/migrations/0001_initial.py | 855 ++++++++++-------- .../templates/subscription_create_email.html | 5 +- rowers/templates/workout_delete_confirm.html | 2 +- 3 files changed, 474 insertions(+), 388 deletions(-) diff --git a/rowers/migrations/0001_initial.py b/rowers/migrations/0001_initial.py index c5a586e6..cafdab70 100644 --- a/rowers/migrations/0001_initial.py +++ b/rowers/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2 on 2019-04-14 15:15 +# Generated by Django 2.1.7 on 2019-04-24 20:56 import datetime from django.conf import settings @@ -19,6 +19,20 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='C2WorldClassAgePerformance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), + ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)), + ('age', models.IntegerField(default=19, verbose_name='Age')), + ('distance', models.IntegerField(default=2000)), + ('name', models.CharField(blank=True, max_length=200)), + ('duration', models.FloatField(blank=True, default=1)), + ('season', models.IntegerField(default=2013)), + ('power', models.IntegerField(default=200)), + ], + ), migrations.CreateModel( name='CalcAgePerformance', fields=[ @@ -40,6 +54,83 @@ class Migration(migrations.Migration): ('name', models.CharField(blank=True, default='group', max_length=30, null=True)), ], ), + migrations.CreateModel( + name='CoachOffer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('issuedate', models.DateField(default=rowers.models.current_day)), + ('code', models.CharField(max_length=150, unique=True)), + ], + ), + migrations.CreateModel( + name='CoachRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('issuedate', models.DateField(default=rowers.models.current_day)), + ('code', models.CharField(max_length=150, unique=True)), + ], + ), + migrations.CreateModel( + name='CourseTestResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('userid', models.IntegerField(default=0)), + ('workoutid', models.IntegerField(null=True)), + ('duration', models.TimeField(default=datetime.time(1, 0))), + ('distance', models.IntegerField(default=0)), + ('coursecompleted', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='cpdata', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('delta', models.IntegerField(default=0)), + ('cp', models.FloatField(default=0)), + ('user', models.IntegerField(default=0)), + ], + options={ + 'db_table': 'cpdata', + }, + ), + migrations.CreateModel( + name='cpergdata', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('delta', models.IntegerField(default=0)), + ('cp', models.FloatField(default=0)), + ('user', models.IntegerField(default=0)), + ], + options={ + 'db_table': 'cpergdata', + }, + ), + migrations.CreateModel( + name='ergcpdata', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('delta', models.IntegerField(default=0)), + ('cp', models.FloatField(default=0)), + ('distance', models.FloatField(default=0)), + ('user', models.IntegerField(default=0)), + ], + options={ + 'db_table': 'ergcpdata', + }, + ), + migrations.CreateModel( + name='FavoriteChart', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')), + ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')), + ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')), + ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')), + ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')), + ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')), + ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')), + ], + ), migrations.CreateModel( name='GeoCourse', fields=[ @@ -50,6 +141,53 @@ class Migration(migrations.Migration): ('notes', models.CharField(blank=True, max_length=200, verbose_name='Course Notes')), ], ), + migrations.CreateModel( + name='GeoPoint', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('latitude', models.FloatField(default=0)), + ('longitude', models.FloatField(default=0)), + ('order_in_poly', models.IntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='GeoPolygon', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=150)), + ('order_in_course', models.IntegerField(default=0)), + ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoCourse')), + ], + ), + migrations.CreateModel( + name='GraphImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('filename', models.CharField(blank=True, default='', max_length=150, null=True)), + ('creationdatetime', models.DateTimeField()), + ('width', models.IntegerField(default=1200)), + ('height', models.IntegerField(default=600)), + ], + ), + migrations.CreateModel( + name='IndoorVirtualRaceResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('userid', models.IntegerField(default=0)), + ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), + ('username', models.CharField(max_length=150)), + ('workoutid', models.IntegerField(null=True)), + ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), + ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), + ('duration', models.TimeField(default=datetime.time(1, 0))), + ('distance', models.IntegerField(default=0)), + ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')), + ('coursecompleted', models.BooleanField(default=False)), + ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), + ('age', models.IntegerField(null=True)), + ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')), + ], + ), migrations.CreateModel( name='PaidPlan', fields=[ @@ -81,8 +219,43 @@ class Migration(migrations.Migration): ('verification', models.CharField(choices=[('none', 'None'), ('automatic', 'Automatic'), ('manual', 'Manual')], default='none', max_length=150)), ('sessionmode', models.CharField(choices=[('distance', 'Distance'), ('time', 'Time'), ('rScore', 'rScore'), ('TRIMP', 'TRIMP')], default='time', max_length=150, verbose_name='Session Mode')), ('hasranking', models.BooleanField(default=False)), - ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course')), - ('manager', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PlannedSessionComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('comment', models.TextField(max_length=300)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('read', models.BooleanField(default=False)), + ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), + ], + ), + migrations.CreateModel( + name='PowerTimeFitnessMetric', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(default=rowers.models.current_day)), + ('last_workout', models.IntegerField(default=0)), + ('PowerFourMin', models.FloatField(default=0)), + ('PowerTwoK', models.FloatField(default=0)), + ('PowerOneHour', models.FloatField(default=0)), + ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=40)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'powertimefitnessmetric', + }, + ), + migrations.CreateModel( + name='RaceLogo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('filename', models.CharField(default='', max_length=150)), + ('creationdatetime', models.DateTimeField()), + ('width', models.IntegerField(default=1200)), + ('height', models.IntegerField(default=600)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -192,213 +365,6 @@ class Migration(migrations.Migration): ('dotweet', models.BooleanField(default=False)), ], ), - migrations.CreateModel( - name='Team', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')), - ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')), - ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')), - ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TrainingMacroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ], - ), - migrations.CreateModel( - name='TrainingMesoCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')), - ], - ), - migrations.CreateModel( - name='Workout', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, null=True)), - ('date', models.DateField()), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bike', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')), - ('workoutsource', models.CharField(default='unknown', max_length=100)), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), - ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), - ('starttime', models.TimeField(blank=True, null=True)), - ('startdatetime', models.DateTimeField(blank=True, null=True)), - ('timezone', models.CharField(default='UTC', max_length=100)), - ('distance', models.IntegerField(blank=True, default=0)), - ('duration', models.TimeField(blank=True, default=1)), - ('dragfactor', models.IntegerField(blank=True, default=0)), - ('trimp', models.IntegerField(blank=True, default=-1)), - ('rscore', models.IntegerField(blank=True, default=-1)), - ('hrtss', models.IntegerField(blank=True, default=-1)), - ('normp', models.IntegerField(blank=True, default=-1)), - ('normv', models.FloatField(blank=True, default=-1)), - ('normw', models.FloatField(blank=True, default=-1)), - ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')), - ('csvfilename', models.CharField(blank=True, max_length=150)), - ('uploadedtoc2', models.IntegerField(default=0)), - ('averagehr', models.IntegerField(blank=True, null=True)), - ('maxhr', models.BigIntegerField(blank=True, null=True)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)), - ('inboard', models.FloatField(default=0.88)), - ('oarlength', models.FloatField(default=2.89)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('summary', models.TextField(blank=True)), - ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)), - ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')), - ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')), - ('plannedsession', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session')), - ('team', models.ManyToManyField(blank=True, to='rowers.Team')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ], - ), - migrations.CreateModel( - name='VirtualRace', - fields=[ - ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')), - ('registration_form', models.CharField(choices=[('windowstart', 'Start of Race Window'), ('windowend', 'End of Race Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')), - ('registration_closure', models.DateTimeField(blank=True, null=True)), - ('evaluation_closure', models.DateTimeField(blank=True, null=True)), - ('start_time', models.TimeField(blank=True, null=True)), - ('end_time', models.TimeField(blank=True, null=True)), - ('country', models.CharField(blank=True, max_length=100)), - ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)), - ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])), - ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])), - ], - bases=('rowers.plannedsession',), - ), - migrations.CreateModel( - name='WorkoutComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')), - ], - ), - migrations.CreateModel( - name='TrainingTarget', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('date', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')), - ], - ), - migrations.CreateModel( - name='TrainingPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('status', models.BooleanField(default=True, verbose_name='Active')), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')), - ('target', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget')), - ], - ), - migrations.CreateModel( - name='TrainingMicroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')), - ], - ), - migrations.AddField( - model_name='trainingmacrocycle', - name='plan', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'), - ), - migrations.CreateModel( - name='TombStone', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('uploadedtoc2', models.IntegerField(default=0)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ], - ), - migrations.CreateModel( - name='TeamRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TeamInvite', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('email', models.CharField(blank=True, max_length=150, null=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), migrations.CreateModel( name='StrokeData', fields=[ @@ -447,194 +413,134 @@ class Migration(migrations.Migration): ], options={ 'db_table': 'strokedata', - 'index_together': {('workoutid',)}, - }, - ), - migrations.AddField( - model_name='rower', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.AddField( - model_name='rower', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.CreateModel( - name='PowerTimeFitnessMetric', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=rowers.models.current_day)), - ('last_workout', models.IntegerField(default=0)), - ('PowerFourMin', models.FloatField(default=0)), - ('PowerTwoK', models.FloatField(default=0)), - ('PowerOneHour', models.FloatField(default=0)), - ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=40)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'db_table': 'powertimefitnessmetric', }, ), migrations.CreateModel( - name='PlannedSessionComment', + name='Team', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ('plannedsession', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AddField( - model_name='plannedsession', - name='rower', - field=models.ManyToManyField(blank=True, to='rowers.Rower'), - ), - migrations.AddField( - model_name='plannedsession', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.CreateModel( - name='GraphImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(blank=True, default='', max_length=150, null=True)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')), + ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')), + ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')), + ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')), + ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')), + ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( - name='GeoPolygon', + name='TeamInvite', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('order_in_course', models.IntegerField(default=0)), - ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoCourse')), + ('issuedate', models.DateField(default=rowers.models.current_day)), + ('code', models.CharField(max_length=150, unique=True)), + ('email', models.CharField(blank=True, max_length=150, null=True)), + ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( - name='GeoPoint', + name='TeamRequest', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('latitude', models.FloatField(default=0)), - ('longitude', models.FloatField(default=0)), - ('order_in_poly', models.IntegerField(default=0)), - ('polygon', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoPolygon')), + ('issuedate', models.DateField(default=rowers.models.current_day)), + ('code', models.CharField(max_length=150, unique=True)), + ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), - migrations.AddField( - model_name='geocourse', - name='manager', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'), - ), migrations.CreateModel( - name='FavoriteChart', + name='TombStone', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')), - ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')), - ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')), - ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')), - ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')), - ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')), - ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')), + ('uploadedtoc2', models.IntegerField(default=0)), + ('uploadedtostrava', models.BigIntegerField(default=0)), + ('uploadedtosporttracks', models.BigIntegerField(default=0)), + ('uploadedtounderarmour', models.BigIntegerField(default=0)), + ('uploadedtotp', models.BigIntegerField(default=0)), + ('uploadedtorunkeeper', models.BigIntegerField(default=0)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), ], ), migrations.CreateModel( - name='ergcpdata', + name='TrainingMacroCycle', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('distance', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'ergcpdata', - 'index_together': {('user',)}, - }, - ), - migrations.CreateModel( - name='cpergdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpergdata', - 'index_together': {('user',)}, - }, - ), - migrations.CreateModel( - name='cpdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpdata', - 'index_together': {('user',)}, - }, - ), - migrations.CreateModel( - name='CourseTestResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('workoutid', models.IntegerField(null=True)), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('coursecompleted', models.BooleanField(default=False)), - ('plannedsession', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession')), + ('name', models.CharField(blank=True, max_length=150)), + ('startdate', models.DateField(default=rowers.models.current_day)), + ('enddate', models.DateField(default=rowers.models.half_year_from_now)), + ('notes', models.TextField(blank=True, max_length=300)), + ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), + ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), + ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), + ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), + ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), + ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), + ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), + ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), + ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), ], ), migrations.CreateModel( - name='CoachRequest', + name='TrainingMesoCycle', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('coach', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('name', models.CharField(blank=True, max_length=150)), + ('startdate', models.DateField(default=rowers.models.current_day)), + ('enddate', models.DateField(default=rowers.models.half_year_from_now)), + ('notes', models.TextField(blank=True, max_length=300)), + ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), + ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), + ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), + ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), + ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), + ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), + ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), + ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), + ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), + ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')), ], ), migrations.CreateModel( - name='CoachOffer', + name='TrainingMicroCycle', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('coach', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('name', models.CharField(blank=True, max_length=150)), + ('startdate', models.DateField(default=rowers.models.current_day)), + ('enddate', models.DateField(default=rowers.models.half_year_from_now)), + ('notes', models.TextField(blank=True, max_length=300)), + ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), + ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), + ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), + ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), + ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), + ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), + ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), + ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), + ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), + ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')), ], ), migrations.CreateModel( - name='C2WorldClassAgePerformance', + name='TrainingPlan', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('distance', models.IntegerField(default=2000)), - ('name', models.CharField(blank=True, max_length=200)), - ('duration', models.FloatField(blank=True, default=1)), - ('season', models.IntegerField(default=2013)), - ('power', models.IntegerField(default=200)), + ('name', models.CharField(blank=True, max_length=150)), + ('status', models.BooleanField(default=True, verbose_name='Active')), + ('startdate', models.DateField(default=rowers.models.current_day)), + ('enddate', models.DateField(default=rowers.models.half_year_from_now)), + ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')), + ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')), + ], + ), + migrations.CreateModel( + name='TrainingTarget', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=150)), + ('date', models.DateField(default=rowers.models.half_year_from_now)), + ('notes', models.TextField(blank=True, max_length=300)), + ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')), + ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')), ], - options={ - 'unique_together': {('age', 'sex', 'weightcategory', 'distance')}, - }, ), migrations.CreateModel( name='VirtualRaceResult', @@ -654,39 +560,222 @@ class Migration(migrations.Migration): ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), ('age', models.IntegerField(null=True)), ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace')), ], ), migrations.CreateModel( - name='RaceLogo', + name='Workout', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(default='', max_length=150)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ('race', models.ManyToManyField(related_name='logos', to='rowers.VirtualRace')), - ], - ), - migrations.CreateModel( - name='IndoorVirtualRaceResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), - ('username', models.CharField(max_length=150)), - ('workoutid', models.IntegerField(null=True)), + ('name', models.CharField(blank=True, max_length=150, null=True)), + ('date', models.DateField()), + ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bike', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')), + ('workoutsource', models.CharField(default='unknown', max_length=100)), + ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), + ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), + ('starttime', models.TimeField(blank=True, null=True)), + ('startdatetime', models.DateTimeField(blank=True, null=True)), + ('timezone', models.CharField(default='UTC', max_length=100)), + ('distance', models.IntegerField(blank=True, default=0)), + ('duration', models.TimeField(blank=True, default=1)), + ('dragfactor', models.IntegerField(blank=True, default=0)), + ('trimp', models.IntegerField(blank=True, default=-1)), + ('rscore', models.IntegerField(blank=True, default=-1)), + ('hrtss', models.IntegerField(blank=True, default=-1)), + ('normp', models.IntegerField(blank=True, default=-1)), + ('normv', models.FloatField(blank=True, default=-1)), + ('normw', models.FloatField(blank=True, default=-1)), ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')), - ('coursecompleted', models.BooleanField(default=False)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), - ('age', models.IntegerField(null=True)), - ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace')), + ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')), + ('csvfilename', models.CharField(blank=True, max_length=150)), + ('uploadedtoc2', models.IntegerField(default=0)), + ('averagehr', models.IntegerField(blank=True, null=True)), + ('maxhr', models.BigIntegerField(blank=True, null=True)), + ('uploadedtostrava', models.BigIntegerField(default=0)), + ('uploadedtosporttracks', models.BigIntegerField(default=0)), + ('uploadedtounderarmour', models.BigIntegerField(default=0)), + ('uploadedtotp', models.BigIntegerField(default=0)), + ('uploadedtorunkeeper', models.BigIntegerField(default=0)), + ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)), + ('inboard', models.FloatField(default=0.88)), + ('oarlength', models.FloatField(default=2.89)), + ('notes', models.CharField(blank=True, max_length=1000, null=True)), + ('summary', models.TextField(blank=True)), + ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)), + ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')), + ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')), ], ), + migrations.CreateModel( + name='WorkoutComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('comment', models.TextField(max_length=300)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('read', models.BooleanField(default=False)), + ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')), + ], + ), + migrations.CreateModel( + name='VirtualRace', + fields=[ + ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')), + ('registration_form', models.CharField(choices=[('windowstart', 'Start of Race Window'), ('windowend', 'End of Race Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')), + ('registration_closure', models.DateTimeField(blank=True, null=True)), + ('evaluation_closure', models.DateTimeField(blank=True, null=True)), + ('start_time', models.TimeField(blank=True, null=True)), + ('end_time', models.TimeField(blank=True, null=True)), + ('country', models.CharField(blank=True, max_length=100)), + ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)), + ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])), + ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])), + ], + bases=('rowers.plannedsession',), + ), + migrations.AddField( + model_name='workout', + name='plannedsession', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session'), + ), + migrations.AddField( + model_name='workout', + name='team', + field=models.ManyToManyField(blank=True, to='rowers.Team'), + ), + migrations.AddField( + model_name='workout', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), + ), + migrations.AddField( + model_name='trainingplan', + name='target', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget'), + ), + migrations.AddField( + model_name='trainingmacrocycle', + name='plan', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'), + ), + migrations.AlterIndexTogether( + name='strokedata', + index_together={('workoutid',)}, + ), + migrations.AddField( + model_name='rower', + name='team', + field=models.ManyToManyField(blank=True, to='rowers.Team'), + ), + migrations.AddField( + model_name='rower', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='plannedsessioncomment', + name='plannedsession', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), + ), + migrations.AddField( + model_name='plannedsessioncomment', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='plannedsession', + name='course', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course'), + ), + migrations.AddField( + model_name='plannedsession', + name='manager', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='plannedsession', + name='rower', + field=models.ManyToManyField(blank=True, to='rowers.Rower'), + ), + migrations.AddField( + model_name='plannedsession', + name='team', + field=models.ManyToManyField(blank=True, to='rowers.Team'), + ), + migrations.AddField( + model_name='graphimage', + name='workout', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), + ), + migrations.AddField( + model_name='geopoint', + name='polygon', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoPolygon'), + ), + migrations.AddField( + model_name='geocourse', + name='manager', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'), + ), + migrations.AddField( + model_name='favoritechart', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), + ), + migrations.AlterIndexTogether( + name='ergcpdata', + index_together={('user',)}, + ), + migrations.AlterIndexTogether( + name='cpergdata', + index_together={('user',)}, + ), + migrations.AlterIndexTogether( + name='cpdata', + index_together={('user',)}, + ), + migrations.AddField( + model_name='coursetestresult', + name='plannedsession', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), + ), + migrations.AddField( + model_name='coachrequest', + name='coach', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), + ), + migrations.AddField( + model_name='coachrequest', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='coachoffer', + name='coach', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), + ), + migrations.AddField( + model_name='coachoffer', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterUniqueTogether( + name='c2worldclassageperformance', + unique_together={('age', 'sex', 'weightcategory', 'distance')}, + ), + migrations.AddField( + model_name='virtualraceresult', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), + ), + migrations.AddField( + model_name='racelogo', + name='race', + field=models.ManyToManyField(related_name='logos', to='rowers.VirtualRace'), + ), + migrations.AddField( + model_name='indoorvirtualraceresult', + name='race', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), + ), ] diff --git a/rowers/templates/subscription_create_email.html b/rowers/templates/subscription_create_email.html index 63c70e90..0b61e01b 100644 --- a/rowers/templates/subscription_create_email.html +++ b/rowers/templates/subscription_create_email.html @@ -15,10 +15,7 @@

- The subscription will keep running until you change or stop it. At any point in time you - can change the automatically renewing subscription to a "one year only" subscription through - the upgrade page. On this page, you can also - upgrade your subscription. + The subscription will keep running until you change or stop it.

{% else %} diff --git a/rowers/templates/workout_delete_confirm.html b/rowers/templates/workout_delete_confirm.html index b54141d2..348de945 100644 --- a/rowers/templates/workout_delete_confirm.html +++ b/rowers/templates/workout_delete_confirm.html @@ -28,7 +28,7 @@
  • {% csrf_token %} - +
  • From 89942d8ab39a0e7b6900ea50c85a6917aaf2b594 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 27 Apr 2019 19:55:35 +0200 Subject: [PATCH 6/7] bug fix --- rowers/views/workoutviews.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index ada6ded4..124ba8d9 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -1801,7 +1801,7 @@ def workout_downloadwind_view(request,id=0, try: row.notes += "\n"+message except TypeError: - if message: + if message and row.notes: row.notes += message row.save() From 2e06a99778ec620d833cf89a2f09260b13fa135e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 27 Apr 2019 20:05:23 +0200 Subject: [PATCH 7/7] fix --- rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12523 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 4f2620a2fab08046786366831eee9a9a7c45c076..5bb4cc014356ab021b4687ad66772e8461877073 100644 GIT binary patch delta 16 XcmaEz_&SkYzMF$1Y{rp|>`x2;JY)vg delta 16 XcmaEz_&SkYzMF&NUDp1M>`x2;KVJtu