diff --git a/rowers/integrations/c2.py b/rowers/integrations/c2.py index 316af562..09af9f4a 100644 --- a/rowers/integrations/c2.py +++ b/rowers/integrations/c2.py @@ -114,7 +114,7 @@ class C2Integration(SyncIntegration): return super(C2Integration, self).open(*args, **kwargs) def token_refresh(self, *args, **kwargs): - return super(C2Integration, self).open(*args, **kwargs) + return super(C2Integration, self).token_refresh(*args, **kwargs) def make_authorization_url(self, *args, **kwargs): scope = "user:read,results:write" diff --git a/rowers/integrations/integrations.py b/rowers/integrations/integrations.py index 6ca777f9..d1fd8646 100644 --- a/rowers/integrations/integrations.py +++ b/rowers/integrations/integrations.py @@ -162,6 +162,8 @@ class SyncIntegration(metaclass=ABCMeta): return token def do_refresh_token(self, *args, **kwargs) -> (str, int, str): + refreshtoken = getattr(self.rower, self.oauth_data['refreshtokenname']) + access_token = kwargs.get('access_token','') post_data = {"grant_type": "refresh_token", "client_secret": self.oauth_data['client_secret'], "client_id": self.oauth_data['client_id'], @@ -229,19 +231,19 @@ class SyncIntegration(metaclass=ABCMeta): @abstractmethod def token_refresh(self, *args, **kwargs) -> str: - refreshtoken = getattr(self.rower, oauth['refreshtokenname']) + refreshtoken = getattr(self.rower, self.oauth_data['refreshtokenname']) if not refreshtoken: - refreshtoken = getattr(self.rower, oauth['tokenname']) + refreshtoken = getattr(self.rower, self.oauth_data['tokenname']) access_token, expires_in, refresh_token = self.do_refresh_token() expirydatetime = timezone.now()+timedelta(seconds=expires_in) - setattr(self.rower, tokenname, access_token) - if expirydatename is not None: - setattr(self.rower, expirydatename, expirydatetime) - if refreshtokenname is not None: - setattr(self.rower, refreshtokenname, refresh_token) + setattr(self.rower, self.oauth_data['tokenname'], access_token) + if self.oauth_data['expirydatename'] is not None: + setattr(self.rower, self.oauth_data['expirydatename'], expirydatetime) + if self.oauth_data['refreshtokenname'] is not None: + setattr(self.rower, self.oauth_data['refreshtokenname'], refresh_token) self.rower.save() diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index 5945c690..f78857cf 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -37,7 +37,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from io import StringIO from django.test.client import RequestFactory - +from rowers.integrations import * from rowers.forms import ( DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail, diff --git a/rowers/tests/test_async_tasks.py b/rowers/tests/test_async_tasks.py index 66aa36dd..cadddd32 100644 --- a/rowers/tests/test_async_tasks.py +++ b/rowers/tests/test_async_tasks.py @@ -186,15 +186,16 @@ class AsyncTaskTests(TestCase): self.u.id) self.assertEqual(res,1) - @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) - @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.integrations.c2.requests.post', side_effect=mocked_requests) + @patch('rowers.integrations.c2.requests.get', side_effect=mocked_requests) def test_c2_sync(self, mock_get, mock_post): authorizationstring = str('Bearer aap') headers = {'Authorization': authorizationstring, 'user-agent': 'sanderroosendaal', 'Content-Type': 'application/json'} - data = c2stuff.createc2workoutdata(self.wwater) + integration = C2Integration(self.u) + data = integration.createworkoutdata(self.wwater) url = "https://log.concept2.com/api/users/%s/results" % (1) res = tasks.handle_c2_sync(1,url,headers,data) @@ -469,8 +470,8 @@ class AsyncTaskTests(TestCase): self.assertEqual(res,1) - @patch('rowers.c2stuff.requests.post',side_effect=mocked_requests) - @patch('rowers.c2stuff.requests.get',side_effect=mocked_requests) + @patch('rowers.integrations.c2.requests.post',side_effect=mocked_requests) + @patch('rowers.integrations.c2.requests.get',side_effect=mocked_requests) def test_import_c2_strokedata(self, mock_get, mock_post): c2token = 'aap' c2id = 1212 diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 6943ee1d..3371674b 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1832,14 +1832,77 @@ def workout_getrp3importview(request, externalid): url = reverse('workout_rp3import_view') return HttpResponseRedirect(url) - @login_required() -def workout_getimportview(request, externalid, source='c2', do_async=True): +def workout_getimportview_old(request, externalid, source='c2', do_async=True): if 'startdate' in request.session and source == 'nk': # pragma: no cover startdate = request.session.get('startdate') enddate = request.session.get('enddate') + try: + result = importsources[source].get_workout(request.user, externalid, do_async=do_async, + startdate=startdate, enddate=enddate) + except NoTokenError: + return HttpResponseRedirect(reverse(importauthorizeviews[source])) + + url = reverse(importlistviews[source]) + return HttpResponseRedirect(url) + try: + result = importsources[source].get_workout(request.user, externalid, + do_async=do_async) + except NoTokenError: + + return HttpResponseRedirect(reverse(importauthorizeviews[source])) + + if result: # pragma: no cover + messages.info( + request, "Your workout will be imported in the background") + # this should return to the respective import list page + else: # pragma: no cover + messages.error(request, 'Error getting the workout') + + url = reverse(importlistviews[source]) + return HttpResponseRedirect(url) + + +# Imports all new workouts from SportTracks +@login_required() +def workout_getsporttracksworkout_all(request): + res = sporttracksstuff.get_sporttracks_workout_list(request.user) + if (res.status_code == 200): + r = getrower(request.user) + stids = [int(getidfromuri(item['uri'])) + for item in res.json()['items']] + knownstids = uniqify([ + w.uploadedtosporttracks for w in Workout.objects.filter(user=r) + ]) + newids = [stid for stid in stids if stid not in knownstids] + for sporttracksid in newids: + id = sporttracksstuff.get_workout( + request.user, sporttracksid) + + if id == 0: # pragma: no cover + messages.error( + request, "Something went wrong with workout {id}".format(id=sporttracksid)) + + else: + w = Workout.objects.get(id=id) + w.uploadedtosporttracks = sporttracksid + w.save() + + url = reverse('workouts_view') + return HttpResponseRedirect(url) + + +@login_required() +def workout_getimportview(request, externalid, source='c2', do_async=True): + try: integration = importsources[source](request.user) + except TypeError: + return workout_getimportview_old(request, externalid, source=source, do_async=True) + if 'startdate' in request.session and source == 'nk': # pragma: no cover + startdate = request.session.get('startdate') + enddate = request.session.get('enddate') + try: result = integration.get_workout(externalid, startdate=startdate, enddate=enddate)