From baa162c2d7dd4a6c18bec8815b9c462a544d65cd Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 3 Jun 2023 15:07:25 +0200 Subject: [PATCH 1/5] migrations --- boatmovers/migrations/0001_initial.py | 58 -- .../0002_alter_athlete_unique_together.py | 17 - .../migrations/0003_auto_20220622_1753.py | 28 - .../migrations/0004_auto_20220622_1835.py | 22 - boatmovers/migrations/0005_athlete_gender.py | 19 - .../migrations/0006_auto_20220624_0811.py | 23 - .../migrations/0007_auto_20220624_0820.py | 24 - .../migrations/0008_auto_20220624_1135.py | 23 - .../migrations/0009_alter_race_crew_size.py | 18 - .../migrations/0010_remove_race_resultlist.py | 17 - .../migrations/0011_alter_race_processed.py | 18 - .../migrations/0012_auto_20220625_1328.py | 33 - .../migrations/0013_alter_crew_athletes.py | 18 - boatmovers/migrations/0014_athlete_dummy.py | 18 - .../0015_alter_athlete_unique_together.py | 17 - boatmovers/migrations/0016_race_gender.py | 18 - .../migrations/0017_athlete_full_name.py | 19 - boatmovers/migrations/__init__.py | 0 rowers/migrations/0001_initial.py | 887 ------------------ 19 files changed, 1277 deletions(-) delete mode 100644 boatmovers/migrations/0001_initial.py delete mode 100644 boatmovers/migrations/0002_alter_athlete_unique_together.py delete mode 100644 boatmovers/migrations/0003_auto_20220622_1753.py delete mode 100644 boatmovers/migrations/0004_auto_20220622_1835.py delete mode 100644 boatmovers/migrations/0005_athlete_gender.py delete mode 100644 boatmovers/migrations/0006_auto_20220624_0811.py delete mode 100644 boatmovers/migrations/0007_auto_20220624_0820.py delete mode 100644 boatmovers/migrations/0008_auto_20220624_1135.py delete mode 100644 boatmovers/migrations/0009_alter_race_crew_size.py delete mode 100644 boatmovers/migrations/0010_remove_race_resultlist.py delete mode 100644 boatmovers/migrations/0011_alter_race_processed.py delete mode 100644 boatmovers/migrations/0012_auto_20220625_1328.py delete mode 100644 boatmovers/migrations/0013_alter_crew_athletes.py delete mode 100644 boatmovers/migrations/0014_athlete_dummy.py delete mode 100644 boatmovers/migrations/0015_alter_athlete_unique_together.py delete mode 100644 boatmovers/migrations/0016_race_gender.py delete mode 100644 boatmovers/migrations/0017_athlete_full_name.py delete mode 100644 boatmovers/migrations/__init__.py delete mode 100644 rowers/migrations/0001_initial.py diff --git a/boatmovers/migrations/0001_initial.py b/boatmovers/migrations/0001_initial.py deleted file mode 100644 index f9b5cbb7..00000000 --- a/boatmovers/migrations/0001_initial.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:41 - -import boatmovers.models -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Athlete', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=200)), - ('last_name', models.CharField(max_length=200)), - ('club', models.CharField(max_length=200)), - ('trueskill_mu', models.FloatField(default=25.0)), - ('trueskill_sigma', models.FloatField(default=8.333)), - ('birth_year', models.IntegerField(default=1972)), - ], - ), - migrations.CreateModel( - name='Crew', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('athletes', models.ManyToManyField(to='boatmovers.Athlete')), - ], - ), - migrations.CreateModel( - name='Race', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=boatmovers.models.current_day)), - ('crew_size', models.IntegerField(default=1)), - ], - ), - migrations.CreateModel( - name='Result', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField()), - ('crew', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.crew')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.race')), - ], - ), - migrations.AddField( - model_name='race', - name='resultlist', - field=models.ManyToManyField(through='boatmovers.Result', to='boatmovers.Crew'), - ), - ] diff --git a/boatmovers/migrations/0002_alter_athlete_unique_together.py b/boatmovers/migrations/0002_alter_athlete_unique_together.py deleted file mode 100644 index 7572d257..00000000 --- a/boatmovers/migrations/0002_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:49 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0001_initial'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year')}, - ), - ] diff --git a/boatmovers/migrations/0003_auto_20220622_1753.py b/boatmovers/migrations/0003_auto_20220622_1753.py deleted file mode 100644 index bc367b79..00000000 --- a/boatmovers/migrations/0003_auto_20220622_1753.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0002_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='name', - field=models.CharField(default='Race1', max_length=200), - preserve_default=False, - ), - migrations.AddField( - model_name='race', - name='resulturl', - field=models.URLField(null=True), - ), - migrations.AlterUniqueTogether( - name='race', - unique_together={('date', 'name')}, - ), - ] diff --git a/boatmovers/migrations/0004_auto_20220622_1835.py b/boatmovers/migrations/0004_auto_20220622_1835.py deleted file mode 100644 index 94691a93..00000000 --- a/boatmovers/migrations/0004_auto_20220622_1835.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0003_auto_20220622_1753'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='verified', - field=models.BooleanField(default=False), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'race', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0005_athlete_gender.py b/boatmovers/migrations/0005_athlete_gender.py deleted file mode 100644 index 41de5e0a..00000000 --- a/boatmovers/migrations/0005_athlete_gender.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0004_auto_20220622_1835'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/0006_auto_20220624_0811.py b/boatmovers/migrations/0006_auto_20220624_0811.py deleted file mode 100644 index 6b234db8..00000000 --- a/boatmovers/migrations/0006_auto_20220624_0811.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0005_athlete_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='trueskill_exposed', - field=models.FloatField(default=0), - ), - migrations.AlterField( - model_name='athlete', - name='trueskill_sigma', - field=models.FloatField(default=8.333333333333334), - ), - ] diff --git a/boatmovers/migrations/0007_auto_20220624_0820.py b/boatmovers/migrations/0007_auto_20220624_0820.py deleted file mode 100644 index 4c4355fa..00000000 --- a/boatmovers/migrations/0007_auto_20220624_0820.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0006_auto_20220624_0811'), - ] - - operations = [ - migrations.AlterField( - model_name='result', - name='crew', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.crew'), - ), - migrations.AlterField( - model_name='result', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.race'), - ), - ] diff --git a/boatmovers/migrations/0008_auto_20220624_1135.py b/boatmovers/migrations/0008_auto_20220624_1135.py deleted file mode 100644 index d5492e47..00000000 --- a/boatmovers/migrations/0008_auto_20220624_1135.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 11:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0007_auto_20220624_0820'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='processed', - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0009_alter_race_crew_size.py b/boatmovers/migrations/0009_alter_race_crew_size.py deleted file mode 100644 index 4207ae30..00000000 --- a/boatmovers/migrations/0009_alter_race_crew_size.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0008_auto_20220624_1135'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(choices=[(1, 1), (2, 2), (4, 4), (8, 8)], default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0010_remove_race_resultlist.py b/boatmovers/migrations/0010_remove_race_resultlist.py deleted file mode 100644 index e6d9403e..00000000 --- a/boatmovers/migrations/0010_remove_race_resultlist.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:50 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0009_alter_race_crew_size'), - ] - - operations = [ - migrations.RemoveField( - model_name='race', - name='resultlist', - ), - ] diff --git a/boatmovers/migrations/0011_alter_race_processed.py b/boatmovers/migrations/0011_alter_race_processed.py deleted file mode 100644 index f8b81cb7..00000000 --- a/boatmovers/migrations/0011_alter_race_processed.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0010_remove_race_resultlist'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='processed', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0012_auto_20220625_1328.py b/boatmovers/migrations/0012_auto_20220625_1328.py deleted file mode 100644 index 9a0b5552..00000000 --- a/boatmovers/migrations/0012_auto_20220625_1328.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:28 - -import boatmovers.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0011_alter_race_processed'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='crews', to='boatmovers.Athlete'), - ), - migrations.AlterField( - model_name='race', - name='date', - field=models.DateField(default=boatmovers.models.current_day, verbose_name='Race Date'), - ), - migrations.AlterField( - model_name='race', - name='resulturl', - field=models.URLField(null=True, verbose_name='URL Link to results'), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0013_alter_crew_athletes.py b/boatmovers/migrations/0013_alter_crew_athletes.py deleted file mode 100644 index 8f9634c4..00000000 --- a/boatmovers/migrations/0013_alter_crew_athletes.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0012_auto_20220625_1328'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='athlete_crews', to='boatmovers.Athlete'), - ), - ] diff --git a/boatmovers/migrations/0014_athlete_dummy.py b/boatmovers/migrations/0014_athlete_dummy.py deleted file mode 100644 index f3aec5e7..00000000 --- a/boatmovers/migrations/0014_athlete_dummy.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 15:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0013_alter_crew_athletes'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='dummy', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0015_alter_athlete_unique_together.py b/boatmovers/migrations/0015_alter_athlete_unique_together.py deleted file mode 100644 index ee5e6ac1..00000000 --- a/boatmovers/migrations/0015_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 17:44 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0014_athlete_dummy'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year', 'gender')}, - ), - ] diff --git a/boatmovers/migrations/0016_race_gender.py b/boatmovers/migrations/0016_race_gender.py deleted file mode 100644 index ffedd044..00000000 --- a/boatmovers/migrations/0016_race_gender.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 18:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0015_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - ), - ] diff --git a/boatmovers/migrations/0017_athlete_full_name.py b/boatmovers/migrations/0017_athlete_full_name.py deleted file mode 100644 index f3056eb9..00000000 --- a/boatmovers/migrations/0017_athlete_full_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-07-08 12:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0016_race_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='full_name', - field=models.CharField(default=' ', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/__init__.py b/boatmovers/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/rowers/migrations/0001_initial.py b/rowers/migrations/0001_initial.py deleted file mode 100644 index 20324b57..00000000 --- a/rowers/migrations/0001_initial.py +++ /dev/null @@ -1,887 +0,0 @@ -# Generated by Django 2.1.7 on 2020-10-01 07:10 - -import datetime -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import django_countries.fields -import rowers.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Alert', - 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, verbose_name='Alert Name')), - ('reststrokes', models.BooleanField(default=False, null=True, verbose_name='Include Rest Strokes')), - ('period', models.IntegerField(default=7, verbose_name='Reporting Period (days)')), - ('next_run', models.DateField(default=django.utils.timezone.now)), - ('emailalert', models.BooleanField(default=True, verbose_name='Send email alerts')), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=50, verbose_name='Exercise/Boat Class')), - ('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')), - ], - ), - migrations.CreateModel( - name='BlogPost', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.TextField(max_length=300)), - ('link', models.TextField(max_length=300)), - ('date', models.DateField()), - ], - ), - migrations.CreateModel( - name='C2WorldClassAgePerformance', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-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=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'Open'), ('female', 'Female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('duration', models.FloatField(blank=True, default=1)), - ('power', models.IntegerField(default=200)), - ], - options={ - 'db_table': 'calcagegrouprecords', - }, - ), - migrations.CreateModel( - name='CoachingGroup', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('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='Condition', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('metric', 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)'), ('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)'), ('distance', 'Interval Distance (m)'), ('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='Metric')), - ('value1', models.FloatField(default=0)), - ('value2', models.FloatField(blank=True, default=0, null=True)), - ('condition', models.CharField(choices=[('<', '<'), ('>', '>'), ('=', '='), ('between', 'between')], max_length=20, null=True)), - ], - ), - migrations.CreateModel( - name='CourseStandard', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=150)), - ('coursedistance', models.IntegerField(default=0)), - ('coursetime', models.CharField(default='', max_length=100)), - ('referencespeed', models.FloatField(default=5.0)), - ('agemin', models.IntegerField(default=0)), - ('agemax', models.IntegerField(default=120)), - ('boatclass', models.CharField(default='water', max_length=150)), - ('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)), - ('sex', models.CharField(default='male', max_length=150)), - ('weightclass', models.CharField(default='hwt', max_length=150)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('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)), - ('skillclass', models.CharField(default='Open', max_length=150)), - ], - ), - 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)'), ('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)'), ('distance', 'Interval Distance (m)'), ('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)'), ('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)'), ('distance', 'Interval Distance (m)'), ('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)'), ('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)'), ('distance', 'Interval Distance (m)'), ('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=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('distance', models.IntegerField(default=0)), - ('name', models.CharField(blank=True, max_length=150)), - ('country', models.CharField(blank=True, max_length=150)), - ('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, related_name='polygons', 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', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('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')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('points', models.FloatField(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 challenge notifications by email')), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - migrations.CreateModel( - name='PaidPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('shortname', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], max_length=50)), - ('name', models.CharField(max_length=200)), - ('external_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('price', models.FloatField(blank=True, default=None, null=True)), - ('paymentprocessor', models.CharField(choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('active', models.BooleanField(default=True)), - ('clubsize', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='PlannedSession', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, verbose_name='Name')), - ('comment', models.TextField(blank=True, max_length=1000)), - ('startdate', models.DateField(default=rowers.models.current_day, verbose_name='On or After')), - ('enddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='On or Before')), - ('preferreddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='Preferred Date')), - ('sessiontype', models.CharField(choices=[('session', 'Training Session'), ('challenge', 'Challenge'), ('test', 'Mandatory Test'), ('cycletarget', 'Total for a time period'), ('coursetest', 'OTW test over a course'), ('race', 'Virtual challenge'), ('indoorrace', 'Indoor Virtual challenge')], default='session', max_length=150, verbose_name='Session Type')), - ('sessionvalue', models.IntegerField(default=60, verbose_name='Value')), - ('max_nr_of_workouts', models.IntegerField(default=0, verbose_name='Maximum number of workouts')), - ('sessionunit', models.CharField(choices=[('min', 'minutes'), ('m', 'meters'), ('None', None)], default='min', max_length=150, verbose_name='Unit')), - ('criterium', models.CharField(choices=[('none', 'Approximately'), ('minimum', 'At Least'), ('exact', 'Exactly')], default='none', max_length=150, verbose_name='Criteria')), - ('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)), - ('is_template', models.BooleanField(default=False)), - ], - ), - 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=41)), - ('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( - name='Rower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', django_countries.fields.CountryField(blank=True, default=None, max_length=2, null=True)), - ('street_address', models.CharField(blank=True, default='', max_length=200, null=True)), - ('city', models.CharField(blank=True, default='', max_length=200, null=True)), - ('postal_code', models.CharField(blank=True, default='', max_length=200, null=True)), - ('customer_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('subscription_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('rowerplan', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], default='basic', max_length=30)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('paymentprocessor', models.CharField(blank=True, choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50, null=True)), - ('planexpires', models.DateField(default=rowers.models.current_day)), - ('teamplanexpires', models.DateField(default=rowers.models.current_day)), - ('clubsize', models.IntegerField(default=0)), - ('protrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('plantrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('offercoaching', models.BooleanField(default=False, verbose_name='Offer Remote Coaching')), - ('gdproptin', models.BooleanField(default=False)), - ('gdproptindate', models.DateTimeField(blank=True, null=True)), - ('surveydone', models.BooleanField(default=False)), - ('surveydonedate', models.DateTimeField(blank=True, null=True)), - ('max', models.IntegerField(default=192, verbose_name='Max Heart Rate')), - ('rest', models.IntegerField(default=48, verbose_name='Resting Heart Rate')), - ('ut2', models.IntegerField(default=105, verbose_name='UT2 band lower HR')), - ('ut1', models.IntegerField(default=146, verbose_name='UT1 band lower HR')), - ('at', models.IntegerField(default=160, verbose_name='AT band lower HR')), - ('tr', models.IntegerField(default=167, verbose_name='TR band lower HR')), - ('an', models.IntegerField(default=180, verbose_name='AN band lower HR')), - ('hrftp', models.IntegerField(default=0, verbose_name='FTP heart rate')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('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')), - ('birthdate', models.DateField(blank=True, null=True)), - ('ftp', models.IntegerField(default=226, verbose_name='Functional Threshold Power')), - ('p0', models.FloatField(default=1.0, verbose_name='CP p1')), - ('p1', models.FloatField(default=1.0, verbose_name='CP p2')), - ('p2', models.FloatField(default=1.0, verbose_name='CP p3')), - ('p3', models.FloatField(default=1.0, verbose_name='CP p4')), - ('cpratio', models.FloatField(default=1.0, verbose_name='CP fit ratio')), - ('ep0', models.FloatField(default=1.0, verbose_name='erg CP p1')), - ('ep1', models.FloatField(default=1.0, verbose_name='erg CP p2')), - ('ep2', models.FloatField(default=1.0, verbose_name='erg CP p3')), - ('ep3', models.FloatField(default=1.0, verbose_name='erg CP p4')), - ('ecpratio', models.FloatField(default=1.0, verbose_name='erg CP fit ratio')), - ('otwslack', models.IntegerField(default=0, verbose_name='OTW Power slack')), - ('pw_ut2', models.IntegerField(default=124, verbose_name='UT2 Power')), - ('pw_ut1', models.IntegerField(default=171, verbose_name='UT1 Power')), - ('pw_at', models.IntegerField(default=203, verbose_name='AT Power')), - ('pw_tr', models.IntegerField(default=237, verbose_name='TR Power')), - ('pw_an', models.IntegerField(default=273, verbose_name='AN Power')), - ('powerzones', rowers.models.PowerZonesField(default=['Rest', 'Pwr UT2', 'Pwr UT1', 'Pwr AT', 'Pwr TR', 'Pwr AN'])), - ('workflowleftpanel', rowers.models.TemplateListField(default=['panel_navigationheader.html', 'panel_editbuttons.html', 'panel_advancededit.html', 'panel_editintervals.html', 'panel_stats.html', 'panel_staticchart.html', 'panel_uploadimage.html'])), - ('workflowmiddlepanel', rowers.models.TemplateListField(default=['panel_middlesocial.html', 'panel_statcharts.html', 'flexthumbnails.html', 'panel_summary.html', 'panel_map.html'])), - ('defaultlandingpage', models.CharField(choices=[('workout_edit_view', 'Edit View'), ('workout_workflow_view', 'Workflow View'), ('workout_stats_view', 'Stats View'), ('workout_data_view', 'Data Explore View'), ('workout_summary_edit_view', 'Intervals Editor')], default='workout_edit_view', max_length=200, verbose_name='Default Landing Page')), - ('c2token', models.CharField(blank=True, default='', max_length=200, null=True)), - ('tokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('c2refreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('c2_auto_export', models.BooleanField(default=False)), - ('c2_auto_import', models.BooleanField(default=False)), - ('sporttrackstoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttrackstokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('sporttracksrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttracks_auto_export', models.BooleanField(default=False)), - ('underarmourtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('underarmourtokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('underarmourrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('mapmyfitness_auto_export', models.BooleanField(default=False)), - ('tptoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('tptokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('tprefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('trainingpeaks_auto_export', models.BooleanField(default=False)), - ('polartoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polartokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('polarrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polaruserid', models.IntegerField(default=0)), - ('polar_auto_import', models.BooleanField(default=False)), - ('garmintoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('garminrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravatoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('stravatokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('stravarefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravaexportas', models.CharField(choices=[('Ride', 'Ride'), ('Kitesurf', 'Kitesurf'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('RockClimbing', 'RockClimbing'), ('Hike', 'Hike'), ('RollerSki', 'RollerSki'), ('Walk', 'Walk'), ('Rowing', 'Rowing'), ('AlpineSki', 'AlpineSki'), ('Snowboard', 'Snowboard'), ('BackcountrySki', 'BackcountrySki'), ('Snowshoe', 'Snowshoe'), ('Canoeing', 'Canoeing'), ('StairStepper', 'StairStepper'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('EBikeRide', 'EBikeRide'), ('Surfing', 'Surfing'), ('Elliptical', 'Elliptical'), ('VirtualRide', 'VirtualRide'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Windsurf', 'Windsurf'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('Yoga', 'Yoga')], default='Rowing', max_length=30, verbose_name='Export Workouts to Strava as')), - ('strava_owner_id', models.BigIntegerField(default=0)), - ('strava_auto_export', models.BooleanField(default=False)), - ('strava_auto_import', models.BooleanField(default=False)), - ('strava_auto_delete', models.BooleanField(default=False)), - ('runkeepertoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('runkeeper_auto_export', models.BooleanField(default=False)), - ('getemailnotifications', models.BooleanField(default=False, verbose_name='Receive email notifications')), - ('emailbounced', models.BooleanField(default=False, verbose_name='Email Address Bounced')), - ('getimportantemails', models.BooleanField(default=True, verbose_name='Get Important Emails')), - ('privacy', models.CharField(choices=[('visible', 'Visible'), ('hidden', 'Hidden')], default='visible', max_length=30)), - ('defaulttimezone', 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/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/Nuuk', 'America/Nuuk'), ('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, verbose_name='Default Time Zone')), - ('showfavoritechartnotes', models.BooleanField(default=True, verbose_name='Show Notes for Favorite Charts')), - ('staticgrids', models.CharField(choices=[('none', None), ('both', 'both'), ('x', 'x'), ('y', 'y')], default='both', max_length=50, null=True, verbose_name='Chart Grid')), - ('slowpaceerg', models.DurationField(default=datetime.timedelta(seconds=160), verbose_name='Slowest Erg Pace')), - ('fastpaceerg', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest Erg Pace')), - ('slowpaceotw', models.DurationField(default=datetime.timedelta(seconds=240), verbose_name='Slowest OTW Pace')), - ('fastpaceotw', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest OTW Pace')), - ('autojoin', models.BooleanField(default=False, verbose_name='Auto Join Workout Segments')), - ('coachinggroups', models.ManyToManyField(related_name='coaches', to='rowers.CoachingGroup')), - ('friends', models.ManyToManyField(blank=True, related_name='_rower_friends_+', to='rowers.Rower')), - ('mycoachgroup', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='coachingrole', to='rowers.CoachingGroup')), - ('paidplan', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PaidPlan')), - ], - ), - migrations.CreateModel( - name='ShareKey', - fields=[ - ('location', models.TextField()), - ('token', models.CharField(max_length=40, primary_key=True, serialize=False)), - ('creation_date', models.DateTimeField(auto_now_add=True)), - ('expiration_seconds', models.BigIntegerField()), - ], - ), - migrations.CreateModel( - name='SiteAnnouncement', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateField(default=rowers.models.current_day)), - ('announcement', models.TextField(max_length=280)), - ('expires', models.DateField(default=rowers.models.current_day)), - ('modified', models.DateField(default=rowers.models.current_day)), - ('dotweet', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='StandardCollection', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('active', models.BooleanField(default=True)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - 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='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='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='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='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='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.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)), - ('notes', models.CharField(blank=True, max_length=200, null=True, verbose_name='Plan Notes')), - ('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')), - ], - ), - migrations.CreateModel( - name='VideoAnalysis', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, default='', max_length=150, null=True)), - ('video_id', models.CharField(default='', max_length=150)), - ('delay', models.IntegerField(default=0)), - ('metricsgroups', rowers.models.TemplateListField(default=['basic'])), - ], - ), - migrations.CreateModel( - name='VirtualRaceFollower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('emailaddress', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email Address')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='VirtualRaceResult', - 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', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('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')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('points', models.FloatField(default=0)), - ('boatclass', models.CharField(choices=[('water', 'Standard Racing Shell'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=40, verbose_name='Boat Class')), - ('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=40, verbose_name='Boat Type')), - ('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 challenge notifications by email')), - ('startsecond', models.FloatField(default=0)), - ('endsecond', models.FloatField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - 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(blank=True, null=True)), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bikeerg', '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'), ('Bike', 'Bike'), ('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'), ('Yoga', 'Yoga'), ('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')), - ('boatbrand', models.CharField(choices=[('other', 'Other'), ('alden', 'Alden Rowing'), ('averowing', 'AveRowing Boats'), ('aylings', 'Aylings'), ('bbg', 'BBG'), ('burgashell', 'Burgashell'), ('burton', 'Burton Water Sports'), ('douglas', 'Carl Douglas Racing Shells'), ('carbocraft', 'Carbocraft'), ('colley', 'Colley'), ('cucchietti', 'Cucchietti'), ('dirigo', 'Dirigo'), ('drew', 'Drew Harrison Racing'), ('echo', 'Echo Rowing'), ('edon', 'Edon TS515 Sculling Boats'), ('edwin', 'Edwin Phelps'), ('empacher', 'Empacher'), ('eton', 'Eton Racing Boats (ERB)'), ('euro', 'Euro Diffusions'), ('filippi', 'Filippi Boats'), ('fluidesign', 'Fluidesign'), ('dragon', 'Flying Dragon Boat Co (Huangzhou, China)'), ('gig', 'Gig Harbor Boat Works'), ('sharrow', 'George Sharrow Racing Shells'), ('harris', 'Harris'), ('hitech', 'Hi-Tech'), ('hudson', 'Hudson Boatworks'), ('janousek', 'Janousek Racing Boats'), ('waugh', 'John Waugh Racing Boats'), ('laszlo', 'Laszlo Boats NZ'), ('leo', 'Leo Coastal Rowing'), ('levator', 'Levator Boatworks'), ('liangjin', 'Liangjin Boat'), ('liteboat', 'LiteBoat'), ('littleriver', 'Little River Marine'), ('kaschper', 'Kaschper Racing Shells'), ('kanghua', 'Kanghua'), ('king', 'King Racing Shells'), ('kiwi', 'Kiwi International Rowing Skiffs (KIRS)'), ('lola', 'Lola Aylings'), ('maas', 'Maas Rowing Shells'), ('maas', 'Maas Boat (coastal)'), ('nelo', 'Nelo Rowing'), ('owen', 'Owen'), ('peinert', 'Peinert'), ('pocock', 'Pocock Racing Shells'), ('race1', 'Race 1 Australia'), ('radley', 'Radley'), ('resolute', 'Resolute Racing Shells'), ('salani', 'Salani'), ('schoenbrod', 'Helmut Schoenbrod'), ('salterbros', 'Salter Bros'), ('sims', 'Ray Sims'), ('slracing', 'SL Racing'), ('stampfli', 'Stämpfli Racing Boats'), ('sutton', 'Sutton'), ('swastik', 'Swastik fibchem industry'), ('swift', 'Swift Racing'), ('sykes', 'Sykes Racing'), ('vandusen', 'Van Dusen'), ('vega', 'Vega'), ('vespoli', 'Vespoli'), ('vicente', 'Vicente Dors'), ('virus', 'Virus'), ('whitehall', 'Whitehall Rowing'), ('wiersma', 'Roeiwerf Wiersma'), ('wintech', 'WinTech Racing'), ('worcester', 'Worcester Oar & Paddle (Joe Garafolo)'), ('swastik', 'Swastik Boats')], default='', max_length=50, verbose_name='Boat Brand')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('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(default=datetime.time(12, 0))), - ('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)), - ('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', 'open-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)), - ('uploadedtogarmin', 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')), - ('impeller', models.BooleanField(default=False, verbose_name='Impeller')), - ], - ), - 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 challenge Window'), ('windowend', 'End of challenge 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/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/Nuuk', 'America/Nuuk'), ('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()])), - ('coursestandards', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.StandardCollection', verbose_name='Standard Times')), - ], - 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='videoanalysis', - name='workout', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), - ), - 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.AddField( - model_name='rower', - name='team', - field=models.ManyToManyField(blank=True, related_name='rower', 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, related_name='points', 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='coursestandard', - name='standardcollection', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='standards', to='rowers.StandardCollection'), - ), - 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='alert', - name='filter', - field=models.ManyToManyField(related_name='filters', to='rowers.Condition', verbose_name='Filters'), - ), - migrations.AddField( - model_name='alert', - name='manager', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='alert', - name='measured', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='measured', to='rowers.Condition', verbose_name='Measuring'), - ), - migrations.AddField( - model_name='alert', - name='rower', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='virtualraceresult', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entries', to='rowers.VirtualRace'), - ), - migrations.AddField( - model_name='virtualracefollower', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), - ), - migrations.AlterUniqueTogether( - name='videoanalysis', - unique_together={('video_id', 'workout')}, - ), - 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'), - ), - migrations.AlterUniqueTogether( - name='coursestandard', - unique_together={('name', 'standardcollection')}, - ), - ] From b6202369c733cc54e640b57e822cc2544328582f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 3 Jun 2023 21:20:02 +0200 Subject: [PATCH 2/5] working on 3.9 --- boatmovers/apps.py | 3 +++ django_extensions/apps.py | 8 ++++++++ rowers/apps.py | 3 +++ rowers/dataroutines.py | 17 +++++++++++++---- rowers/interactiveplots.py | 27 ++++++++++++++------------- rowers/templates/flexchart3otw.html | 4 ++-- rowers/views/analysisviews.py | 27 +++++++++++++++++++++------ rowers/views/workoutviews.py | 2 ++ 8 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 django_extensions/apps.py diff --git a/boatmovers/apps.py b/boatmovers/apps.py index eb3806d9..9e5fbbb2 100644 --- a/boatmovers/apps.py +++ b/boatmovers/apps.py @@ -1,6 +1,9 @@ from django.apps import AppConfig +import os +from django.conf import settings class BoatmoversConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'boatmovers' + path = os.path.join(settings.BASE_DIR, 'boatmovers') diff --git a/django_extensions/apps.py b/django_extensions/apps.py new file mode 100644 index 00000000..88077107 --- /dev/null +++ b/django_extensions/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +import os +from django.conf import settings + + +class DjangoExtensionsConfig(AppConfig): + name = 'django_extensions' + path = os.path.join(settings.BASE_DIR, 'django_extensions') diff --git a/rowers/apps.py b/rowers/apps.py index 82adbc07..94f7b677 100644 --- a/rowers/apps.py +++ b/rowers/apps.py @@ -1,8 +1,11 @@ from django.apps import AppConfig +import os +from django.conf import settings # Store metadata for the app class RowersConfig(AppConfig): name = 'rowers' + path = os.path.join(settings.BASE_DIR, 'rowers') diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 94398d17..1d439969 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -1369,6 +1369,7 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): extracols = [] + columns = list(columns) + ['distance', 'spm', 'workoutid'] columns = [x for x in columns if x != 'None'] columns = list(set(columns)) @@ -1381,27 +1382,35 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): elif len(ids) == 1: # pragma: no cover try: filename = 'media/strokedata_{id}.parquet.gz'.format(id=ids[0]) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) except OSError: rowdata, row = getrowdata(id=ids[0]) if rowdata and len(rowdata.df): _ = dataprep(rowdata.df, id=ids[0], bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) else: data = [] filenames = [ 'media/strokedata_{id}.parquet.gz'.format(id=id) for id in ids] for id, f in zip(ids, filenames): try: - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) except (OSError, IndexError, ArrowInvalid): rowdata, row = getrowdata(id=id) if rowdata and len(rowdata.df): # pragma: no cover _ = dataprep(rowdata.df, id=id, bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) try: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 067c47d9..2603e2d4 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4853,18 +4853,17 @@ def interactive_multiflex(datadf, xparam, yparam, groupby, extratitle='', TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap' if groupby != 'date': - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval{1.1}'), - (xparamname, '@x{1.1}'), - (yparamname, '@y') + hover = HoverTool(tooltips=[ + (groupby, '@groupval{1.1}'), + (xparamname, '@x{1.1}'), + (yparamname, '@y') ]) else: # pragma: no cover - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval'), - (xparamname, '@x{1.1}'), - (yparamname, '@y'), + hover = HoverTool( + tooltips=[ + (groupby, '@groupval'), + (xparamname, '@x{1.1}'), + (yparamname, '@y'), ]) hover.mode = 'mouse' @@ -6851,7 +6850,7 @@ def interactive_otw_advanced_pace_chart(id=0, promember=0): ) plot.title.text = row.name - plot.title.text_font_size = value("1.2em") + #plot.title.text_font_size = value("1.2em") plot.xaxis.axis_label = "Time" plot.yaxis.axis_label = "Pace (/500m)" plot.xaxis[0].formatter = DatetimeTickFormatter( @@ -7236,8 +7235,10 @@ def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', p.extra_y_ranges["yax2"] = Range1d(start=0, end=y2rangemax) p.line('date', 'hours', source=source2, y_range_name="yax2", color="black", width=5) - p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, - legend_label='Hours') + p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10) + +# p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, +# legend_label='Hours') p.add_layout(LinearAxis(y_range_name="yax2", axis_label='Hours'), 'right') diff --git a/rowers/templates/flexchart3otw.html b/rowers/templates/flexchart3otw.html index 5c965572..19f7cbeb 100644 --- a/rowers/templates/flexchart3otw.html +++ b/rowers/templates/flexchart3otw.html @@ -11,8 +11,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 46366473..e98a5f3f 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -414,11 +414,26 @@ def trendflexdata(workouts, options, userid=0): groups = datadf.groupby(pd.cut(datadf['days ago'], bins, labels=False)) - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - groupsize = groups.count()[xparam] + xvalues = [] + yvalues = [] + xerror = [] + yerror = [] + groupsize = [] + groupval = [] + for key, item in groups: + xvalues.append(groups.get_group(key)[xparam].mean()) + yvalues.append(groups.get_group(key)[yparam].mean()) + xerror.append(groups.get_group(key)[xparam].std()) + yerror.append(groups.get_group(key)[yparam].std()) + groupsize.append(len(groups.get_group(key)[xparam])) + groupval.append(groups.get_group(key)[groupby].mean()) + + + xvalues = pd.Series(xvalues) + yvalues = pd.Series(yvalues) + xerror = pd.Series(xerror) + yerror = pd.Series(yerror) + groupsize = pd.Series(groupsize) mask = groupsize <= min([0.01*groupsize.sum(), 0.2*groupsize.mean()]) xvalues.loc[mask] = np.nan @@ -458,7 +473,7 @@ def trendflexdata(workouts, options, userid=0): if groupby != 'date': try: - df['groupval'] = groups.mean()[groupby] + df['groupval'] = pd.Series(groupval) df.loc[mask, 'groupval'] = np.nan groupcols = df['groupval'] diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 42641229..2f59a0ab 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -3859,6 +3859,8 @@ def workout_stats_view(request, id=0, message="", successmessage=""): except KeyError: # pragma: no cover pass + datadf = datadf.select_dtypes([np.number]) + # Create a dict with correlation values cor = datadf.corr(method='spearman') cor.fillna(value=0, inplace=True) From 206ee219f3921339c1f937a485ff17de6a90b31b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 4 Jun 2023 09:26:36 +0200 Subject: [PATCH 3/5] fixing analysis data bokeh --- rowers/datautils.py | 2 +- rowers/interactiveplots.py | 5 +++-- rowers/templates/user_analysis_select.html | 21 ++++++++++++++------- rowers/views/analysisviews.py | 17 ++--------------- templates/newbase.html | 1 - 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/rowers/datautils.py b/rowers/datautils.py index 47581604..a13709f9 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -329,7 +329,7 @@ def getmaxwattinterval(tt, ww, i): w_roll = ww.rolling(i+2).mean().dropna() if len(w_roll): # now goes with # data points - should be fixed seconds - indexmax = w_roll.idxmax(axis=1) + indexmax = w_roll.idxmax(axis=0) # indexmaxpos = indexmax.get_loc(indexmax) indexmaxpos = indexmax try: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 2603e2d4..91bb53b1 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -3589,8 +3589,9 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, cpfit='da title = "Critical Power for "+rowername plot.title.text = title - xaxis = plot.select(dict(type=Axis, layout="below"))[0] - xaxis.formatter = PrintfTickFormatter() + #xaxis = plot.select(dict(type=Axis, layout="below")) #[0] + #print(xaxis) + #xaxis.formatter = PrintfTickFormatter() hover = plot.select(dict(type=HoverTool)) diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html index 45dd06ad..935fe39d 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -332,12 +332,18 @@
- -
- - + + + + +
From 1a082d8908b5b81de53b361f3ce3b0209cbb1ecd Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 4 Jun 2023 16:53:55 +0200 Subject: [PATCH 4/5] 3.6.0 for py39 --- rowers/dataprep.py | 12 ++++++------ rowers/dataroutines.py | 10 +++++----- rowers/interactiveplots.py | 2 +- rowers/scoring.py | 2 ++ rowers/tasks.py | 3 ++- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 3999 bytes templates/newbase.html | 2 -- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index c042b4af..d68d01d4 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -786,9 +786,9 @@ def split_workout(r, parent, splitsecond, splitmode): data1.fillna(method='bfill', inplace=True) # Some new stuff to try out - data1 = data1.groupby('time', axis=0).mean() - data1['time'] = data1.index - data1.reset_index(drop=True, inplace=True) + #data1 = data1.groupby('time', axis=0).mean() + #data1['time'] = data1.index + #data1.reset_index(drop=True, inplace=True) data2 = data2.sort_values(['time']) data2 = data2.interpolate(method='linear', axis=0, limit_direction='both', @@ -796,9 +796,9 @@ def split_workout(r, parent, splitsecond, splitmode): data2.fillna(method='bfill', inplace=True) # Some new stuff to try out - data2 = data2.groupby('time', axis=0).mean() - data2['time'] = data2.index - data2.reset_index(drop=True, inplace=True) + #data2 = data2.groupby('time', axis=0).mean() + #data2['time'] = data2.index + #data2.reset_index(drop=True, inplace=True) data1['pace'] = data1['pace'] / 1000. data2['pace'] = data2['pace'] / 1000. diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 1d439969..74d82a9b 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -1480,7 +1480,7 @@ def datafusion(id1, id2, columns, offset): 'fpace', 'workoutid', 'id'], - 1, errors='ignore') + axis=1, errors='ignore') # Add coordinates to DataFrame latitude, longitude = get_latlon(id1) @@ -1503,7 +1503,7 @@ def datafusion(id1, id2, columns, offset): for c in df1.columns: if c not in keep1: - df1 = df1.drop(c, 1, errors='ignore') + df1 = df1.drop(c, axis=1, errors='ignore') df = pd.concat([df1, df2], ignore_index=True) df = df.sort_values(['time']) @@ -1512,9 +1512,9 @@ def datafusion(id1, id2, columns, offset): df.fillna(method='bfill', inplace=True) # Some new stuff to try out - df = df.groupby('time', axis=0).mean() - df['time'] = df.index - df.reset_index(drop=True, inplace=True) + #df = df.groupby('time',axis=0).mean() + #df['time'] = df.index + #df.reset_index(drop=True, inplace=True) df['time'] = df['time'] / 1000. df['pace'] = df['pace'] / 1000. diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 91bb53b1..c8da52f2 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4655,7 +4655,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}): ]) hover.mode = 'mouse' - hover.names = ["spm", "pace"] + # hover.name = ["spm", "pace"] script, div = components(plot) diff --git a/rowers/scoring.py b/rowers/scoring.py index ab692240..678f3a62 100644 --- a/rowers/scoring.py +++ b/rowers/scoring.py @@ -137,6 +137,8 @@ def save_scoring(name, user, filename, id=0, notes=""): adaptiveclass = 'None' except KeyError: # pragma: no cover adaptiveclass = 'None' + except AttributeError: + adaptiveclass = 'None' try: skillclass = row['SkillClass'] diff --git a/rowers/tasks.py b/rowers/tasks.py index fa27043c..99ab4353 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3691,12 +3691,13 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, newc2id = workout.uploadedtoc2 parkedids = [] - with open('c2blocked.json', 'r') as c2blocked: + with open('c2blocked.json', 'a+') as c2blocked: try: jsondata = json.load(c2blocked) parkedids = jsondata['ids'] except JSONDecodeError: # pragma: no cover parkedids = [] + newparkedids = [id for id in parkedids if id != newc2id] with open('c2blocked.json', 'wt') as c2blocked: diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 4d0a992ce943143fa3defe13b65bf38115b24992..d34d12c1e78589ea84a4c24a8b4484e1b80cd5f5 100644 GIT binary patch literal 3999 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 F0RTcDI&%O3 literal 4000 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 GfB^u#j6oOx diff --git a/templates/newbase.html b/templates/newbase.html index 1771e66e..b2c32821 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -12,8 +12,6 @@ {% block title %}Rowsandall Rowing Data Analytics{% endblock %} {% analytical_head_top %} - - From eb969b94091cad040d95b778839fce5f02d2306c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 5 Jun 2023 19:12:55 +0200 Subject: [PATCH 5/5] fixing more tests --- rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index d34d12c1e78589ea84a4c24a8b4484e1b80cd5f5..6fc8fb8843cf74b331ce9a370a75dc5a96ce510b 100644 GIT binary patch literal 4001 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 F0RTcDI&%O3