From 49ab756211d7f026ecc198fd0d1a08d8534e050f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 23 May 2024 09:17:00 +0200 Subject: [PATCH 1/9] attempt to django 4.2 --- .gitignore | 1 + requirementsdj4.2.txt | 220 +++++++++++++++++++++++++++++++++++ rowers/urls.py | 23 ++-- rowers/views/paymentviews.py | 4 +- rowers/views/statements.py | 2 +- rowsandall_app/settings.py | 12 +- 6 files changed, 245 insertions(+), 17 deletions(-) create mode 100644 requirementsdj4.2.txt diff --git a/.gitignore b/.gitignore index 7f7af7f0..031d78ef 100644 --- a/.gitignore +++ b/.gitignore @@ -69,4 +69,5 @@ config.yaml /py2/ /py38/ /py39/ +/py39b/ /django2/ diff --git a/requirementsdj4.2.txt b/requirementsdj4.2.txt new file mode 100644 index 00000000..d2fcab82 --- /dev/null +++ b/requirementsdj4.2.txt @@ -0,0 +1,220 @@ +aiohttp==3.8.4 +aiosignal==1.3.1 +alabaster==0.7.13 +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 +Babel==2.12.1 +backcall==0.2.0 +beautifulsoup4==4.12.2 +billiard==3.6.4.0 +bleach==6.0.0 +bokeh==3.1.1 +boto3==1.26.159 +botocore==1.29.159 +braintree==4.21.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 +coverage==7.2.7 +cramjam==2.6.2 +cryptography==41.0.1 +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-recaptcha==4.0.0 +django-rest-framework==0.1.0 +django-rest-swagger==2.2.0 +django-rq==2.5.1 +django-ses==2.0.0 +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 +docutils==0.20.1 +elementpath==4.3.0 +exceptiongroup==1.1.1 +execnet==2.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 +gunicorn==21.2.0 +h3==3.7.6 +holoviews==1.16.0 +httplib2==0.22.0 +humanize==4.6.0 +icalendar==5.0.7 +idna==3.4 +imagesize==1.4.1 +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 +jaraco.classes==3.2.3 +jedi==0.18.2 +jeepney==0.8.0 +Jinja2==3.0.3 +jmespath==1.0.1 +jsmin==3.0.1 +keyring==23.13.1 +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 +more-itertools==9.1.0 +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 +pkginfo==1.9.6 +pluggy==1.4.0 +polars==0.20.18 +prompt-toolkit==3.0.38 +protobuf==4.25.3 +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==8.1.1 +pytest-django==4.8.0 +pytest-runner==6.0.0 +pytest-xdist==3.5.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 +readme-renderer==37.3 +redis==4.5.5 +requests==2.31.0 +requests-oauthlib==1.2.0 +requests-toolbelt==1.0.0 +rfc3986==2.0.0 +rich==13.4.1 +rowingdata==3.6.8 +rowingphysics==0.5.2 +rq==1.15.0 +rules==3.3 +ruptures==1.1.7 +s3transfer==0.6.1 +scipy==1.10.1 +SecretStorage==3.3.3 +shortuuid==1.0.11 +simplejson==3.19.1 +six==1.16.0 +snowballstemmer==2.2.0 +soupsieve==2.4.1 +Sphinx==7.0.1 +sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.5 +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 +twine==4.0.2 +types-python-dateutil==2.9.0.20240316 +typing_extensions==4.6.3 +tzdata==2023.3 +uc-micro-py==1.0.2 +uritemplate==4.1.1 +urllib3==1.26.16 +uWSGI==2.0.24 +VerbalExpressions==0.0.2 +vine==5.0.0 +wcwidth==0.2.6 +webencodings==0.5.1 +Werkzeug==2.3.4 +xmlschema==3.0.2 +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/urls.py b/rowers/urls.py index a17520b9..cb040753 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -1,6 +1,6 @@ -from oauth2_provider.views import base +#from oauth2_provider.views import base from django.conf import settings -from django.conf.urls import url, include, handler404, handler500 +from django.conf.urls import include, handler404, handler500 from django.urls import path, re_path from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, permission_required @@ -42,14 +42,14 @@ from rowers.forms import ForceCurveMultipleCompareForm from rowers.models import ForceCurveAnalysis from rowers.interactiveplots import forcecurve_multi_interactive_chart, instroke_multi_interactive_chart -from oauth2_provider.views import ( - AuthorizedTokensListView, - AuthorizedTokenDeleteView, -) +#from oauth2_provider.views import ( +# AuthorizedTokensListView, +# AuthorizedTokenDeleteView, +#) -from oauth2_provider.views.base import ( - RevokeTokenView -) +#from oauth2_provider.views.base import ( +# RevokeTokenView +#) class PlannedSessionViewSet(viewsets.ModelViewSet): @@ -237,8 +237,9 @@ handler500 = views.error500_view urlpatterns = [ - re_path(r'^o/authorize/$', base.AuthorizationView.as_view(), name="authorize"), - re_path(r'^o/token/$', base.TokenView.as_view(), name="token"), + re_path(r'^oauth2/', include('provider.oauth2.urls', namespace = 'oauth2')), +# re_path(r'^o/authorize/$', base.AuthorizationView.as_view(), name="authorize"), +# re_path(r'^o/token/$', base.TokenView.as_view(), name="token"), re_path(r'^', include(router.urls)), re_path(r'^api-docs/$', views.schema_view, name='schema_view'), re_path(r'^api-auth/', include('rest_framework.urls', diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index c3fcf5ac..db8ea50e 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -1,4 +1,4 @@ -from django.utils.encoding import force_bytes, force_text +from django.utils.encoding import force_bytes, force_str from rowers.tokens import account_activation_token from django.contrib.sites.shortcuts import get_current_site from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode @@ -782,7 +782,7 @@ def downgrade_completed_view(request): def useractivate(request, uidb64, token): # pragma: no cover try: - uid = force_text(urlsafe_base64_decode(uidb64)) + uid = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(id=uid) except(TypeError, ValueError, OverflowError, User.DoesNotExist): user = None diff --git a/rowers/views/statements.py b/rowers/views/statements.py index fd7c2d99..4e9f852b 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -298,7 +298,7 @@ import stravalib from stravalib.exc import ActivityUploadFailed, TimeoutExceeded from rowers.weather import get_wind_data, get_airport_code, get_metar_data -from oauth2_provider.models import Application, Grant, AccessToken +# from oauth2_provider.models import Application, Grant, AccessToken import django_rq queue = django_rq.get_queue('default') diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 757c540e..40572359 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -71,7 +71,9 @@ INSTALLED_APPS = [ 'rest_framework', 'datetimewidget', 'rest_framework_swagger', - 'oauth2_provider', + # 'oauth2_provider', + 'provider', + 'provider.oauth2', 'corsheaders', 'analytical', 'cookielaw', @@ -86,10 +88,12 @@ INSTALLED_APPS = [ ] AUTHENTICATION_BACKENDS = ( - 'oauth2_provider.backends.OAuth2Backend', + #'oauth2_provider.backends.OAuth2Backend', # Uncomment following if you want to access the admin 'rules.permissions.ObjectPermissionBackend', 'django.contrib.auth.backends.ModelBackend', + 'django.contrib.auth.backends.ModelBackend', + 'django.contrib.auth.backends.RemoteUserBackend', ) MIDDLEWARE = [ @@ -105,7 +109,9 @@ MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'oauth2_provider.middleware.OAuth2TokenMiddleware', + # 'oauth2_provider.middleware.OAuth2TokenMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'provider.oauth2.middleware.Oauth2UserMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'tz_detect.middleware.TimezoneMiddleware', From 5f63b84d001f7852c4696123c65011281f9a1a33 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 26 May 2024 13:32:17 +0200 Subject: [PATCH 2/9] getting there --- boatmovers/urls.py | 32 +++++++++++++------------- rowers/ownapistuff.py | 2 +- rowers/tests/statements.py | 2 +- rowers/tests/test_analysis.py | 3 ++- rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4000 bytes rowers/urls.py | 1 + rowers/views/statements.py | 2 +- rowers/views/workoutviews.py | 8 ++----- rowsandall_app/settings.py | 6 ++--- 9 files changed, 27 insertions(+), 29 deletions(-) diff --git a/boatmovers/urls.py b/boatmovers/urls.py index b465970c..b993c755 100644 --- a/boatmovers/urls.py +++ b/boatmovers/urls.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.conf.urls import url, include +from django.conf.urls import include from django.urls import path, re_path from django.views.generic.base import TemplateView @@ -7,21 +7,21 @@ from django.views.generic.base import TemplateView import boatmovers.views as views urlpatterns = [ - url(r'athlete/add/$',views.AthleteCreateView.as_view(),name='athlete_add'), - url(r'athlete/(?P\d+)/$',views.athlete_view,name='athlete_view'), - url(r'crew/add/$',views.CrewCreateView.as_view(),name='crew_add'), - url(r'race/add/$',views.RaceCreateView.as_view(),name='race_add'), - url(r'result/add/$',views.ResultCreateView.as_view(),name='result_add'), - url(r'race/(?P\d+)/$',views.race_view,name='race_view'), - url(r'race/(?P\d+)/csv/$',views.race_add_csv,name='race_add_csv'), - url(r'race/(?P\d+)/timeteam/$',views.race_handle_timeteam,name='race_handle_timeteam'), - url(r'race/(?P\d+)/verify/$',views.race_verify,name='race_verify'), - url(r'race/(?P\d+)/process/$',views.race_process,name='race_process'), - url(r'race/(?P\d+)/deleteresults/$',views.race_delete_results, + re_path(r'athlete/add/$',views.AthleteCreateView.as_view(),name='athlete_add'), + re_path(r'athlete/(?P\d+)/$',views.athlete_view,name='athlete_view'), + re_path(r'crew/add/$',views.CrewCreateView.as_view(),name='crew_add'), + re_path(r'race/add/$',views.RaceCreateView.as_view(),name='race_add'), + re_path(r'result/add/$',views.ResultCreateView.as_view(),name='result_add'), + re_path(r'race/(?P\d+)/$',views.race_view,name='race_view'), + re_path(r'race/(?P\d+)/csv/$',views.race_add_csv,name='race_add_csv'), + re_path(r'race/(?P\d+)/timeteam/$',views.race_handle_timeteam,name='race_handle_timeteam'), + re_path(r'race/(?P\d+)/verify/$',views.race_verify,name='race_verify'), + re_path(r'race/(?P\d+)/process/$',views.race_process,name='race_process'), + re_path(r'race/(?P\d+)/deleteresults/$',views.race_delete_results, name='race_delete_results'), - url(r'crew/(?P\d+)/$',views.crew_view,name='crew_view'), - url(r'^$',views.boatmovers_view,name='boatmovers'), - url(r'^compare/$',views.boatmovers_compareview,name='boatmovers_compare'), + re_path(r'crew/(?P\d+)/$',views.crew_view,name='crew_view'), + re_path(r'^$',views.boatmovers_view,name='boatmovers'), + re_path(r'^compare/$',views.boatmovers_compareview,name='boatmovers_compare'), path(r'faq/', TemplateView.as_view(template_name='faq.html'), name='faq'), - #url(r'(?P\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers') + #re_path(r'(?P\b[0-9A-Fa-f]+\b)/$',views.boatmovers_view,name='boatmovers') ] diff --git a/rowers/ownapistuff.py b/rowers/ownapistuff.py index cf81c148..75c58d45 100644 --- a/rowers/ownapistuff.py +++ b/rowers/ownapistuff.py @@ -1,7 +1,7 @@ # Interactions with Rowsandall.com API. Not fully complete. # Python -import oauth2 as oauth +#import oauth2 as oauth import cgi import requests import requests.auth diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index c809c60e..47f64ae6 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -62,7 +62,7 @@ from rowers.utils import NoTokenError from rowers.plannedsessions import get_dates_timeperiod from shutil import copyfile, copy from nose.tools import assert_true -from mock import Mock, patch +from mock import Mock, patch, MagicMock #from minimocktest import MockTestCase import pandas as pd import polars as pl diff --git a/rowers/tests/test_analysis.py b/rowers/tests/test_analysis.py index 4bd98e36..c2bd1f89 100644 --- a/rowers/tests/test_analysis.py +++ b/rowers/tests/test_analysis.py @@ -1103,7 +1103,8 @@ class WorkoutStatsTestNew(TestCase): } request.COOKIES = SimpleCookie({'name': 'bla'}) # adding session - middleware = SessionMiddleware() + get_response = MagicMock() + middleware = SessionMiddleware(get_response) middleware.process_request(request) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 8f7a45403b2c784b4c366ae2ef550ef8022ef921..33e508029c39077e2eb3cf26afed1d6938aa78d9 100644 GIT binary patch delta 2689 zcmV-{3V!vUAD|z9ABzYGGX+v+0{?Vnb97{3bYU)ZV|W1Vok?#THx_{J{uP1`$zc%o zTllyrvVv@bF<@tc*vRBIs7M{TXQYyrKR9~6=~nC2`t1AVx?gU8e(3t{_inp9NIS2$j~>40 z`>Vsn;`Qs-=B(RXtk&k_@?w#`+@8ExUUb{V?T0U3(Zl^I4!bv>ah7jS`qisd|L2cy z`sF&`;EfZ!*{(h~!)rE|o3jN0;NrKZPoC{g@zrX*?Ys5KG99&D9q!NjJ^!PH`~*{KJf2d|9y9Uxmhi@i&yy9`~T7PC;R=E*O$W2yVM|{yB@m#jSr6> z92^|IeE{iaT=URdic-&#d7m-|7H66@#!%Ey01XKB6yB`Xz`GoiH!DX_*chXUnm`a`uwu*&huf6ct@e!Tu}+4b9>mz$@n^~-+w@BYS*NT>O=JAb)6Mw>3O|MUG77PnmD#@A1~ zH>-<(mlyx18xVKP4cu~x8(%+O?_SmZ&*R-&u}oyIx7>V?r_1z!j|uZ*-2Z)p;%0Sr zmTqm?zqmX-e%h^HcIS!W2U~CM-JSgRgS+2txw>4f``HifO`_SNrC()6!s);NASS|hFhNRZinlC(QEt3WuO22+h@-Nw~pZ-pD~^DUtQlP zv57~E{a+tnbCE9k@z1;c7W0d68(uAS29u;+tb#hS!D(R654s}mEa6#^IHr$=9hMw|D>O@w=0@*cP%?%o6sPNUB|SJI4Qnh$qh4|f6M z16qx|doeN*?v;)671?pZCW4I`?m2@n6z&=jSue3sgj&jb#+pkT2}Ji!&lm6_Ixa zoz97a&X=6$Ews^o6!O7D5~~T%p${efclRRSM*BhXgvJqg)o35elAlk64y7W0tB$M@ zKvZdXF_yIF=S1FyipVEDoe5RRR}f1^=`77?w8x6bM-vddRi)iE@-raMWL(6kBA=6U z3zDCa-@c~Np2e^OubJn`mL+dzM82Yk4F>}NUNqzdN=E1Hef;*^thyocNq((ERT>sa zEa}6W75R#Mc$N(#T1}Lee9;Vl`$m2w^3H%&k`FK$nXhf0uP91ugYoHARN3f`(hie%#tQ~bl$HsL+VgWFUy(hZ zEi|^Od7c?foCtYr^Zf1PIp^LoAZa`~=|w4-b!}bq+mAwC3@`+h%nKENjo38u_ifWz@TvWsJP3A`-?+iv1mCQ$5 z)O*`xejM_<+*?%(G+VZ!@?PYz`S6Cw=iFPdD&5|et*Er2$^0nftw}?D)adq>Tv3@1 z&8i!Pyf+llX}q_VUD14h`_M-FF~~FQT4HH*duv@$-9EJV{3ztfIEJWdf+uCk u) zRYYEl6=u~u?~2ya&WgNLL_V0rU6p}p%T`nhG?^cRyhW2VPDiSir$u|+%8aV0#a2X~ zjd!{zt&Oo{PR^Xj*HdG|Irr9iM9pX~2$PZdX3r0kkA?!opdufCn{Ge-h>cM0mZFN% z3PaQFr!VtjO-Q=EO6G0Ztn1inX-6UNjj%3aBT|-p^Wlv^-X_=vy;Wshi)-ZXO5RpP zo=ot%>MHR#nfQE@`C;;6ETO8pNh^OYU(;wG4IlHEX!_ndOGR^U=S03Dd!DQzhpd|Cg(j1G%dLKXki0i&kyN9-qoVfwjL18x zhrZs=jTMeBHcb|YaCIvYMBe%qO>z0F9tw=R9((pY zdT8YDO1>i9-hyE-Do>6_TT;WjR~}x|@P^5A?tZHB-uh$-#+HFOdGcbsb*PEe`J@{Z zjMWLw$eyn#K5v7u$f(K5@#$@`6Cq!l4=>b1UNG0vs@AmdQnY@4PBLGUh9_*i5NdpQ z-no)~`&rF@^A*|iNq#w!s>a59*D5OSNWP*dtwaM%pc?Iin~ZMXytf17P~1A3JsH=<0&r30;R-XQwjlMW6q0`C@+KMpH@?^d!_M($$7 z)){*S=&eaJy=nmz0%$#Q?~2}!h5qfltPr9q?4?kV@%kA+O=l$0|o-Z$!>;B-& z-KH-Oy8Zy(_&*|?oCaB@|9^4Te|@yrAMjv*rgy(Ff4=^-+JAra{U&j|+`QfQr!Kuc zo6FbRZhhLFpYNVl`nXzupPhDnm(JVm->yXE{c%U%zU*IIZf?9L-(FpvuTHu?{q*Y> zGjY3HNB7N&>Iiu?UtwAf6^thv*70EPj_3b(`GO4_uFl_ezYH* z|LA$T>EmCP=gV%pOdRs3w~y||eH}gN)@P4@IR5dc%x3rJe*4cj=`H^0<;CyIbY}ox v0qp-hTHN?z|KxX%>G;78^=h4-!}kg0a`Qua8o#GYA3yjXkx`AS#DD<+!7iRN delta 2688 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 1 else v for k, v in q.items()} + # only allow local host hostt = request.get_host().split(':') if hostt[0] not in ['localhost', '127.0.0.1', 'dev.rowsandall.com', 'rowsandall.com']: @@ -4834,7 +4831,6 @@ def workout_upload_api(request): message = {'status': 'false', 'message': 'invalid credentials'} return JSONResponse(status=403, data=message) - form = DocumentsForm(post_data) optionsform = TeamUploadOptionsForm(post_data) rowerform = TeamInviteForm(post_data) diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 40572359..5f792d9b 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -71,9 +71,9 @@ INSTALLED_APPS = [ 'rest_framework', 'datetimewidget', 'rest_framework_swagger', - # 'oauth2_provider', - 'provider', - 'provider.oauth2', + 'oauth2_provider', + #'provider', + #'provider.oauth2', 'corsheaders', 'analytical', 'cookielaw', From ad372d8f92affe1f40cc6aef59e57a973794b69d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 26 May 2024 14:51:21 +0200 Subject: [PATCH 3/9] fixing tests --- rowers/emails.py | 2 +- rowers/models.py | 9 +++++---- rowers/tests/.#test_analysis.py | 1 + rowers/tests/test_plans.py | 5 +++-- rowers/tests/test_races.py | 3 ++- rowers/tests/test_unit_tests.py | 4 +++- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes rowers/views/workoutviews.py | 10 ++++++++-- 8 files changed, 23 insertions(+), 11 deletions(-) create mode 120000 rowers/tests/.#test_analysis.py diff --git a/rowers/emails.py b/rowers/emails.py index 68c3dbfb..f0d4c0d9 100644 --- a/rowers/emails.py +++ b/rowers/emails.py @@ -117,7 +117,7 @@ def send_template_email(from_email, to_email, subject, if createmessage: for recipient in to_email: try: - soup = BeautifulSoup(html_content) + soup = BeautifulSoup(html_content, 'lxml') s2 = soup.body diff --git a/rowers/models.py b/rowers/models.py index 178394db..57b8aaee 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -48,6 +48,7 @@ from sqlalchemy import create_engine import sqlalchemy as sa from sqlite3 import OperationalError from django.utils import timezone +from datetime import timezone as dt_timezone import pandas as pd from dateutil import parser import datetime @@ -99,25 +100,25 @@ smoothingchoices = ( def half_year_from_now(ttz=None): if ttz is None: - return (datetime.datetime.now(tz=timezone.utc)+timezone.timedelta(days=182)).date() + return (datetime.datetime.now(tz=dt_timezone.utc)+timezone.timedelta(days=182)).date() return (datetime.datetime.utcnow()+timezone.timedelta(days=182)).astimezone(pytz.timezone(ttz)).date() # pragma: no cover def a_week_from_now(ttz=None): if ttz is None: - return (datetime.datetime.now(tz=timezone.utc)+timezone.timedelta(days=7)).date() + return (datetime.datetime.now(tz=dt_timezone.utc)+timezone.timedelta(days=7)).date() return (datetime.datetime.utcnow()+timezone.timedelta(days=7)).astimezone(pytz.timezone(ttz)).date() # pragma: no cover def current_day(ttz=None): if ttz is None: - return (datetime.datetime.now(tz=timezone.utc)).date() + return (datetime.datetime.now(tz=dt_timezone.utc)).date() return datetime.datetime.utcnow().astimezone(pytz.timezone(ttz)).date() # pragma: no cover def current_time(ttz=None): # pragma: no cover if ttz is None: - return datetime.datetime.now(tz=timezone.utc) + return datetime.datetime.now(tz=dt_timezone.utc) return (datetime.datetime.utcnow()).astimezone(pytz.timezone(ttz)) # pragma: no cover diff --git a/rowers/tests/.#test_analysis.py b/rowers/tests/.#test_analysis.py new file mode 120000 index 00000000..076b486b --- /dev/null +++ b/rowers/tests/.#test_analysis.py @@ -0,0 +1 @@ +sander@rowsandall-2.376838:1715854849 \ No newline at end of file diff --git a/rowers/tests/test_plans.py b/rowers/tests/test_plans.py index 2a2a870d..b8615a19 100644 --- a/rowers/tests/test_plans.py +++ b/rowers/tests/test_plans.py @@ -469,7 +469,8 @@ class SessionLinkTest(TestCase): data=form_data) # adding session - middleware = SessionMiddleware() + get_response = MagicMock() + middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() @@ -484,7 +485,7 @@ class SessionLinkTest(TestCase): # and adding a get request = self.factory.get(url) # adding session - middleware = SessionMiddleware() + middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() diff --git a/rowers/tests/test_races.py b/rowers/tests/test_races.py index e783db2e..a8d3ecbb 100644 --- a/rowers/tests/test_races.py +++ b/rowers/tests/test_races.py @@ -856,7 +856,8 @@ class ChallengesTest(TestCase): data=form_data) # adding session - middleware = SessionMiddleware() + get_response = MagicMock() + middleware = SessionMiddleware(get_response) middleware.process_request(request) request.session.save() diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index 4903774b..bb571703 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -41,7 +41,9 @@ class OtherUnitTests(TestCase): # Test get_dates_timeperiod def test_get_dates_timeperiod(self): rq = RequestFactory().get('/rowers/plannedsessions/') - middleware = SessionMiddleware() + get_response = MagicMock() + + middleware = SessionMiddleware(get_response) middleware.process_request(rq) # blanco should just run diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 33e508029c39077e2eb3cf26afed1d6938aa78d9..e0b4e763580501b26758edbc3fd9337d1d29d19e 100644 GIT binary patch delta 2689 zcmV-{3V!vVAD|z9ABzYGMlDlj0{?Vnb97{3bYU)ZV|W1Vom+1dM;3tJ`4tuq$-|18 zbE#7o$2cO8)gl2K1(eO(s$(W*cI~m{X>R|1t7gC$a4Q^pyHwpO9+0P}Z_{6&s&lV{ zAK#sx?7dlDY*uIM`*+d6-Mt?V?;O0i=vM31`uO2;-7hbH9(8^9N4Ht-rJdKC`*&aU z{rUc4@%HUobKG5=uGZ%0>~xX7+#J1Ho_3qX^@lIs(B0iB_PclAaFz#0{p!uCfB*Bl ze!0#!c;y7|HmlFh@RrTl#qojwaPj-oC(pO1xVKtw`fh!+Oh;{2`@8c#IXmk5?XSJj z4eaTUdPC-a-R9+AANcpKf7qRzU96Uy#T)$V{r~Lxquu_?%S++6U1|`}O%L7u#=D1i z_Vx}wJb?5w^2bjb-tRp>KfCDf-~DI*YI$*Y_htI}@ykO3boW5+5xhX&x42KvL`NLq zZvguM2aB}R$Nisl=X=ll?xKIOI$hqs`&Y+aUML-Z`r@qbPV!;Tmq%yomzzUjf3Wy! z>!$-At#)tF(`EXxn{=P~UcT7)Y44Bt4iUq_;_}m{9Udf6>yDTISf;!Gwdds{rTw%i)$`%(l?!4T!tu2Clipm9HPKx36md{&4$NEECzwEmt4p%Vm1NhlKet?*6_)@nUs+ zoNjH|zdCz)__SNU?oJZL&$eFOyF2>tXLrBda(=d2_g6RPFVZ{k4e#Q1x6hCK;*}6% zhhLNJ0k+&%DC|gFkKnTh4A(s0?GBfJqu1uE%f9&K_ivsFt{ua_JYzcNzq-Cp zViOM*yT87?<|1A6%b$1sE#?>DI=ouy3?@mtSOs-tgVVsCA9O|B$yLNXK}2vt!JU%c zRFHePId`f{-mO%`-5Fw3jq+)T;DX%aY`8mH5%-wn-HO+6k0s@uVK&@-McgfI$9boJ z;BJGVg52>I+_5U|0V?7yiF*<%jW+L%n+W&1LO3oO!2f2$&?eFDTgS3C4Dz+=Ognh6_K|lCZ%2_^CTt|Brh`}A1flC z%sD|0s_={}YR9|zkhiWL@(9LRB$do3c7iUDCDkAR; zI-L^-oi91hTWF*GDCC2QBvuoiLmx`|?`}oDjrN1&35_H0s?k1_B|o1C9ZE%iRvlR* zfT+^&Vk~LT&xyPZ6_HPRIuojruOOC;(pj3(Xpa?9-zkN-kJ&R!nUNg^=Elb|ch)N{Jw;zSP7+?r0nHMU58nJ2Q$06@c zND_}4@{XI#-;g}lLmt6MfS_uU;kl^H`=;BELY@s<6xBQ*xTuEbo6L_w-WiN2Dw&VA zsQ0$X{5a&dxwonoXtr!c<*mqL^WhDV&$+i^Rl2<`TTy94llf7|Ta$+RsL|~$xuP;3 znpHOnd2cA9(|B(!yQ2Aj_MwgTV~}Uqw#3rt_SU+hx_xNz`BBJ|aSTz_1W(G6pHoGp ztBAZ9E6l2S-W9E-ofUbhh-(} z8}D>cS{q}@oSZq4ucyX_bMCG4h?>z}5GEt@&7L179}NYFK}9})Hr;;u5gVc0EkzZj z6^5qUPhaN6nvisRmCW0+S=X`E(vCvj8)0303DFT2)$Qj*zNXPW8bA!1_`G8(T1D+! ze0~h_IrlbT(Dc1^mWt-y&WU_Q_B>fb4p}wN3r!~XmRtS&AbD@lBB@4uM@8-V8IgBX z5&7IXfmqYu-gz!M&(Dc`MY?^`);OYS)iM{jMQLY1UJQVLsJfiH$Sq1c{n4Ji5z%!* z^w7xPlzc_Hy#>QwRGu7;SH1L-2GJLz4gfwj4cCm^5n&M>rfM`^GP=- z7^@SUkv(5geBK6Qkx`SACqlk9A6}@3ykM@SRjp~^rD*;9oMgTx4Nus3A=LQr zymKY}_OqIQ=PR=3ll*cdRgI1Ju2odtkbFf^T8RdjKsDM2HyPc&d2a{E%RZp-N*|t& zMOPu8mCQ>;&x$-JwGyf+908mlf~n2gLf^26k#acQvEjP`*-QG0$) zqkX7{Jd&{%qbBP*aBMPvL-MgA@?sz;M|)dzrNUW%d2%Wm?a>=AqUx3sT+!7@=j6Th zR1bNA+#8EEo}5s2jY^?LeiZU-kaRsTLnyjx*__DNG|!WmAQ&|nm?2`(%nX{*Jnt(a zAB-fK*Hl_WpeFNEkJZUOqp?h?%#4WK$WJ|DlgL{`>7R-`6v6alm3UFPnM_4b-(xh zcGLHJUB3tK{GZHh|LpRz*54iXKO8J}2i)16>EmzApD#bHcHbX7yht3+ERL|D;Q1XTjCaU+=bBr_EkI?YG@<`Dnj5 z|G|rN(}%wyrKR9~6=~nC2`t1AVx?gU8e(3t{_inp9NIS2$j~>40 z`>Vsn;`Qs-=B(RXtk&k_@?w#`+@8ExUUb{V?T0U3(Zl^I4!bv>ah7jS`qisd|L2cy z`sF&`;EfZ!*{(h~!)rE|o3jN0;NrKZPoC{g@zrX*?Ys5KG99&D9q!NjJ^!PH`~*{KJf2d|9y9Uxmhi@i&yy9`~T7PC;R=E*O$W2yVM|{yB@m#jSr6> z92^|IeE{iaT=URdic-&#d7m-|7H66@#!%Ey01XKB6yB`Xz`GoiH!DX_*chXUnm`a`uwu*&huf6ct@e!Tu}+4b9>mz$@n^~-+w@BYS*NT>O=JAb)6Mw>3O|MUG77PnmD#@A1~ zH>-<(mlyx18xVKP4cu~x8(%+O?_SmZ&*R-&u}oyIx7>V?r_1z!j|uZ*-2Z)p;%0Sr zmTqm?zqmX-e%h^HcIS!W2U~CM-JSgRgS+2txw>4f``HifO`_SNrC()6!s);NASS|hFhNRZinlC(QEt3WuO22+h@-Nw~pZ-pD~^DUtQlP zv57~E{a+tnbCE9k@z1;c7W0d68(uAS29u;+tb#hS!D(R654s}mEa6#^IHr$=9hMw|D>O@w=0@*cP%?%o6sPNUB|SJI4Qnh$qh4|f6M z16qx|doeN*?v;)671?pZCW4I`?m2@n6z&=jSue3sgj&jb#+pkT2}Ji!&lm6_Ixa zoz97a&X=6$Ews^o6!O7D5~~T%p${efclRRSM*BhXgvJqg)o35elAlk64y7W0tB$M@ zKvZdXF_yIF=S1FyipVEDoe5RRR}f1^=`77?w8x6bM-vddRi)iE@-raMWL(6kBA=6U z3zDCa-@c~Np2e^OubJn`mL+dzM82Yk4F>}NUNqzdN=E1Hef;*^thyocNq((ERT>sa zEa}6W75R#Mc$N(#T1}Lee9;Vl`$m2w^3H%&k`FK$nXhf0uP91ugYoHARN3f`(hie%#tQ~bl$HsL+VgWFUy(hZ zEi|^Od7c?foCtYr^Zf1PIp^LoAZa`~=|w4-b!}bq+mAwC3@`+h%nKENjo38u_ifWz@TvWsJP3A`-?+iv1mCQ$5 z)O*`xejM_<+*?%(G+VZ!@?PYz`S6Cw=iFPdD&5|et*Er2$^0nftw}?D)adq>Tv3@1 z&8i!Pyf+llX}q_VUD14h`_M-FF~~FQT4HH*duv@$-9EJV{3ztfIEJWdf+uCk u) zRYYEl6=u~u?~2ya&WgNLL_V0rU6p}p%T`nhG?^cRyhW2VPDiSir$u|+%8aV0#a2X~ zjd!{zt&Oo{PR^Xj*HdG|Irr9iM9pX~2$PZdX3r0kkA?!opdufCn{Ge-h>cM0mZFN% z3PaQFr!VtjO-Q=EO6G0Ztn1inX-6UNjj%3aBT|-p^Wlv^-X_=vy;Wshi)-ZXO5RpP zo=ot%>MHR#nfQE@`C;;6ETO8pNh^OYU(;wG4IlHEX!_ndOGR^U=S03Dd!DQzhpd|Cg(j1G%dLKXki0i&kyN9-qoVfwjL18x zhrZs=jTMeBHcb|YaCIvYMBe%qO>z0F9tw=R9((pY zdT8YDO1>i9-hyE-Do>6_TT;WjR~}x|@P^5A?tZHB-uh$-#+HFOdGcbsb*PEe`J@{Z zjMWLw$eyn#K5v7u$f(K5@#$@`6Cq!l4=>b1UNG0vs@AmdQnY@4PBLGUh9_*i5NdpQ z-no)~`&rF@^A*|iNq#w!s>a59*D5OSNWP*dtwaM%pc?Iin~ZMXytf17P~1A3JsH=<0&r30;R-XQwjlMW6q0`C@+KMpH@?^d!_M($$7 z)){*S=&eaJy=nmz0%$#Q?~2}!h5qfltPr9q?4?kV@%kA+O=l$0|o-Z$!>;B-& z-KH-Oy8Zy(_&*|?oCaB@|9^4Te|@yrAMjv*rgy(Ff4=^-+JAra{U&j|+`QfQr!Kuc zo6FbRZhhLFpYNVl`nXzupPhDnm(JVm->yXE{c%U%zU*IIZf?9L-(FpvuTHu?{q*Y> zGjY3HNB7N&>Iiu?UtwAf6^thv*70EPj_3b(`GO4_uFl_ezYH* z|LA$T>EmCP=gV%pOdRs3w~y||eH}gN)@P4@IR5dc%x3rJe*4cj=`H^0<;CyIbY}ox v0qp-hTHN?z|KxX%>G;78^=h4-!}kg0a`Qua8o#GYA3yjXkx`AS#DD<+%deg^ diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index a408421a..6385e646 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -3406,12 +3406,16 @@ def workout_data_view(request, id=0): columns = datadf.columns.values - to_be_dropped = [ + to_be_dropped_all = [ 'id', 'time', 'hr_an', 'hr_at', 'hr_bottom', 'hr_max', 'hr_tr', 'hr_ut1', 'hr_ut2', 'x_right', ] - to_be_dropped = [c for c in to_be_dropped if c in columns] + to_be_dropped = [] + + for c in to_be_dropped_all: + if c in columns: + to_be_dropped.append(c) datadf.drop(labels=to_be_dropped, inplace=True, axis=1) @@ -3854,6 +3858,8 @@ def workout_flexchart3_view(request, *args, **kwargs): favoritenr = 0 except AssertionError: favoritenr = 0 + except ValueError: + favoritenr = 0 if 'xparam' in kwargs: xparam = kwargs['xparam'] From 5f970a17c8c1af941dd14df14e0ef542348c05a5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 26 May 2024 14:51:40 +0200 Subject: [PATCH 4/9] fixing tests --- rowers/tests/.#test_analysis.py | 1 - 1 file changed, 1 deletion(-) delete mode 120000 rowers/tests/.#test_analysis.py diff --git a/rowers/tests/.#test_analysis.py b/rowers/tests/.#test_analysis.py deleted file mode 120000 index 076b486b..00000000 --- a/rowers/tests/.#test_analysis.py +++ /dev/null @@ -1 +0,0 @@ -sander@rowsandall-2.376838:1715854849 \ No newline at end of file From 52d6e3b6bbea905c02e4ffd5573df571ddfda74d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 26 May 2024 17:01:45 +0200 Subject: [PATCH 5/9] oauth2 not working --- rowers/urls.py | 4 ++-- rowsandall_app/settings.py | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rowers/urls.py b/rowers/urls.py index 8b5d8a56..ed1f68c8 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -237,10 +237,10 @@ handler500 = views.error500_view urlpatterns = [ - re_path(r'^oauth2/', include('provider.oauth2.urls', namespace = 'oauth2')), +# re_path(r'^oauth2/', include('provider.oauth2.urls', namespace = 'oauth2')), # re_path(r'^o/authorize/$', base.AuthorizationView.as_view(), name="authorize"), # re_path(r'^o/token/$', base.TokenView.as_view(), name="token"), - path('o/', include('oauth2_provider.urls', namespace='oauth2_provider')), + re_path('^o/', include('oauth2_provider.urls', namespace='oauth2_provider')), re_path(r'^', include(router.urls)), re_path(r'^api-docs/$', views.schema_view, name='schema_view'), re_path(r'^api-auth/', include('rest_framework.urls', diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 67110858..d2ddaf38 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -72,8 +72,8 @@ INSTALLED_APPS = [ 'datetimewidget', 'rest_framework_swagger', 'oauth2_provider', - #'provider', - #'provider.oauth2', + # 'provider', + # 'provider.oauth2', 'corsheaders', 'analytical', 'cookielaw', @@ -194,6 +194,8 @@ DATABASES = { # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators +AUTH_USER_MLDEL = 'user.User' + AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', @@ -456,7 +458,7 @@ OAUTH2_PROVIDER = { 'ACCESS_TOKEN_MODEL': 'oauth2_provider.AccessToken', 'APPLICATION_MODEL': 'oauth2_provider.Application', 'REFRESH_TOKEN_MODEL': 'oauth2_provider.RefreshToken', - 'ACCESS_TOKEN_EXPIRE_SECONDS': 360000, + 'ACCESS_TOKEN_EXPIRE_SECONDS': 3600000, "PKCE_REQUIRED": False, # 'OAUTH2_BACKEND_CLASS': 'oauth2_provider.oauth2_backends.JSONOAuthLibCore' } From f59fb7947a696aea2a6b194e4d4ffc4c0317ad7a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 26 May 2024 17:09:54 +0200 Subject: [PATCH 6/9] lijkt beter te werken --- rowers/views/apiviews.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index 4795800f..7da471e3 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -378,7 +378,7 @@ def get_crewnerd_liked(request): # Stroke data views @csrf_exempt -@login_required() +#@login_required() @api_view(["POST"]) @permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) @@ -481,7 +481,7 @@ def strokedata_tcx(request): @csrf_exempt -@login_required() +#@login_required() @api_view(["POST"]) @permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) @@ -620,7 +620,7 @@ def strokedatajson_v3(request): # Process the POSTed stroke data according to the API definition # Return the GET stroke data according to the API definition @csrf_exempt -@login_required() +#@login_required() @permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @api_view(["GET", "POST"]) @permission_classes([IsAuthenticated]) @@ -780,7 +780,7 @@ def strokedatajson_v2(request, id): @csrf_exempt -@login_required() +#@login_required() @permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @api_view(['GET', 'POST']) @permission_classes([IsAuthenticated]) From 0c06463cef8292d0201aaedee7ea2f9291d07619 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 28 May 2024 08:46:07 +0200 Subject: [PATCH 7/9] fix --- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4001 bytes rowers/views/apiviews.py | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index e0b4e763580501b26758edbc3fd9337d1d29d19e..8d99e92a596b6058f6487976dae6c199f6cba8ae 100644 GIT binary patch literal 4001 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 H#DD<+Tz5gb literal 4000 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 GfB^ua_%4Y6 diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index 7da471e3..1937d9fd 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -481,8 +481,8 @@ def strokedata_tcx(request): @csrf_exempt -#@login_required() @api_view(["POST"]) +#@login_required() @permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True) @permission_classes([IsAuthenticated]) def strokedatajson_v3(request): @@ -517,6 +517,7 @@ def strokedatajson_v3(request): } """ + print("V3") if request.method != 'POST': return HttpResponseNotAllowed("Method not supported") # pragma: no cover From 863d90c24bc2faff0a08d653fe8ca03c7c10205e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 28 May 2024 15:19:20 +0200 Subject: [PATCH 8/9] removing unnecessary middleware --- rowers/dataprep.py | 5 +++-- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4000 bytes rowsandall_app/settings.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index d5debb11..bfd68570 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -432,6 +432,7 @@ def resample(id, r, parent, overwrite='copy'): def calculate_goldmedalstandard(rower, workout, recurrance=True): cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id) + try: df = pl.read_parquet(cpfile) except: @@ -445,7 +446,8 @@ def calculate_goldmedalstandard(rower, workout, recurrance=True): if df.is_empty(): return 0, 0 else: - return 0,0 + return 0,0 + if df.is_empty() and recurrance: # pragma: no cover df, delta, cpvalues = setcp(workout, recurrance=False, background=True) @@ -562,7 +564,6 @@ def setcp(workout, background=False, recurrance=True): return pl.DataFrame({'delta': [], 'cp': []}), pl.Series(dtype=pl.Float64), pl.Series(dtype=pl.Float64) csvfile = os.path.abspath(csvfile) - with grpc.insecure_channel( target='localhost:50052', options=[('grpc.lb_policy_name', 'pick_first'), diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 8d99e92a596b6058f6487976dae6c199f6cba8ae..72066069fbd60bce1e0f6194ca56affb43fa8530 100644 GIT binary patch literal 4000 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 H#DD<+Tz5gb diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index d2ddaf38..57e7d41e 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -111,7 +111,7 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', # 'oauth2_provider.middleware.OAuth2TokenMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'provider.oauth2.middleware.Oauth2UserMiddleware', + #'provider.oauth2.middleware.Oauth2UserMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'tz_detect.middleware.TimezoneMiddleware', From b2ac38a88930b048205e643ce91b1ffc568a23b3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 31 May 2024 14:30:58 +0200 Subject: [PATCH 9/9] fix --- .#requirementsdj4.2.txt | 1 + diff.txt | 18 ++++++++++++++++++ requirementsdj4.2.txt | 16 ++++++++-------- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4001 bytes 4 files changed, 27 insertions(+), 8 deletions(-) create mode 120000 .#requirementsdj4.2.txt create mode 100644 diff.txt diff --git a/.#requirementsdj4.2.txt b/.#requirementsdj4.2.txt new file mode 120000 index 00000000..076b486b --- /dev/null +++ b/.#requirementsdj4.2.txt @@ -0,0 +1 @@ +sander@rowsandall-2.376838:1715854849 \ No newline at end of file diff --git a/diff.txt b/diff.txt new file mode 100644 index 00000000..ae961a75 --- /dev/null +++ b/diff.txt @@ -0,0 +1,18 @@ +Install + +common-fate-schema==0.7.0 +types-python-dateutil==2.9.0.20240316 + + +Upgrade + +Django==4.2.13 +django-tz-detect==0.5.0 +geoip2 +rowingdata + +Uninstall + +django-oauth2-provider==0.2.6.1 +oauth2==1.9.0.post1 +oauth2_provider==0.0 diff --git a/requirementsdj4.2.txt b/requirementsdj4.2.txt index d2fcab82..e4f166ac 100644 --- a/requirementsdj4.2.txt +++ b/requirementsdj4.2.txt @@ -26,6 +26,7 @@ click-plugins==1.1.1 click-repl==0.2.0 cloudpickle==2.2.1 colorcet==3.0.1 +common-fate-schema==0.7.0 contourpy==1.0.7 coreapi==2.3.3 coreschema==0.0.4 @@ -36,7 +37,7 @@ cycler==0.11.0 Cython==0.29.35 dask==2023.5.1 decorator==5.1.1 -Django==3.2.12 +Django==4.2.13 django-analytical==2.5.0 django-async-messages==0.3.1 django-classy-tags==4.0.0 @@ -46,8 +47,7 @@ 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-oauth-toolkit==2.4.0 django-recaptcha==4.0.0 django-rest-framework==0.1.0 django-rest-swagger==2.2.0 @@ -56,7 +56,7 @@ django-ses==2.0.0 django-shell-plus==1.1.7 django-social-share==1.3.2 django-taggit==4.0.0 -django-tz-detect==0.2.9 +django-tz-detect==0.5.0 djangorestframework==3.14.0 docopt==0.6.2 docutils==0.20.1 @@ -97,6 +97,7 @@ jeepney==0.8.0 Jinja2==3.0.3 jmespath==1.0.1 jsmin==3.0.1 +jwcrypto==1.5.6 keyring==23.13.1 kiwisolver==1.4.4 kombu==5.2.4 @@ -118,8 +119,6 @@ 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 @@ -154,7 +153,7 @@ pytest-runner==6.0.0 pytest-xdist==3.5.0 python-dateutil==2.8.2 python-twitter==3.5 -pytz==2023.3 +pytz==2024.1 pytzdata==2020.1 pyviz-comms==2.3.0 PyYAML==6.0 @@ -166,7 +165,7 @@ requests-oauthlib==1.2.0 requests-toolbelt==1.0.0 rfc3986==2.0.0 rich==13.4.1 -rowingdata==3.6.8 +rowingdata==3.6.10 rowingphysics==0.5.2 rq==1.15.0 rules==3.3 @@ -192,6 +191,7 @@ stack-data==0.6.2 stravalib==1.3.0 timezonefinder==6.2.0 tk==0.1.0 +toml==0.10.2 tomli==2.0.1 toolz==0.12.0 tornado==6.3.2 diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 72066069fbd60bce1e0f6194ca56affb43fa8530..396eb8ca16001da1eb8b5d005dd92fd81027aeec 100644 GIT binary patch literal 4001 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 H#DD<+>gpa; literal 4000 zcmV;R4`1*fiwFoP$yH_o|8!+@bYx+4VJ>uIcmVC4NpBoC7J%>m6@m}RVG#CP__!#t zf^35^U}u8Z$mBMtNFBLnq?XWKUh?mU?6zguRv~`U6u~Oc2SZ(5Th~{Qd^?Z6d2?}o z@M^i)t}fS)9-@JV2j3h&IC{S6R_oRJ?EB@qUv7Tr`tJ8`yF5rcueXmLzUcd_!^PtD z>(}P2+gz;H=H&8Xk-prXyjWgz+r{mNFJ95Z{V5K+H=l8qZ%_Kwt5yH!k8k?rI^W=p z6TI23J~+c`HkX^T1p(mVx2I2@?N0I4YQ62d^~o|FwOt+V&->)^r0aLT_D(l&pg-yr znK#?hzdrEqUH^S|ez{pKw~JT!*Zcp`^(XuNm)DoV&%4whpt~Nr|BVli9~>MUy?p@b zXXKCXH~e|5_haQ|ic`tj*80lKe1z9M*zd}#5IoQaM&!ruT60ge`F zr+525>8=i*_1&g_zPeaGdiYnzUSB93`uwu*&huf6ct@ ze!Tu}+4b9>mz$@n^~-+w@BYS*NT>O=JAb)6Mw>3O|MUG77PnmD#@A1~H>-=67yqXl z5O>QB+;WK&Ue*53F_9Sjc@WBIyTb}Q3hwIU6`^jaW|NPr$&jh!Q;UAwdo%3H^-zTw&M~nSmA768k zF8cA$yZsjPi*OrWEp-Nyq+P6nIPg?r}EUovny_O!98UYq-af^3E_D?!F@KmUiR3Q*gJzP(ki^5AIkM z_W%`fm&82@l}4NQ#!ZBKUGg5dBJSP<4^E@cJ6F<-W10_lUk`Ty;{#fayn8V+5$=_Z z^A*`~!X|=^8ty?#+V69c_fQdcXB-e{^tvcT_4)b8J3>W@okYW|bJHS}CC~RDPj!)} zYNmKPgk;Kz&XhxxlD-?Z^O1R$ipX0NlTxpec@h%}l9w5gj}?(m=A0l0Rd~h~wd37< z$Xizrc?9Dul1k>2@n6z&=jSue3sgj&jb#+pkT2}Ji!&lm6_Ixaoz97a&X=6$Ews^o z6!O7D5~~T%p${efclRRSM*BhXgvJqg)o35elAlk64y7Wij;s+tRB3oImbB;RMBavq z$R|CW3028g5KBhsEX`=N$BM{D6A-*rrQJ31Ga%1oT*Rm%pObS7lAn>^zNXQh#jpdf zndixtC2wa$zM_Z?2Lk|JG~@+JM(6E){Px_ex*_sOeyu}Q8Wu?`>BE~9`HFmamJK6X zO_Y{=(G2@WekAhFfK`$YFd3PzZJw_vN^67h=~YzO^AU`18s60Bc|nszUS-cSK+%ZJ zj7IyKWL~UE&lX5S9&s|deT&i#lXu1o22GTf35(kEb0S}nJ)bQ!wyJra8BLrBd2I9i z?c_P<-ZCI*JUQt_DVcR`UGv+ILS76o1eMGS6^+<5^5c;ACM1bR4SB~+=I=miR| zBtTF#$?#lM=6%!cMgB=55)m z>)2{(MGorgM=%kIHQrkX*m7^DFZ0Mo0+A+4>u@^c zxp{I1$-A6&t?Gp62#f0Wb0S~UXdewA22Fh4F%_+%_ANd?2Kk(O8!%}4-a1P~b8qKF zz9M^`tRaW2n&*WklY7gpetwX=H)xSmqrIb|_WX>2L2m7oF$lM7|>3 zK51(lQMGEB3*4f#GaxSpKvZ4MUE~&}o&IRg-iYWrA$n-!?@GQR-QI#>FDg%tM_W?E zyH_4w)9{ALbMAhs^4|Jn3C5OzIeGG8ymhFF)%m0w6pYmg&d8pxC_Zn4vB;>&$?@rJ zu@fO*n-4G4LtZe~(yG?9@KUsXeoiu9lZGd3ybx-9c;2~^e*0O?^A*|iNq#w!s>a59 z*D5OSNWP*dtwaM%pc?Iin~ZMXytf17g15oSSD3w zMnrDpryj9Mmsax;c@r$dhA(p-7;~w~yWz9qnCP zi+T+5``laIJRd?)t8Px@EAr$>ve1}7MLve2IXSM)^P`Y=CRk!klokQXhH2-7z9LtS z#GG&sL4}^6p}%AQ(`v?hmpk9Os2lGQ7>lOd-v>QZhF&T{FS%g~=mvaClR=NI-}NB+ zU<3(Cg+8fqkLvjTKb+a1p#TslOw7stCQ$EwVhS z&<8gesjmz@yL!+kJIw|Ht3n@rQ8jN)13p%Sp3_`UpqlFu!er3bHsIGJ_0BLLspfjb zvgI~&LeCYUk6FWyI;k(aYGFe^4*J{))v+ow3)76%H2fK$mptIBLbixPMWgj|Qu8V@ z?l>6o7*rZQy5`Nht8o|VL7&EMaJfI82E8xZ2lrkXnb3^8LG;!D5bLBq*vX*BX50;; z_X)kOiAK)mDvF*P`ccqF6RpyvL*R-UchtOjW1vsUdPH5>4N`XeH>saIdNIyx(No!0 zX>*c#s0e*9BBW}7jg%}x-_TFnrQ>sFOzT8c#vLUEK_=2Z2ivmrgXpbcuWO%^7si-O z=cH!W52N>nf&|@w@1ba6JvKFO4D^@;SXpp~6mT*faj~Uk4x(p+PS-UHDHdJ0bXEgC zRfOIdu%ye#W#GxIant7dVf4X7QC8nD+M+I)cSQxf=t0&af2J)z`C>ZKpy_%^L+h8v%?usdr&A z13tC{twHq8Sk$d$i0ot0#%a{-`ccqFLlLb`!w+S{H{85=W1zQ``)BFAc^qR?^QJ%G zTQMNY!Yhj~nRtC|$=DSIZEe!nkYZG!Cu(#3^wA5Ls9d-hEmP6RUGw3OgPu)vNILYE zC$qd+bL0-A-?dEiDmBlFZ7!YZJ92j|6VdDDdMA@f&}wO!1L(u9Wg_U7yg}=w8Fy2+ z>qBmtXhl%v$hDzW-`o{_s0e+?9kg^^HEb*!zTr0DkAWW1FpE=3y+GOJ>UlUs=mSosp-NNp2GGacG7%7?&aRKt(lTd&o=pIyH_t=a z<&2^A(isK4%jl!ZuJ_1AYwn;KccY+>#-lP1-&5HV3}`{yG0-FBhAK*_=dvXj(1Nz3 zpqJcGg>+JHrD)_1nwmEX`e0Zv=%ij;(NvA5=8b}$l5t1M)(YOa=E$A8ODE=*iJ)E6 z)_Xshxt?0kb`X6ovSv_)Z+!60uAc$=Xe3#8I;oF-GIl*RHE#$#lM!om;hO-V+4VC( zFS+mvbm*}t`n*(78}LU!9}F<+`r(J1ygw22)Vz5^=<`a}fI)|z<7Cjc_3MYxvk5}F z$X$9-N^1DI6GcNm0(xgW+o*Es1cxPEI4Z?U()M2HTg}}tddbx{L6wmkV$n+5dky%lm(DQykk_=;MeZULUF>XD8h$NVIs&_u ztO32sksDDa1o=8b}$cZ-;-jJqhYt!_DSZ(c_4a^aN{y^BSqzBNi62Yt+iS30{s258OG zChpBk=yxkwD$?p{iznUH^@pD>`{nld zi}U{LAJ3N;%XNS7_+pSN#^Yh))N*`D2v(v8c(s{f6+m)!iKkn$;m;H;&&5hUO z+pDYd)k)W29la z+U({1e!C6VkM^VUA3aYuef-PveA#W6i9`PM_R-zAucIg3`t0!!$3Om*+3fz@Z~r;H z#Xr5g_