From 6ae85c26e7472dcfaccda62dcf343a81a7a8ba54 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 2 Jun 2023 17:55:06 +0200 Subject: [PATCH 01/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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 2b0369993ebf81570b30c13598c8ab8d8613a9c9 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 22 Jun 2023 08:31:56 +0200 Subject: [PATCH 12/15] adding re --- requirements38.txt | 270 ++++++++++++++++++++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 0 bytes 2 files changed, 270 insertions(+) create mode 100644 requirements38.txt delete mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/requirements38.txt b/requirements38.txt new file mode 100644 index 00000000..1ae4faf8 --- /dev/null +++ b/requirements38.txt @@ -0,0 +1,270 @@ +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 +atomicwrites==1.3.0 +attrs==19.1.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.0.9 +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 +cookies==2.2.1 +coreapi==2.3.3 +coreschema==0.0.4 +coverage==5.5 +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 +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-datetime-widget==0.9.3 +django-datetime-widget2==0.9.5 +django-debug-toolbar==2.0 +django-extensions==2.1.6 +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.5.0 +fitparse==1.2.0 +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 +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 +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 +llvmlite==0.36.0 +locket==0.2.1 +lxml==4.7.1 +Markdown==3.0.1 +MarkupSafe==2.0.1 +matplotlib==3.5.0 +maxminddb==1.5.4 +minify +MiniMockTest==0.5 +mistune==2.0.4 +mock==2.0.0 +more-itertools==6.0.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.53.1 +numpy==1.18.5 +oauth2==1.9.0.post1 +oauth2-provider==0.0 +oauthlib==3.0.1 +openapi-codec==1.3.2 +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 +pluggy==0.9.0 +prometheus-client==0.6.0 +prompt-toolkit==2.0.9 +protobuf==3.11.1 +psycopg2==2.8.1 +ptyprocess==0.6.0 +py==1.11.0 +pyarrow==2.0.0 +pycairo==1.19.0 +pycparser==2.19 +pyct==0.4.8 +Pygments==2.13.0 +PyJWT==2.1.0 +pyOpenSSL==20.0.1 +pyparsing==3.0.6 +pyrsistent==0.14.11 +pyshp==2.1.0 +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 +qtconsole==4.4.3 +ratelim==0.1.6 +rauth==0.7.3 +redis==3.5.3 +requests==2.23.0 +requests-oauthlib==1.2.0 +rowingdata==3.5.29 +rowingphysics==0.5.0 +rq==1.10.1 +rules==3.0 +ruptures==1.1.3 +s3transfer==0.3.4 +safety==1.10.3 +scipy==1.5.4 +SecretStorage==3.3.1 +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 +soupsieve==1.8 +SQLAlchemy==1.3.1 +sqlparse==0.3.0 +stravalib==0.10.4 +termcolor==1.1.0 +terminado==0.12.1 +terminaltables==3.1.0 +testpath==0.4.2 +text-unidecode==1.2 +thrift==0.15.0 +timezonefinder==5.2.0 +tinycss2==1.1.1 +tk==0.1.0 +toml==0.10.2 +tomli==1.2.2 +toolz==0.10.0 +tornado==6.1 +tqdm==4.31.1 +traitlets==5.4.0 +trueskill==0.4.5 +typing_extensions==4.0.1 +units==0.7 +uritemplate==3.0.0 +urllib3==1.25.9 +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 +xlrd==1.2.0 +xmltodict==0.12.0 +yamjam==0.1.7 +yamllint==1.15.0 +yuicompressor +zipp==3.8.1 diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz deleted file mode 100644 index 5a1186ca9cda5f19c4f7e7632fcd341d9afb0c3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4001 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 H#DD<+I9)uF From 978fffffe4349d2db591ab22cd069be8334188f7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 22 Jun 2023 15:39:48 +0200 Subject: [PATCH 13/15] 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 zcmV;R4`1*fiwFpWMU-R$|8!+@bYx+4VJ>uIcmVC4NpBoC7J%>m6@m}RVG#CP__!#F zf^35^U}u8Z$mBMt$Q8L~q?VvAFZuUFcH6RStB^ctieMG!gQ2djt?R2tzMV&3zd1iU zc-3ER*B6_w9-@JV2VWmQIC^%~tvBn<>398R=&!!-hVHj++aIKzH`}isz8Hqf!`15b z>(}PAyE_D(l&pg-yr znK#?#e}3TKyWzX;?BZ(OZ&$DI&-eem8&3B7_t%%gzjmonKzBWK{~I43KR7rzdiwy< z&&VI&Z}{Wj>E*@M@YTbA4lnwvhx;$n*N>hb6QKJ7g{>Cjyb&(`PtR}cT}*y{_WL!Vs?-B~{DX@7FDdA>as_D8Evw!S~$`}O_} zdeWyKyG{3*@8zS7@ArO(?-(&0t*$@4-{G4iYTar7k3QY~&)v{}dwITlHHSYg(=WN+ z{AlxS-woTJ`l~1F&C8+x_i*D!q|^M;oxSXj(WZ;+|9pRi)h(B}@%5AL&HDW1`Tyw# z#NBcOw_M`J*N-;4S9SQ~c=uNHiR|^3n-B7NpC0frVSbGJzi&{yTA!Y#TkD4x7tfEM zbeosmS)%yC)|-2GC;$E6?sr=*FV>sk=H~oGdI$c(ySUr!!y`X>CB)eA*JO9VJqg^T zK>ia7dlI)J_}~GPg?r|~Povny_O!98UYq-af^3Jdr?!F@KmUiR3Q*gJzP(ki^5AIkM z_W%`fm&82@l}4NQ#?6F#UGg5dBJSP<4^E@cJ6F<-V_FV(Uk`Ty;{#fayn8V+6YiCb z^A*`~!X|=^8ty?#+V4w}_fQdcXB-e{^tvcT_4(zW@okYW|bJHS}CC~RDPj!)} zYNmKPgk;Kz&XhxxlD-?Z%aM7OipX0NlTxpec@h%}l9vUMj}?(m=A0l0Rd~h~wd37# z$Xizrc?9Dul1k>2@n6z&=a)0j3sgj&jb#+pkT2}Jiwh!86_Ixaoz97a&X=6$Ews^o z67s=B5~~T%p${efclRRSM*C6ngvJqg)o35el3z}Q4y7Wij;s+tRB3oImbB-WMBavq z$R|CW3028g5KBhsEG=lX$BM{D6A-*rrQJ313n0&AT*Rm%pObS7l3$SDzNXQh#jpdf zndixtC2to*zM_Z?2Lk|JG~@+JM(6E){Px_ex-s%eeyu}Q8Wu?`>BCzT`HFmamJK6X zO_Y{=(G2@Wej@VDfK`$YFdLb#ZJw_vN^67h=~YzO^AU`18s6OJc|nszUS-cSK+%ZJ zf=2tAWL~UE&lX5S9&t9heT&kLlXu1o22GTf35(kEOCn#9J)bQ!wyJra8BLrCd2I9i z?c_P<-ZCI*JUQt_DVcR`UGv*dLS76o1eMGS6^+<5^3#y_CM1bR4SB~+=I=miR| zBtTF#$?#lM=6%!cCn3*#a2X~jd!{zt&Oo{PR^3Z*HdG| zIrr9iM9pX~2(yv-X3vk4kA?!opdufeZa@EsjZp5EqKeWAL(}c&FY{teNV>gB=55)m z>)2{(Cn4{Rur6XFQkH!4;Y~o^CfEkORb^d^Yvk`r-d04OOz^tuD)Bg*_Go5QM=%kIHQrkX*m7^@FZ0Mo0+A+4>u^5g zxp{I%$-A6&t?Gp62#f0WOCn#>XdewA22Fh4F%_+%_ANd?1^JwN8!%}4-a1P~b8nYK zz9M^`tRaW2n&*XPlY7gpetwj^H)xSmqrIb|_WXj#JF19$?wmlZ>2L2m7oF#qM7|>3 zK51(lQMGEB3*4f#3m`8BKvZ4MUE~&}o&RXh-iYWrA$n-!?@GQR-QI#>FDg%tM_W?E zyH_4w)9}X0bMAhs^4|Jn3C5OzIeYSAymhFF)%m0w6pYmgF36s*C_Zn4vB;>&$?@rJ zu`?lGn-4G4LtZe~(yG?9@KUsXen~Q4lZGd3ybx-9c;2~^e)~nu^A*|iNq#w!s>a59 z*D5OSNWP*dtwaM%pc?Iin~iSYytgCdg15oSSD3w zMnrDp=N_?1msax+RgX$dhA(p-7;~w~yWz9qnCP zi+T$3``laIJRd?)t8Pi;EAr$>ve1}7MLve2IXSM)^OKNwCRk!klokQXhH00Cz9LtS z#GG&sL4}^6p}%AQ(`v?hmpk9Os2lGQ7>lOd-v>QZhF&T{FS%g~=mvaCvq6uo-}NZ^ zU<3(Cg+8fnA~PjTKb+a1p#TslOw7stCQ$EwVhS z&<8ggsjmz@yL!+kJIw|Ht3n@rQ8jN#13p%Sp3_`UpqlFu!fepjHsIGJ_0BLLspfjb zvgI~QLeCYUk6FWyI;k(aYGFe^4f@;()v+ow3)76%H2ejimptIBLbixPMWgjgQu8V@ z?l>6o7*rZQy5`Nht8o|VL7&EMaJfI82E8xZ2lrkXnb3^8QS{aT5bLBq*x8`RX55XU z_X)kOiAK)mDvF*P`bp476RpyvL*R-UchtOjQ=m`EdPH5>4N`XeH>saJdNIyx(No!0 zX-krNs0e*9BBW}7jg%}x-_Xz7rQ>sFOzT8c#vLUEL1xlE2ivmrqv)++uWO%^7si-P z=cH!WkE8d7f&|@w@1ba6JvKFO3iOx+SXpp~6mT{jaj~Ukj-qFSPS-UHDHdJ0bWsC7 zRfOIdu%ye#W#HMYant7darD7NQC8nD+M+I)cSQxtjug&af2J)z`C>ZKpy_&6@;08v%?usdr&E z13tC{tx@#OSk$d$i0ot0#%a{-`bp47LlLb`!w+S{H{85=Q=qq$`)BFAc^qR?^X5O` zTQMNY!Yhj~n|OU~$=DSIZEe!nkYZG!Cu(#3{Lu@Ts9d-hEmP6RUGw2jgPu)vNILYE zXS2LnbL5Vr-?dEiDmBlFZ7!YpJ92j|6VdDDdMC3<&}wO!Bk04fWg_U7yg}=w8FzEH z>qBmtXhl%v$hDzW-`o{_s0e+?9kg^^HEb*!zTr0DPk|oMFpE=3y+GOJ>UlwG9#n+h z?piCT)I2HNMrld)^|m7P-jG!WZH1wzH_x^Ke+u*j28oeX=q=1Us=mXBCp-NNpM$pIHG7%7?&aRKt(lQr-o=pIyH_t=a z<&2^A(wPLk%jl!ZuJ_1AYwn;Kcaxxx#-lP1-&5HV3}`{yDbOS3hAK*_=dvXj(1Ny; zpqJcGg>+JHrD)_1nwmEW`e0Zv=%ij;(NvA5=1qd0l5t1M)(YOa=E$A9ODE=*iJ)E6 z)_Xsjxt?0kb`*UsvSv_)Z+!60u3rH9Xe3#8I;oF-Hg-KVHE#?(lM!om;hO-V+4T!R zFS+mvbm*}t`n*(78}KJU9}F<+`r(J1ygw84)Vz6P=<`a}fI)|z<808k_3Ovcvk5}F z$X$9-N^1DI6GcNm0eWXV+o*Es1cxPEI*URt6`_xLO4Z?U()M2HTg}}#ddbx{L6wmkV$n+5dky%lm(Do)kk_=;MeZULUF>X88h$NVIs&_u ztO32sksDEF6Yx%x(lp8afAw`_C$DEhpTH6y9K zdC~f!)i>1o=1qd0cZ-;-jJqhYt!_DUZ(c_4a^aN{y^BSqzBNjn27SzhS30{s258OG zX70^P=yxkwD$?p{tH<5t^@krXhJJhe z+1c>r4`=;(zZnib-);K*pc@Y0jsKmbKasxkC-B+n@a55Jf53zNncn@z{Q3IRdjI{= zcUOty#nsz=f9%rRb9M20+ijkAXJ@;ol|HUFr_Z~gOXuzOZ{kAL_vv)TQ*-~Lm2 zi+_B1{#&2!4B!iZ{r^X+8(-|7{O&OwKiHvOZ_;!4E}`tNzE4l%w{+>_2mb?KoWDuL 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 14/15] 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/ From 1cf5085fdb8bcd18b1eaaab5ea6549aee413374e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 22 Jun 2023 15:58:50 +0200 Subject: [PATCH 15/15] ch --- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 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 71e3d13c5b238545c46b878b060f448351bca8ae..eaaf5563407481517f9b99ec47587b5690838a36 100644 GIT binary patch delta 3643 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 delta 3643 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 N{{vr~ze&V^0RX%|g#Q2l