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 82547966..5aa2a435 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ 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, })