diff --git a/rowers/migrations/0001_initial.py b/rowers/migrations/0001_initial.py
index c5a586e6..cafdab70 100644
--- a/rowers/migrations/0001_initial.py
+++ b/rowers/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2 on 2019-04-14 15:15
+# Generated by Django 2.1.7 on 2019-04-24 20:56
import datetime
from django.conf import settings
@@ -19,6 +19,20 @@ class Migration(migrations.Migration):
]
operations = [
+ migrations.CreateModel(
+ name='C2WorldClassAgePerformance',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)),
+ ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)),
+ ('age', models.IntegerField(default=19, verbose_name='Age')),
+ ('distance', models.IntegerField(default=2000)),
+ ('name', models.CharField(blank=True, max_length=200)),
+ ('duration', models.FloatField(blank=True, default=1)),
+ ('season', models.IntegerField(default=2013)),
+ ('power', models.IntegerField(default=200)),
+ ],
+ ),
migrations.CreateModel(
name='CalcAgePerformance',
fields=[
@@ -40,6 +54,83 @@ class Migration(migrations.Migration):
('name', models.CharField(blank=True, default='group', max_length=30, null=True)),
],
),
+ migrations.CreateModel(
+ name='CoachOffer',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('issuedate', models.DateField(default=rowers.models.current_day)),
+ ('code', models.CharField(max_length=150, unique=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CoachRequest',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('issuedate', models.DateField(default=rowers.models.current_day)),
+ ('code', models.CharField(max_length=150, unique=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CourseTestResult',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('userid', models.IntegerField(default=0)),
+ ('workoutid', models.IntegerField(null=True)),
+ ('duration', models.TimeField(default=datetime.time(1, 0))),
+ ('distance', models.IntegerField(default=0)),
+ ('coursecompleted', models.BooleanField(default=False)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='cpdata',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('delta', models.IntegerField(default=0)),
+ ('cp', models.FloatField(default=0)),
+ ('user', models.IntegerField(default=0)),
+ ],
+ options={
+ 'db_table': 'cpdata',
+ },
+ ),
+ migrations.CreateModel(
+ name='cpergdata',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('delta', models.IntegerField(default=0)),
+ ('cp', models.FloatField(default=0)),
+ ('user', models.IntegerField(default=0)),
+ ],
+ options={
+ 'db_table': 'cpergdata',
+ },
+ ),
+ migrations.CreateModel(
+ name='ergcpdata',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('delta', models.IntegerField(default=0)),
+ ('cp', models.FloatField(default=0)),
+ ('distance', models.FloatField(default=0)),
+ ('user', models.IntegerField(default=0)),
+ ],
+ options={
+ 'db_table': 'ergcpdata',
+ },
+ ),
+ migrations.CreateModel(
+ name='FavoriteChart',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')),
+ ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')),
+ ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')),
+ ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')),
+ ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')),
+ ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')),
+ ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')),
+ ],
+ ),
migrations.CreateModel(
name='GeoCourse',
fields=[
@@ -50,6 +141,53 @@ class Migration(migrations.Migration):
('notes', models.CharField(blank=True, max_length=200, verbose_name='Course Notes')),
],
),
+ migrations.CreateModel(
+ name='GeoPoint',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('latitude', models.FloatField(default=0)),
+ ('longitude', models.FloatField(default=0)),
+ ('order_in_poly', models.IntegerField(default=0)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='GeoPolygon',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('order_in_course', models.IntegerField(default=0)),
+ ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoCourse')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='GraphImage',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('filename', models.CharField(blank=True, default='', max_length=150, null=True)),
+ ('creationdatetime', models.DateTimeField()),
+ ('width', models.IntegerField(default=1200)),
+ ('height', models.IntegerField(default=600)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='IndoorVirtualRaceResult',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('userid', models.IntegerField(default=0)),
+ ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')),
+ ('username', models.CharField(max_length=150)),
+ ('workoutid', models.IntegerField(null=True)),
+ ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')),
+ ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')),
+ ('duration', models.TimeField(default=datetime.time(1, 0))),
+ ('distance', models.IntegerField(default=0)),
+ ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')),
+ ('coursecompleted', models.BooleanField(default=False)),
+ ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')),
+ ('age', models.IntegerField(null=True)),
+ ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')),
+ ],
+ ),
migrations.CreateModel(
name='PaidPlan',
fields=[
@@ -81,8 +219,43 @@ class Migration(migrations.Migration):
('verification', models.CharField(choices=[('none', 'None'), ('automatic', 'Automatic'), ('manual', 'Manual')], default='none', max_length=150)),
('sessionmode', models.CharField(choices=[('distance', 'Distance'), ('time', 'Time'), ('rScore', 'rScore'), ('TRIMP', 'TRIMP')], default='time', max_length=150, verbose_name='Session Mode')),
('hasranking', models.BooleanField(default=False)),
- ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course')),
- ('manager', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='PlannedSessionComment',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('comment', models.TextField(max_length=300)),
+ ('created', models.DateTimeField(default=django.utils.timezone.now)),
+ ('read', models.BooleanField(default=False)),
+ ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='PowerTimeFitnessMetric',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('date', models.DateField(default=rowers.models.current_day)),
+ ('last_workout', models.IntegerField(default=0)),
+ ('PowerFourMin', models.FloatField(default=0)),
+ ('PowerTwoK', models.FloatField(default=0)),
+ ('PowerOneHour', models.FloatField(default=0)),
+ ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=40)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'db_table': 'powertimefitnessmetric',
+ },
+ ),
+ migrations.CreateModel(
+ name='RaceLogo',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('filename', models.CharField(default='', max_length=150)),
+ ('creationdatetime', models.DateTimeField()),
+ ('width', models.IntegerField(default=1200)),
+ ('height', models.IntegerField(default=600)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
@@ -192,213 +365,6 @@ class Migration(migrations.Migration):
('dotweet', models.BooleanField(default=False)),
],
),
- migrations.CreateModel(
- name='Team',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')),
- ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')),
- ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')),
- ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')),
- ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.CreateModel(
- name='TrainingMacroCycle',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('startdate', models.DateField(default=rowers.models.current_day)),
- ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
- ('notes', models.TextField(blank=True, max_length=300)),
- ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
- ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
- ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
- ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
- ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
- ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
- ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
- ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
- ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
- ],
- ),
- migrations.CreateModel(
- name='TrainingMesoCycle',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('startdate', models.DateField(default=rowers.models.current_day)),
- ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
- ('notes', models.TextField(blank=True, max_length=300)),
- ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
- ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
- ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
- ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
- ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
- ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
- ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
- ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
- ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
- ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')),
- ],
- ),
- migrations.CreateModel(
- name='Workout',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150, null=True)),
- ('date', models.DateField()),
- ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bike', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')),
- ('workoutsource', models.CharField(default='unknown', max_length=100)),
- ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')),
- ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')),
- ('starttime', models.TimeField(blank=True, null=True)),
- ('startdatetime', models.DateTimeField(blank=True, null=True)),
- ('timezone', models.CharField(default='UTC', max_length=100)),
- ('distance', models.IntegerField(blank=True, default=0)),
- ('duration', models.TimeField(blank=True, default=1)),
- ('dragfactor', models.IntegerField(blank=True, default=0)),
- ('trimp', models.IntegerField(blank=True, default=-1)),
- ('rscore', models.IntegerField(blank=True, default=-1)),
- ('hrtss', models.IntegerField(blank=True, default=-1)),
- ('normp', models.IntegerField(blank=True, default=-1)),
- ('normv', models.FloatField(blank=True, default=-1)),
- ('normw', models.FloatField(blank=True, default=-1)),
- ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')),
- ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')),
- ('csvfilename', models.CharField(blank=True, max_length=150)),
- ('uploadedtoc2', models.IntegerField(default=0)),
- ('averagehr', models.IntegerField(blank=True, null=True)),
- ('maxhr', models.BigIntegerField(blank=True, null=True)),
- ('uploadedtostrava', models.BigIntegerField(default=0)),
- ('uploadedtosporttracks', models.BigIntegerField(default=0)),
- ('uploadedtounderarmour', models.BigIntegerField(default=0)),
- ('uploadedtotp', models.BigIntegerField(default=0)),
- ('uploadedtorunkeeper', models.BigIntegerField(default=0)),
- ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)),
- ('inboard', models.FloatField(default=0.88)),
- ('oarlength', models.FloatField(default=2.89)),
- ('notes', models.CharField(blank=True, max_length=1000, null=True)),
- ('summary', models.TextField(blank=True)),
- ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)),
- ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')),
- ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')),
- ('plannedsession', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session')),
- ('team', models.ManyToManyField(blank=True, to='rowers.Team')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')),
- ],
- ),
- migrations.CreateModel(
- name='VirtualRace',
- fields=[
- ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')),
- ('registration_form', models.CharField(choices=[('windowstart', 'Start of Race Window'), ('windowend', 'End of Race Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')),
- ('registration_closure', models.DateTimeField(blank=True, null=True)),
- ('evaluation_closure', models.DateTimeField(blank=True, null=True)),
- ('start_time', models.TimeField(blank=True, null=True)),
- ('end_time', models.TimeField(blank=True, null=True)),
- ('country', models.CharField(blank=True, max_length=100)),
- ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)),
- ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])),
- ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])),
- ],
- bases=('rowers.plannedsession',),
- ),
- migrations.CreateModel(
- name='WorkoutComment',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('comment', models.TextField(max_length=300)),
- ('created', models.DateTimeField(default=django.utils.timezone.now)),
- ('read', models.BooleanField(default=False)),
- ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
- ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')),
- ],
- ),
- migrations.CreateModel(
- name='TrainingTarget',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('date', models.DateField(default=rowers.models.half_year_from_now)),
- ('notes', models.TextField(blank=True, max_length=300)),
- ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')),
- ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')),
- ],
- ),
- migrations.CreateModel(
- name='TrainingPlan',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('status', models.BooleanField(default=True, verbose_name='Active')),
- ('startdate', models.DateField(default=rowers.models.current_day)),
- ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
- ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')),
- ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')),
- ('target', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget')),
- ],
- ),
- migrations.CreateModel(
- name='TrainingMicroCycle',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('startdate', models.DateField(default=rowers.models.current_day)),
- ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
- ('notes', models.TextField(blank=True, max_length=300)),
- ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
- ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
- ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
- ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
- ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
- ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
- ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
- ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
- ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
- ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')),
- ],
- ),
- migrations.AddField(
- model_name='trainingmacrocycle',
- name='plan',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'),
- ),
- migrations.CreateModel(
- name='TombStone',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('uploadedtoc2', models.IntegerField(default=0)),
- ('uploadedtostrava', models.BigIntegerField(default=0)),
- ('uploadedtosporttracks', models.BigIntegerField(default=0)),
- ('uploadedtounderarmour', models.BigIntegerField(default=0)),
- ('uploadedtotp', models.BigIntegerField(default=0)),
- ('uploadedtorunkeeper', models.BigIntegerField(default=0)),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')),
- ],
- ),
- migrations.CreateModel(
- name='TeamRequest',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('issuedate', models.DateField(default=rowers.models.current_day)),
- ('code', models.CharField(max_length=150, unique=True)),
- ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')),
- ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.CreateModel(
- name='TeamInvite',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('issuedate', models.DateField(default=rowers.models.current_day)),
- ('code', models.CharField(max_length=150, unique=True)),
- ('email', models.CharField(blank=True, max_length=150, null=True)),
- ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')),
- ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
migrations.CreateModel(
name='StrokeData',
fields=[
@@ -447,194 +413,134 @@ class Migration(migrations.Migration):
],
options={
'db_table': 'strokedata',
- 'index_together': {('workoutid',)},
- },
- ),
- migrations.AddField(
- model_name='rower',
- name='team',
- field=models.ManyToManyField(blank=True, to='rowers.Team'),
- ),
- migrations.AddField(
- model_name='rower',
- name='user',
- field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
- ),
- migrations.CreateModel(
- name='PowerTimeFitnessMetric',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('date', models.DateField(default=rowers.models.current_day)),
- ('last_workout', models.IntegerField(default=0)),
- ('PowerFourMin', models.FloatField(default=0)),
- ('PowerTwoK', models.FloatField(default=0)),
- ('PowerOneHour', models.FloatField(default=0)),
- ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=40)),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- options={
- 'db_table': 'powertimefitnessmetric',
},
),
migrations.CreateModel(
- name='PlannedSessionComment',
+ name='Team',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('comment', models.TextField(max_length=300)),
- ('created', models.DateTimeField(default=django.utils.timezone.now)),
- ('read', models.BooleanField(default=False)),
- ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')),
- ('plannedsession', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.AddField(
- model_name='plannedsession',
- name='rower',
- field=models.ManyToManyField(blank=True, to='rowers.Rower'),
- ),
- migrations.AddField(
- model_name='plannedsession',
- name='team',
- field=models.ManyToManyField(blank=True, to='rowers.Team'),
- ),
- migrations.CreateModel(
- name='GraphImage',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('filename', models.CharField(blank=True, default='', max_length=150, null=True)),
- ('creationdatetime', models.DateTimeField()),
- ('width', models.IntegerField(default=1200)),
- ('height', models.IntegerField(default=600)),
- ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')),
+ ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')),
+ ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')),
+ ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')),
+ ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')),
+ ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
- name='GeoPolygon',
+ name='TeamInvite',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(blank=True, max_length=150)),
- ('order_in_course', models.IntegerField(default=0)),
- ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoCourse')),
+ ('issuedate', models.DateField(default=rowers.models.current_day)),
+ ('code', models.CharField(max_length=150, unique=True)),
+ ('email', models.CharField(blank=True, max_length=150, null=True)),
+ ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')),
+ ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
- name='GeoPoint',
+ name='TeamRequest',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('latitude', models.FloatField(default=0)),
- ('longitude', models.FloatField(default=0)),
- ('order_in_poly', models.IntegerField(default=0)),
- ('polygon', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoPolygon')),
+ ('issuedate', models.DateField(default=rowers.models.current_day)),
+ ('code', models.CharField(max_length=150, unique=True)),
+ ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')),
+ ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
- migrations.AddField(
- model_name='geocourse',
- name='manager',
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'),
- ),
migrations.CreateModel(
- name='FavoriteChart',
+ name='TombStone',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')),
- ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')),
- ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distance', 'Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')),
- ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')),
- ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')),
- ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')),
- ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')),
+ ('uploadedtoc2', models.IntegerField(default=0)),
+ ('uploadedtostrava', models.BigIntegerField(default=0)),
+ ('uploadedtosporttracks', models.BigIntegerField(default=0)),
+ ('uploadedtounderarmour', models.BigIntegerField(default=0)),
+ ('uploadedtotp', models.BigIntegerField(default=0)),
+ ('uploadedtorunkeeper', models.BigIntegerField(default=0)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')),
],
),
migrations.CreateModel(
- name='ergcpdata',
+ name='TrainingMacroCycle',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('delta', models.IntegerField(default=0)),
- ('cp', models.FloatField(default=0)),
- ('distance', models.FloatField(default=0)),
- ('user', models.IntegerField(default=0)),
- ],
- options={
- 'db_table': 'ergcpdata',
- 'index_together': {('user',)},
- },
- ),
- migrations.CreateModel(
- name='cpergdata',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('delta', models.IntegerField(default=0)),
- ('cp', models.FloatField(default=0)),
- ('user', models.IntegerField(default=0)),
- ],
- options={
- 'db_table': 'cpergdata',
- 'index_together': {('user',)},
- },
- ),
- migrations.CreateModel(
- name='cpdata',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('delta', models.IntegerField(default=0)),
- ('cp', models.FloatField(default=0)),
- ('user', models.IntegerField(default=0)),
- ],
- options={
- 'db_table': 'cpdata',
- 'index_together': {('user',)},
- },
- ),
- migrations.CreateModel(
- name='CourseTestResult',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('userid', models.IntegerField(default=0)),
- ('workoutid', models.IntegerField(null=True)),
- ('duration', models.TimeField(default=datetime.time(1, 0))),
- ('distance', models.IntegerField(default=0)),
- ('coursecompleted', models.BooleanField(default=False)),
- ('plannedsession', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession')),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('startdate', models.DateField(default=rowers.models.current_day)),
+ ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
+ ('notes', models.TextField(blank=True, max_length=300)),
+ ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
+ ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
+ ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
+ ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
+ ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
+ ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
+ ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
+ ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
+ ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
],
),
migrations.CreateModel(
- name='CoachRequest',
+ name='TrainingMesoCycle',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('issuedate', models.DateField(default=rowers.models.current_day)),
- ('code', models.CharField(max_length=150, unique=True)),
- ('coach', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')),
- ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('startdate', models.DateField(default=rowers.models.current_day)),
+ ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
+ ('notes', models.TextField(blank=True, max_length=300)),
+ ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
+ ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
+ ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
+ ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
+ ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
+ ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
+ ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
+ ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
+ ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
+ ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')),
],
),
migrations.CreateModel(
- name='CoachOffer',
+ name='TrainingMicroCycle',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('issuedate', models.DateField(default=rowers.models.current_day)),
- ('code', models.CharField(max_length=150, unique=True)),
- ('coach', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')),
- ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('startdate', models.DateField(default=rowers.models.current_day)),
+ ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
+ ('notes', models.TextField(blank=True, max_length=300)),
+ ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)),
+ ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')),
+ ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')),
+ ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')),
+ ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')),
+ ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')),
+ ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')),
+ ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')),
+ ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')),
+ ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')),
],
),
migrations.CreateModel(
- name='C2WorldClassAgePerformance',
+ name='TrainingPlan',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)),
- ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)),
- ('age', models.IntegerField(default=19, verbose_name='Age')),
- ('distance', models.IntegerField(default=2000)),
- ('name', models.CharField(blank=True, max_length=200)),
- ('duration', models.FloatField(blank=True, default=1)),
- ('season', models.IntegerField(default=2013)),
- ('power', models.IntegerField(default=200)),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('status', models.BooleanField(default=True, verbose_name='Active')),
+ ('startdate', models.DateField(default=rowers.models.current_day)),
+ ('enddate', models.DateField(default=rowers.models.half_year_from_now)),
+ ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')),
+ ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TrainingTarget',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(blank=True, max_length=150)),
+ ('date', models.DateField(default=rowers.models.half_year_from_now)),
+ ('notes', models.TextField(blank=True, max_length=300)),
+ ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')),
+ ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')),
],
- options={
- 'unique_together': {('age', 'sex', 'weightcategory', 'distance')},
- },
),
migrations.CreateModel(
name='VirtualRaceResult',
@@ -654,39 +560,222 @@ class Migration(migrations.Migration):
('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')),
('age', models.IntegerField(null=True)),
('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')),
- ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace')),
],
),
migrations.CreateModel(
- name='RaceLogo',
+ name='Workout',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('filename', models.CharField(default='', max_length=150)),
- ('creationdatetime', models.DateTimeField()),
- ('width', models.IntegerField(default=1200)),
- ('height', models.IntegerField(default=600)),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
- ('race', models.ManyToManyField(related_name='logos', to='rowers.VirtualRace')),
- ],
- ),
- migrations.CreateModel(
- name='IndoorVirtualRaceResult',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('userid', models.IntegerField(default=0)),
- ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')),
- ('username', models.CharField(max_length=150)),
- ('workoutid', models.IntegerField(null=True)),
+ ('name', models.CharField(blank=True, max_length=150, null=True)),
+ ('date', models.DateField()),
+ ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bike', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')),
+ ('workoutsource', models.CharField(default='unknown', max_length=100)),
+ ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')),
+ ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')),
+ ('starttime', models.TimeField(blank=True, null=True)),
+ ('startdatetime', models.DateTimeField(blank=True, null=True)),
+ ('timezone', models.CharField(default='UTC', max_length=100)),
+ ('distance', models.IntegerField(blank=True, default=0)),
+ ('duration', models.TimeField(blank=True, default=1)),
+ ('dragfactor', models.IntegerField(blank=True, default=0)),
+ ('trimp', models.IntegerField(blank=True, default=-1)),
+ ('rscore', models.IntegerField(blank=True, default=-1)),
+ ('hrtss', models.IntegerField(blank=True, default=-1)),
+ ('normp', models.IntegerField(blank=True, default=-1)),
+ ('normv', models.FloatField(blank=True, default=-1)),
+ ('normw', models.FloatField(blank=True, default=-1)),
('weightcategory', models.CharField(choices=[('hwt', 'heavy-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')),
- ('adaptiveclass', models.CharField(choices=[('None', 'None'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')),
- ('duration', models.TimeField(default=datetime.time(1, 0))),
- ('distance', models.IntegerField(default=0)),
- ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')),
- ('coursecompleted', models.BooleanField(default=False)),
- ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')),
- ('age', models.IntegerField(null=True)),
- ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive race notifications by email')),
- ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace')),
+ ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')),
+ ('csvfilename', models.CharField(blank=True, max_length=150)),
+ ('uploadedtoc2', models.IntegerField(default=0)),
+ ('averagehr', models.IntegerField(blank=True, null=True)),
+ ('maxhr', models.BigIntegerField(blank=True, null=True)),
+ ('uploadedtostrava', models.BigIntegerField(default=0)),
+ ('uploadedtosporttracks', models.BigIntegerField(default=0)),
+ ('uploadedtounderarmour', models.BigIntegerField(default=0)),
+ ('uploadedtotp', models.BigIntegerField(default=0)),
+ ('uploadedtorunkeeper', models.BigIntegerField(default=0)),
+ ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)),
+ ('inboard', models.FloatField(default=0.88)),
+ ('oarlength', models.FloatField(default=2.89)),
+ ('notes', models.CharField(blank=True, max_length=1000, null=True)),
+ ('summary', models.TextField(blank=True)),
+ ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)),
+ ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')),
+ ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')),
],
),
+ migrations.CreateModel(
+ name='WorkoutComment',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('comment', models.TextField(max_length=300)),
+ ('created', models.DateTimeField(default=django.utils.timezone.now)),
+ ('read', models.BooleanField(default=False)),
+ ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
+ ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='VirtualRace',
+ fields=[
+ ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')),
+ ('registration_form', models.CharField(choices=[('windowstart', 'Start of Race Window'), ('windowend', 'End of Race Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')),
+ ('registration_closure', models.DateTimeField(blank=True, null=True)),
+ ('evaluation_closure', models.DateTimeField(blank=True, null=True)),
+ ('start_time', models.TimeField(blank=True, null=True)),
+ ('end_time', models.TimeField(blank=True, null=True)),
+ ('country', models.CharField(blank=True, max_length=100)),
+ ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)),
+ ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])),
+ ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])),
+ ],
+ bases=('rowers.plannedsession',),
+ ),
+ migrations.AddField(
+ model_name='workout',
+ name='plannedsession',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session'),
+ ),
+ migrations.AddField(
+ model_name='workout',
+ name='team',
+ field=models.ManyToManyField(blank=True, to='rowers.Team'),
+ ),
+ migrations.AddField(
+ model_name='workout',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'),
+ ),
+ migrations.AddField(
+ model_name='trainingplan',
+ name='target',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget'),
+ ),
+ migrations.AddField(
+ model_name='trainingmacrocycle',
+ name='plan',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'),
+ ),
+ migrations.AlterIndexTogether(
+ name='strokedata',
+ index_together={('workoutid',)},
+ ),
+ migrations.AddField(
+ model_name='rower',
+ name='team',
+ field=models.ManyToManyField(blank=True, to='rowers.Team'),
+ ),
+ migrations.AddField(
+ model_name='rower',
+ name='user',
+ field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='plannedsessioncomment',
+ name='plannedsession',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'),
+ ),
+ migrations.AddField(
+ model_name='plannedsessioncomment',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='plannedsession',
+ name='course',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course'),
+ ),
+ migrations.AddField(
+ model_name='plannedsession',
+ name='manager',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='plannedsession',
+ name='rower',
+ field=models.ManyToManyField(blank=True, to='rowers.Rower'),
+ ),
+ migrations.AddField(
+ model_name='plannedsession',
+ name='team',
+ field=models.ManyToManyField(blank=True, to='rowers.Team'),
+ ),
+ migrations.AddField(
+ model_name='graphimage',
+ name='workout',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'),
+ ),
+ migrations.AddField(
+ model_name='geopoint',
+ name='polygon',
+ field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='rowers.GeoPolygon'),
+ ),
+ migrations.AddField(
+ model_name='geocourse',
+ name='manager',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'),
+ ),
+ migrations.AddField(
+ model_name='favoritechart',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'),
+ ),
+ migrations.AlterIndexTogether(
+ name='ergcpdata',
+ index_together={('user',)},
+ ),
+ migrations.AlterIndexTogether(
+ name='cpergdata',
+ index_together={('user',)},
+ ),
+ migrations.AlterIndexTogether(
+ name='cpdata',
+ index_together={('user',)},
+ ),
+ migrations.AddField(
+ model_name='coursetestresult',
+ name='plannedsession',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'),
+ ),
+ migrations.AddField(
+ model_name='coachrequest',
+ name='coach',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'),
+ ),
+ migrations.AddField(
+ model_name='coachrequest',
+ name='user',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AddField(
+ model_name='coachoffer',
+ name='coach',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'),
+ ),
+ migrations.AddField(
+ model_name='coachoffer',
+ name='user',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AlterUniqueTogether(
+ name='c2worldclassageperformance',
+ unique_together={('age', 'sex', 'weightcategory', 'distance')},
+ ),
+ migrations.AddField(
+ model_name='virtualraceresult',
+ name='race',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'),
+ ),
+ migrations.AddField(
+ model_name='racelogo',
+ name='race',
+ field=models.ManyToManyField(related_name='logos', to='rowers.VirtualRace'),
+ ),
+ migrations.AddField(
+ model_name='indoorvirtualraceresult',
+ name='race',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'),
+ ),
]
diff --git a/rowers/templates/subscription_create_email.html b/rowers/templates/subscription_create_email.html
index 63c70e90..0b61e01b 100644
--- a/rowers/templates/subscription_create_email.html
+++ b/rowers/templates/subscription_create_email.html
@@ -15,10 +15,7 @@
- The subscription will keep running until you change or stop it. At any point in time you
- can change the automatically renewing subscription to a "one year only" subscription through
- the upgrade page. On this page, you can also
- upgrade your subscription.
+ The subscription will keep running until you change or stop it.
{% else %}
diff --git a/rowers/templates/workout_delete_confirm.html b/rowers/templates/workout_delete_confirm.html
index b54141d2..348de945 100644
--- a/rowers/templates/workout_delete_confirm.html
+++ b/rowers/templates/workout_delete_confirm.html
@@ -28,7 +28,7 @@