From f53a2aca1eaca4e135a6786af0e5987324045737 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 29 Dec 2024 15:12:45 +0100 Subject: [PATCH] fixing export, adding apps to export settings --- rowers/templates/rower_exportsettings.html | 28 +++- rowers/tests/test_imports.py | 185 +++++++++++++++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 3989 bytes rowers/views/importviews.py | 3 +- rowers/views/userviews.py | 2 + 5 files changed, 208 insertions(+), 10 deletions(-) diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 21e91159..03abb848 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -206,14 +206,26 @@ {% endfor %} -
  • - {% endif %} - {% if user.is_staff %} -
  • -

    Admin

    -

    iDoklad authorize

    -
  • - {% endif %} + + {% endif %} + {% if apps %} + {% for app in apps %} +
  • +

    {{ app.name }}

    +

    Client ID: {{ app.client_id }}

    +

    Redirect URIs: {{ app.redirect_uris }}

    +

    Client Type: {{ app.client_type }}

    +

    Authorization grant type: {{ app.authorization_grant_type }}

    +

    Allowed origins: {{ app.allowed_origins }}

    +
  • + {% endfor %} + {% endif %} + {% if user.is_staff %} +
  • +

    Admin

    +

    iDoklad authorize

    +
  • + {% endif %} diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index b5735396..f7b3a933 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -349,6 +349,25 @@ class C2Objects(DjangoTestCase): timezone='Europe/Amsterdam' ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) + def test_timezone_c2(self): c2integration = C2Integration(self.u) data = c2integration.createworkoutdata(self.w) @@ -411,6 +430,19 @@ class C2Objects(DjangoTestCase): @patch('rowers.integrations.c2.requests.post', side_effect=mocked_requests) @patch('rowers.integrations.c2.requests.get', side_effect=mocked_requests) + def test_c2_upload2(self, mock_get, mock_post): + url = '/rowers/workout/'+encoded2+'/c2uploadw/' + + response = self.c.get(url) + + self.assertRedirects(response, + expected_url = '/rowers/list-workouts/', + status_code=302,target_status_code=200) + + self.assertEqual(response.url, '/rowers/list-workouts/') + self.assertEqual(response.status_code, 302) + @patch('rowers.integrations.c2.requests.post', side_effect=mocked_requests) + @patch('rowers.integrations.c2.requests.get', side_effect=mocked_requests) def test_c2_list(self, mock_get, mock_post): response = self.c.get('/rowers/workout/c2import',follow=True) @@ -756,6 +788,24 @@ class NKObjects(DjangoTestCase): duration=duration,distance=totaldist, csvfilename=filename ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) @patch('rowers.dataprep.create_engine') @patch('rowers.dataprep.read_data',side_effect=mocked_read_data) @@ -1025,6 +1075,24 @@ class PolarObjects(DjangoTestCase): duration=duration,distance=totaldist, csvfilename=filename ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) @patch('rowers.integrations.polar.requests.post', side_effect=mocked_requests) @patch('rowers.integrations.polar.requests.get', side_effect=mocked_requests) @@ -1118,6 +1186,24 @@ class RP3Objects(DjangoTestCase): duration=duration,distance=totaldist, csvfilename=filename ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) @patch('rowers.integrations.rp3.requests.get', side_effect=mocked_requests) @patch('rowers.integrations.rp3.requests.post', side_effect=mocked_requests) @@ -1213,6 +1299,24 @@ class StravaObjects(DjangoTestCase): duration=duration,distance=totaldist, csvfilename=filename,uploadedtostrava=123, ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) @patch('rowers.integrations.strava.requests.post', side_effect=mocked_requests) @patch('rowers.integrations.strava.requests.get', side_effect=mocked_requests) @@ -1281,6 +1385,20 @@ class StravaObjects(DjangoTestCase): self.assertEqual(res,1) + @patch('rowers.integrations.strava.requests.post', side_effect=mocked_requests) + @patch('rowers.integrations.strava.requests.get', side_effect=mocked_requests) + def test_strava_upload2(self, mock_get, mock_post): + url = '/rowers/workout/'+encoded2+'/stravauploadw/' + + response = self.c.get(url) + + self.assertRedirects(response, + expected_url = '/rowers/list-workouts/', + status_code=302,target_status_code=200) + + self.assertEqual(response.url, '/rowers/list-workouts/') + self.assertEqual(response.status_code, 302) + @patch('rowers.integrations.strava.requests.post', side_effect=mocked_requests) @patch('rowers.integrations.strava.requests.get', side_effect=mocked_requests) def test_strava_upload(self, mock_get, mock_post): @@ -1383,6 +1501,24 @@ class STObjects(DjangoTestCase): duration=duration,distance=totaldist, csvfilename=filename ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) @patch('rowers.integrations.sporttracks.requests.post', side_effect=mocked_requests) def test_sporttracks_callback(self, mock_post): @@ -1411,6 +1547,20 @@ class STObjects(DjangoTestCase): self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/') self.assertEqual(response.status_code, 302) + @patch('rowers.integrations.sporttracks.requests.post', side_effect=mocked_requests) + @patch('rowers.integrations.sporttracks.requests.get', side_effect=mocked_requests) + def test_tp_upload2(self, mock_get, mock_post): + url = '/rowers/workout/'+encoded2+'/sporttracksuploadw/' + + response = self.c.get(url) + + self.assertRedirects(response, + expected_url = '/rowers/list-workouts/', + status_code=302,target_status_code=200) + + self.assertEqual(response.url, '/rowers/list-workouts/') + self.assertEqual(response.status_code, 302) + @patch('rowers.integrations.sporttracks.requests.get', side_effect=mocked_requests) def test_sporttracks_list(self, mock_get): response = self.c.get('/rowers/workout/sporttracksimport',follow=True) @@ -1462,6 +1612,7 @@ class TPObjects(DjangoTestCase): self.u.first_name = 'John' self.u.last_name = 'Sander' self.u.save() + self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, gdproptindate=timezone.now() ) @@ -1507,6 +1658,26 @@ class TPObjects(DjangoTestCase): csvfilename=filename ) + + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) + @patch('rowers.integrations.trainingpeaks.requests.post', side_effect=mocked_requests) def test_tp_callback(self, mock_post): response = self.c.get('/tp_callback?code=dsdoij232s',follow=True) @@ -1535,3 +1706,17 @@ class TPObjects(DjangoTestCase): self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/') self.assertEqual(response.status_code, 302) + + @patch('rowers.integrations.trainingpeaks.requests.post', side_effect=mocked_requests) + @patch('rowers.integrations.trainingpeaks.requests.get', side_effect=mocked_requests) + def test_tp_upload2(self, mock_get, mock_post): + url = '/rowers/workout/'+encoded2+'/tpuploadw/' + + response = self.c.get(url) + + self.assertRedirects(response, + expected_url = '/rowers/list-workouts/', + status_code=302,target_status_code=200) + + self.assertEqual(response.url, '/rowers/list-workouts/') + self.assertEqual(response.status_code, 302) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 825479663045a110a1a50dc800b37b8f4079804a..5aa2a435fcf8b024cf872edae62d76da0e6c639c 100644 GIT binary patch literal 3989 zcmV;G4{GoqiwFqESaD|p|8!+@bYx+4VJ>uIcmVC4TW=Fd7J%RR6;WR1VMX~|>eM9) z88NV{9SPXcfM(}y)g+$aoy3k}hs(d;DjPz8w1$&xm#SOE1B%;ybANrR&b)Gvx&)(Ah?i2^z`|mi*+Z^xqpI=`Jzwc7LfbM$e?lf_oQaM&!ruT601jtq zr%(Go>n`?QZo13OtHt^J(f(f@dwrpF=&RMHJIjZ?oFA{2C+j0&e>nSQ>*oWWE_QFw z^LhHQ>vW&_UcTD+dGAm7ju6A)?E2H^9Udo9>rUtYoTt10wcE^px;Wpynwt+7>6ct@ z{(1S+yxXjQnO{C%EUz~6|7>pjh;*9Yy0feK5!!T--JhSYFuUavH@<$}yJj}9BtorGtnWqPQM3^7r?(Z8EFBhk$>DK0(H>;DQ z=iTzEJ4+P5*m`sC?)c9y?tZ)FVzpRqZf?$Bq<7#u-o@>1Ump3@D+yJrmqIhJSs=bk2Wwn@tj%csSer_4PGp z>7rl%yxVUvzX-SC)lz3LN!rCKs3RL32lo7+E8D;#_u!6I zaSu=tcS+onP-(PzZ`??@*Cp?PE8^}=@ZdE1ymKYZIHu`v_w{fWFg~Ew$h#LKBjH}z zIA4(+Cu}0vsNo)@r2Rf6c@GtFcg6vMMz4!fRG*)YydzYk*hw_ZIyWssS@L`j@>Caj zs%DC(14yQv=uA08De1dmI~|#4sffHaF)8&bnI|!!AbFV(`B)M8WX=h4P=#k)Q9IsE zhrD(5kVi1iBB^9P8UH0ccYZqayg)_d*;qzl4f(>pyEq~8R1tY+(CM5w=zPg}-a;Gg z2O%F!B(a+C9Qshwe|InPZM5$tPiP#0SB>_eEcxj~=uj%M>c|=aM3sgYV@Z2{O5|;* zhrD2i8l0Ljik*~;yXW1~K z)kJB@7tOG5*`pI$|kJs-jNrs0i!o)#W2>6ynbE|NkjFO9 z-%g%$?kxk7#*>p?l#*H3)-}KVAmqgWLr}@QP|=7@BR>pzZ$grI)R1@FWd4rixgPQe zMgjy?lMK&AW!^X4eh~6(*rKTB`M^arJl|w~5c1AoL{Z6nv_-wQP3DIozswLr6F zD=P0r9-9xZk9^L(6|2(iZP|)S8=A}yLf)D*)JKhOZ^;#v`OvJoLCAYU5uL_+YuOde zw-0T!AA&r?wk4KEx3|_6)$K!z&ksVLjAMwZCU{bo{FEvxT}9-@SYcMp^R8$u?WD*{ zMdX7?+*KKvwroYEK$H0)$Xhf?<8-8Id0MpBtxTwjT5Lt+*?6am(%KkH=HyI?d_6Tb zoO5rTN7Rh=f-oAHZ}xmY`DiFW3@Y-m>GtD~*a+orDXJ)~Ff`qM{4y`rgrwW6WZss| zx{j@ub`bL32gRjOdxI89HQGBWYR^xIyrYW9=gtYln*R3AbJ2NzO5`ij z?US~~5ml>}xxg(-I|1@y07TX0+(m9t+VPL}?2U-76QYMk{;uRJ((Nr6_M-CSc(f%o zynE&0H4U$yJm>DGD(|gNmSAidn4>2z##@J)Se;M0LBUv^;Dqe?isJJ&7>kUWoE)Ft z7CRF1wfXQuJ>&&*Ev;%z3ok|M=cgp|HEDRl#tWgwhv%Iu>9?QMJYSJLpX8S#scLMz zcderGj^rzf(n>VI1ggH$q-0(yB5#caQOSIOqH9r4 zO6FZfhWd%eEaBq(b3+u zwWx<6zstSV&GR7?wd$rsz9LVKBnyoRRODkQnv>(&JU<9|XM!cxL}?MAY?yXR=qqyN zNX!ZM5LD<18u~l-KdolGce(Sei@Nb1fw5@H{e93wW$2|M^pYEuK64;R5pllnWNr;5<~+#<`P z3Vm>+k^0Kev#SSvveRrJuqyP?7gh77G~i=J=sC^x1gg0nA&drnZ3BKyQtu1{l4`C; zEL(0fCG=bo`j|ERsFV7#s}?r&!=TTdP#vo>voOtAO~ao6ddUO6DrAc&R5V&YB{i=i zqT!30I^Q$gB=ZeY{p$L zdY{ninrP%~uA=C)<_)Vx8^vk}0klX@3M zGvH%O(CS6+j78mAhR8k^ZJb8Ut{((_G!)V5H2hFDe8bI~Hw1c1xqp_@P|N8V2~JDh2Fww);4V3yngiCB5P8` z>yt&$imWFf^)7eSh&uF+iW+yVtHvN2q&REEamKyXN+JHZPN3M+tJ&~&L%Go%YO52vD(~Dlnu-1p~9JIN9 z0_epMY1KRrEhBgAg;ycBOvJQJhd$tF8mcrkuLph1EfWDT>g@VREiH2b=-C8NdhYTh8|DH(U9Y^~s(YmVHpyL4i1nF!i7 zZN2xSnd_+qZF|w@B5MX!_{Im{?D`3yk4BPpr<3~VM`PDhQ}g=JGa0c~7rqG)nq5Bu z^pXp&K!+ZSqR&eOwE=$s^uYk5t{;BL$@?QgPtBXxhd!@l4H$IjIgSQ>Tfe>^J)0n; zi`=CbrKEdg=6|4|z>nUF0r8(Z$XtrQz3-r6aIi z$r{kB9Jvu?G%g)zee-(JZ&$L`t#cQtY|s|kTt5hUpQ~?_=-H2Eb;~x__oB}$Su>K# zn-{GwT75&UZ{8s2dAo?Y%D9UX+v=7h_vU5vE*D-Y(Yshw>RY4KVbI51c%`%JV}RB? zZRFm(gnqk{wK8%SBeu@i6F_fGn(0*wpb$Xok$YG4ekk-Gw|?4iID6JzTz`16+RWES zuYdUCa&^9Uwfu9rdbiwryXf{VSMS!{@}xUE%RlUg!`W`n2fI^z`f>U5^{2(|`@<)f z3E=AT&--mRTtCyV z&VTqS-Sp9~^Rs!ko+kkL)5k}5uIcmVC4NpBoC7J%>m6@m`QVG#CP__!#t z0>{o^4A`C^F*3OgDpE)88L1_x%iF&nvfGhmTZQCFQv|C(9}IPMZCzhI^6fnQ?%ny> z-kassW_7WCxQ_<*_r5!NaQO17Tdh~?)5ptozr1?V_1$mXX1SMkUT+@mzv}zTgT>n~ST{1p(mV*XPfE-k#!{)q2x+>*HlQYO^}no%h+rao2Bu?VWC5Pk+=K zGVeAge}3TKyZ&)^c5$^@ZWeFw&-eem>yLN)FRw3!f9+C(fbM$e?l_ww1sk9+@t?+7s*F0Ma)+~H9YweEEJk7c_1pSphe{pI=g)$HG2reAWs z`RV%mW!GOWukG5~cGLgOBa`Qo+EYkx%BFv9*_xBBoSF6+0bZg80)y2ut z^KSjRJ4+Nl*?M#D?)bl--2HaT<;7~<-`t$PNbkU3co(<3eR||)uY?#o{F-bJxF>;| z6v%%;VMpS21fM)$xaIk7ceozCHeX!!<&VGq<(c5tG5qs0rgQ$Q>-!`&@o=&G>+@?a z(nUZ2dAHwUei3fNtEJ9hlC+CeP)9a64ea?rSHzuMMcfla1Q!(CDd|lGxre)Rr@G|b zN=4kAAx70GpN0r7$UV-6yR#K>k4fIGcn$YhQr;P6!`)ZJ-O_fPcM9${7%Ipe@4+3b z;vS$P?vl7Cq0(sc-nfZyuS?zoSH#_$;K6D1dFM)+aZK~!?(5+$V0=KUk#{dfCc?e4 zalRruPS`}SQNuk*N&9_H@*XPU?u-Khjb0a}s6Ia*c}J*7v6E<+b#7XOvgG+53jEfjmZ zHS;{#vgGZI$X67x;a~v3i-x>F$>_YjkKdk~RX0RF$**;&O2ZDdBl$Rkchw{KC}Ve-y+!JvuKGGS4Beoo{ovgfmf##S}YGoy(UA&+gI zznwhi+*<}DjVC9)C?&J5t!sY!QOJt{hM zIOpCvkEj{#1z|EW-|YEe^3hO$7*ynA)9t4pu@TDMQdCh|VQ9Mj^krVG2}!qC$-FI_ zbsbwR?I`5E5!OX)M9PwHKD-gg+XUO7x2mjbagF?4$=iy^lL=l|T_qkT6Q6G~KTKYX zB~(>cNhn)a*Lq-%Lp~TnRCP{}ShmK-H{E^=@(3m(vBrDr09)?u^kp8|NFdTgX&p|7 zJU36yAbFRwu2r279br-3eoo|T8ttP2#Gr}KJEo#l)V{^%#~`0`ZvzHR-&<#?XzuNt z$X8^~lQra!Rr9>iWO8r0)z1%-_XaJJYP5G$)SjOac}EqI&z%#9HT~_K=c4ocoXA(C z+b3;}BdS&{bAelwb_V3d0Enu~xr^MQw9_B$*&7jECqxg8{9Vacq}y9C>_z3t@n}nG zc=yV~YZ~4#dCuKWRo+{lEWy|^Fegu5jJFOou{xi0gMzU-!5P`}6~*UmFcuj#IXOPP zEp{U0YxCiSddLgrT3Xeb7G8?h&(BHbYtrz9jTb_V56?SS(r-VjdA=fhKFKdfQq|aa z?^;FW9m!V|rIl!a2~?wfaFfyPoA-8ryc_@;uk_*hSacQgS;@RqMBW+;qLTRlMc1O9 zmCU<}$a{l8pt0%#hRMi$BR@<&8kYup&1fGe6t(B)G}?!H$RinRF>11|1IH%wcO)Mx zA}D!!86pn>)pWB%dvJSnoMQuB2bNwjjt+9eCA1;EICiQnjPZgo}xkZ*o z75d;NBlVS`XIBsUWT)9cU{&a&FRJFvX~4&d&~uvW2~=}ELYNHt+6MfZq}~|@B-LDx zShn0|PUyKJ^f7DrQ783fS1oMl$3dSvp*mJ&W?`DKnub3E^pXdBRmc`msA#l)PHJ97 z#vKPk9)n85N7uZ0cQx)pJ?PWe4KDY`)1dc7`{3RyBNLi&H;CRE0Aiig2Rj+`*o?bD z^gf~2HPOh~Tt(4yLq7`oXrfiRbO>BgCEqW^3 zDs4_u4;7&gMub!iu#u8Q=o|WJyL5c+jA@;S%DAJXAjm}8=U`iweh|Gi>~-yP^1>LC z>73N;`eF3mP>`S-@I4eQtjDJ2je#DM04odbkOEGoBQCbI%t7>Q(CNBnA;qE#m(FUy zr;5-!1D13dxePp+HE!BmKa4(@D9Y*^MqAXS)8_h7&=Z8L43T{-+Bl7xT|Wx?Xegr9Y51XR_=cM|Zw&O7a{nxyH;-d%YTon* zd@BY-S$Jg;CKIo(Eg8F_psh_B8&Zra^h9m0pFVm46O{`Wqh%@@xobZBanQ4g4oQdJ z@?@4bYmVGu^xKw+UZv()vCXA3eMj!LWg>drT<>Hu30f^Ja{ztVwoC-wk~e6*G~;gS zc74b#6RilU9Jw~M>YKZw4;7&gxr3IjtA>qb!#CUp{4vlY8fI}SsTU}_Ts_Z7&4Y^2 z+ihzFm6|7o+bGSczTQ@Z-W#&Ypsg?z_2$_&;E#cxz#uWQ3cZENtZmr5dBf z*C&gh6Rs-t5q0Pt6*cZ!SB-Jdhb;A8H{g4ojMTRQe-J&R3BtN~y#!lS!*4;` zanM`i5K+}tL!xcoyy-h~*&EMfRY6+^ZZfGFP0brbpX@a2P?x3S(6s@7>bZFdJsY9y zq|u6Bo!HcG?jow1M;Ej8#lv;lwmj$9iPdLmWfm9ud&m9{NQXAr%RVXY6}IcRhJ z4A6@q(yDnLT1M{F3$H?MnTTnd4t>DMG*oG7-T?ZTTP6Zx)YIn*BrT1cj?63G7+?E z+IsINGuKlK+76=6Mb-?e@Qn|?+4VC(AB`mIPAB!zPsXmNrsfTyXEI`~E_@RpG`oHV z=p`3kfet+uMW2@nY6JcV=z{@9T|fMgllLcro|-pr2z_438ZhY4bDRwNwtoFEdNx5w z7r9F>N=XerccN(MM?mk4XB$;6o#3#fOJ`Q-r6Tk(uW1W9srOiP!1t{LV+`~{##s!i zES(UFR@&YReXF?}MlZSgCa5xULo8Zpd#?e%_0kzeAM%>Ey2xFGqKlo)O2e-uOGjY4 zk~N@LIdUV)WL!GX`sNLy->zh>TjwrP*`O`7xqcM%K3Cr;(X*e->XvP;A4H#5vSuWe zH!oUWwEBix-@H-K^L7z)m2np(w$&{s?#;{ST`s&*qIa>V)VD^d(i62@6vg@-P@I@d_3;((d+)z#np}1 zAI}2`p{&Kg~ zI&Jpyalh?`>qq<9`43;Fn?Cw!dA95}%fumn`tay(+}Gi=ZhiXn$PdPUzoknbJ@_9-$8k5r GfB^tN_dX;5 diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index ed6a3052..294171b2 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -39,11 +39,10 @@ def default(o): # pragma: no cover raise TypeError @login_required() -@permission_required('workout.is_workout_owner', fn=get_user_by_userid, raise_exception=True) def workout_export_view(request, id=0, source='c2'): r = getrequestrower(request) w = get_workout_by_opaqueid(request, id) - if w.user != request.user: + if w.user != request.user.rower: messages.error(request, 'You can only export your own workouts') url = reverse('workouts_view') return HttpResponseRedirect(url) diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 7378c1ac..0ab645d6 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -550,6 +550,7 @@ def rower_exportsettings_view(request, userid=0): except APIKey.DoesNotExist: apikey = APIKey.objects.create(user=request.user) + apps = Application.objects.filter(user=request.user) return render(request, 'rower_exportsettings.html', {'form': form, @@ -558,6 +559,7 @@ def rower_exportsettings_view(request, userid=0): 'breadcrumbs': breadcrumbs, 'grants': grants, 'apikey': apikey.key, + 'apps': apps, })