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,
})