diff --git a/.gitignore b/.gitignore index f9c7abf4..7f7af7f0 100644 --- a/.gitignore +++ b/.gitignore @@ -67,4 +67,6 @@ config.yaml /venv39/ /py27/ /py2/ +/py38/ +/py39/ /django2/ diff --git a/boatmovers/apps.py b/boatmovers/apps.py index eb3806d9..9e5fbbb2 100644 --- a/boatmovers/apps.py +++ b/boatmovers/apps.py @@ -1,6 +1,9 @@ from django.apps import AppConfig +import os +from django.conf import settings class BoatmoversConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'boatmovers' + path = os.path.join(settings.BASE_DIR, 'boatmovers') diff --git a/boatmovers/migrations/0001_initial.py b/boatmovers/migrations/0001_initial.py deleted file mode 100644 index f9b5cbb7..00000000 --- a/boatmovers/migrations/0001_initial.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:41 - -import boatmovers.models -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Athlete', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=200)), - ('last_name', models.CharField(max_length=200)), - ('club', models.CharField(max_length=200)), - ('trueskill_mu', models.FloatField(default=25.0)), - ('trueskill_sigma', models.FloatField(default=8.333)), - ('birth_year', models.IntegerField(default=1972)), - ], - ), - migrations.CreateModel( - name='Crew', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('athletes', models.ManyToManyField(to='boatmovers.Athlete')), - ], - ), - migrations.CreateModel( - name='Race', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=boatmovers.models.current_day)), - ('crew_size', models.IntegerField(default=1)), - ], - ), - migrations.CreateModel( - name='Result', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField()), - ('crew', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.crew')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.race')), - ], - ), - migrations.AddField( - model_name='race', - name='resultlist', - field=models.ManyToManyField(through='boatmovers.Result', to='boatmovers.Crew'), - ), - ] diff --git a/boatmovers/migrations/0002_alter_athlete_unique_together.py b/boatmovers/migrations/0002_alter_athlete_unique_together.py deleted file mode 100644 index 7572d257..00000000 --- a/boatmovers/migrations/0002_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:49 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0001_initial'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year')}, - ), - ] diff --git a/boatmovers/migrations/0003_auto_20220622_1753.py b/boatmovers/migrations/0003_auto_20220622_1753.py deleted file mode 100644 index bc367b79..00000000 --- a/boatmovers/migrations/0003_auto_20220622_1753.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0002_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='name', - field=models.CharField(default='Race1', max_length=200), - preserve_default=False, - ), - migrations.AddField( - model_name='race', - name='resulturl', - field=models.URLField(null=True), - ), - migrations.AlterUniqueTogether( - name='race', - unique_together={('date', 'name')}, - ), - ] diff --git a/boatmovers/migrations/0004_auto_20220622_1835.py b/boatmovers/migrations/0004_auto_20220622_1835.py deleted file mode 100644 index 94691a93..00000000 --- a/boatmovers/migrations/0004_auto_20220622_1835.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0003_auto_20220622_1753'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='verified', - field=models.BooleanField(default=False), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'race', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0005_athlete_gender.py b/boatmovers/migrations/0005_athlete_gender.py deleted file mode 100644 index 41de5e0a..00000000 --- a/boatmovers/migrations/0005_athlete_gender.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0004_auto_20220622_1835'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/0006_auto_20220624_0811.py b/boatmovers/migrations/0006_auto_20220624_0811.py deleted file mode 100644 index 6b234db8..00000000 --- a/boatmovers/migrations/0006_auto_20220624_0811.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0005_athlete_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='trueskill_exposed', - field=models.FloatField(default=0), - ), - migrations.AlterField( - model_name='athlete', - name='trueskill_sigma', - field=models.FloatField(default=8.333333333333334), - ), - ] diff --git a/boatmovers/migrations/0007_auto_20220624_0820.py b/boatmovers/migrations/0007_auto_20220624_0820.py deleted file mode 100644 index 4c4355fa..00000000 --- a/boatmovers/migrations/0007_auto_20220624_0820.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0006_auto_20220624_0811'), - ] - - operations = [ - migrations.AlterField( - model_name='result', - name='crew', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.crew'), - ), - migrations.AlterField( - model_name='result', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.race'), - ), - ] diff --git a/boatmovers/migrations/0008_auto_20220624_1135.py b/boatmovers/migrations/0008_auto_20220624_1135.py deleted file mode 100644 index d5492e47..00000000 --- a/boatmovers/migrations/0008_auto_20220624_1135.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 11:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0007_auto_20220624_0820'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='processed', - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0009_alter_race_crew_size.py b/boatmovers/migrations/0009_alter_race_crew_size.py deleted file mode 100644 index 4207ae30..00000000 --- a/boatmovers/migrations/0009_alter_race_crew_size.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0008_auto_20220624_1135'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(choices=[(1, 1), (2, 2), (4, 4), (8, 8)], default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0010_remove_race_resultlist.py b/boatmovers/migrations/0010_remove_race_resultlist.py deleted file mode 100644 index e6d9403e..00000000 --- a/boatmovers/migrations/0010_remove_race_resultlist.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:50 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0009_alter_race_crew_size'), - ] - - operations = [ - migrations.RemoveField( - model_name='race', - name='resultlist', - ), - ] diff --git a/boatmovers/migrations/0011_alter_race_processed.py b/boatmovers/migrations/0011_alter_race_processed.py deleted file mode 100644 index f8b81cb7..00000000 --- a/boatmovers/migrations/0011_alter_race_processed.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0010_remove_race_resultlist'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='processed', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0012_auto_20220625_1328.py b/boatmovers/migrations/0012_auto_20220625_1328.py deleted file mode 100644 index 9a0b5552..00000000 --- a/boatmovers/migrations/0012_auto_20220625_1328.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:28 - -import boatmovers.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0011_alter_race_processed'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='crews', to='boatmovers.Athlete'), - ), - migrations.AlterField( - model_name='race', - name='date', - field=models.DateField(default=boatmovers.models.current_day, verbose_name='Race Date'), - ), - migrations.AlterField( - model_name='race', - name='resulturl', - field=models.URLField(null=True, verbose_name='URL Link to results'), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0013_alter_crew_athletes.py b/boatmovers/migrations/0013_alter_crew_athletes.py deleted file mode 100644 index 8f9634c4..00000000 --- a/boatmovers/migrations/0013_alter_crew_athletes.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0012_auto_20220625_1328'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='athlete_crews', to='boatmovers.Athlete'), - ), - ] diff --git a/boatmovers/migrations/0014_athlete_dummy.py b/boatmovers/migrations/0014_athlete_dummy.py deleted file mode 100644 index f3aec5e7..00000000 --- a/boatmovers/migrations/0014_athlete_dummy.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 15:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0013_alter_crew_athletes'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='dummy', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0015_alter_athlete_unique_together.py b/boatmovers/migrations/0015_alter_athlete_unique_together.py deleted file mode 100644 index ee5e6ac1..00000000 --- a/boatmovers/migrations/0015_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 17:44 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0014_athlete_dummy'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year', 'gender')}, - ), - ] diff --git a/boatmovers/migrations/0016_race_gender.py b/boatmovers/migrations/0016_race_gender.py deleted file mode 100644 index ffedd044..00000000 --- a/boatmovers/migrations/0016_race_gender.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 18:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0015_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - ), - ] diff --git a/boatmovers/migrations/0017_athlete_full_name.py b/boatmovers/migrations/0017_athlete_full_name.py deleted file mode 100644 index f3056eb9..00000000 --- a/boatmovers/migrations/0017_athlete_full_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-07-08 12:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0016_race_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='full_name', - field=models.CharField(default=' ', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/__init__.py b/boatmovers/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/django_extensions/apps.py b/django_extensions/apps.py new file mode 100644 index 00000000..88077107 --- /dev/null +++ b/django_extensions/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +import os +from django.conf import settings + + +class DjangoExtensionsConfig(AppConfig): + name = 'django_extensions' + path = os.path.join(settings.BASE_DIR, 'django_extensions') diff --git a/requirements38.txt b/requirements38.txt new file mode 100644 index 00000000..a4964748 --- /dev/null +++ b/requirements38.txt @@ -0,0 +1,413 @@ +amqp==5.0.7 +anyio==3.4.0 +apipkg==1.5 +appdirs==1.4.3 +arcgis==1.6.0 +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +arrow==1.0.2 +asgiref==3.4.1 +asn1crypto==0.24.0 +<<<<<<< HEAD +atomicwrites==1.3.0 +attrs==19.1.0 +======= +astroid==2.11.7 +async-generator==1.10 +atomicwrites==1.3.0 +attrs==21.4.0 +autopep8==1.6.0 +>>>>>>> feature/py39 +Babel==2.9.1 +backcall==0.1.0 +backports.zoneinfo==0.2.1 +beautifulsoup4==4.7.1 +billiard==3.6.4.0 +bleach==4.1.0 +bokeh==2.2.3 +boto==2.49.0 +boto3==1.17.45 +botocore==1.20.45 +bottle==0.12.23 +braintree==4.18.1 +cairocffi==1.0.2 +celery==5.2.1 +certifi==2019.3.9 +cffi==1.14.0 +chardet==3.0.4 +<<<<<<< HEAD +charset-normalizer==2.0.9 +======= +charset-normalizer==2.1.0 +>>>>>>> feature/py39 +click==8.0.3 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.2.0 +cloudpickle==1.2.2 +colorama==0.4.1 +colorclass==2.2.0 +<<<<<<< HEAD +======= +contourpy==1.0.6 +>>>>>>> feature/py39 +cookies==2.2.1 +coreapi==2.3.3 +coreschema==0.0.4 +coverage==5.5 +<<<<<<< HEAD +======= +cramjam==2.5.0 +>>>>>>> feature/py39 +cryptography==3.4.7 +cycler==0.10.0 +Cython==0.29.21 +dask==2021.12.0 +decorator==4.4.0 +defusedxml==0.5.0 +Deprecated==1.2.13 +<<<<<<< HEAD +======= +dill==0.3.5.1 +>>>>>>> feature/py39 +Django==3.2.12 +django-analytical==2.5.0 +django-async-messages==0.3.1 +django-braces==1.13.0 +django-classy-tags==0.8.0 +django-cookie-law==2.0.1 +django-cors-headers==3.10.1 +django-countries==7.2.1 +<<<<<<< HEAD +django-datetime-widget==0.9.3 +django-datetime-widget2==0.9.5 +django-debug-toolbar==2.0 +django-extensions==2.1.6 +======= +django-crispy-forms==1.14.0 +django-datetime-widget2==0.9.5 +django-debug-toolbar==2.0 +django-extensions==2.1.6 +django-filter==22.1 +>>>>>>> feature/py39 +django-htmlmin==0.11.0 +django-leaflet==0.28.2 +django-oauth-toolkit==1.2.0 +django-oauth2-provider==0.2.6.1 +django-picklefield==2.1.1 +django-redis==4.10.0 +django-rest-framework==0.1.0 +django-rest-swagger==2.2.0 +django-rq==2.5.1 +django-rq-dashboard==0.3.3 +django-ses==2.0.0 +django-shell-plus==1.1.7 +django-social-share==1.3.2 +django-taggit==1.3.0 +django-tz-detect==0.2.9 +djangorestframework==3.13.0 +docopt==0.6.2 +docutils==0.14 +dparse==0.5.1 +entrypoints==0.3 +execnet==1.5.0 +factory-boy==2.11.1 +Faker==1.0.4 +fastjsonschema==2.16.1 +<<<<<<< HEAD +fastparquet==0.5.0 +fitparse==1.2.0 +======= +fastparquet==0.8.3 +fitparse==1.2.0 +flake8==4.0.1 +>>>>>>> feature/py39 +Flask==1.0.2 +fonttools==4.28.2 +fsspec==2021.11.1 +future==0.17.1 +geocoder==1.38.1 +geoip2==3.0.0 +geos==0.2.1 +grpcio==1.26.0 +grpcio-tools==1.26.0 +gunicorn==20.0.4 +<<<<<<< HEAD +======= +h11==0.13.0 +>>>>>>> feature/py39 +holoviews==1.13.5 +html5lib==1.1 +htmlmin==0.1.12 +HTMLParser==0.0.2 +httplib2==0.20.2 +humanize==3.3.0 +hvplot==0.4.0 +icalendar==4.0.3 +idna==2.8 +image==1.5.27 +importlib-metadata==4.12.0 +importlib-resources==1.0.2 +ipykernel==5.1.0 +ipython==7.22.0 +ipython-genutils==0.2.0 +ipywidgets==7.4.2 +iso8601==0.1.12 +isodate==0.6.0 +<<<<<<< HEAD +======= +isort==5.10.1 +>>>>>>> feature/py39 +itsdangerous==1.1.0 +itypes==1.2.0 +jedi==0.18.0 +jeepney==0.6.0 +Jinja2==3.0.3 +jmespath==0.10.0 +json5==0.8.5 +jsonschema==3.0.1 +jupyter==1.0.0 +jupyter-client==6.1.7 +jupyter-console==6.2.0 +jupyter-core==4.7.0 +jupyter-server==1.13.1 +jupyterlab==3.2.5 +jupyterlab-pygments==0.2.2 +jupyterlab-server==2.9.0 +jwcrypto==1.0 +keyring==18.0.0 +kiwisolver==1.0.1 +kombu==5.2.2 +<<<<<<< HEAD +llvmlite==0.36.0 +======= +lazy-object-proxy==1.7.1 +llvmlite==0.39.1 +>>>>>>> feature/py39 +locket==0.2.1 +lxml==4.7.1 +Markdown==3.0.1 +MarkupSafe==2.0.1 +matplotlib==3.5.0 +maxminddb==1.5.4 +<<<<<<< HEAD +minify +MiniMockTest==0.5 +mistune==2.0.4 +mock==2.0.0 +more-itertools==6.0.0 +======= +mccabe==0.6.1 +MiniMockTest==0.5 +mistune==2.0.4 +mock==2.0.0 +more-itertools==8.12.0 +>>>>>>> feature/py39 +mpld3==0.3 +mysqlclient==1.4.2.post1 +nbclassic==0.3.4 +nbclient==0.6.8 +nbconvert==7.0.0 +nbformat==5.5.0 +nest-asyncio==1.5.4 +newrelic==8.1.0.180 +nose==1.3.7 +nose-parameterized==0.6.0 +notebook==6.4.6 +<<<<<<< HEAD +numba==0.53.1 +numpy==1.18.5 +======= +numba==0.56.2 +>>>>>>> feature/py39 +oauth2==1.9.0.post1 +oauth2-provider==0.0 +oauthlib==3.0.1 +openapi-codec==1.3.2 +<<<<<<< HEAD +======= +outcome==1.2.0 +>>>>>>> feature/py39 +packaging==21.3 +pandas==1.2.4 +pandocfilters==1.4.2 +panel==0.10.1 +param==1.10.0 +parameterized==0.8.1 +parso==0.8.2 +partd==1.2.0 +pathspec==0.5.9 +pbr==5.1.3 +pendulum==2.1.2 +pexpect==4.6.0 +pickleshare==0.7.5 +Pillow==8.4.0 +pip-upgrader==1.4.6 +<<<<<<< HEAD +pluggy==0.9.0 +prometheus-client==0.6.0 +prompt-toolkit==2.0.9 +protobuf==3.11.1 +======= +platformdirs==2.5.2 +pluggy==0.9.0 +ply==3.11 +prometheus-client==0.6.0 +prompt-toolkit==2.0.9 +protobuf==3.19.4 +>>>>>>> feature/py39 +psycopg2==2.8.1 +ptyprocess==0.6.0 +py==1.11.0 +pyarrow==2.0.0 +pycairo==1.19.0 +<<<<<<< HEAD +pycparser==2.19 +pyct==0.4.8 +Pygments==2.13.0 +PyJWT==2.1.0 +======= +pycodestyle==2.8.0 +pycparser==2.19 +pyct==0.4.8 +pyflakes==2.4.0 +Pygments==2.13.0 +PyJWT==2.1.0 +pylint==2.14.4 +>>>>>>> feature/py39 +pyOpenSSL==20.0.1 +pyparsing==3.0.6 +pyrsistent==0.14.11 +pyshp==2.1.0 +<<<<<<< HEAD +======= +PySocks==1.7.1 +>>>>>>> feature/py39 +pytest==4.3.1 +pytest-django==3.4.8 +pytest-forked==1.0.2 +pytest-runner==4.4 +pytest-sugar==0.9.2 +pytest-xdist==1.27.0 +python-dateutil==2.8.0 +python-memcached==1.59 +python-twitter==3.5 +pytz==2020.1 +pytzdata==2020.1 +pyviz-comms==0.7.6 +pywin32-ctypes==0.2.0 +PyYAML==6.0 +<<<<<<< HEAD +pyzmq +======= +pyzmq==18.0.1 +>>>>>>> feature/py39 +qtconsole==4.4.3 +ratelim==0.1.6 +rauth==0.7.3 +redis==3.5.3 +<<<<<<< HEAD +requests==2.23.0 +======= +requests==2.28.1 +>>>>>>> feature/py39 +requests-oauthlib==1.2.0 +rowingdata==3.5.29 +rowingphysics==0.5.0 +rq==1.10.1 +<<<<<<< HEAD +rules==3.0 +======= +ruamel.yaml==0.17.21 +ruamel.yaml.clib==0.2.6 +rules==3.3 +>>>>>>> feature/py39 +ruptures==1.1.3 +s3transfer==0.3.4 +safety==1.10.3 +scipy==1.5.4 +SecretStorage==3.3.1 +<<<<<<< HEAD +======= +selenium==4.3.0 +>>>>>>> feature/py39 +Send2Trash==1.8.0 +setuptools-scm==6.3.2 +shell==1.0.1 +shortuuid==0.5.0 +simplejson==3.17.2 +six==1.12.0 +sniffio==1.2.0 +<<<<<<< HEAD +======= +sortedcontainers==2.4.0 +>>>>>>> feature/py39 +soupsieve==1.8 +SQLAlchemy==1.3.1 +sqlparse==0.3.0 +stravalib==0.10.4 +<<<<<<< HEAD +======= +TatSu==5.6.1 +tblib==1.7.0 +>>>>>>> feature/py39 +termcolor==1.1.0 +terminado==0.12.1 +terminaltables==3.1.0 +testpath==0.4.2 +text-unidecode==1.2 +thrift==0.15.0 +<<<<<<< HEAD +======= +thriftpy2==0.4.14 +>>>>>>> feature/py39 +timezonefinder==5.2.0 +tinycss2==1.1.1 +tk==0.1.0 +toml==0.10.2 +tomli==1.2.2 +<<<<<<< HEAD +======= +tomlkit==0.11.1 +>>>>>>> feature/py39 +toolz==0.10.0 +tornado==6.1 +tqdm==4.31.1 +traitlets==5.4.0 +<<<<<<< HEAD +======= +trio==0.21.0 +trio-websocket==0.9.2 +>>>>>>> feature/py39 +trueskill==0.4.5 +typing_extensions==4.0.1 +units==0.7 +uritemplate==3.0.0 +<<<<<<< HEAD +urllib3==1.25.9 +======= +urllib3==1.26.10 +>>>>>>> feature/py39 +VerbalExpressions==0.0.2 +vine==5.0.0 +wcwidth==0.1.7 +webencodings==0.5.1 +websocket-client==1.2.3 +Werkzeug==0.15.1 +widgetsnbextension==3.4.2 +wrapt==1.13.3 +<<<<<<< HEAD +xlrd==1.2.0 +xmltodict==0.12.0 +yamjam==0.1.7 +yamllint==1.15.0 +yuicompressor +======= +wsproto==1.1.0 +xlrd==1.2.0 +xmltodict==0.12.0 +xyzservices==2022.9.0 +yamjam==0.1.7 +yamllint==1.15.0 +>>>>>>> feature/py39 +zipp==3.8.1 diff --git a/requirements39.txt b/requirements39.txt new file mode 100644 index 00000000..47dc6125 --- /dev/null +++ b/requirements39.txt @@ -0,0 +1,179 @@ +aiohttp==3.8.4 +aiosignal==1.3.1 +amqp==5.1.1 +arrow==1.2.3 +asgiref==3.7.2 +asttokens==2.2.1 +async-timeout==4.0.2 +attrs==23.1.0 +backcall==0.2.0 +beautifulsoup4==4.12.2 +billiard==3.6.4.0 +bleach==6.0.0 +bokeh==3.1.1 +braintree==4.20.0 +celery==5.2.1 +certifi==2023.5.7 +cffi==1.15.1 +charset-normalizer==3.1.0 +click==8.1.3 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.2.0 +cloudpickle==2.2.1 +colorcet==3.0.1 +contourpy==1.0.7 +coreapi==2.3.3 +coreschema==0.0.4 +cramjam==2.6.2 +cycler==0.11.0 +Cython==0.29.35 +dask==2023.5.1 +decorator==5.1.1 +Django==3.2.12 +django-analytical==2.5.0 +django-async-messages==0.3.1 +django-classy-tags==4.0.0 +django-cookie-law==2.0.1 +django-cors-headers==3.10.1 +django-countries==7.5.1 +django-datetime-widget2==0.9.5 +django-debug-toolbar==2.0 +django-leaflet==0.28.2 +django-oauth-toolkit==1.2.0 +django-oauth2-provider==0.2.6.1 +django-rest-framework==0.1.0 +django-rest-swagger==2.2.0 +django-rq==2.5.1 +django-shell-plus==1.1.7 +django-social-share==1.3.2 +django-taggit==4.0.0 +django-tz-detect==0.2.9 +djangorestframework==3.14.0 +docopt==0.6.2 +exceptiongroup==1.1.1 +executing==1.2.0 +factory-boy==2.11.1 +Faker==18.10.0 +fastparquet==2023.4.0 +fitparse==1.2.0 +fonttools==4.39.4 +frozenlist==1.3.3 +fsspec==2023.5.0 +future==0.18.3 +geocoder==1.38.1 +geoip2==4.7.0 +greenlet==2.0.2 +grpcio==1.26.0 +h3==3.7.6 +holoviews==1.16.0 +httplib2==0.22.0 +humanize==4.6.0 +icalendar==5.0.7 +idna==3.4 +importlib-metadata==6.6.0 +importlib-resources==5.12.0 +iniconfig==2.0.0 +ipython==8.14.0 +iso8601==1.1.0 +isodate==0.6.1 +itypes==1.2.0 +jedi==0.18.2 +Jinja2==3.0.3 +kiwisolver==1.4.4 +kombu==5.2.4 +linkify-it-py==2.0.2 +locket==1.0.0 +lxml==4.9.2 +Markdown==3.4.3 +markdown-it-py==2.2.0 +MarkupSafe==2.1.2 +matplotlib==3.7.1 +matplotlib-inline==0.1.6 +maxminddb==2.3.0 +mdit-py-plugins==0.3.5 +mdurl==0.1.2 +mock==5.0.2 +mpld3==0.5.9 +multidict==6.0.4 +nose==1.3.7 +nose-parameterized==0.6.0 +numpy==1.24.3 +oauth2==1.9.0.post1 +oauth2-provider==0.0 +oauthlib==3.2.2 +openapi-codec==1.3.2 +packaging==23.1 +pandas==2.0.2 +panel==1.0.4 +param==1.13.0 +parso==0.8.3 +partd==1.4.0 +pathspec==0.11.1 +pendulum==2.1.2 +pexpect==4.8.0 +pickleshare==0.7.5 +Pillow==9.5.0 +Pint==0.22 +pluggy==1.0.0 +prompt-toolkit==3.0.38 +protobuf==3.19.4 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pyarrow==12.0.0 +pycairo==1.23.0 +pycparser==2.21 +pyct==0.5.0 +pydantic==1.10.8 +Pygments==2.15.1 +pyparsing==3.0.9 +pytest==7.3.1 +pytest-runner==6.0.0 +python-dateutil==2.8.2 +python-twitter==3.5 +pytz==2023.3 +pytzdata==2020.1 +pyviz-comms==2.3.0 +PyYAML==6.0 +ratelim==0.1.6 +redis==4.5.5 +requests==2.31.0 +requests-oauthlib==1.2.0 +rowingdata==3.5.29 +rowingphysics==0.5.2 +rq==1.15.0 +rules==3.3 +ruptures==1.1.7 +scipy==1.10.1 +shortuuid==1.0.11 +simplejson==3.19.1 +six==1.16.0 +soupsieve==2.4.1 +SQLAlchemy==2.0.15 +sqlparse==0.4.4 +stack-data==0.6.2 +stravalib==1.3.0 +timezonefinder==6.2.0 +tk==0.1.0 +tomli==2.0.1 +toolz==0.12.0 +tornado==6.3.2 +tqdm==4.65.0 +traitlets==5.9.0 +trueskill==0.4.5 +typing_extensions==4.6.3 +tzdata==2023.3 +uc-micro-py==1.0.2 +uritemplate==4.1.1 +urllib3==2.0.2 +VerbalExpressions==0.0.2 +vine==5.0.0 +wcwidth==0.2.6 +webencodings==0.5.1 +Werkzeug==2.3.4 +xmltodict==0.13.0 +xyzservices==2023.5.0 +yamjam==0.1.7 +yamllint==1.32.0 +yarl==1.9.2 +zipp==3.15.0 diff --git a/rowers/apps.py b/rowers/apps.py index 82adbc07..94f7b677 100644 --- a/rowers/apps.py +++ b/rowers/apps.py @@ -1,8 +1,11 @@ from django.apps import AppConfig +import os +from django.conf import settings # Store metadata for the app class RowersConfig(AppConfig): name = 'rowers' + path = os.path.join(settings.BASE_DIR, 'rowers') diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 5c18f94a..20573d2b 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -786,9 +786,9 @@ def split_workout(r, parent, splitsecond, splitmode): data1.fillna(method='bfill', inplace=True) # Some new stuff to try out - data1 = data1.groupby('time', axis=0).mean() - data1['time'] = data1.index - data1.reset_index(drop=True, inplace=True) + #data1 = data1.groupby('time', axis=0).mean() + #data1['time'] = data1.index + #data1.reset_index(drop=True, inplace=True) data2 = data2.sort_values(['time']) data2 = data2.interpolate(method='linear', axis=0, limit_direction='both', @@ -796,9 +796,9 @@ def split_workout(r, parent, splitsecond, splitmode): data2.fillna(method='bfill', inplace=True) # Some new stuff to try out - data2 = data2.groupby('time', axis=0).mean() - data2['time'] = data2.index - data2.reset_index(drop=True, inplace=True) + #data2 = data2.groupby('time', axis=0).mean() + #data2['time'] = data2.index + #data2.reset_index(drop=True, inplace=True) data1['pace'] = data1['pace'] / 1000. data2['pace'] = data2['pace'] / 1000. @@ -1621,31 +1621,29 @@ def get_existing_job(w): def workout_trimp(w, reset=False): r = w.user - # below is temporary - if w.trimp > -1 and not reset: - return w.trimp, w.hrtss - -# if w.trimp is None: -# if get_existing_job(w): -# return 0, 0 -# elif w.averagehr is None: -# if get_existing_job(w): -# return w.trimp, 0 -# elif w.trimp <= 0 and w.averagehr > 0: -# ftp = float(r.ftp) -# _ = myqueue( -# queuehigh, -# handle_calctrimp, -# w.id, -# w.csvfilename, -# ftp, -# r.sex, -# r.hrftp, -# r.max, -# r.rest) -# return w.trimp, w.hrtss -# elif w.trimp > -1 and not reset: -# return w.trimp, w.hrtss + if w.trimp is None: + if get_existing_job(w): + return 0, 0 + elif w.averagehr is None: + if get_existing_job(w): + return w.trimp, 0 + elif w.trimp <= 0 and w.averagehr > 0: + if get_existing_job(w): + return 0, w.averagehr + ftp = float(r.ftp) + _ = myqueue( + queuehigh, + handle_calctrimp, + w.id, + w.csvfilename, + ftp, + r.sex, + r.hrftp, + r.max, + r.rest) + return w.trimp, w.hrtss + elif w.trimp > -1 and not reset: + return w.trimp, w.hrtss if get_existing_job(w): return 0, 0 diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index b84f5b97..ad946f8e 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -385,8 +385,10 @@ def filter_df(datadf, fieldname, value, largerthan=True): def df_resample(datadf): # time stamps must be in seconds timestamps = datadf['TimeStamp (sec)'].astype('int') + datadf['timestamps'] = timestamps - newdf = datadf.groupby(['timestamps']).mean() + # newdf = datadf.groupby(['timestamps']).mean() + newdf = datadf[~datadf.duplicated(['timestamps'])] return newdf @@ -1369,6 +1371,7 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): extracols = [] + columns = list(columns) + ['distance', 'spm', 'workoutid'] columns = [x for x in columns if x != 'None'] columns = list(set(columns)) @@ -1381,27 +1384,35 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): elif len(ids) == 1: # pragma: no cover try: filename = 'media/strokedata_{id}.parquet.gz'.format(id=ids[0]) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) except OSError: rowdata, row = getrowdata(id=ids[0]) if rowdata and len(rowdata.df): _ = dataprep(rowdata.df, id=ids[0], bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) else: data = [] filenames = [ 'media/strokedata_{id}.parquet.gz'.format(id=id) for id in ids] for id, f in zip(ids, filenames): try: - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) except (OSError, IndexError, ArrowInvalid): rowdata, row = getrowdata(id=id) if rowdata and len(rowdata.df): # pragma: no cover _ = dataprep(rowdata.df, id=id, bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) try: @@ -1471,7 +1482,7 @@ def datafusion(id1, id2, columns, offset): 'fpace', 'workoutid', 'id'], - 1, errors='ignore') + axis=1, errors='ignore') # Add coordinates to DataFrame latitude, longitude = get_latlon(id1) @@ -1494,7 +1505,7 @@ def datafusion(id1, id2, columns, offset): for c in df1.columns: if c not in keep1: - df1 = df1.drop(c, 1, errors='ignore') + df1 = df1.drop(c, axis=1, errors='ignore') df = pd.concat([df1, df2], ignore_index=True) df = df.sort_values(['time']) @@ -1503,9 +1514,9 @@ def datafusion(id1, id2, columns, offset): df.fillna(method='bfill', inplace=True) # Some new stuff to try out - df = df.groupby('time', axis=0).mean() - df['time'] = df.index - df.reset_index(drop=True, inplace=True) + #df = df.groupby('time',axis=0).mean() + #df['time'] = df.index + #df.reset_index(drop=True, inplace=True) df['time'] = df['time'] / 1000. df['pace'] = df['pace'] / 1000. diff --git a/rowers/datautils.py b/rowers/datautils.py index 47581604..a13709f9 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -329,7 +329,7 @@ def getmaxwattinterval(tt, ww, i): w_roll = ww.rolling(i+2).mean().dropna() if len(w_roll): # now goes with # data points - should be fixed seconds - indexmax = w_roll.idxmax(axis=1) + indexmax = w_roll.idxmax(axis=0) # indexmaxpos = indexmax.get_loc(indexmax) indexmaxpos = indexmax try: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 0a936218..b4e4a6ed 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -70,7 +70,8 @@ from bokeh.palettes import Dark2_8 as palette from bokeh.palettes import Set1_4 as palette2 from bokeh.models.glyphs import MultiLine import itertools -from bokeh.plotting import figure, ColumnDataSource, Figure, curdoc +from bokeh.plotting import figure, ColumnDataSource, curdoc + from bokeh.models import CustomJS, Slider, TextInput, BoxAnnotation, Band import arrow @@ -250,7 +251,7 @@ def interactive_hr_piechart(df, rower, title, totalseconds=0): TOOLS = 'save,hover' - z = figure(title="HR "+title, x_range=(-0.5, 1), plot_height=375, + z = figure(title="HR "+title, x_range=(-0.5, 1), height=375, tools=TOOLS, toolbar_location=None, tooltips="@zone: @totaltime", ) @@ -314,7 +315,7 @@ def interactive_workouttype_piechart(workouts): except KeyError: # pragma: no cover pass - p = figure(plot_height=350, title="Types", toolbar_location=None, + p = figure(height=350, title="Types", toolbar_location=None, tools="hover,save", tooltips="@type: @totaltime", x_range=(-0.5, 1.0)) p.wedge(x=0, y=1, radius=0.4, @@ -364,7 +365,7 @@ def interactive_boxchart(datadf, fieldname, extratitle='', yrange1 = Range1d(start=yaxminima[fieldname], end=yaxmaxima[fieldname]) plot.y_range = yrange1 - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' if extratitle: plot.title.text = extratitle @@ -386,8 +387,8 @@ def interactive_boxchart(datadf, fieldname, extratitle='', plot.xaxis.major_label_orientation = pi/4 - plot.plot_width = 920 - plot.plot_height = 600 + plot.width = 920 + plot.height = 600 slidertext = 'SPM: {:.0f}-{:.0f}, WpS: {:.0f}-{:.0f}'.format( spmmin, spmmax, workmin, workmax @@ -426,11 +427,11 @@ def interactive_planchart(data, startdate, enddate): p = hv.render(bars) - p.plot_width = 550 - p.plot_height = 350 + p.width = 550 + p.height = 350 p.y_range = yrange1 p.toolbar_location = 'above' - p.sizing_mode = 'stretch_both' + #p.sizing_mode = 'stretch_both' script, div = components(p) @@ -592,11 +593,11 @@ def interactive_activitychart(workouts, startdate, enddate, stack='type', toolba d2=enddate.strftime("%Y-%m-%d"), ) - p.plot_width = 550 - p.plot_height = 350 + p.width = 550 + p.height = 350 p.toolbar_location = toolbar_location p.y_range.start = 0 - p.sizing_mode = 'stretch_both' + #p.sizing_mode = 'stretch_both' taptool = p.select(type=TapTool) callback = CustomJS(args={'links': df.link}, code=""" @@ -793,10 +794,10 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb else: # pragma: no cover p.yaxis.axis_label = 'rScore' - p.plot_width = 550 - p.plot_height = 350 + p.width = 550 + p.height = 350 p.toolbar_location = toolbar_location - p.sizing_mode = 'stretch_both' + #p.sizing_mode = 'stretch_both' p.y_range.start = 0 taptool = p.select(type=TapTool) @@ -1089,9 +1090,9 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter' ) ) - plot = Figure(tools=TOOLS, - toolbar_sticky=False, toolbar_location="above", plot_width=800, plot_height=600) - plot.sizing_mode = 'stretch_both' + plot = figure(tools=TOOLS, + toolbar_sticky=False, toolbar_location="above", width=800, height=600) + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -1491,7 +1492,7 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter' mylayout = layoutrow([thesliders, plot]) - mylayout.sizing_mode = 'stretch_both' + #mylayout.sizing_mode = 'stretch_both' script, div = components(mylayout) js_resources = INLINE.render_js() @@ -1683,8 +1684,8 @@ def goldmedalscorechart(user, startdate=None, enddate=None): ) ) - plot = Figure(tools=TOOLS, x_axis_type='datetime', - plot_width=900, plot_height=600, + plot = figure(tools=TOOLS, x_axis_type='datetime', + width=900, height=600, toolbar_location='above', toolbar_sticky=False) @@ -1869,8 +1870,8 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= ) ) - plot = Figure(tools=TOOLS, x_axis_type='datetime', - plot_width=900, plot_height=300, + plot = figure(tools=TOOLS, x_axis_type='datetime', + width=900, height=300, toolbar_location="above", toolbar_sticky=False) @@ -1996,8 +1997,8 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= ('Test', '@testduration'), ]) - plot2 = Figure(tools=TOOLS2, x_axis_type='datetime', - plot_width=900, plot_height=150, + plot2 = figure(tools=TOOLS2, x_axis_type='datetime', + width=900, height=150, toolbar_location=None, toolbar_sticky=False) @@ -2015,7 +2016,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue= plot2.add_tools(linked_crosshair) mylayout = layoutcolumn([plot, plot2]) - mylayout.sizing_mode = 'stretch_both' + #mylayout.sizing_mode = 'stretch_both' try: script, div = components(mylayout) @@ -2074,7 +2075,7 @@ def interactive_histoall(theworkouts, histoparam, includereststrokes, histopwr = histopwr[histopwr > yaxminima[histoparam]] histopwr = histopwr[histopwr < yaxmaxima[histoparam]] - plot = Figure(tools=TOOLS, plot_width=900, + plot = figure(tools=TOOLS, width=900, toolbar_sticky=False, toolbar_location="above" ) @@ -2147,7 +2148,7 @@ def interactive_histoall(theworkouts, histoparam, includereststrokes, plot.add_layout(LinearAxis(y_range_name="fraction", axis_label="Cumulative % of strokes"), 'right') - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' annolabel = Label(x=50, y=450, x_units='screen', y_units='screen', text='', @@ -3415,9 +3416,9 @@ def interactive_agegroupcpchart(age, normalized=False): TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' - plot = Figure(plot_width=900, x_axis_type=x_axis_type, + plot = figure(width=900, x_axis_type=x_axis_type, tools=TOOLS) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.line('duration', 'fitpowerfh', source=sourcefit, legend_label='Female HW', color='blue') @@ -3455,7 +3456,8 @@ def interactive_agegroupcpchart(age, normalized=False): return script, div -def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, cpfit='data', +def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, + cpfit='data', title='', type='water', wcpower=[], wcdurations=[], cpoverlay=False): @@ -3550,8 +3552,8 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, cpfit='da ) # making the plot - plot = Figure(tools=TOOLS, x_axis_type=x_axis_type, - plot_width=900, + plot = figure(tools=TOOLS, x_axis_type=x_axis_type, + width=900, toolbar_location="above", toolbar_sticky=False) @@ -3588,8 +3590,9 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, cpfit='da title = "Critical Power for "+rowername plot.title.text = title - xaxis = plot.select(dict(type=Axis, layout="below"))[0] - xaxis.formatter = PrintfTickFormatter() + #xaxis = plot.select(dict(type=Axis, layout="below")) #[0] + #print(xaxis) + #xaxis.formatter = PrintfTickFormatter() hover = plot.select(dict(type=HoverTool)) @@ -3694,8 +3697,8 @@ def interactive_agegroup_plot(df, distance=2000, duration=None, TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' - plot = Figure(tools=TOOLS, plot_width=900) - plot.sizing_mode = 'stretch_both' + plot = figure(tools=TOOLS, width=900) + #plot.sizing_mode = 'stretch_both' plot.circle('age', 'power', source=source, fill_color='red', size=15, legend_label='World Record') @@ -3878,8 +3881,8 @@ def interactive_cpchart(rower, thedistances, thesecs, theavpower, ) # making the plot - plot = Figure(tools=TOOLS, x_axis_type=x_axis_type, - plot_width=900, + plot = figure(tools=TOOLS, x_axis_type=x_axis_type, + width=900, toolbar_location="above", toolbar_sticky=False) @@ -4007,7 +4010,7 @@ def interactive_windchart(id=0, promember=0): f1 = row.csvfilename # create interactive plot - plot = Figure(plot_width=400, plot_height=300) + plot = figure(width=400, height=300) # get user # u = User.objects.get(id=row.user.id) @@ -4060,7 +4063,7 @@ def interactive_windchart(id=0, promember=0): TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,crosshair' # making the plot - plot = Figure(tools=TOOLS, plot_width=400, height=500, + plot = figure(tools=TOOLS, width=400, height=500, # toolbar_location="below", toolbar_sticky=False, ) @@ -4073,7 +4076,7 @@ def interactive_windchart(id=0, promember=0): plot.xaxis.axis_label = "Distance (m)" plot.yaxis.axis_label = "Wind Speed (m/s)" plot.y_range = Range1d(-7, 7) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.extra_y_ranges = {"winddirection": Range1d(start=0, end=360)} plot.line('dist', 'winddirection', source=source, @@ -4095,7 +4098,7 @@ def interactive_streamchart(id=0, promember=0): f1 = row.csvfilename # create interactive plot - plot = Figure(plot_width=400, + plot = figure(width=400, ) # get user # u = User.objects.get(id=row.user.id) @@ -4129,7 +4132,7 @@ def interactive_streamchart(id=0, promember=0): TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,crosshair' # making the plot - plot = Figure(tools=TOOLS, plot_width=400, height=500, + plot = figure(tools=TOOLS, width=400, height=500, # toolbar_location="below", toolbar_sticky=False, ) @@ -4139,7 +4142,7 @@ def interactive_streamchart(id=0, promember=0): plot.xaxis.axis_label = "Distance (m)" plot.yaxis.axis_label = "River Current (m/s)" plot.y_range = Range1d(-2, 2) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' script, div = components(plot) @@ -4199,11 +4202,11 @@ def forcecurve_multi_interactive_chart(selected): ) TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,crosshair' - plot = Figure(plot_width=920,tools=TOOLS, + plot = figure(width=920,tools=TOOLS, toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -4301,11 +4304,11 @@ def instroke_multi_interactive_chart(selected, *args, **kwargs): ) TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,crosshair' - plot = Figure(plot_width=920,tools=TOOLS, + plot = figure(width=920,tools=TOOLS, toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -4399,11 +4402,11 @@ def instroke_interactive_chart(df,metric, workout, spm_min, spm_max, pass TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,crosshair' - plot = Figure(plot_width=920,tools=TOOLS, + plot = figure(width=920,tools=TOOLS, toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.title.text = str(workout) + ' - ' + metric @@ -4561,9 +4564,9 @@ def interactive_chart(id=0, promember=0, intervaldata={}): datadf ) - plot = Figure(x_axis_type="datetime", y_axis_type="datetime", - plot_width=400, - plot_height=400, + plot = figure(x_axis_type="datetime", y_axis_type="datetime", + width=400, + height=400, toolbar_sticky=False, tools=TOOLS) @@ -4590,7 +4593,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}): plot.line('time', 'pace', source=source, legend_label="Pace", name="pace") plot.title.text = row.name plot.title.text_font_size = "1.0em" - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.xaxis.axis_label = "Time" plot.yaxis.axis_label = "Pace (/500m)" plot.xaxis[0].formatter = DatetimeTickFormatter( @@ -4653,7 +4656,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}): ]) hover.mode = 'mouse' - hover.names = ["spm", "pace"] + # hover.name = ["spm", "pace"] script, div = components(plot) @@ -4852,28 +4855,27 @@ def interactive_multiflex(datadf, xparam, yparam, groupby, extratitle='', TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap' if groupby != 'date': - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval{1.1}'), - (xparamname, '@x{1.1}'), - (yparamname, '@y') + hover = HoverTool(tooltips=[ + (groupby, '@groupval{1.1}'), + (xparamname, '@x{1.1}'), + (yparamname, '@y') ]) else: # pragma: no cover - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval'), - (xparamname, '@x{1.1}'), - (yparamname, '@y'), + hover = HoverTool( + tooltips=[ + (groupby, '@groupval'), + (xparamname, '@x{1.1}'), + (yparamname, '@y'), ]) hover.mode = 'mouse' TOOLS = [SaveTool(), PanTool(), BoxZoomTool(), WheelZoomTool(), ResetTool(), TapTool(), hover] - plot = Figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, + plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, tools=TOOLS, toolbar_location="above", - toolbar_sticky=False, plot_width=920) + toolbar_sticky=False, width=920) # add watermark watermarkurl = "/static/img/logo7.png" @@ -4889,7 +4891,7 @@ def interactive_multiflex(datadf, xparam, yparam, groupby, extratitle='', plot.title.text = title plot.title.text_font_size = "1.0em" - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.image_url([watermarkurl], watermarkx, watermarky, watermarkw, watermarkh, @@ -5107,7 +5109,7 @@ def interactive_cum_flex_chart2(theworkouts, promember=0, else: # pragma: no cover TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,crosshair' - plot = Figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, + plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, tools=TOOLS, toolbar_location="above", toolbar_sticky=False) @@ -5123,7 +5125,7 @@ def interactive_cum_flex_chart2(theworkouts, promember=0, watermarkanchor = 'bottom_right' plot.extra_y_ranges = {"watermark": watermarkrange} plot.extra_x_ranges = {"watermark": watermarkrange} - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' if extratitle: plot.title.text = extratitle @@ -5377,7 +5379,7 @@ def interactive_cum_flex_chart2(theworkouts, promember=0, mylayout = layoutrow([thesliders, plot]) - mylayout.sizing_mode = 'stretch_both' + #mylayout.sizing_mode = 'stretch_both' script, div = components(mylayout) js_resources = INLINE.render_js() @@ -5523,23 +5525,23 @@ def interactive_flexchart_stacked(id, r, xparam='time', TOOLS = 'box_zoom,wheel_zoom,reset,tap,hover' TOOLS2 = 'box_zoom,hover' - plot1 = Figure(x_axis_type=x_axis_type, y_axis_type=y1_axis_type, plot_width=920, plot_height=150, + plot1 = figure(x_axis_type=x_axis_type, y_axis_type=y1_axis_type, width=920, height=150, tools=TOOLS, toolbar_location='above') - plot2 = Figure(x_axis_type=x_axis_type, y_axis_type=y2_axis_type, plot_width=920, plot_height=150, + plot2 = figure(x_axis_type=x_axis_type, y_axis_type=y2_axis_type, width=920, height=150, tools=TOOLS2, toolbar_location=None) - plot3 = Figure(x_axis_type=x_axis_type, y_axis_type=y3_axis_type, plot_width=920, plot_height=150, + plot3 = figure(x_axis_type=x_axis_type, y_axis_type=y3_axis_type, width=920, height=150, tools=TOOLS2, toolbar_location=None) - plot4 = Figure(x_axis_type=x_axis_type, y_axis_type=y4_axis_type, plot_width=920, plot_height=150, + plot4 = figure(x_axis_type=x_axis_type, y_axis_type=y4_axis_type, width=920, height=150, tools=TOOLS2, toolbar_location=None) plot1.xaxis.visible = False plot2.xaxis.visible = False plot3.xaxis.visible = False - plot1.sizing_mode = 'stretch_both' - plot2.sizing_mode = 'stretch_both' - plot3.sizing_mode = 'stretch_both' - plot4.sizing_mode = 'stretch_both' + #plot1.sizing_mode = 'stretch_both' + #plot2.sizing_mode = 'stretch_both' + #plot3.sizing_mode = 'stretch_both' + #plot4.sizing_mode = 'stretch_both' linked_crosshair = CrosshairTool(dimensions="height") plot1.add_tools(linked_crosshair) @@ -5734,7 +5736,7 @@ def interactive_flexchart_stacked(id, r, xparam='time', plot4, ]) - mylayout.sizing_mode = 'stretch_both' + #mylayout.sizing_mode = 'stretch_both' script, div = components(mylayout) js_resources = INLINE.render_js() @@ -5939,11 +5941,11 @@ def interactive_flex_chart2(id, r, promember=0, else: TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' - plot = Figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, + plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, tools=TOOLS, toolbar_location='above', - toolbar_sticky=False, plot_width=800, plot_height=600, + toolbar_sticky=False, width=800, height=600, ) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -5956,7 +5958,7 @@ def interactive_flex_chart2(id, r, promember=0, watermarkanchor = 'bottom_right' plot.extra_y_ranges = {"watermark": watermarkrange} plot.extra_x_ranges = {"watermark": watermarkrange} - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.image_url([watermarkurl], watermarkx, watermarky, watermarkw, watermarkh, @@ -6051,7 +6053,7 @@ def interactive_flex_chart2(id, r, promember=0, plot.title.text = row.name plot.title.text_font_size = "1.0em" - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.xaxis.axis_label = xaxlabel plot.yaxis.axis_label = yaxlabel @@ -6326,7 +6328,7 @@ def interactive_flex_chart2(id, r, promember=0, mylayout = layoutrow([thesliders, plot]) # layout.sizing_mode = 'stretch_both' - mylayout.sizing_mode = 'stretch_both' + #mylayout.sizing_mode = 'stretch_both' script, div = components(mylayout) js_resources = INLINE.render_js() @@ -6381,7 +6383,7 @@ def thumbnails_set(r, id, favorites): rowdata['time'].max(), maxlength) groups = rowdata.groupby(np.digitize(rowdata['time'], bins)) rowdata = groups.mean() - except KeyError: # pragma: no cover + except (KeyError, TypeError): # pragma: no cover pass for f in favorites: @@ -6475,8 +6477,8 @@ def thumbnail_flex_chart(rowdata, id=0, promember=0, rowdata ) - plot = Figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, - plot_width=200, plot_height=150, + plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, + width=200, height=150, ) @@ -6639,10 +6641,10 @@ def interactive_multiple_compare_chart(ids, xparam, yparam, plottype='line', if xparam == 'time': x_axis_type = 'datetime' - plot = Figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, + plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type, tools=TOOLS, toolbar_location="above", - plot_width=920, plot_height=500, + width=920, height=500, toolbar_sticky=False) # add watermark @@ -6653,7 +6655,7 @@ def interactive_multiple_compare_chart(ids, xparam, yparam, plottype='line', watermarkh = 35 plot.extra_y_ranges = {"watermark": watermarkrange} plot.extra_x_ranges = {"watermark": watermarkrange} - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.image_url([watermarkurl], 0.05, 0.9, watermarkw, watermarkh, @@ -6820,9 +6822,9 @@ def interactive_otw_advanced_pace_chart(id=0, promember=0): rowdata ) - plot = Figure(x_axis_type="datetime", y_axis_type="datetime", + plot = figure(x_axis_type="datetime", y_axis_type="datetime", tools=TOOLS, - plot_width=920, + width=920, toolbar_sticky=False) # add watermark @@ -6850,7 +6852,7 @@ def interactive_otw_advanced_pace_chart(id=0, promember=0): ) plot.title.text = row.name - plot.title.text_font_size = value("1.2em") + #plot.title.text_font_size = value("1.2em") plot.xaxis.axis_label = "Time" plot.yaxis.axis_label = "Pace (/500m)" plot.xaxis[0].formatter = DatetimeTickFormatter( @@ -7221,11 +7223,11 @@ def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', if yaxis == 'percentage': p.yaxis.axis_label = 'Percentage' - p.plot_width = 550 - p.plot_height = 350 + p.width = 550 + p.height = 350 p.toolbar_location = 'right' p.y_range.start = 0 - p.sizing_mode = 'stretch_both' + #p.sizing_mode = 'stretch_both' if yaxis == 'percentage': tidy_df = df2.groupby(['date']).sum() @@ -7235,8 +7237,10 @@ def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', p.extra_y_ranges["yax2"] = Range1d(start=0, end=y2rangemax) p.line('date', 'hours', source=source2, y_range_name="yax2", color="black", width=5) - p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, - legend_label='Hours') + p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10) + +# p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, +# legend_label='Hours') p.add_layout(LinearAxis(y_range_name="yax2", axis_label='Hours'), 'right') diff --git a/rowers/migrations/0001_initial.py b/rowers/migrations/0001_initial.py deleted file mode 100644 index 20324b57..00000000 --- a/rowers/migrations/0001_initial.py +++ /dev/null @@ -1,887 +0,0 @@ -# Generated by Django 2.1.7 on 2020-10-01 07:10 - -import datetime -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import django_countries.fields -import rowers.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Alert', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, null=True, verbose_name='Alert Name')), - ('reststrokes', models.BooleanField(default=False, null=True, verbose_name='Include Rest Strokes')), - ('period', models.IntegerField(default=7, verbose_name='Reporting Period (days)')), - ('next_run', models.DateField(default=django.utils.timezone.now)), - ('emailalert', models.BooleanField(default=True, verbose_name='Send email alerts')), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=50, verbose_name='Exercise/Boat Class')), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), - ], - ), - migrations.CreateModel( - name='BlogPost', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.TextField(max_length=300)), - ('link', models.TextField(max_length=300)), - ('date', models.DateField()), - ], - ), - migrations.CreateModel( - name='C2WorldClassAgePerformance', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('distance', models.IntegerField(default=2000)), - ('name', models.CharField(blank=True, max_length=200)), - ('duration', models.FloatField(blank=True, default=1)), - ('season', models.IntegerField(default=2013)), - ('power', models.IntegerField(default=200)), - ], - ), - migrations.CreateModel( - name='CalcAgePerformance', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'Open'), ('female', 'Female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('duration', models.FloatField(blank=True, default=1)), - ('power', models.IntegerField(default=200)), - ], - options={ - 'db_table': 'calcagegrouprecords', - }, - ), - migrations.CreateModel( - name='CoachingGroup', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, default='group', max_length=30, null=True)), - ], - ), - migrations.CreateModel( - name='CoachOffer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ], - ), - migrations.CreateModel( - name='CoachRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ], - ), - migrations.CreateModel( - name='Condition', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('metric', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Metric')), - ('value1', models.FloatField(default=0)), - ('value2', models.FloatField(blank=True, default=0, null=True)), - ('condition', models.CharField(choices=[('<', '<'), ('>', '>'), ('=', '='), ('between', 'between')], max_length=20, null=True)), - ], - ), - migrations.CreateModel( - name='CourseStandard', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=150)), - ('coursedistance', models.IntegerField(default=0)), - ('coursetime', models.CharField(default='', max_length=100)), - ('referencespeed', models.FloatField(default=5.0)), - ('agemin', models.IntegerField(default=0)), - ('agemax', models.IntegerField(default=120)), - ('boatclass', models.CharField(default='water', max_length=150)), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50)), - ('sex', models.CharField(default='male', max_length=150)), - ('weightclass', models.CharField(default='hwt', max_length=150)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50)), - ('skillclass', models.CharField(default='Open', max_length=150)), - ], - ), - migrations.CreateModel( - name='CourseTestResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('workoutid', models.IntegerField(null=True)), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('coursecompleted', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='cpdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpdata', - }, - ), - migrations.CreateModel( - name='cpergdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpergdata', - }, - ), - migrations.CreateModel( - name='ergcpdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('distance', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'ergcpdata', - }, - ), - migrations.CreateModel( - name='FavoriteChart', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')), - ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')), - ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')), - ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')), - ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')), - ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')), - ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')), - ], - ), - migrations.CreateModel( - name='GeoCourse', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('distance', models.IntegerField(default=0)), - ('name', models.CharField(blank=True, max_length=150)), - ('country', models.CharField(blank=True, max_length=150)), - ('notes', models.CharField(blank=True, max_length=200, verbose_name='Course Notes')), - ], - ), - migrations.CreateModel( - name='GeoPoint', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('latitude', models.FloatField(default=0)), - ('longitude', models.FloatField(default=0)), - ('order_in_poly', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='GeoPolygon', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('order_in_course', models.IntegerField(default=0)), - ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='polygons', to='rowers.GeoCourse')), - ], - ), - migrations.CreateModel( - name='GraphImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(blank=True, default='', max_length=150, null=True)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ], - ), - migrations.CreateModel( - name='IndoorVirtualRaceResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), - ('username', models.CharField(max_length=150)), - ('workoutid', models.IntegerField(null=True)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('points', models.FloatField(default=0)), - ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')), - ('coursecompleted', models.BooleanField(default=False)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), - ('age', models.IntegerField(null=True)), - ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive challenge notifications by email')), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - migrations.CreateModel( - name='PaidPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('shortname', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], max_length=50)), - ('name', models.CharField(max_length=200)), - ('external_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('price', models.FloatField(blank=True, default=None, null=True)), - ('paymentprocessor', models.CharField(choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('active', models.BooleanField(default=True)), - ('clubsize', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='PlannedSession', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, verbose_name='Name')), - ('comment', models.TextField(blank=True, max_length=1000)), - ('startdate', models.DateField(default=rowers.models.current_day, verbose_name='On or After')), - ('enddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='On or Before')), - ('preferreddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='Preferred Date')), - ('sessiontype', models.CharField(choices=[('session', 'Training Session'), ('challenge', 'Challenge'), ('test', 'Mandatory Test'), ('cycletarget', 'Total for a time period'), ('coursetest', 'OTW test over a course'), ('race', 'Virtual challenge'), ('indoorrace', 'Indoor Virtual challenge')], default='session', max_length=150, verbose_name='Session Type')), - ('sessionvalue', models.IntegerField(default=60, verbose_name='Value')), - ('max_nr_of_workouts', models.IntegerField(default=0, verbose_name='Maximum number of workouts')), - ('sessionunit', models.CharField(choices=[('min', 'minutes'), ('m', 'meters'), ('None', None)], default='min', max_length=150, verbose_name='Unit')), - ('criterium', models.CharField(choices=[('none', 'Approximately'), ('minimum', 'At Least'), ('exact', 'Exactly')], default='none', max_length=150, verbose_name='Criteria')), - ('verification', models.CharField(choices=[('none', 'None'), ('automatic', 'Automatic'), ('manual', 'Manual')], default='none', max_length=150)), - ('sessionmode', models.CharField(choices=[('distance', 'Distance'), ('time', 'Time'), ('rScore', 'rScore'), ('TRIMP', 'TRIMP')], default='time', max_length=150, verbose_name='Session Mode')), - ('hasranking', models.BooleanField(default=False)), - ('is_template', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='PlannedSessionComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ], - ), - migrations.CreateModel( - name='PowerTimeFitnessMetric', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=rowers.models.current_day)), - ('last_workout', models.IntegerField(default=0)), - ('PowerFourMin', models.FloatField(default=0)), - ('PowerTwoK', models.FloatField(default=0)), - ('PowerOneHour', models.FloatField(default=0)), - ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=41)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'db_table': 'powertimefitnessmetric', - }, - ), - migrations.CreateModel( - name='RaceLogo', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(default='', max_length=150)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Rower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', django_countries.fields.CountryField(blank=True, default=None, max_length=2, null=True)), - ('street_address', models.CharField(blank=True, default='', max_length=200, null=True)), - ('city', models.CharField(blank=True, default='', max_length=200, null=True)), - ('postal_code', models.CharField(blank=True, default='', max_length=200, null=True)), - ('customer_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('subscription_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('rowerplan', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], default='basic', max_length=30)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('paymentprocessor', models.CharField(blank=True, choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50, null=True)), - ('planexpires', models.DateField(default=rowers.models.current_day)), - ('teamplanexpires', models.DateField(default=rowers.models.current_day)), - ('clubsize', models.IntegerField(default=0)), - ('protrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('plantrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('offercoaching', models.BooleanField(default=False, verbose_name='Offer Remote Coaching')), - ('gdproptin', models.BooleanField(default=False)), - ('gdproptindate', models.DateTimeField(blank=True, null=True)), - ('surveydone', models.BooleanField(default=False)), - ('surveydonedate', models.DateTimeField(blank=True, null=True)), - ('max', models.IntegerField(default=192, verbose_name='Max Heart Rate')), - ('rest', models.IntegerField(default=48, verbose_name='Resting Heart Rate')), - ('ut2', models.IntegerField(default=105, verbose_name='UT2 band lower HR')), - ('ut1', models.IntegerField(default=146, verbose_name='UT1 band lower HR')), - ('at', models.IntegerField(default=160, verbose_name='AT band lower HR')), - ('tr', models.IntegerField(default=167, verbose_name='TR band lower HR')), - ('an', models.IntegerField(default=180, verbose_name='AN band lower HR')), - ('hrftp', models.IntegerField(default=0, verbose_name='FTP heart rate')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), - ('birthdate', models.DateField(blank=True, null=True)), - ('ftp', models.IntegerField(default=226, verbose_name='Functional Threshold Power')), - ('p0', models.FloatField(default=1.0, verbose_name='CP p1')), - ('p1', models.FloatField(default=1.0, verbose_name='CP p2')), - ('p2', models.FloatField(default=1.0, verbose_name='CP p3')), - ('p3', models.FloatField(default=1.0, verbose_name='CP p4')), - ('cpratio', models.FloatField(default=1.0, verbose_name='CP fit ratio')), - ('ep0', models.FloatField(default=1.0, verbose_name='erg CP p1')), - ('ep1', models.FloatField(default=1.0, verbose_name='erg CP p2')), - ('ep2', models.FloatField(default=1.0, verbose_name='erg CP p3')), - ('ep3', models.FloatField(default=1.0, verbose_name='erg CP p4')), - ('ecpratio', models.FloatField(default=1.0, verbose_name='erg CP fit ratio')), - ('otwslack', models.IntegerField(default=0, verbose_name='OTW Power slack')), - ('pw_ut2', models.IntegerField(default=124, verbose_name='UT2 Power')), - ('pw_ut1', models.IntegerField(default=171, verbose_name='UT1 Power')), - ('pw_at', models.IntegerField(default=203, verbose_name='AT Power')), - ('pw_tr', models.IntegerField(default=237, verbose_name='TR Power')), - ('pw_an', models.IntegerField(default=273, verbose_name='AN Power')), - ('powerzones', rowers.models.PowerZonesField(default=['Rest', 'Pwr UT2', 'Pwr UT1', 'Pwr AT', 'Pwr TR', 'Pwr AN'])), - ('workflowleftpanel', rowers.models.TemplateListField(default=['panel_navigationheader.html', 'panel_editbuttons.html', 'panel_advancededit.html', 'panel_editintervals.html', 'panel_stats.html', 'panel_staticchart.html', 'panel_uploadimage.html'])), - ('workflowmiddlepanel', rowers.models.TemplateListField(default=['panel_middlesocial.html', 'panel_statcharts.html', 'flexthumbnails.html', 'panel_summary.html', 'panel_map.html'])), - ('defaultlandingpage', models.CharField(choices=[('workout_edit_view', 'Edit View'), ('workout_workflow_view', 'Workflow View'), ('workout_stats_view', 'Stats View'), ('workout_data_view', 'Data Explore View'), ('workout_summary_edit_view', 'Intervals Editor')], default='workout_edit_view', max_length=200, verbose_name='Default Landing Page')), - ('c2token', models.CharField(blank=True, default='', max_length=200, null=True)), - ('tokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('c2refreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('c2_auto_export', models.BooleanField(default=False)), - ('c2_auto_import', models.BooleanField(default=False)), - ('sporttrackstoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttrackstokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('sporttracksrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttracks_auto_export', models.BooleanField(default=False)), - ('underarmourtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('underarmourtokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('underarmourrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('mapmyfitness_auto_export', models.BooleanField(default=False)), - ('tptoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('tptokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('tprefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('trainingpeaks_auto_export', models.BooleanField(default=False)), - ('polartoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polartokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('polarrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polaruserid', models.IntegerField(default=0)), - ('polar_auto_import', models.BooleanField(default=False)), - ('garmintoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('garminrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravatoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('stravatokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('stravarefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravaexportas', models.CharField(choices=[('Ride', 'Ride'), ('Kitesurf', 'Kitesurf'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('RockClimbing', 'RockClimbing'), ('Hike', 'Hike'), ('RollerSki', 'RollerSki'), ('Walk', 'Walk'), ('Rowing', 'Rowing'), ('AlpineSki', 'AlpineSki'), ('Snowboard', 'Snowboard'), ('BackcountrySki', 'BackcountrySki'), ('Snowshoe', 'Snowshoe'), ('Canoeing', 'Canoeing'), ('StairStepper', 'StairStepper'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('EBikeRide', 'EBikeRide'), ('Surfing', 'Surfing'), ('Elliptical', 'Elliptical'), ('VirtualRide', 'VirtualRide'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Windsurf', 'Windsurf'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('Yoga', 'Yoga')], default='Rowing', max_length=30, verbose_name='Export Workouts to Strava as')), - ('strava_owner_id', models.BigIntegerField(default=0)), - ('strava_auto_export', models.BooleanField(default=False)), - ('strava_auto_import', models.BooleanField(default=False)), - ('strava_auto_delete', models.BooleanField(default=False)), - ('runkeepertoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('runkeeper_auto_export', models.BooleanField(default=False)), - ('getemailnotifications', models.BooleanField(default=False, verbose_name='Receive email notifications')), - ('emailbounced', models.BooleanField(default=False, verbose_name='Email Address Bounced')), - ('getimportantemails', models.BooleanField(default=True, verbose_name='Get Important Emails')), - ('privacy', models.CharField(choices=[('visible', 'Visible'), ('hidden', 'Hidden')], default='visible', max_length=30)), - ('defaulttimezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100, verbose_name='Default Time Zone')), - ('showfavoritechartnotes', models.BooleanField(default=True, verbose_name='Show Notes for Favorite Charts')), - ('staticgrids', models.CharField(choices=[('none', None), ('both', 'both'), ('x', 'x'), ('y', 'y')], default='both', max_length=50, null=True, verbose_name='Chart Grid')), - ('slowpaceerg', models.DurationField(default=datetime.timedelta(seconds=160), verbose_name='Slowest Erg Pace')), - ('fastpaceerg', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest Erg Pace')), - ('slowpaceotw', models.DurationField(default=datetime.timedelta(seconds=240), verbose_name='Slowest OTW Pace')), - ('fastpaceotw', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest OTW Pace')), - ('autojoin', models.BooleanField(default=False, verbose_name='Auto Join Workout Segments')), - ('coachinggroups', models.ManyToManyField(related_name='coaches', to='rowers.CoachingGroup')), - ('friends', models.ManyToManyField(blank=True, related_name='_rower_friends_+', to='rowers.Rower')), - ('mycoachgroup', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='coachingrole', to='rowers.CoachingGroup')), - ('paidplan', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PaidPlan')), - ], - ), - migrations.CreateModel( - name='ShareKey', - fields=[ - ('location', models.TextField()), - ('token', models.CharField(max_length=40, primary_key=True, serialize=False)), - ('creation_date', models.DateTimeField(auto_now_add=True)), - ('expiration_seconds', models.BigIntegerField()), - ], - ), - migrations.CreateModel( - name='SiteAnnouncement', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateField(default=rowers.models.current_day)), - ('announcement', models.TextField(max_length=280)), - ('expires', models.DateField(default=rowers.models.current_day)), - ('modified', models.DateField(default=rowers.models.current_day)), - ('dotweet', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='StandardCollection', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('active', models.BooleanField(default=True)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Team', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')), - ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')), - ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')), - ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TeamInvite', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('email', models.CharField(blank=True, max_length=150, null=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TeamRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TombStone', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('uploadedtoc2', models.IntegerField(default=0)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ], - ), - migrations.CreateModel( - name='TrainingMacroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ], - ), - migrations.CreateModel( - name='TrainingMesoCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')), - ], - ), - migrations.CreateModel( - name='TrainingMicroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')), - ], - ), - migrations.CreateModel( - name='TrainingPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('status', models.BooleanField(default=True, verbose_name='Active')), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('notes', models.CharField(blank=True, max_length=200, null=True, verbose_name='Plan Notes')), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')), - ], - ), - migrations.CreateModel( - name='TrainingTarget', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('date', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')), - ], - ), - migrations.CreateModel( - name='VideoAnalysis', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, default='', max_length=150, null=True)), - ('video_id', models.CharField(default='', max_length=150)), - ('delay', models.IntegerField(default=0)), - ('metricsgroups', rowers.models.TemplateListField(default=['basic'])), - ], - ), - migrations.CreateModel( - name='VirtualRaceFollower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('emailaddress', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email Address')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='VirtualRaceResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), - ('username', models.CharField(max_length=150)), - ('workoutid', models.IntegerField(null=True)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('points', models.FloatField(default=0)), - ('boatclass', models.CharField(choices=[('water', 'Standard Racing Shell'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=40, verbose_name='Boat Class')), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=40, verbose_name='Boat Type')), - ('coursecompleted', models.BooleanField(default=False)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), - ('age', models.IntegerField(null=True)), - ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive challenge notifications by email')), - ('startsecond', models.FloatField(default=0)), - ('endsecond', models.FloatField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - migrations.CreateModel( - name='Workout', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, null=True)), - ('date', models.DateField(blank=True, null=True)), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bikeerg', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Bike', 'Bike'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('Yoga', 'Yoga'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')), - ('workoutsource', models.CharField(default='unknown', max_length=100)), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), - ('boatbrand', models.CharField(choices=[('other', 'Other'), ('alden', 'Alden Rowing'), ('averowing', 'AveRowing Boats'), ('aylings', 'Aylings'), ('bbg', 'BBG'), ('burgashell', 'Burgashell'), ('burton', 'Burton Water Sports'), ('douglas', 'Carl Douglas Racing Shells'), ('carbocraft', 'Carbocraft'), ('colley', 'Colley'), ('cucchietti', 'Cucchietti'), ('dirigo', 'Dirigo'), ('drew', 'Drew Harrison Racing'), ('echo', 'Echo Rowing'), ('edon', 'Edon TS515 Sculling Boats'), ('edwin', 'Edwin Phelps'), ('empacher', 'Empacher'), ('eton', 'Eton Racing Boats (ERB)'), ('euro', 'Euro Diffusions'), ('filippi', 'Filippi Boats'), ('fluidesign', 'Fluidesign'), ('dragon', 'Flying Dragon Boat Co (Huangzhou, China)'), ('gig', 'Gig Harbor Boat Works'), ('sharrow', 'George Sharrow Racing Shells'), ('harris', 'Harris'), ('hitech', 'Hi-Tech'), ('hudson', 'Hudson Boatworks'), ('janousek', 'Janousek Racing Boats'), ('waugh', 'John Waugh Racing Boats'), ('laszlo', 'Laszlo Boats NZ'), ('leo', 'Leo Coastal Rowing'), ('levator', 'Levator Boatworks'), ('liangjin', 'Liangjin Boat'), ('liteboat', 'LiteBoat'), ('littleriver', 'Little River Marine'), ('kaschper', 'Kaschper Racing Shells'), ('kanghua', 'Kanghua'), ('king', 'King Racing Shells'), ('kiwi', 'Kiwi International Rowing Skiffs (KIRS)'), ('lola', 'Lola Aylings'), ('maas', 'Maas Rowing Shells'), ('maas', 'Maas Boat (coastal)'), ('nelo', 'Nelo Rowing'), ('owen', 'Owen'), ('peinert', 'Peinert'), ('pocock', 'Pocock Racing Shells'), ('race1', 'Race 1 Australia'), ('radley', 'Radley'), ('resolute', 'Resolute Racing Shells'), ('salani', 'Salani'), ('schoenbrod', 'Helmut Schoenbrod'), ('salterbros', 'Salter Bros'), ('sims', 'Ray Sims'), ('slracing', 'SL Racing'), ('stampfli', 'Stämpfli Racing Boats'), ('sutton', 'Sutton'), ('swastik', 'Swastik fibchem industry'), ('swift', 'Swift Racing'), ('sykes', 'Sykes Racing'), ('vandusen', 'Van Dusen'), ('vega', 'Vega'), ('vespoli', 'Vespoli'), ('vicente', 'Vicente Dors'), ('virus', 'Virus'), ('whitehall', 'Whitehall Rowing'), ('wiersma', 'Roeiwerf Wiersma'), ('wintech', 'WinTech Racing'), ('worcester', 'Worcester Oar & Paddle (Joe Garafolo)'), ('swastik', 'Swastik Boats')], default='', max_length=50, verbose_name='Boat Brand')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), - ('starttime', models.TimeField(default=datetime.time(12, 0))), - ('startdatetime', models.DateTimeField(blank=True, null=True)), - ('timezone', models.CharField(default='UTC', max_length=100)), - ('distance', models.IntegerField(blank=True, default=0)), - ('duration', models.TimeField(blank=True)), - ('dragfactor', models.IntegerField(blank=True, default=0)), - ('trimp', models.IntegerField(blank=True, default=-1)), - ('rscore', models.IntegerField(blank=True, default=-1)), - ('hrtss', models.IntegerField(blank=True, default=-1)), - ('normp', models.IntegerField(blank=True, default=-1)), - ('normv', models.FloatField(blank=True, default=-1)), - ('normw', models.FloatField(blank=True, default=-1)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')), - ('csvfilename', models.CharField(blank=True, max_length=150)), - ('uploadedtoc2', models.IntegerField(default=0)), - ('averagehr', models.IntegerField(blank=True, null=True)), - ('maxhr', models.BigIntegerField(blank=True, null=True)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('uploadedtogarmin', models.BigIntegerField(default=0)), - ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)), - ('inboard', models.FloatField(default=0.88)), - ('oarlength', models.FloatField(default=2.89)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('summary', models.TextField(blank=True)), - ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)), - ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')), - ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')), - ('impeller', models.BooleanField(default=False, verbose_name='Impeller')), - ], - ), - migrations.CreateModel( - name='WorkoutComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')), - ], - ), - migrations.CreateModel( - name='VirtualRace', - fields=[ - ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')), - ('registration_form', models.CharField(choices=[('windowstart', 'Start of challenge Window'), ('windowend', 'End of challenge Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')), - ('registration_closure', models.DateTimeField(blank=True, null=True)), - ('evaluation_closure', models.DateTimeField(blank=True, null=True)), - ('start_time', models.TimeField(blank=True, null=True)), - ('end_time', models.TimeField(blank=True, null=True)), - ('country', models.CharField(blank=True, max_length=100)), - ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)), - ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])), - ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])), - ('coursestandards', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.StandardCollection', verbose_name='Standard Times')), - ], - bases=('rowers.plannedsession',), - ), - migrations.AddField( - model_name='workout', - name='plannedsession', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session'), - ), - migrations.AddField( - model_name='workout', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.AddField( - model_name='workout', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='videoanalysis', - name='workout', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), - ), - migrations.AddField( - model_name='trainingplan', - name='target', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget'), - ), - migrations.AddField( - model_name='trainingmacrocycle', - name='plan', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'), - ), - migrations.AddField( - model_name='rower', - name='team', - field=models.ManyToManyField(blank=True, related_name='rower', to='rowers.Team'), - ), - migrations.AddField( - model_name='rower', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsessioncomment', - name='plannedsession', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), - ), - migrations.AddField( - model_name='plannedsessioncomment', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsession', - name='course', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course'), - ), - migrations.AddField( - model_name='plannedsession', - name='manager', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsession', - name='rower', - field=models.ManyToManyField(blank=True, to='rowers.Rower'), - ), - migrations.AddField( - model_name='plannedsession', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.AddField( - model_name='graphimage', - name='workout', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), - ), - migrations.AddField( - model_name='geopoint', - name='polygon', - field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='points', to='rowers.GeoPolygon'), - ), - migrations.AddField( - model_name='geocourse', - name='manager', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'), - ), - migrations.AddField( - model_name='favoritechart', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AlterIndexTogether( - name='ergcpdata', - index_together={('user',)}, - ), - migrations.AlterIndexTogether( - name='cpergdata', - index_together={('user',)}, - ), - migrations.AlterIndexTogether( - name='cpdata', - index_together={('user',)}, - ), - migrations.AddField( - model_name='coursetestresult', - name='plannedsession', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), - ), - migrations.AddField( - model_name='coursestandard', - name='standardcollection', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='standards', to='rowers.StandardCollection'), - ), - migrations.AddField( - model_name='coachrequest', - name='coach', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='coachrequest', - name='user', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='coachoffer', - name='coach', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='coachoffer', - name='user', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='c2worldclassageperformance', - unique_together={('age', 'sex', 'weightcategory', 'distance')}, - ), - migrations.AddField( - model_name='alert', - name='filter', - field=models.ManyToManyField(related_name='filters', to='rowers.Condition', verbose_name='Filters'), - ), - migrations.AddField( - model_name='alert', - name='manager', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='alert', - name='measured', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='measured', to='rowers.Condition', verbose_name='Measuring'), - ), - migrations.AddField( - model_name='alert', - name='rower', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='virtualraceresult', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entries', to='rowers.VirtualRace'), - ), - migrations.AddField( - model_name='virtualracefollower', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), - ), - migrations.AlterUniqueTogether( - name='videoanalysis', - unique_together={('video_id', 'workout')}, - ), - migrations.AddField( - model_name='racelogo', - name='race', - field=models.ManyToManyField(related_name='logos', to='rowers.VirtualRace'), - ), - migrations.AddField( - model_name='indoorvirtualraceresult', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), - ), - migrations.AlterUniqueTogether( - name='coursestandard', - unique_together={('name', 'standardcollection')}, - ), - ] diff --git a/rowers/scoring.py b/rowers/scoring.py index ab692240..678f3a62 100644 --- a/rowers/scoring.py +++ b/rowers/scoring.py @@ -137,6 +137,8 @@ def save_scoring(name, user, filename, id=0, notes=""): adaptiveclass = 'None' except KeyError: # pragma: no cover adaptiveclass = 'None' + except AttributeError: + adaptiveclass = 'None' try: skillclass = row['SkillClass'] diff --git a/rowers/tasks.py b/rowers/tasks.py index d8880e74..857e844c 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -730,7 +730,8 @@ def handle_sporttracks_sync(workoutid, url, headers, data, debug=False, **kwargs @app.task -def handle_strava_sync(stravatoken, workoutid, filename, name, activity_type, description, debug=False, **kwargs): +def handle_strava_sync(stravatoken, + workoutid, filename, name, activity_type, description, debug=False, **kwargs): client = stravalib.Client(access_token=stravatoken) failed = False try: @@ -738,7 +739,7 @@ def handle_strava_sync(stravatoken, workoutid, filename, name, activity_type, de try: act = client.upload_activity(f, 'tcx.gz', name=name) try: - res = act.wait(poll_interval=1.0, timeout=10) + res = act.wait(poll_interval=1.0, timeout=30) except stravalib.exc.ActivityUploadFailed: # pragma: no cover dologging('strava_fail.log', 'Strava upload failed for Workout {id} ActivityUploadFailed'.format( id=workoutid)) @@ -3693,12 +3694,13 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, newc2id = workout.uploadedtoc2 parkedids = [] - with open('c2blocked.json', 'r') as c2blocked: + with open('c2blocked.json', 'a+') as c2blocked: try: jsondata = json.load(c2blocked) parkedids = jsondata['ids'] except JSONDecodeError: # pragma: no cover parkedids = [] + newparkedids = [id for id in parkedids if id != newc2id] with open('c2blocked.json', 'wt') as c2blocked: diff --git a/rowers/templates/agegroupchart.html b/rowers/templates/agegroupchart.html index 6d4d01df..2ad2a9a8 100644 --- a/rowers/templates/agegroupchart.html +++ b/rowers/templates/agegroupchart.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/agegroupcp.html b/rowers/templates/agegroupcp.html index 2308f5fb..c08a9552 100644 --- a/rowers/templates/agegroupcp.html +++ b/rowers/templates/agegroupcp.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/boxplot.html b/rowers/templates/boxplot.html index 7f8bd9db..df98c678 100644 --- a/rowers/templates/boxplot.html +++ b/rowers/templates/boxplot.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/cum_flex.html b/rowers/templates/cum_flex.html index e78b002f..4e818a57 100644 --- a/rowers/templates/cum_flex.html +++ b/rowers/templates/cum_flex.html @@ -59,12 +59,12 @@
- - + +
- - + +
diff --git a/rowers/templates/cumstats.html b/rowers/templates/cumstats.html index 7e5c5b83..fbc98813 100644 --- a/rowers/templates/cumstats.html +++ b/rowers/templates/cumstats.html @@ -60,12 +60,12 @@
- - + +
- - + +
diff --git a/rowers/templates/disqualification_view.html b/rowers/templates/disqualification_view.html index 346009d7..dfacbe67 100644 --- a/rowers/templates/disqualification_view.html +++ b/rowers/templates/disqualification_view.html @@ -102,7 +102,7 @@ {% endif %}
  • - + diff --git a/rowers/templates/fitnessfit.html b/rowers/templates/fitnessfit.html index 010f8e09..a5eb088d 100644 --- a/rowers/templates/fitnessfit.html +++ b/rowers/templates/fitnessfit.html @@ -48,7 +48,7 @@ }); - + diff --git a/rowers/templates/fitnessmetric.html b/rowers/templates/fitnessmetric.html index c3a0a4d6..94e57b2a 100644 --- a/rowers/templates/fitnessmetric.html +++ b/rowers/templates/fitnessmetric.html @@ -48,7 +48,7 @@ }); - + diff --git a/rowers/templates/flexchart3otw.html b/rowers/templates/flexchart3otw.html index bbae4c43..19f7cbeb 100644 --- a/rowers/templates/flexchart3otw.html +++ b/rowers/templates/flexchart3otw.html @@ -11,8 +11,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/templates/flexchartstacked.html b/rowers/templates/flexchartstacked.html index d44b9c33..d5788f79 100644 --- a/rowers/templates/flexchartstacked.html +++ b/rowers/templates/flexchartstacked.html @@ -11,8 +11,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/templates/forcecurve_analysis.html b/rowers/templates/forcecurve_analysis.html index 79638221..b46f8d37 100644 --- a/rowers/templates/forcecurve_analysis.html +++ b/rowers/templates/forcecurve_analysis.html @@ -9,8 +9,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/templates/forcecurve_single.html b/rowers/templates/forcecurve_single.html index 56844a45..d9ea9729 100644 --- a/rowers/templates/forcecurve_single.html +++ b/rowers/templates/forcecurve_single.html @@ -11,8 +11,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/templates/goldmedalscores.html b/rowers/templates/goldmedalscores.html index 020db44c..e56f3624 100644 --- a/rowers/templates/goldmedalscores.html +++ b/rowers/templates/goldmedalscores.html @@ -60,7 +60,7 @@ {% block main %} - + diff --git a/rowers/templates/histo.html b/rowers/templates/histo.html index cbb641c7..a46d9d5e 100644 --- a/rowers/templates/histo.html +++ b/rowers/templates/histo.html @@ -60,12 +60,12 @@
    - - + +
    - - + +
    diff --git a/rowers/templates/histo_single.html b/rowers/templates/histo_single.html index 85539731..4d6111d3 100644 --- a/rowers/templates/histo_single.html +++ b/rowers/templates/histo_single.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/history.html b/rowers/templates/history.html index 819b0ff5..358b91a0 100644 --- a/rowers/templates/history.html +++ b/rowers/templates/history.html @@ -6,12 +6,12 @@ {% block main %}
    - - + +
    - - + +
    - + + diff --git a/rowers/templates/instroke_interactive.html b/rowers/templates/instroke_interactive.html index eccdefdb..d7d89704 100644 --- a/rowers/templates/instroke_interactive.html +++ b/rowers/templates/instroke_interactive.html @@ -113,7 +113,7 @@ $( function() { {% block main %} - + + + + diff --git a/rowers/templates/map_view.html b/rowers/templates/map_view.html index 676aa566..17eedd47 100644 --- a/rowers/templates/map_view.html +++ b/rowers/templates/map_view.html @@ -12,7 +12,7 @@ {% block main %} - + diff --git a/rowers/templates/mapcompare.html b/rowers/templates/mapcompare.html index 4d219412..a00044a6 100644 --- a/rowers/templates/mapcompare.html +++ b/rowers/templates/mapcompare.html @@ -12,7 +12,7 @@ {% block main %} - + diff --git a/rowers/templates/multicompare.html b/rowers/templates/multicompare.html index 6024d130..59ddd994 100644 --- a/rowers/templates/multicompare.html +++ b/rowers/templates/multicompare.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/multiflex.html b/rowers/templates/multiflex.html index e9638577..b2290f82 100644 --- a/rowers/templates/multiflex.html +++ b/rowers/templates/multiflex.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/oterankings.html b/rowers/templates/oterankings.html index 76c07327..d376974a 100644 --- a/rowers/templates/oterankings.html +++ b/rowers/templates/oterankings.html @@ -10,7 +10,7 @@ {% block main %} - + diff --git a/rowers/templates/otwgeeky.html b/rowers/templates/otwgeeky.html index 4ed742ab..139fdcca 100644 --- a/rowers/templates/otwgeeky.html +++ b/rowers/templates/otwgeeky.html @@ -138,7 +138,7 @@
    - + diff --git a/rowers/templates/otwinteractive.html b/rowers/templates/otwinteractive.html index 5c5164cb..1dc48cfc 100644 --- a/rowers/templates/otwinteractive.html +++ b/rowers/templates/otwinteractive.html @@ -6,7 +6,7 @@ {% block main %} - + diff --git a/rowers/templates/otwrankings.html b/rowers/templates/otwrankings.html index bd0186b4..a482e4db 100644 --- a/rowers/templates/otwrankings.html +++ b/rowers/templates/otwrankings.html @@ -10,7 +10,7 @@ {% block main %} - + diff --git a/rowers/templates/performancemanager.html b/rowers/templates/performancemanager.html index 43a98877..f7ae5451 100644 --- a/rowers/templates/performancemanager.html +++ b/rowers/templates/performancemanager.html @@ -63,7 +63,7 @@ {% block main %} - + diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html index 74591842..e4a04338 100644 --- a/rowers/templates/rankings.html +++ b/rowers/templates/rankings.html @@ -13,7 +13,7 @@ {% block main %} - + diff --git a/rowers/templates/splitworkout.html b/rowers/templates/splitworkout.html index 6a2994df..bd7c0130 100644 --- a/rowers/templates/splitworkout.html +++ b/rowers/templates/splitworkout.html @@ -23,7 +23,7 @@
  • - + diff --git a/rowers/templates/streamedit.html b/rowers/templates/streamedit.html index 16a0e59a..3c62cacc 100644 --- a/rowers/templates/streamedit.html +++ b/rowers/templates/streamedit.html @@ -31,7 +31,7 @@
  • - + diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 5fe8d68d..4117c89d 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -89,7 +89,7 @@

  • - + diff --git a/rowers/templates/trainingplan_chart.html b/rowers/templates/trainingplan_chart.html index aca80898..3b1c5c11 100644 --- a/rowers/templates/trainingplan_chart.html +++ b/rowers/templates/trainingplan_chart.html @@ -6,8 +6,8 @@ {% block main %} - - + + diff --git a/rowers/templates/trainingzones.html b/rowers/templates/trainingzones.html index 2fa5fb60..19502c31 100644 --- a/rowers/templates/trainingzones.html +++ b/rowers/templates/trainingzones.html @@ -6,8 +6,8 @@ {% block main %} - - + + diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html index bd6f982a..935fe39d 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -332,12 +332,18 @@
    - -
    - - + + + + +
    + diff --git a/rowers/templates/withdraw_view.html b/rowers/templates/withdraw_view.html index 91b0809d..a5df85ce 100644 --- a/rowers/templates/withdraw_view.html +++ b/rowers/templates/withdraw_view.html @@ -98,7 +98,7 @@
  • {% endif %}
  • - + diff --git a/rowers/templates/workflow.html b/rowers/templates/workflow.html index 75bd7179..f61d1348 100644 --- a/rowers/templates/workflow.html +++ b/rowers/templates/workflow.html @@ -16,7 +16,7 @@ {% block meta %} {% leaflet_js %} {% leaflet_css %} - + diff --git a/rowers/templates/workout_comments.html b/rowers/templates/workout_comments.html index e802eada..699598eb 100644 --- a/rowers/templates/workout_comments.html +++ b/rowers/templates/workout_comments.html @@ -86,7 +86,7 @@
  • - + diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html index 0ffb7944..278434db 100644 --- a/rowers/templates/workout_form.html +++ b/rowers/templates/workout_form.html @@ -157,7 +157,7 @@ $('#id_workouttype').change(); {% endif %} {% if mapdiv %}
  • - + diff --git a/rowers/templates/workout_view.html b/rowers/templates/workout_view.html index cfbecfba..bfb12fe2 100644 --- a/rowers/templates/workout_view.html +++ b/rowers/templates/workout_view.html @@ -137,7 +137,7 @@
  • {% endif %}
  • - + diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index 7a18725d..0979619e 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -15,7 +15,6 @@ except NameError: import pytest -from pandas.core.common import SettingWithCopyWarning from rowers.courses import howfaris import warnings diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 5a1186ca..eaaf5563 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 46366473..882e7412 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -414,11 +414,26 @@ def trendflexdata(workouts, options, userid=0): groups = datadf.groupby(pd.cut(datadf['days ago'], bins, labels=False)) - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - groupsize = groups.count()[xparam] + xvalues = [] + yvalues = [] + xerror = [] + yerror = [] + groupsize = [] + groupval = [] + for key, item in groups: + xvalues.append(groups.get_group(key)[xparam].mean()) + yvalues.append(groups.get_group(key)[yparam].mean()) + xerror.append(groups.get_group(key)[xparam].std()) + yerror.append(groups.get_group(key)[yparam].std()) + groupsize.append(len(groups.get_group(key)[xparam])) + groupval.append(groups.get_group(key)[groupby].mean()) + + + xvalues = pd.Series(xvalues) + yvalues = pd.Series(yvalues) + xerror = pd.Series(xerror) + yerror = pd.Series(yerror) + groupsize = pd.Series(groupsize) mask = groupsize <= min([0.01*groupsize.sum(), 0.2*groupsize.mean()]) xvalues.loc[mask] = np.nan @@ -458,7 +473,7 @@ def trendflexdata(workouts, options, userid=0): if groupby != 'date': try: - df['groupval'] = groups.mean()[groupby] + df['groupval'] = pd.Series(groupval) df.loc[mask, 'groupval'] = np.nan groupcols = df['groupval'] @@ -520,8 +535,6 @@ def trendflexdata(workouts, options, userid=0): spmmin=spmmin, spmmax=spmmax, workmin=workmin, workmax=workmax) - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) return(script, div) @@ -568,9 +581,6 @@ def flexalldata(workouts, options): script = res[0] div = res[1] - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) - return(script, div) @@ -605,9 +615,6 @@ def histodata(workouts, options): extratitle=extratitle, workmin=workmin, workmax=workmax) - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) - return(script, div) @@ -703,8 +710,8 @@ def cpdata(workouts, options): p1 = [1, 1, 1, 1] ratio = 1 - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) + + minutes = options['piece'] if minutes != 0: @@ -883,9 +890,6 @@ def comparisondata(workouts, options): script = res[0] div = res[1] - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) - return(script, div) @@ -949,8 +953,6 @@ def boxplotdata(workouts, options): spmmin=spmmin, spmmax=spmmax, workmin=workmin, workmax=workmax) - scripta = script.split('\n')[2:-1] - script = ''.join(scripta) return(script, div) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 42641229..2f59a0ab 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -3859,6 +3859,8 @@ def workout_stats_view(request, id=0, message="", successmessage=""): except KeyError: # pragma: no cover pass + datadf = datadf.select_dtypes([np.number]) + # Create a dict with correlation values cor = datadf.corr(method='spearman') cor.fillna(value=0, inplace=True) diff --git a/templates/newbase.html b/templates/newbase.html index 6e77fffd..b2c32821 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -12,8 +12,6 @@ {% block title %}Rowsandall Rowing Data Analytics{% endblock %} {% analytical_head_top %} - - @@ -60,7 +58,6 @@ }(document, 'script', 'facebook-jssdk'));