From 6ae85c26e7472dcfaccda62dcf343a81a7a8ba54 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 2 Jun 2023 17:55:06 +0200 Subject: [PATCH 01/13] start py39 --- .gitignore | 1 + rowers/interactiveplots.py | 107 +++++++++++++------------- rowers/tasks.py | 5 +- rowers/tests/statements.py | 1 - rowers/tests/testdata/testdata.tcx.gz | Bin 4002 -> 4000 bytes 5 files changed, 58 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index f9c7abf4..d5a0d687 100644 --- a/.gitignore +++ b/.gitignore @@ -67,4 +67,5 @@ config.yaml /venv39/ /py27/ /py2/ +/py39/ /django2/ diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 0a936218..067c47d9 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, @@ -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,8 +427,8 @@ 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' @@ -592,8 +593,8 @@ 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' @@ -793,8 +794,8 @@ 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.y_range.start = 0 @@ -1089,8 +1090,8 @@ 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 = figure(tools=TOOLS, + toolbar_sticky=False, toolbar_location="above", width=800, height=600) plot.sizing_mode = 'stretch_both' # add watermark @@ -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) @@ -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" ) @@ -3415,7 +3416,7 @@ 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' @@ -3550,8 +3551,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) @@ -3694,7 +3695,7 @@ 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 = 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 +3879,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 +4008,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 +4061,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, ) @@ -4095,7 +4096,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 +4130,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, ) @@ -4199,7 +4200,7 @@ 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) @@ -4301,7 +4302,7 @@ 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) @@ -4399,7 +4400,7 @@ 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) @@ -4561,9 +4562,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) @@ -4870,10 +4871,10 @@ def interactive_multiflex(datadf, xparam, yparam, groupby, extratitle='', 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" @@ -5107,7 +5108,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) @@ -5523,13 +5524,13 @@ 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 @@ -5939,9 +5940,9 @@ 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' @@ -6475,8 +6476,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 +6640,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 @@ -6820,9 +6821,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 @@ -7221,8 +7222,8 @@ 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' diff --git a/rowers/tasks.py b/rowers/tasks.py index d79130a5..fa27043c 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -727,7 +727,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: @@ -735,7 +736,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)) 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 76d8220cbd71ac9fb8e2acf5abf53f0df6bb05f9..cc629a176b16d5106df2918b9095a3ac4f6187c8 100644 GIT binary patch delta 258 zcmV+d0sa1>AD|xxABzYG!Vr3~2dNH!E(7zCe_=cL?zsQ)V6i*k&hAVfe`Ef9`DwNL z{@}qy;&^uPVc(}+dV4O;-fp_}%kJc4`?S)>)%y5l*LUf>-R|v5R6ZSdaQ}7x>g?jm zYjXem{A6|1_35Wyz8IJ1{_14uyPsdLPF`OA+~3ptm=3-2a6W8#()}l0GCK=#u73V{ zx79jr_VQ`J?S{)o`^EVWo~N5W{B3!%>^959A%FVt=&sz?!Q*ay{OIA~FHbX@?Vr2t zzoxhN>Fd)M%XDV|KLG6hKUiG(V)x{?kLmEv7WHbKp2LHLa(VGEJ&hOX(ua5c2Sa%a I_<14!E;B)5qVKKVN=Y z?Y=*FaFIBkU3}R0X_wxfi?g?zZvC=5IoUp~^l`O5e%bY1I&ZgoyAqX8#~s{%-M>1! zxbm9ZKR-WN9d&*B>6b6Y<+;B)S^Dnh*Q=A4mp}LS^ggCTuRNR&Tb^|PNteuX&Vs9- zzus-NPMf`a+Hbqz^3i^A{)6Y~rVoExo-Dh~GI7YCK0LZB_jT~NTOU7qc=*fH%x3%N zZu_t4Eq?m?^u;pW8Nd$!yZ;XsSH9Ri`R!vmyt75UTBqmmAfa4dJWNmHMY{Cio&N!x Kq`iy8fB^sp=#dlv From 7a9e8ef77f27175dad23ee6a358dbb24a112009e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 2 Jun 2023 21:29:19 +0200 Subject: [PATCH 02/13] py39 getting to pass --- requirements39.txt | 179 ++++++++++++++++++++ rowers/templates/agegroupchart.html | 2 +- rowers/templates/agegroupcp.html | 2 +- rowers/templates/boxplot.html | 2 +- rowers/templates/cum_flex.html | 8 +- rowers/templates/cumstats.html | 8 +- rowers/templates/disqualification_view.html | 2 +- rowers/templates/fitnessfit.html | 2 +- rowers/templates/fitnessmetric.html | 2 +- rowers/templates/flexchart3otw.html | 4 +- rowers/templates/flexchartstacked.html | 4 +- rowers/templates/forcecurve_analysis.html | 4 +- rowers/templates/forcecurve_single.html | 4 +- rowers/templates/goldmedalscores.html | 2 +- rowers/templates/histo.html | 8 +- rowers/templates/histo_single.html | 2 +- rowers/templates/history.html | 8 +- rowers/templates/instroke_analysis.html | 4 +- rowers/templates/instroke_interactive.html | 2 +- rowers/templates/list_workouts.html | 6 +- rowers/templates/map_view.html | 2 +- rowers/templates/mapcompare.html | 2 +- rowers/templates/multicompare.html | 2 +- rowers/templates/multiflex.html | 2 +- rowers/templates/oterankings.html | 2 +- rowers/templates/otwgeeky.html | 2 +- rowers/templates/otwinteractive.html | 2 +- rowers/templates/otwrankings.html | 2 +- rowers/templates/performancemanager.html | 2 +- rowers/templates/rankings.html | 2 +- rowers/templates/splitworkout.html | 2 +- rowers/templates/streamedit.html | 2 +- rowers/templates/summary_edit.html | 2 +- rowers/templates/trainingplan_chart.html | 4 +- rowers/templates/trainingzones.html | 4 +- rowers/templates/user_analysis_select.html | 8 +- rowers/templates/windedit.html | 2 +- rowers/templates/withdraw_view.html | 2 +- rowers/templates/workflow.html | 2 +- rowers/templates/workout_comments.html | 2 +- rowers/templates/workout_form.html | 2 +- rowers/templates/workout_view.html | 2 +- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes 43 files changed, 244 insertions(+), 65 deletions(-) create mode 100644 requirements39.txt 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/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..5c965572 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..45dd06ad 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -332,12 +332,12 @@
    - - + +
    - - + +
    + 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/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index cc629a176b16d5106df2918b9095a3ac4f6187c8..4d0a992ce943143fa3defe13b65bf38115b24992 100644 GIT binary patch literal 4000 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 GfB^u#j6oOx literal 4000 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 Date: Sat, 3 Jun 2023 15:07:25 +0200 Subject: [PATCH 03/13] migrations --- boatmovers/migrations/0001_initial.py | 58 -- .../0002_alter_athlete_unique_together.py | 17 - .../migrations/0003_auto_20220622_1753.py | 28 - .../migrations/0004_auto_20220622_1835.py | 22 - boatmovers/migrations/0005_athlete_gender.py | 19 - .../migrations/0006_auto_20220624_0811.py | 23 - .../migrations/0007_auto_20220624_0820.py | 24 - .../migrations/0008_auto_20220624_1135.py | 23 - .../migrations/0009_alter_race_crew_size.py | 18 - .../migrations/0010_remove_race_resultlist.py | 17 - .../migrations/0011_alter_race_processed.py | 18 - .../migrations/0012_auto_20220625_1328.py | 33 - .../migrations/0013_alter_crew_athletes.py | 18 - boatmovers/migrations/0014_athlete_dummy.py | 18 - .../0015_alter_athlete_unique_together.py | 17 - boatmovers/migrations/0016_race_gender.py | 18 - .../migrations/0017_athlete_full_name.py | 19 - boatmovers/migrations/__init__.py | 0 rowers/migrations/0001_initial.py | 887 ------------------ 19 files changed, 1277 deletions(-) delete mode 100644 boatmovers/migrations/0001_initial.py delete mode 100644 boatmovers/migrations/0002_alter_athlete_unique_together.py delete mode 100644 boatmovers/migrations/0003_auto_20220622_1753.py delete mode 100644 boatmovers/migrations/0004_auto_20220622_1835.py delete mode 100644 boatmovers/migrations/0005_athlete_gender.py delete mode 100644 boatmovers/migrations/0006_auto_20220624_0811.py delete mode 100644 boatmovers/migrations/0007_auto_20220624_0820.py delete mode 100644 boatmovers/migrations/0008_auto_20220624_1135.py delete mode 100644 boatmovers/migrations/0009_alter_race_crew_size.py delete mode 100644 boatmovers/migrations/0010_remove_race_resultlist.py delete mode 100644 boatmovers/migrations/0011_alter_race_processed.py delete mode 100644 boatmovers/migrations/0012_auto_20220625_1328.py delete mode 100644 boatmovers/migrations/0013_alter_crew_athletes.py delete mode 100644 boatmovers/migrations/0014_athlete_dummy.py delete mode 100644 boatmovers/migrations/0015_alter_athlete_unique_together.py delete mode 100644 boatmovers/migrations/0016_race_gender.py delete mode 100644 boatmovers/migrations/0017_athlete_full_name.py delete mode 100644 boatmovers/migrations/__init__.py delete mode 100644 rowers/migrations/0001_initial.py diff --git a/boatmovers/migrations/0001_initial.py b/boatmovers/migrations/0001_initial.py deleted file mode 100644 index f9b5cbb7..00000000 --- a/boatmovers/migrations/0001_initial.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:41 - -import boatmovers.models -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Athlete', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('first_name', models.CharField(max_length=200)), - ('last_name', models.CharField(max_length=200)), - ('club', models.CharField(max_length=200)), - ('trueskill_mu', models.FloatField(default=25.0)), - ('trueskill_sigma', models.FloatField(default=8.333)), - ('birth_year', models.IntegerField(default=1972)), - ], - ), - migrations.CreateModel( - name='Crew', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('athletes', models.ManyToManyField(to='boatmovers.Athlete')), - ], - ), - migrations.CreateModel( - name='Race', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=boatmovers.models.current_day)), - ('crew_size', models.IntegerField(default=1)), - ], - ), - migrations.CreateModel( - name='Result', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField()), - ('crew', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.crew')), - ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='boatmovers.race')), - ], - ), - migrations.AddField( - model_name='race', - name='resultlist', - field=models.ManyToManyField(through='boatmovers.Result', to='boatmovers.Crew'), - ), - ] diff --git a/boatmovers/migrations/0002_alter_athlete_unique_together.py b/boatmovers/migrations/0002_alter_athlete_unique_together.py deleted file mode 100644 index 7572d257..00000000 --- a/boatmovers/migrations/0002_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:49 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0001_initial'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year')}, - ), - ] diff --git a/boatmovers/migrations/0003_auto_20220622_1753.py b/boatmovers/migrations/0003_auto_20220622_1753.py deleted file mode 100644 index bc367b79..00000000 --- a/boatmovers/migrations/0003_auto_20220622_1753.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 17:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0002_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='name', - field=models.CharField(default='Race1', max_length=200), - preserve_default=False, - ), - migrations.AddField( - model_name='race', - name='resulturl', - field=models.URLField(null=True), - ), - migrations.AlterUniqueTogether( - name='race', - unique_together={('date', 'name')}, - ), - ] diff --git a/boatmovers/migrations/0004_auto_20220622_1835.py b/boatmovers/migrations/0004_auto_20220622_1835.py deleted file mode 100644 index 94691a93..00000000 --- a/boatmovers/migrations/0004_auto_20220622_1835.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0003_auto_20220622_1753'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='verified', - field=models.BooleanField(default=False), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'race', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0005_athlete_gender.py b/boatmovers/migrations/0005_athlete_gender.py deleted file mode 100644 index 41de5e0a..00000000 --- a/boatmovers/migrations/0005_athlete_gender.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-22 18:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0004_auto_20220622_1835'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/0006_auto_20220624_0811.py b/boatmovers/migrations/0006_auto_20220624_0811.py deleted file mode 100644 index 6b234db8..00000000 --- a/boatmovers/migrations/0006_auto_20220624_0811.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0005_athlete_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='trueskill_exposed', - field=models.FloatField(default=0), - ), - migrations.AlterField( - model_name='athlete', - name='trueskill_sigma', - field=models.FloatField(default=8.333333333333334), - ), - ] diff --git a/boatmovers/migrations/0007_auto_20220624_0820.py b/boatmovers/migrations/0007_auto_20220624_0820.py deleted file mode 100644 index 4c4355fa..00000000 --- a/boatmovers/migrations/0007_auto_20220624_0820.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 08:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0006_auto_20220624_0811'), - ] - - operations = [ - migrations.AlterField( - model_name='result', - name='crew', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.crew'), - ), - migrations.AlterField( - model_name='result', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='results', to='boatmovers.race'), - ), - ] diff --git a/boatmovers/migrations/0008_auto_20220624_1135.py b/boatmovers/migrations/0008_auto_20220624_1135.py deleted file mode 100644 index d5492e47..00000000 --- a/boatmovers/migrations/0008_auto_20220624_1135.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 11:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0007_auto_20220624_0820'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='processed', - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0009_alter_race_crew_size.py b/boatmovers/migrations/0009_alter_race_crew_size.py deleted file mode 100644 index 4207ae30..00000000 --- a/boatmovers/migrations/0009_alter_race_crew_size.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0008_auto_20220624_1135'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='crew_size', - field=models.IntegerField(choices=[(1, 1), (2, 2), (4, 4), (8, 8)], default=1, verbose_name='Nr of rowers per crew (1, 2, 4, 8)'), - ), - ] diff --git a/boatmovers/migrations/0010_remove_race_resultlist.py b/boatmovers/migrations/0010_remove_race_resultlist.py deleted file mode 100644 index e6d9403e..00000000 --- a/boatmovers/migrations/0010_remove_race_resultlist.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:50 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0009_alter_race_crew_size'), - ] - - operations = [ - migrations.RemoveField( - model_name='race', - name='resultlist', - ), - ] diff --git a/boatmovers/migrations/0011_alter_race_processed.py b/boatmovers/migrations/0011_alter_race_processed.py deleted file mode 100644 index f8b81cb7..00000000 --- a/boatmovers/migrations/0011_alter_race_processed.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-24 12:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0010_remove_race_resultlist'), - ] - - operations = [ - migrations.AlterField( - model_name='race', - name='processed', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0012_auto_20220625_1328.py b/boatmovers/migrations/0012_auto_20220625_1328.py deleted file mode 100644 index 9a0b5552..00000000 --- a/boatmovers/migrations/0012_auto_20220625_1328.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:28 - -import boatmovers.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0011_alter_race_processed'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='crews', to='boatmovers.Athlete'), - ), - migrations.AlterField( - model_name='race', - name='date', - field=models.DateField(default=boatmovers.models.current_day, verbose_name='Race Date'), - ), - migrations.AlterField( - model_name='race', - name='resulturl', - field=models.URLField(null=True, verbose_name='URL Link to results'), - ), - migrations.AlterUniqueTogether( - name='result', - unique_together={('crew', 'order')}, - ), - ] diff --git a/boatmovers/migrations/0013_alter_crew_athletes.py b/boatmovers/migrations/0013_alter_crew_athletes.py deleted file mode 100644 index 8f9634c4..00000000 --- a/boatmovers/migrations/0013_alter_crew_athletes.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-25 13:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0012_auto_20220625_1328'), - ] - - operations = [ - migrations.AlterField( - model_name='crew', - name='athletes', - field=models.ManyToManyField(related_name='athlete_crews', to='boatmovers.Athlete'), - ), - ] diff --git a/boatmovers/migrations/0014_athlete_dummy.py b/boatmovers/migrations/0014_athlete_dummy.py deleted file mode 100644 index f3aec5e7..00000000 --- a/boatmovers/migrations/0014_athlete_dummy.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 15:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0013_alter_crew_athletes'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='dummy', - field=models.BooleanField(default=False), - ), - ] diff --git a/boatmovers/migrations/0015_alter_athlete_unique_together.py b/boatmovers/migrations/0015_alter_athlete_unique_together.py deleted file mode 100644 index ee5e6ac1..00000000 --- a/boatmovers/migrations/0015_alter_athlete_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 17:44 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0014_athlete_dummy'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='athlete', - unique_together={('first_name', 'last_name', 'birth_year', 'gender')}, - ), - ] diff --git a/boatmovers/migrations/0016_race_gender.py b/boatmovers/migrations/0016_race_gender.py deleted file mode 100644 index ffedd044..00000000 --- a/boatmovers/migrations/0016_race_gender.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-06-29 18:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0015_alter_athlete_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='race', - name='gender', - field=models.CharField(choices=[('m', 'M'), ('f', 'F')], default='m', max_length=200), - ), - ] diff --git a/boatmovers/migrations/0017_athlete_full_name.py b/boatmovers/migrations/0017_athlete_full_name.py deleted file mode 100644 index f3056eb9..00000000 --- a/boatmovers/migrations/0017_athlete_full_name.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-07-08 12:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('boatmovers', '0016_race_gender'), - ] - - operations = [ - migrations.AddField( - model_name='athlete', - name='full_name', - field=models.CharField(default=' ', max_length=200), - preserve_default=False, - ), - ] diff --git a/boatmovers/migrations/__init__.py b/boatmovers/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/rowers/migrations/0001_initial.py b/rowers/migrations/0001_initial.py deleted file mode 100644 index 20324b57..00000000 --- a/rowers/migrations/0001_initial.py +++ /dev/null @@ -1,887 +0,0 @@ -# Generated by Django 2.1.7 on 2020-10-01 07:10 - -import datetime -from django.conf import settings -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import django_countries.fields -import rowers.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Alert', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, null=True, verbose_name='Alert Name')), - ('reststrokes', models.BooleanField(default=False, null=True, verbose_name='Include Rest Strokes')), - ('period', models.IntegerField(default=7, verbose_name='Reporting Period (days)')), - ('next_run', models.DateField(default=django.utils.timezone.now)), - ('emailalert', models.BooleanField(default=True, verbose_name='Send email alerts')), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=50, verbose_name='Exercise/Boat Class')), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), - ], - ), - migrations.CreateModel( - name='BlogPost', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.TextField(max_length=300)), - ('link', models.TextField(max_length=300)), - ('date', models.DateField()), - ], - ), - migrations.CreateModel( - name='C2WorldClassAgePerformance', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('distance', models.IntegerField(default=2000)), - ('name', models.CharField(blank=True, max_length=200)), - ('duration', models.FloatField(blank=True, default=1)), - ('season', models.IntegerField(default=2013)), - ('power', models.IntegerField(default=200)), - ], - ), - migrations.CreateModel( - name='CalcAgePerformance', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'Open'), ('female', 'Female')], default='female', max_length=30)), - ('age', models.IntegerField(default=19, verbose_name='Age')), - ('duration', models.FloatField(blank=True, default=1)), - ('power', models.IntegerField(default=200)), - ], - options={ - 'db_table': 'calcagegrouprecords', - }, - ), - migrations.CreateModel( - name='CoachingGroup', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, default='group', max_length=30, null=True)), - ], - ), - migrations.CreateModel( - name='CoachOffer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ], - ), - migrations.CreateModel( - name='CoachRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ], - ), - migrations.CreateModel( - name='Condition', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('metric', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Metric')), - ('value1', models.FloatField(default=0)), - ('value2', models.FloatField(blank=True, default=0, null=True)), - ('condition', models.CharField(choices=[('<', '<'), ('>', '>'), ('=', '='), ('between', 'between')], max_length=20, null=True)), - ], - ), - migrations.CreateModel( - name='CourseStandard', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(default='', max_length=150)), - ('coursedistance', models.IntegerField(default=0)), - ('coursetime', models.CharField(default='', max_length=100)), - ('referencespeed', models.FloatField(default=5.0)), - ('agemin', models.IntegerField(default=0)), - ('agemax', models.IntegerField(default=120)), - ('boatclass', models.CharField(default='water', max_length=150)), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50)), - ('sex', models.CharField(default='male', max_length=150)), - ('weightclass', models.CharField(default='hwt', max_length=150)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50)), - ('skillclass', models.CharField(default='Open', max_length=150)), - ], - ), - migrations.CreateModel( - name='CourseTestResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('workoutid', models.IntegerField(null=True)), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('coursecompleted', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='cpdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpdata', - }, - ), - migrations.CreateModel( - name='cpergdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'cpergdata', - }, - ), - migrations.CreateModel( - name='ergcpdata', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('delta', models.IntegerField(default=0)), - ('cp', models.FloatField(default=0)), - ('distance', models.FloatField(default=0)), - ('user', models.IntegerField(default=0)), - ], - options={ - 'db_table': 'ergcpdata', - }, - ), - migrations.CreateModel( - name='FavoriteChart', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('yparam1', models.CharField(choices=[('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='Y1')), - ('yparam2', models.CharField(blank=True, choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], default='None', max_length=50, verbose_name='Y2')), - ('xparam', models.CharField(choices=[('None', ''), ('averageforce', 'Average Drive Force (N)'), ('forceratio', 'Average/Peak Force Ratio'), ('velo', 'Boat Speed (m/s)'), ('catch', 'Catch Angle (degrees)'), ('cumdist', 'Cumulative Distance (m)'), ('distanceperstroke', 'Distance per Stroke (m)'), ('totalangle', 'Drive Length (deg)'), ('drivelength', 'Drive Length (m)'), ('drivespeed', 'Drive Speed (m/s)'), ('effectiveangle', 'Effective Drive Length (deg)'), ('finish', 'Finish Angle (degrees)'), ('hr', 'Heart Rate (bpm)'), ('distance', 'Interval Distance (m)'), ('efficiency', 'OTW Efficiency (%)'), ('pace', 'Pace (/500m)'), ('peakforce', 'Peak Drive Force (N)'), ('peakforceangle', 'Peak Force Angle'), ('power', 'Power (W)'), ('slip', 'Slip (degrees)'), ('spm', 'Stroke Rate (spm)'), ('rhythm', 'Stroke Rhythm'), ('time', 'Time'), ('wash', 'Wash (degrees)'), ('driveenergy', 'Work Per Stroke (J)')], max_length=50, verbose_name='X')), - ('plottype', models.CharField(choices=[('line', 'Line Chart'), ('scatter', 'Scatter Chart')], default='line', max_length=50, verbose_name='Chart Type')), - ('workouttype', models.CharField(choices=[('ote', 'Erg/SkiErg'), ('otw', 'On The Water'), ('all', 'All'), ('strava', 'strava'), ('concept2', 'concept2'), ('sporttracks', 'sporttracks'), ('runkeeper', 'runkeeper'), ('mapmyfitness', 'mapmyfitness'), ('csv', 'painsled'), ('tcx', 'tcx'), ('rp', 'rowperfect'), ('mystery', 'mystery'), ('rowperfect3', 'rowperfect3'), ('ergdata', 'ergdata'), ('boatcoach', 'boatcoach'), ('boatcoachotw', 'boatcoachotw'), ('painsleddesktop', 'painsleddesktop'), ('speedcoach', 'speedcoach'), ('speedcoach2', 'speedcoach2'), ('ergstick', 'ergstick'), ('fit', 'fit'), ('unknown', 'unknown')], default='both', max_length=50, verbose_name='Workout Type')), - ('reststrokes', models.BooleanField(default=True, verbose_name='Incl. Rest')), - ('notes', models.CharField(blank=True, default='Flex Chart Notes', max_length=300, verbose_name='Chart Notes')), - ], - ), - migrations.CreateModel( - name='GeoCourse', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('distance', models.IntegerField(default=0)), - ('name', models.CharField(blank=True, max_length=150)), - ('country', models.CharField(blank=True, max_length=150)), - ('notes', models.CharField(blank=True, max_length=200, verbose_name='Course Notes')), - ], - ), - migrations.CreateModel( - name='GeoPoint', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('latitude', models.FloatField(default=0)), - ('longitude', models.FloatField(default=0)), - ('order_in_poly', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='GeoPolygon', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('order_in_course', models.IntegerField(default=0)), - ('course', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='polygons', to='rowers.GeoCourse')), - ], - ), - migrations.CreateModel( - name='GraphImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(blank=True, default='', max_length=150, null=True)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ], - ), - migrations.CreateModel( - name='IndoorVirtualRaceResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), - ('username', models.CharField(max_length=150)), - ('workoutid', models.IntegerField(null=True)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('points', models.FloatField(default=0)), - ('boatclass', models.CharField(choices=[('rower', 'Indoor Rower'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides')], default='rower', max_length=40, verbose_name='Ergometer Class')), - ('coursecompleted', models.BooleanField(default=False)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), - ('age', models.IntegerField(null=True)), - ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive challenge notifications by email')), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - migrations.CreateModel( - name='PaidPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('shortname', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], max_length=50)), - ('name', models.CharField(max_length=200)), - ('external_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('price', models.FloatField(blank=True, default=None, null=True)), - ('paymentprocessor', models.CharField(choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('active', models.BooleanField(default=True)), - ('clubsize', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='PlannedSession', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, verbose_name='Name')), - ('comment', models.TextField(blank=True, max_length=1000)), - ('startdate', models.DateField(default=rowers.models.current_day, verbose_name='On or After')), - ('enddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='On or Before')), - ('preferreddate', models.DateField(default=rowers.models.a_week_from_now, verbose_name='Preferred Date')), - ('sessiontype', models.CharField(choices=[('session', 'Training Session'), ('challenge', 'Challenge'), ('test', 'Mandatory Test'), ('cycletarget', 'Total for a time period'), ('coursetest', 'OTW test over a course'), ('race', 'Virtual challenge'), ('indoorrace', 'Indoor Virtual challenge')], default='session', max_length=150, verbose_name='Session Type')), - ('sessionvalue', models.IntegerField(default=60, verbose_name='Value')), - ('max_nr_of_workouts', models.IntegerField(default=0, verbose_name='Maximum number of workouts')), - ('sessionunit', models.CharField(choices=[('min', 'minutes'), ('m', 'meters'), ('None', None)], default='min', max_length=150, verbose_name='Unit')), - ('criterium', models.CharField(choices=[('none', 'Approximately'), ('minimum', 'At Least'), ('exact', 'Exactly')], default='none', max_length=150, verbose_name='Criteria')), - ('verification', models.CharField(choices=[('none', 'None'), ('automatic', 'Automatic'), ('manual', 'Manual')], default='none', max_length=150)), - ('sessionmode', models.CharField(choices=[('distance', 'Distance'), ('time', 'Time'), ('rScore', 'rScore'), ('TRIMP', 'TRIMP')], default='time', max_length=150, verbose_name='Session Mode')), - ('hasranking', models.BooleanField(default=False)), - ('is_template', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='PlannedSessionComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ], - ), - migrations.CreateModel( - name='PowerTimeFitnessMetric', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(default=rowers.models.current_day)), - ('last_workout', models.IntegerField(default=0)), - ('PowerFourMin', models.FloatField(default=0)), - ('PowerTwoK', models.FloatField(default=0)), - ('PowerOneHour', models.FloatField(default=0)), - ('workoutmode', models.CharField(choices=[('rower', 'Rower'), ('water', 'On the water')], default='rower', max_length=41)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'db_table': 'powertimefitnessmetric', - }, - ), - migrations.CreateModel( - name='RaceLogo', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('filename', models.CharField(default='', max_length=150)), - ('creationdatetime', models.DateTimeField()), - ('width', models.IntegerField(default=1200)), - ('height', models.IntegerField(default=600)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Rower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country', django_countries.fields.CountryField(blank=True, default=None, max_length=2, null=True)), - ('street_address', models.CharField(blank=True, default='', max_length=200, null=True)), - ('city', models.CharField(blank=True, default='', max_length=200, null=True)), - ('postal_code', models.CharField(blank=True, default='', max_length=200, null=True)), - ('customer_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('subscription_id', models.CharField(blank=True, default=None, max_length=200, null=True)), - ('rowerplan', models.CharField(choices=[('basic', 'basic'), ('pro', 'pro'), ('plan', 'plan'), ('coach', 'coach'), ('freecoach', 'freecoach')], default='basic', max_length=30)), - ('paymenttype', models.CharField(choices=[('single', 'single'), ('recurring', 'recurring')], default='single', max_length=30, verbose_name='Payment Type')), - ('paymentprocessor', models.CharField(blank=True, choices=[('paypal', 'PayPal'), ('braintree', 'BrainTree')], default='braintree', max_length=50, null=True)), - ('planexpires', models.DateField(default=rowers.models.current_day)), - ('teamplanexpires', models.DateField(default=rowers.models.current_day)), - ('clubsize', models.IntegerField(default=0)), - ('protrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('plantrialexpires', models.DateField(default=datetime.date(1970, 1, 1))), - ('offercoaching', models.BooleanField(default=False, verbose_name='Offer Remote Coaching')), - ('gdproptin', models.BooleanField(default=False)), - ('gdproptindate', models.DateTimeField(blank=True, null=True)), - ('surveydone', models.BooleanField(default=False)), - ('surveydonedate', models.DateTimeField(blank=True, null=True)), - ('max', models.IntegerField(default=192, verbose_name='Max Heart Rate')), - ('rest', models.IntegerField(default=48, verbose_name='Resting Heart Rate')), - ('ut2', models.IntegerField(default=105, verbose_name='UT2 band lower HR')), - ('ut1', models.IntegerField(default=146, verbose_name='UT1 band lower HR')), - ('at', models.IntegerField(default=160, verbose_name='AT band lower HR')), - ('tr', models.IntegerField(default=167, verbose_name='TR band lower HR')), - ('an', models.IntegerField(default=180, verbose_name='AN band lower HR')), - ('hrftp', models.IntegerField(default=0, verbose_name='FTP heart rate')), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=30)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30)), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), - ('birthdate', models.DateField(blank=True, null=True)), - ('ftp', models.IntegerField(default=226, verbose_name='Functional Threshold Power')), - ('p0', models.FloatField(default=1.0, verbose_name='CP p1')), - ('p1', models.FloatField(default=1.0, verbose_name='CP p2')), - ('p2', models.FloatField(default=1.0, verbose_name='CP p3')), - ('p3', models.FloatField(default=1.0, verbose_name='CP p4')), - ('cpratio', models.FloatField(default=1.0, verbose_name='CP fit ratio')), - ('ep0', models.FloatField(default=1.0, verbose_name='erg CP p1')), - ('ep1', models.FloatField(default=1.0, verbose_name='erg CP p2')), - ('ep2', models.FloatField(default=1.0, verbose_name='erg CP p3')), - ('ep3', models.FloatField(default=1.0, verbose_name='erg CP p4')), - ('ecpratio', models.FloatField(default=1.0, verbose_name='erg CP fit ratio')), - ('otwslack', models.IntegerField(default=0, verbose_name='OTW Power slack')), - ('pw_ut2', models.IntegerField(default=124, verbose_name='UT2 Power')), - ('pw_ut1', models.IntegerField(default=171, verbose_name='UT1 Power')), - ('pw_at', models.IntegerField(default=203, verbose_name='AT Power')), - ('pw_tr', models.IntegerField(default=237, verbose_name='TR Power')), - ('pw_an', models.IntegerField(default=273, verbose_name='AN Power')), - ('powerzones', rowers.models.PowerZonesField(default=['Rest', 'Pwr UT2', 'Pwr UT1', 'Pwr AT', 'Pwr TR', 'Pwr AN'])), - ('workflowleftpanel', rowers.models.TemplateListField(default=['panel_navigationheader.html', 'panel_editbuttons.html', 'panel_advancededit.html', 'panel_editintervals.html', 'panel_stats.html', 'panel_staticchart.html', 'panel_uploadimage.html'])), - ('workflowmiddlepanel', rowers.models.TemplateListField(default=['panel_middlesocial.html', 'panel_statcharts.html', 'flexthumbnails.html', 'panel_summary.html', 'panel_map.html'])), - ('defaultlandingpage', models.CharField(choices=[('workout_edit_view', 'Edit View'), ('workout_workflow_view', 'Workflow View'), ('workout_stats_view', 'Stats View'), ('workout_data_view', 'Data Explore View'), ('workout_summary_edit_view', 'Intervals Editor')], default='workout_edit_view', max_length=200, verbose_name='Default Landing Page')), - ('c2token', models.CharField(blank=True, default='', max_length=200, null=True)), - ('tokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('c2refreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('c2_auto_export', models.BooleanField(default=False)), - ('c2_auto_import', models.BooleanField(default=False)), - ('sporttrackstoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttrackstokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('sporttracksrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('sporttracks_auto_export', models.BooleanField(default=False)), - ('underarmourtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('underarmourtokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('underarmourrefreshtoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('mapmyfitness_auto_export', models.BooleanField(default=False)), - ('tptoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('tptokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('tprefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('trainingpeaks_auto_export', models.BooleanField(default=False)), - ('polartoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polartokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('polarrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('polaruserid', models.IntegerField(default=0)), - ('polar_auto_import', models.BooleanField(default=False)), - ('garmintoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('garminrefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravatoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('stravatokenexpirydate', models.DateTimeField(blank=True, null=True)), - ('stravarefreshtoken', models.CharField(blank=True, default='', max_length=1000, null=True)), - ('stravaexportas', models.CharField(choices=[('Ride', 'Ride'), ('Kitesurf', 'Kitesurf'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('RockClimbing', 'RockClimbing'), ('Hike', 'Hike'), ('RollerSki', 'RollerSki'), ('Walk', 'Walk'), ('Rowing', 'Rowing'), ('AlpineSki', 'AlpineSki'), ('Snowboard', 'Snowboard'), ('BackcountrySki', 'BackcountrySki'), ('Snowshoe', 'Snowshoe'), ('Canoeing', 'Canoeing'), ('StairStepper', 'StairStepper'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('EBikeRide', 'EBikeRide'), ('Surfing', 'Surfing'), ('Elliptical', 'Elliptical'), ('VirtualRide', 'VirtualRide'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Windsurf', 'Windsurf'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('Yoga', 'Yoga')], default='Rowing', max_length=30, verbose_name='Export Workouts to Strava as')), - ('strava_owner_id', models.BigIntegerField(default=0)), - ('strava_auto_export', models.BooleanField(default=False)), - ('strava_auto_import', models.BooleanField(default=False)), - ('strava_auto_delete', models.BooleanField(default=False)), - ('runkeepertoken', models.CharField(blank=True, default='', max_length=200, null=True)), - ('runkeeper_auto_export', models.BooleanField(default=False)), - ('getemailnotifications', models.BooleanField(default=False, verbose_name='Receive email notifications')), - ('emailbounced', models.BooleanField(default=False, verbose_name='Email Address Bounced')), - ('getimportantemails', models.BooleanField(default=True, verbose_name='Get Important Emails')), - ('privacy', models.CharField(choices=[('visible', 'Visible'), ('hidden', 'Hidden')], default='visible', max_length=30)), - ('defaulttimezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100, verbose_name='Default Time Zone')), - ('showfavoritechartnotes', models.BooleanField(default=True, verbose_name='Show Notes for Favorite Charts')), - ('staticgrids', models.CharField(choices=[('none', None), ('both', 'both'), ('x', 'x'), ('y', 'y')], default='both', max_length=50, null=True, verbose_name='Chart Grid')), - ('slowpaceerg', models.DurationField(default=datetime.timedelta(seconds=160), verbose_name='Slowest Erg Pace')), - ('fastpaceerg', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest Erg Pace')), - ('slowpaceotw', models.DurationField(default=datetime.timedelta(seconds=240), verbose_name='Slowest OTW Pace')), - ('fastpaceotw', models.DurationField(default=datetime.timedelta(seconds=85), verbose_name='Fastest OTW Pace')), - ('autojoin', models.BooleanField(default=False, verbose_name='Auto Join Workout Segments')), - ('coachinggroups', models.ManyToManyField(related_name='coaches', to='rowers.CoachingGroup')), - ('friends', models.ManyToManyField(blank=True, related_name='_rower_friends_+', to='rowers.Rower')), - ('mycoachgroup', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='coachingrole', to='rowers.CoachingGroup')), - ('paidplan', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PaidPlan')), - ], - ), - migrations.CreateModel( - name='ShareKey', - fields=[ - ('location', models.TextField()), - ('token', models.CharField(max_length=40, primary_key=True, serialize=False)), - ('creation_date', models.DateTimeField(auto_now_add=True)), - ('expiration_seconds', models.BigIntegerField()), - ], - ), - migrations.CreateModel( - name='SiteAnnouncement', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateField(default=rowers.models.current_day)), - ('announcement', models.TextField(max_length=280)), - ('expires', models.DateField(default=rowers.models.current_day)), - ('modified', models.DateField(default=rowers.models.current_day)), - ('dotweet', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='StandardCollection', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('active', models.BooleanField(default=True)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Team', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=150, unique=True, verbose_name='Team Name')), - ('notes', models.CharField(blank=True, max_length=200, verbose_name='Team Purpose')), - ('private', models.CharField(choices=[('private', 'private'), ('open', 'open')], default='open', max_length=30, verbose_name='Team Type')), - ('viewing', models.CharField(choices=[('coachonly', 'Coach Only'), ('allmembers', 'All Members')], default='allmembers', max_length=30, verbose_name='Sharing Behavior')), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TeamInvite', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('email', models.CharField(blank=True, max_length=150, null=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TeamRequest', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('issuedate', models.DateField(default=rowers.models.current_day)), - ('code', models.CharField(max_length=150, unique=True)), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Team')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='TombStone', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('uploadedtoc2', models.IntegerField(default=0)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower')), - ], - ), - migrations.CreateModel( - name='TrainingMacroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ], - ), - migrations.CreateModel( - name='TrainingMesoCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMacroCycle')), - ], - ), - migrations.CreateModel( - name='TrainingMicroCycle', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('type', models.CharField(choices=[('filler', 'System Defined'), ('userdefined', 'User Defined')], default='filler', max_length=150)), - ('plantime', models.IntegerField(default=0, verbose_name='Planned Duration')), - ('plandistance', models.IntegerField(default=0, verbose_name='Planned Distance')), - ('planrscore', models.IntegerField(default=0, verbose_name='Planned rScore')), - ('plantrimp', models.IntegerField(default=0, verbose_name='Planned TRIMP')), - ('actualtime', models.IntegerField(default=0, verbose_name='Actual Duration')), - ('actualdistance', models.IntegerField(default=0, verbose_name='Actual Distance')), - ('actualrscore', models.IntegerField(default=0, verbose_name='Actual rScore')), - ('actualtrimp', models.IntegerField(default=0, verbose_name='Actual TRIMP')), - ('plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingMesoCycle')), - ], - ), - migrations.CreateModel( - name='TrainingPlan', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('status', models.BooleanField(default=True, verbose_name='Active')), - ('startdate', models.DateField(default=rowers.models.current_day)), - ('notes', models.CharField(blank=True, max_length=200, null=True, verbose_name='Plan Notes')), - ('enddate', models.DateField(default=rowers.models.half_year_from_now)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='planmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='planathletes', to='rowers.Rower', verbose_name='Athletes')), - ], - ), - migrations.CreateModel( - name='TrainingTarget', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150)), - ('date', models.DateField(default=rowers.models.half_year_from_now)), - ('notes', models.TextField(blank=True, max_length=300)), - ('manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='targetmanager', to='rowers.Rower')), - ('rowers', models.ManyToManyField(related_name='targetathletes', to='rowers.Rower', verbose_name='Athletes')), - ], - ), - migrations.CreateModel( - name='VideoAnalysis', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, default='', max_length=150, null=True)), - ('video_id', models.CharField(default='', max_length=150)), - ('delay', models.IntegerField(default=0)), - ('metricsgroups', rowers.models.TemplateListField(default=['basic'])), - ], - ), - migrations.CreateModel( - name='VirtualRaceFollower', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('emailaddress', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email Address')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='VirtualRaceResult', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('userid', models.IntegerField(default=0)), - ('teamname', models.CharField(blank=True, max_length=80, null=True, verbose_name='Team Name')), - ('username', models.CharField(max_length=150)), - ('workoutid', models.IntegerField(null=True)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Class')), - ('skillclass', models.CharField(default='Open', max_length=50, verbose_name='Skill Class')), - ('duration', models.TimeField(default=datetime.time(1, 0))), - ('distance', models.IntegerField(default=0)), - ('points', models.FloatField(default=0)), - ('boatclass', models.CharField(choices=[('water', 'Standard Racing Shell'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat')], default='water', max_length=40, verbose_name='Boat Class')), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=40, verbose_name='Boat Type')), - ('coursecompleted', models.BooleanField(default=False)), - ('sex', models.CharField(choices=[('male', 'male'), ('female', 'female'), ('not specified', 'not specified')], default='not specified', max_length=30, verbose_name='Gender')), - ('age', models.IntegerField(null=True)), - ('emailnotifications', models.BooleanField(default=True, verbose_name='Receive challenge notifications by email')), - ('startsecond', models.FloatField(default=0)), - ('endsecond', models.FloatField(default=0)), - ('referencespeed', models.FloatField(default=5.0)), - ('acceptsocialmedia', models.BooleanField(default=True, verbose_name='I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)')), - ('entrycategory', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.CourseStandard', verbose_name='Group')), - ], - ), - migrations.CreateModel( - name='Workout', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(blank=True, max_length=150, null=True)), - ('date', models.DateField(blank=True, null=True)), - ('workouttype', models.CharField(choices=[('water', 'Standard Racing Shell'), ('rower', 'Indoor Rower'), ('skierg', 'Ski Erg'), ('bikeerg', 'Bike Erg'), ('dynamic', 'Dynamic Indoor Rower'), ('slides', 'Indoor Rower on Slides'), ('paddle', 'Paddle Adapter'), ('snow', 'On-snow'), ('coastal', 'Coastal'), ('c-boat', 'Dutch C boat'), ('churchboat', 'Finnish Church boat'), ('Ride', 'Ride'), ('Bike', 'Bike'), ('Run', 'Run'), ('NordicSki', 'NordicSki'), ('Swim', 'Swim'), ('Hike', 'Hike'), ('Walk', 'Walk'), ('Canoeing', 'Canoeing'), ('Crossfit', 'Crossfit'), ('StandUpPaddling', 'StandUpPaddling'), ('IceSkate', 'IceSkate'), ('WeightTraining', 'WeightTraining'), ('InlineSkate', 'InlineSkate'), ('Kayaking', 'Kayaking'), ('Workout', 'Workout'), ('Yoga', 'Yoga'), ('other', 'Other')], max_length=50, verbose_name='Exercise/Boat Class')), - ('workoutsource', models.CharField(default='unknown', max_length=100)), - ('boattype', models.CharField(choices=[('1x', '1x (single)'), ('2x', '2x (double)'), ('2x+', '2x+ (coxed double)'), ('2-', '2- (pair)'), ('2+', '2+ (coxed pair)'), ('3x+', '3x+ (coxed triple)'), ('3x-', '3x- (triple)'), ('4x', '4x (quad)'), ('4x+', '4x+ (coxed quad)'), ('4-', '4- (four)'), ('4+', '4+ (coxed four)'), ('8+', '8+ (eight)'), ('8x+', '8x+ (octuple scull)')], default='1x', max_length=50, verbose_name='Boat Type')), - ('boatbrand', models.CharField(choices=[('other', 'Other'), ('alden', 'Alden Rowing'), ('averowing', 'AveRowing Boats'), ('aylings', 'Aylings'), ('bbg', 'BBG'), ('burgashell', 'Burgashell'), ('burton', 'Burton Water Sports'), ('douglas', 'Carl Douglas Racing Shells'), ('carbocraft', 'Carbocraft'), ('colley', 'Colley'), ('cucchietti', 'Cucchietti'), ('dirigo', 'Dirigo'), ('drew', 'Drew Harrison Racing'), ('echo', 'Echo Rowing'), ('edon', 'Edon TS515 Sculling Boats'), ('edwin', 'Edwin Phelps'), ('empacher', 'Empacher'), ('eton', 'Eton Racing Boats (ERB)'), ('euro', 'Euro Diffusions'), ('filippi', 'Filippi Boats'), ('fluidesign', 'Fluidesign'), ('dragon', 'Flying Dragon Boat Co (Huangzhou, China)'), ('gig', 'Gig Harbor Boat Works'), ('sharrow', 'George Sharrow Racing Shells'), ('harris', 'Harris'), ('hitech', 'Hi-Tech'), ('hudson', 'Hudson Boatworks'), ('janousek', 'Janousek Racing Boats'), ('waugh', 'John Waugh Racing Boats'), ('laszlo', 'Laszlo Boats NZ'), ('leo', 'Leo Coastal Rowing'), ('levator', 'Levator Boatworks'), ('liangjin', 'Liangjin Boat'), ('liteboat', 'LiteBoat'), ('littleriver', 'Little River Marine'), ('kaschper', 'Kaschper Racing Shells'), ('kanghua', 'Kanghua'), ('king', 'King Racing Shells'), ('kiwi', 'Kiwi International Rowing Skiffs (KIRS)'), ('lola', 'Lola Aylings'), ('maas', 'Maas Rowing Shells'), ('maas', 'Maas Boat (coastal)'), ('nelo', 'Nelo Rowing'), ('owen', 'Owen'), ('peinert', 'Peinert'), ('pocock', 'Pocock Racing Shells'), ('race1', 'Race 1 Australia'), ('radley', 'Radley'), ('resolute', 'Resolute Racing Shells'), ('salani', 'Salani'), ('schoenbrod', 'Helmut Schoenbrod'), ('salterbros', 'Salter Bros'), ('sims', 'Ray Sims'), ('slracing', 'SL Racing'), ('stampfli', 'Stämpfli Racing Boats'), ('sutton', 'Sutton'), ('swastik', 'Swastik fibchem industry'), ('swift', 'Swift Racing'), ('sykes', 'Sykes Racing'), ('vandusen', 'Van Dusen'), ('vega', 'Vega'), ('vespoli', 'Vespoli'), ('vicente', 'Vicente Dors'), ('virus', 'Virus'), ('whitehall', 'Whitehall Rowing'), ('wiersma', 'Roeiwerf Wiersma'), ('wintech', 'WinTech Racing'), ('worcester', 'Worcester Oar & Paddle (Joe Garafolo)'), ('swastik', 'Swastik Boats')], default='', max_length=50, verbose_name='Boat Brand')), - ('adaptiveclass', models.CharField(choices=[('None', 'Open'), ('PR1', 'PR1 (Arms and Shoulders)'), ('PR2', 'PR2 (Trunk and Arms)'), ('PR3', 'PR3 (Leg Trunk and Arms)'), ('FES', 'FES (Functional Electrical Stimulation)')], default='None', max_length=50, verbose_name='Adaptive Classification')), - ('starttime', models.TimeField(default=datetime.time(12, 0))), - ('startdatetime', models.DateTimeField(blank=True, null=True)), - ('timezone', models.CharField(default='UTC', max_length=100)), - ('distance', models.IntegerField(blank=True, default=0)), - ('duration', models.TimeField(blank=True)), - ('dragfactor', models.IntegerField(blank=True, default=0)), - ('trimp', models.IntegerField(blank=True, default=-1)), - ('rscore', models.IntegerField(blank=True, default=-1)), - ('hrtss', models.IntegerField(blank=True, default=-1)), - ('normp', models.IntegerField(blank=True, default=-1)), - ('normv', models.FloatField(blank=True, default=-1)), - ('normw', models.FloatField(blank=True, default=-1)), - ('weightcategory', models.CharField(choices=[('hwt', 'open-weight'), ('lwt', 'light-weight')], default='hwt', max_length=10, verbose_name='Weight Category')), - ('weightvalue', models.FloatField(blank=True, default=80.0, verbose_name='Average Crew Weight (kg)')), - ('csvfilename', models.CharField(blank=True, max_length=150)), - ('uploadedtoc2', models.IntegerField(default=0)), - ('averagehr', models.IntegerField(blank=True, null=True)), - ('maxhr', models.BigIntegerField(blank=True, null=True)), - ('uploadedtostrava', models.BigIntegerField(default=0)), - ('uploadedtosporttracks', models.BigIntegerField(default=0)), - ('uploadedtounderarmour', models.BigIntegerField(default=0)), - ('uploadedtotp', models.BigIntegerField(default=0)), - ('uploadedtorunkeeper', models.BigIntegerField(default=0)), - ('uploadedtogarmin', models.BigIntegerField(default=0)), - ('forceunit', models.CharField(choices=[('lbs', 'lbs'), ('N', 'N')], default='lbs', max_length=100)), - ('inboard', models.FloatField(default=0.88)), - ('oarlength', models.FloatField(default=2.89)), - ('notes', models.CharField(blank=True, max_length=1000, null=True)), - ('summary', models.TextField(blank=True)), - ('privacy', models.CharField(choices=[('private', 'Private'), ('visible', 'Visible')], default='visible', max_length=30)), - ('rankingpiece', models.BooleanField(default=False, verbose_name='Ranking Piece')), - ('duplicate', models.BooleanField(default=False, verbose_name='Duplicate Workout')), - ('impeller', models.BooleanField(default=False, verbose_name='Impeller')), - ], - ), - migrations.CreateModel( - name='WorkoutComment', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('comment', models.TextField(max_length=300)), - ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('read', models.BooleanField(default=False)), - ('notification', models.BooleanField(default=True, verbose_name='Subscribe to new comment notifications')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), - ('workout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout')), - ], - ), - migrations.CreateModel( - name='VirtualRace', - fields=[ - ('plannedsession_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rowers.PlannedSession')), - ('registration_form', models.CharField(choices=[('windowstart', 'Start of challenge Window'), ('windowend', 'End of challenge Window'), ('deadline', 'Evaluation Closure Deadline'), ('manual', 'Manual - select below')], default='windowstart', max_length=100, verbose_name='Registration Closure Quick Selector')), - ('registration_closure', models.DateTimeField(blank=True, null=True)), - ('evaluation_closure', models.DateTimeField(blank=True, null=True)), - ('start_time', models.TimeField(blank=True, null=True)), - ('end_time', models.TimeField(blank=True, null=True)), - ('country', models.CharField(blank=True, max_length=100)), - ('timezone', models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Sydney', 'Australia/Sydney'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GMT', 'GMT'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('US/Alaska', 'US/Alaska'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('UTC', 'UTC')], default='UTC', max_length=100)), - ('contact_phone', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])), - ('contact_email', models.EmailField(blank=True, max_length=254, validators=[django.core.validators.EmailValidator()])), - ('coursestandards', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.StandardCollection', verbose_name='Standard Times')), - ], - bases=('rowers.plannedsession',), - ), - migrations.AddField( - model_name='workout', - name='plannedsession', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.PlannedSession', verbose_name='Session'), - ), - migrations.AddField( - model_name='workout', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.AddField( - model_name='workout', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='videoanalysis', - name='workout', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), - ), - migrations.AddField( - model_name='trainingplan', - name='target', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.TrainingTarget'), - ), - migrations.AddField( - model_name='trainingmacrocycle', - name='plan', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.TrainingPlan'), - ), - migrations.AddField( - model_name='rower', - name='team', - field=models.ManyToManyField(blank=True, related_name='rower', to='rowers.Team'), - ), - migrations.AddField( - model_name='rower', - name='user', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsessioncomment', - name='plannedsession', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), - ), - migrations.AddField( - model_name='plannedsessioncomment', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsession', - name='course', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.GeoCourse', verbose_name='OTW Course'), - ), - migrations.AddField( - model_name='plannedsession', - name='manager', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='plannedsession', - name='rower', - field=models.ManyToManyField(blank=True, to='rowers.Rower'), - ), - migrations.AddField( - model_name='plannedsession', - name='team', - field=models.ManyToManyField(blank=True, to='rowers.Team'), - ), - migrations.AddField( - model_name='graphimage', - name='workout', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Workout'), - ), - migrations.AddField( - model_name='geopoint', - name='polygon', - field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='points', to='rowers.GeoPolygon'), - ), - migrations.AddField( - model_name='geocourse', - name='manager', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='rowers.Rower'), - ), - migrations.AddField( - model_name='favoritechart', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AlterIndexTogether( - name='ergcpdata', - index_together={('user',)}, - ), - migrations.AlterIndexTogether( - name='cpergdata', - index_together={('user',)}, - ), - migrations.AlterIndexTogether( - name='cpdata', - index_together={('user',)}, - ), - migrations.AddField( - model_name='coursetestresult', - name='plannedsession', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.PlannedSession'), - ), - migrations.AddField( - model_name='coursestandard', - name='standardcollection', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='standards', to='rowers.StandardCollection'), - ), - migrations.AddField( - model_name='coachrequest', - name='coach', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='coachrequest', - name='user', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='coachoffer', - name='coach', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='coachoffer', - name='user', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='c2worldclassageperformance', - unique_together={('age', 'sex', 'weightcategory', 'distance')}, - ), - migrations.AddField( - model_name='alert', - name='filter', - field=models.ManyToManyField(related_name='filters', to='rowers.Condition', verbose_name='Filters'), - ), - migrations.AddField( - model_name='alert', - name='manager', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='alert', - name='measured', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='measured', to='rowers.Condition', verbose_name='Measuring'), - ), - migrations.AddField( - model_name='alert', - name='rower', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.Rower'), - ), - migrations.AddField( - model_name='virtualraceresult', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entries', to='rowers.VirtualRace'), - ), - migrations.AddField( - model_name='virtualracefollower', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), - ), - migrations.AlterUniqueTogether( - name='videoanalysis', - unique_together={('video_id', 'workout')}, - ), - migrations.AddField( - model_name='racelogo', - name='race', - field=models.ManyToManyField(related_name='logos', to='rowers.VirtualRace'), - ), - migrations.AddField( - model_name='indoorvirtualraceresult', - name='race', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rowers.VirtualRace'), - ), - migrations.AlterUniqueTogether( - name='coursestandard', - unique_together={('name', 'standardcollection')}, - ), - ] From b6202369c733cc54e640b57e822cc2544328582f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 3 Jun 2023 21:20:02 +0200 Subject: [PATCH 04/13] working on 3.9 --- boatmovers/apps.py | 3 +++ django_extensions/apps.py | 8 ++++++++ rowers/apps.py | 3 +++ rowers/dataroutines.py | 17 +++++++++++++---- rowers/interactiveplots.py | 27 ++++++++++++++------------- rowers/templates/flexchart3otw.html | 4 ++-- rowers/views/analysisviews.py | 27 +++++++++++++++++++++------ rowers/views/workoutviews.py | 2 ++ 8 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 django_extensions/apps.py diff --git a/boatmovers/apps.py b/boatmovers/apps.py index eb3806d9..9e5fbbb2 100644 --- a/boatmovers/apps.py +++ b/boatmovers/apps.py @@ -1,6 +1,9 @@ from django.apps import AppConfig +import os +from django.conf import settings class BoatmoversConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'boatmovers' + path = os.path.join(settings.BASE_DIR, 'boatmovers') diff --git a/django_extensions/apps.py b/django_extensions/apps.py new file mode 100644 index 00000000..88077107 --- /dev/null +++ b/django_extensions/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +import os +from django.conf import settings + + +class DjangoExtensionsConfig(AppConfig): + name = 'django_extensions' + path = os.path.join(settings.BASE_DIR, 'django_extensions') diff --git a/rowers/apps.py b/rowers/apps.py index 82adbc07..94f7b677 100644 --- a/rowers/apps.py +++ b/rowers/apps.py @@ -1,8 +1,11 @@ from django.apps import AppConfig +import os +from django.conf import settings # Store metadata for the app class RowersConfig(AppConfig): name = 'rowers' + path = os.path.join(settings.BASE_DIR, 'rowers') diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 94398d17..1d439969 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -1369,6 +1369,7 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): extracols = [] + columns = list(columns) + ['distance', 'spm', 'workoutid'] columns = [x for x in columns if x != 'None'] columns = list(set(columns)) @@ -1381,27 +1382,35 @@ def read_cols_df_sql(ids, columns, convertnewtons=True): elif len(ids) == 1: # pragma: no cover try: filename = 'media/strokedata_{id}.parquet.gz'.format(id=ids[0]) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) except OSError: rowdata, row = getrowdata(id=ids[0]) if rowdata and len(rowdata.df): _ = dataprep(rowdata.df, id=ids[0], bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(filename, columns=columns) + pq_file = pq.ParquetDataset(filename) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(filename, columns=columns_in_file) else: data = [] filenames = [ 'media/strokedata_{id}.parquet.gz'.format(id=id) for id in ids] for id, f in zip(ids, filenames): try: - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) except (OSError, IndexError, ArrowInvalid): rowdata, row = getrowdata(id=id) if rowdata and len(rowdata.df): # pragma: no cover _ = dataprep(rowdata.df, id=id, bands=True, otwpower=True, barchart=True) - df = pd.read_parquet(f, columns=columns) + pq_file = pq.ParquetDataset(f) + columns_in_file = [c for c in columns if c in pq_file.schema.names] + df = pd.read_parquet(f, columns=columns_in_file) data.append(df) try: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 067c47d9..2603e2d4 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4853,18 +4853,17 @@ def interactive_multiflex(datadf, xparam, yparam, groupby, extratitle='', TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap' if groupby != 'date': - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval{1.1}'), - (xparamname, '@x{1.1}'), - (yparamname, '@y') + hover = HoverTool(tooltips=[ + (groupby, '@groupval{1.1}'), + (xparamname, '@x{1.1}'), + (yparamname, '@y') ]) else: # pragma: no cover - hover = HoverTool(names=['data'], - tooltips=[ - (groupby, '@groupval'), - (xparamname, '@x{1.1}'), - (yparamname, '@y'), + hover = HoverTool( + tooltips=[ + (groupby, '@groupval'), + (xparamname, '@x{1.1}'), + (yparamname, '@y'), ]) hover.mode = 'mouse' @@ -6851,7 +6850,7 @@ def interactive_otw_advanced_pace_chart(id=0, promember=0): ) plot.title.text = row.name - plot.title.text_font_size = value("1.2em") + #plot.title.text_font_size = value("1.2em") plot.xaxis.axis_label = "Time" plot.yaxis.axis_label = "Pace (/500m)" plot.xaxis[0].formatter = DatetimeTickFormatter( @@ -7236,8 +7235,10 @@ def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', p.extra_y_ranges["yax2"] = Range1d(start=0, end=y2rangemax) p.line('date', 'hours', source=source2, y_range_name="yax2", color="black", width=5) - p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, - legend_label='Hours') + p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10) + +# p.circle('date', 'hours', source=source2, y_range_name="yax2", color="black", size=10, +# legend_label='Hours') p.add_layout(LinearAxis(y_range_name="yax2", axis_label='Hours'), 'right') diff --git a/rowers/templates/flexchart3otw.html b/rowers/templates/flexchart3otw.html index 5c965572..19f7cbeb 100644 --- a/rowers/templates/flexchart3otw.html +++ b/rowers/templates/flexchart3otw.html @@ -11,8 +11,8 @@ {{ js_res | safe }} {{ css_res| safe }} - - + + diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 46366473..e98a5f3f 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -414,11 +414,26 @@ def trendflexdata(workouts, options, userid=0): groups = datadf.groupby(pd.cut(datadf['days ago'], bins, labels=False)) - xvalues = groups.mean()[xparam] - yvalues = groups.mean()[yparam] - xerror = groups.std()[xparam] - yerror = groups.std()[yparam] - groupsize = groups.count()[xparam] + xvalues = [] + yvalues = [] + xerror = [] + yerror = [] + groupsize = [] + groupval = [] + for key, item in groups: + xvalues.append(groups.get_group(key)[xparam].mean()) + yvalues.append(groups.get_group(key)[yparam].mean()) + xerror.append(groups.get_group(key)[xparam].std()) + yerror.append(groups.get_group(key)[yparam].std()) + groupsize.append(len(groups.get_group(key)[xparam])) + groupval.append(groups.get_group(key)[groupby].mean()) + + + xvalues = pd.Series(xvalues) + yvalues = pd.Series(yvalues) + xerror = pd.Series(xerror) + yerror = pd.Series(yerror) + groupsize = pd.Series(groupsize) mask = groupsize <= min([0.01*groupsize.sum(), 0.2*groupsize.mean()]) xvalues.loc[mask] = np.nan @@ -458,7 +473,7 @@ def trendflexdata(workouts, options, userid=0): if groupby != 'date': try: - df['groupval'] = groups.mean()[groupby] + df['groupval'] = pd.Series(groupval) df.loc[mask, 'groupval'] = np.nan groupcols = df['groupval'] diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 42641229..2f59a0ab 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -3859,6 +3859,8 @@ def workout_stats_view(request, id=0, message="", successmessage=""): except KeyError: # pragma: no cover pass + datadf = datadf.select_dtypes([np.number]) + # Create a dict with correlation values cor = datadf.corr(method='spearman') cor.fillna(value=0, inplace=True) From 206ee219f3921339c1f937a485ff17de6a90b31b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 4 Jun 2023 09:26:36 +0200 Subject: [PATCH 05/13] fixing analysis data bokeh --- rowers/datautils.py | 2 +- rowers/interactiveplots.py | 5 +++-- rowers/templates/user_analysis_select.html | 21 ++++++++++++++------- rowers/views/analysisviews.py | 17 ++--------------- templates/newbase.html | 1 - 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/rowers/datautils.py b/rowers/datautils.py index 47581604..a13709f9 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -329,7 +329,7 @@ def getmaxwattinterval(tt, ww, i): w_roll = ww.rolling(i+2).mean().dropna() if len(w_roll): # now goes with # data points - should be fixed seconds - indexmax = w_roll.idxmax(axis=1) + indexmax = w_roll.idxmax(axis=0) # indexmaxpos = indexmax.get_loc(indexmax) indexmaxpos = indexmax try: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 2603e2d4..91bb53b1 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -3589,8 +3589,9 @@ def interactive_otwcpchart(powerdf, promember=0, rowername="", r=None, cpfit='da title = "Critical Power for "+rowername plot.title.text = title - xaxis = plot.select(dict(type=Axis, layout="below"))[0] - xaxis.formatter = PrintfTickFormatter() + #xaxis = plot.select(dict(type=Axis, layout="below")) #[0] + #print(xaxis) + #xaxis.formatter = PrintfTickFormatter() hover = plot.select(dict(type=HoverTool)) diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html index 45dd06ad..935fe39d 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -332,12 +332,18 @@
    - -
    - - + + + + +
    From 1a082d8908b5b81de53b361f3ce3b0209cbb1ecd Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 4 Jun 2023 16:53:55 +0200 Subject: [PATCH 06/13] 3.6.0 for py39 --- rowers/dataprep.py | 12 ++++++------ rowers/dataroutines.py | 10 +++++----- rowers/interactiveplots.py | 2 +- rowers/scoring.py | 2 ++ rowers/tasks.py | 3 ++- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 3999 bytes templates/newbase.html | 2 -- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index c042b4af..d68d01d4 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -786,9 +786,9 @@ def split_workout(r, parent, splitsecond, splitmode): data1.fillna(method='bfill', inplace=True) # Some new stuff to try out - data1 = data1.groupby('time', axis=0).mean() - data1['time'] = data1.index - data1.reset_index(drop=True, inplace=True) + #data1 = data1.groupby('time', axis=0).mean() + #data1['time'] = data1.index + #data1.reset_index(drop=True, inplace=True) data2 = data2.sort_values(['time']) data2 = data2.interpolate(method='linear', axis=0, limit_direction='both', @@ -796,9 +796,9 @@ def split_workout(r, parent, splitsecond, splitmode): data2.fillna(method='bfill', inplace=True) # Some new stuff to try out - data2 = data2.groupby('time', axis=0).mean() - data2['time'] = data2.index - data2.reset_index(drop=True, inplace=True) + #data2 = data2.groupby('time', axis=0).mean() + #data2['time'] = data2.index + #data2.reset_index(drop=True, inplace=True) data1['pace'] = data1['pace'] / 1000. data2['pace'] = data2['pace'] / 1000. diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 1d439969..74d82a9b 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -1480,7 +1480,7 @@ def datafusion(id1, id2, columns, offset): 'fpace', 'workoutid', 'id'], - 1, errors='ignore') + axis=1, errors='ignore') # Add coordinates to DataFrame latitude, longitude = get_latlon(id1) @@ -1503,7 +1503,7 @@ def datafusion(id1, id2, columns, offset): for c in df1.columns: if c not in keep1: - df1 = df1.drop(c, 1, errors='ignore') + df1 = df1.drop(c, axis=1, errors='ignore') df = pd.concat([df1, df2], ignore_index=True) df = df.sort_values(['time']) @@ -1512,9 +1512,9 @@ def datafusion(id1, id2, columns, offset): df.fillna(method='bfill', inplace=True) # Some new stuff to try out - df = df.groupby('time', axis=0).mean() - df['time'] = df.index - df.reset_index(drop=True, inplace=True) + #df = df.groupby('time',axis=0).mean() + #df['time'] = df.index + #df.reset_index(drop=True, inplace=True) df['time'] = df['time'] / 1000. df['pace'] = df['pace'] / 1000. diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 91bb53b1..c8da52f2 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4655,7 +4655,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}): ]) hover.mode = 'mouse' - hover.names = ["spm", "pace"] + # hover.name = ["spm", "pace"] script, div = components(plot) diff --git a/rowers/scoring.py b/rowers/scoring.py index ab692240..678f3a62 100644 --- a/rowers/scoring.py +++ b/rowers/scoring.py @@ -137,6 +137,8 @@ def save_scoring(name, user, filename, id=0, notes=""): adaptiveclass = 'None' except KeyError: # pragma: no cover adaptiveclass = 'None' + except AttributeError: + adaptiveclass = 'None' try: skillclass = row['SkillClass'] diff --git a/rowers/tasks.py b/rowers/tasks.py index fa27043c..99ab4353 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3691,12 +3691,13 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, newc2id = workout.uploadedtoc2 parkedids = [] - with open('c2blocked.json', 'r') as c2blocked: + with open('c2blocked.json', 'a+') as c2blocked: try: jsondata = json.load(c2blocked) parkedids = jsondata['ids'] except JSONDecodeError: # pragma: no cover parkedids = [] + newparkedids = [id for id in parkedids if id != newc2id] with open('c2blocked.json', 'wt') as c2blocked: diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 4d0a992ce943143fa3defe13b65bf38115b24992..d34d12c1e78589ea84a4c24a8b4484e1b80cd5f5 100644 GIT binary patch literal 3999 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 F0RTcDI&%O3 literal 4000 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 GfB^u#j6oOx diff --git a/templates/newbase.html b/templates/newbase.html index 1771e66e..b2c32821 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -12,8 +12,6 @@ {% block title %}Rowsandall Rowing Data Analytics{% endblock %} {% analytical_head_top %} - - From eb969b94091cad040d95b778839fce5f02d2306c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 5 Jun 2023 19:12:55 +0200 Subject: [PATCH 07/13] fixing more tests --- rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index d34d12c1e78589ea84a4c24a8b4484e1b80cd5f5..6fc8fb8843cf74b331ce9a370a75dc5a96ce510b 100644 GIT binary patch literal 4001 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 F0RTcDI&%O3 From 25dc93c76c1a59dc88d34948203e499c78bec5d6 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 5 Jun 2023 19:35:25 +0200 Subject: [PATCH 08/13] fix --- requirements38.txt | 298 ++++++++++++++++++++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 0 bytes 2 files changed, 298 insertions(+) create mode 100644 requirements38.txt diff --git a/requirements38.txt b/requirements38.txt new file mode 100644 index 00000000..47747bfd --- /dev/null +++ b/requirements38.txt @@ -0,0 +1,298 @@ +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 +astroid==2.11.7 +async-generator==1.10 +atomicwrites==1.3.0 +attrs==21.4.0 +autopep8==1.6.0 +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 +charset-normalizer==2.1.0 +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 +contourpy==1.0.6 +cookies==2.2.1 +coreapi==2.3.3 +coreschema==0.0.4 +coverage==5.5 +cramjam==2.5.0 +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 +dill==0.3.5.1 +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 +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 +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 +fastparquet==0.8.3 +fitparse==1.2.0 +flake8==4.0.1 +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 +h11==0.13.0 +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 +isort==5.10.1 +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 +lazy-object-proxy==1.7.1 +llvmlite==0.39.1 +locket==0.2.1 +lxml==4.7.1 +Markdown==3.0.1 +MarkupSafe==2.0.1 +matplotlib==3.5.0 +maxminddb==1.5.4 +mccabe==0.6.1 +MiniMockTest==0.5 +mistune==2.0.4 +mock==2.0.0 +more-itertools==8.12.0 +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 +numba==0.56.2 +oauth2==1.9.0.post1 +oauth2-provider==0.0 +oauthlib==3.0.1 +openapi-codec==1.3.2 +outcome==1.2.0 +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 +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 +psycopg2==2.8.1 +ptyprocess==0.6.0 +py==1.11.0 +pyarrow==2.0.0 +pycairo==1.19.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 +pyOpenSSL==20.0.1 +pyparsing==3.0.6 +pyrsistent==0.14.11 +pyshp==2.1.0 +PySocks==1.7.1 +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 +pyzmq==18.0.1 +qtconsole==4.4.3 +ratelim==0.1.6 +rauth==0.7.3 +redis==3.5.3 +requests==2.28.1 +requests-oauthlib==1.2.0 +rowingdata==3.5.29 +rowingphysics==0.5.0 +rq==1.10.1 +ruamel.yaml==0.17.21 +ruamel.yaml.clib==0.2.6 +rules==3.3 +ruptures==1.1.3 +s3transfer==0.3.4 +safety==1.10.3 +scipy==1.5.4 +SecretStorage==3.3.1 +selenium==4.3.0 +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 +sortedcontainers==2.4.0 +soupsieve==1.8 +SQLAlchemy==1.3.1 +sqlparse==0.3.0 +stravalib==0.10.4 +TatSu==5.6.1 +tblib==1.7.0 +termcolor==1.1.0 +terminado==0.12.1 +terminaltables==3.1.0 +testpath==0.4.2 +text-unidecode==1.2 +thrift==0.15.0 +thriftpy2==0.4.14 +timezonefinder==5.2.0 +tinycss2==1.1.1 +tk==0.1.0 +toml==0.10.2 +tomli==1.2.2 +tomlkit==0.11.1 +toolz==0.10.0 +tornado==6.1 +tqdm==4.31.1 +traitlets==5.4.0 +trio==0.21.0 +trio-websocket==0.9.2 +trueskill==0.4.5 +typing_extensions==4.0.1 +units==0.7 +uritemplate==3.0.0 +urllib3==1.26.10 +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 +wsproto==1.1.0 +xlrd==1.2.0 +xmltodict==0.12.0 +xyzservices==2022.9.0 +yamjam==0.1.7 +yamllint==1.15.0 +zipp==3.8.1 diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 4d0a992ce943143fa3defe13b65bf38115b24992..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 4000 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 GfB^u#j6oOx From 26e9050afb7f59ac624b25b016f6ca370c2d55da Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Jun 2023 07:51:26 +0200 Subject: [PATCH 09/13] more corrections --- rowers/dataroutines.py | 4 +- rowers/interactiveplots.py | 65 ++++++++++++++------------- rowers/tests/testdata/testdata.tcx.gz | 0 3 files changed, 36 insertions(+), 33 deletions(-) delete mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 74d82a9b..43807ca9 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 diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index c8da52f2..b4e4a6ed 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -365,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 @@ -431,7 +431,7 @@ def interactive_planchart(data, startdate, enddate): 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) @@ -597,7 +597,7 @@ def interactive_activitychart(workouts, startdate, enddate, stack='type', toolba 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=""" @@ -797,7 +797,7 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb 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) @@ -1092,7 +1092,7 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter' plot = figure(tools=TOOLS, toolbar_sticky=False, toolbar_location="above", width=800, height=600) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -1492,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() @@ -2016,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) @@ -2148,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='', @@ -3418,7 +3418,7 @@ def interactive_agegroupcpchart(age, normalized=False): 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') @@ -3456,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): @@ -3697,7 +3698,7 @@ def interactive_agegroup_plot(df, distance=2000, duration=None, TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' plot = figure(tools=TOOLS, width=900) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.circle('age', 'power', source=source, fill_color='red', size=15, legend_label='World Record') @@ -4075,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, @@ -4141,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) @@ -4205,7 +4206,7 @@ def forcecurve_multi_interactive_chart(selected): toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -4307,7 +4308,7 @@ def instroke_multi_interactive_chart(selected, *args, **kwargs): toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -4405,7 +4406,7 @@ def instroke_interactive_chart(df,metric, workout, spm_min, spm_max, toolbar_location='above', toolbar_sticky=False) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' plot.title.text = str(workout) + ' - ' + metric @@ -4592,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( @@ -4890,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, @@ -5124,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 @@ -5378,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() @@ -5537,10 +5538,10 @@ def interactive_flexchart_stacked(id, r, xparam='time', 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) @@ -5735,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() @@ -5944,7 +5945,7 @@ def interactive_flex_chart2(id, r, promember=0, tools=TOOLS, toolbar_location='above', toolbar_sticky=False, width=800, height=600, ) - plot.sizing_mode = 'stretch_both' + #plot.sizing_mode = 'stretch_both' # add watermark watermarkurl = "/static/img/logo7.png" @@ -5957,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, @@ -6052,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 @@ -6327,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() @@ -6382,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: @@ -6654,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, @@ -7226,7 +7227,7 @@ def interactive_zoneschart(rower, data, startdate, enddate, trainingzones='hr', 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() diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz deleted file mode 100644 index e69de29b..00000000 From 0b05fd52923a268cd3d47ba038f38e8efd278c7a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Jun 2023 07:53:34 +0200 Subject: [PATCH 10/13] return and improvement of the bad commit --- rowers/dataprep.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index d68d01d4..20573d2b 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1628,6 +1628,8 @@ def workout_trimp(w, reset=False): 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, From eed71c9cb9e3e8efc2d6ba4168d477a4c476d128 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Jun 2023 08:04:12 +0200 Subject: [PATCH 11/13] fix --- rowers/tests/testdata/testdata.tcx.gz | Bin 0 -> 4000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz new file mode 100644 index 0000000000000000000000000000000000000000..b4061536bfa590b581afbc03b3f086f900c760b4 GIT binary patch literal 4000 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 GfB^vbsT%$O literal 0 HcmV?d00001 From 978fffffe4349d2db591ab22cd069be8334188f7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 22 Jun 2023 15:39:48 +0200 Subject: [PATCH 12/13] modifying gitignore --- .gitignore | 1 + rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes 2 files changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d5a0d687..b7fe99e3 100644 --- a/.gitignore +++ b/.gitignore @@ -68,4 +68,5 @@ config.yaml /py27/ /py2/ /py39/ +/py39/ /django2/ diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index b4061536bfa590b581afbc03b3f086f900c760b4..71e3d13c5b238545c46b878b060f448351bca8ae 100644 GIT binary patch literal 4000 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 GfB^tGe?Z{? literal 4000 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 GfB^vbsT%$O From 3a65fccccd51e3ff36772e654feaaf49e7d0f4ef Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 22 Jun 2023 15:47:06 +0200 Subject: [PATCH 13/13] fix gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b7fe99e3..7f7af7f0 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,6 @@ config.yaml /venv39/ /py27/ /py2/ -/py39/ +/py38/ /py39/ /django2/