From 0152c8d20be9446e9e9e36517fb5a426b402575e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Jun 2018 12:14:00 +0200 Subject: [PATCH 1/5] removing some duplicate code --- rowers/courses.py | 24 ------------------ rowers/database.py | 18 +++++++++++++ rowers/dataprep.py | 18 +------------ rowers/dataprepnodjango.py | 28 +------------------- rowers/models.py | 17 +------------ rowers/plots.py | 44 +------------------------------- rowers/runkeeperstuff.py | 52 ++------------------------------------ rowers/sporttracksstuff.py | 29 ++------------------- rowers/stravastuff.py | 19 +++++--------- rowers/tasks.py | 23 +++++++---------- rowers/tpstuff.py | 52 +++----------------------------------- rowers/underarmourstuff.py | 51 +++---------------------------------- rowers/utils.py | 45 +++++++++++++++++++++++++++++++++ rowers/views.py | 12 ++++----- 14 files changed, 99 insertions(+), 333 deletions(-) create mode 100644 rowers/database.py diff --git a/rowers/courses.py b/rowers/courses.py index 4658462e..4d204100 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -46,30 +46,6 @@ from utils import geo_distance from rowers.courseutils import coursetime_paths, coursetime_first,time_in_path - -def get_course_timezone(course): - polygons = GeoPolygon.objects.filter(course = course) - points = GeoPoint.objects.filter(polygon = polygons[0]) - lat = points[0].latitude - lon = points[0].longitude - - tf = TimezoneFinder() - try: - timezone_str = tf.timezone_at(lng=lon,lat=lat) - except ValueError: - timezone_str = 'UTC' - - if timezone_str is None: - timezone_str = tf.closest_timezone_at(lng=lon,lat=lat) - if timezone_str is None: - timezone_str = 'UTC' - - return timezone_str - - - - - def crewnerdcourse(doc): courses = [] for course in doc: diff --git a/rowers/database.py b/rowers/database.py new file mode 100644 index 00000000..cd420ad2 --- /dev/null +++ b/rowers/database.py @@ -0,0 +1,18 @@ +from django.conf import settings + +user = settings.DATABASES['default']['USER'] +password = settings.DATABASES['default']['PASSWORD'] +database_name = settings.DATABASES['default']['NAME'] +host = settings.DATABASES['default']['HOST'] +port = settings.DATABASES['default']['PORT'] + +database_url = 'mysql://{user}:{password}@{host}:{port}/{database_name}'.format( + user=user, + password=password, + database_name=database_name, + host=host, + port=port, + ) + +if settings.DEBUG or user=='': + database_url = 'sqlite:///db.sqlite3' diff --git a/rowers/dataprep.py b/rowers/dataprep.py index ddcb0b05..bd238950 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -71,24 +71,8 @@ queuehigh = django_rq.get_queue('default') from rowsandall_app.settings import SITE_URL from rowers.types import otwtypes -user = settings.DATABASES['default']['USER'] -password = settings.DATABASES['default']['PASSWORD'] -database_name = settings.DATABASES['default']['NAME'] -host = settings.DATABASES['default']['HOST'] -port = settings.DATABASES['default']['PORT'] +from rowers.database import * -database_url = 'mysql://{user}:{password}@{host}:{port}/{database_name}'.format( - user=user, - password=password, - database_name=database_name, - host=host, - port=port, -) - -# Use SQLite local database when we're in debug mode -if settings.DEBUG or user == '': - # database_url = 'sqlite:///db.sqlite3' - database_url = 'sqlite:///' + database_name # mapping the DB column names to the CSV file column names diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index 3828afdb..0dd4d25b 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -133,34 +133,8 @@ def rdata(file,rower=rrower()): return res +from utils import totaltime_sec_to_string -def totaltime_sec_to_string(totaltime): - hours = int(totaltime / 3600.) - if hours > 23: - message = 'Warning: The workout duration was longer than 23 hours. ' - hours = 23 - - minutes = int((totaltime - 3600. * hours) / 60.) - if minutes > 59: - minutes = 59 - if not message: - message = 'Warning: there is something wrong with the workout duration' - - seconds = int(totaltime - 3600. * hours - 60. * minutes) - if seconds > 59: - seconds = 59 - if not message: - message = 'Warning: there is something wrong with the workout duration' - - tenths = int(10 * (totaltime - 3600. * hours - 60. * minutes - seconds)) - if tenths > 9: - tenths = 9 - if not message: - message = 'Warning: there is something wrong with the workout duration' - - duration = "%s:%s:%s.%s" % (hours, minutes, seconds, tenths) - - return duration # Creates C2 stroke data def create_c2_stroke_data_db( diff --git a/rowers/models.py b/rowers/models.py index b6146910..6510f4dd 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -49,22 +49,7 @@ tweetapi = twitter.Api(consumer_key=TWEET_CONSUMER_KEY, access_token_key=TWEET_ACCESS_TOKEN_KEY, access_token_secret=TWEET_ACCESS_TOKEN_SECRET) -user = settings.DATABASES['default']['USER'] -password = settings.DATABASES['default']['PASSWORD'] -database_name = settings.DATABASES['default']['NAME'] -host = settings.DATABASES['default']['HOST'] -port = settings.DATABASES['default']['PORT'] - -database_url = 'mysql://{user}:{password}@{host}:{port}/{database_name}'.format( - user=user, - password=password, - database_name=database_name, - host=host, - port=port, - ) - -if settings.DEBUG or user=='': - database_url = 'sqlite:///db.sqlite3' +from rowers.database import * timezones = ( (x,x) for x in pytz.common_timezones diff --git a/rowers/plots.py b/rowers/plots.py index 8193a088..b57d263e 100644 --- a/rowers/plots.py +++ b/rowers/plots.py @@ -2,43 +2,8 @@ from matplotlib.ticker import MultipleLocator,FuncFormatter,NullFormatter import matplotlib.pyplot as plt import numpy as np +from rows import format_pace_tick, format_pace, format_time, format_time_tick -# Make pace ticks for pace axis '2:00', '1:50', etc -def format_pace_tick(x,pos=None): - min=int(x/60) - sec=int(x-min*60.) - sec_str=str(sec).zfill(2) - template='%d:%s' - return template % (min,sec_str) - -# Returns a pace string from a pace in seconds/500m, '1:45.4' -def format_pace(x,pos=None): - if isinf(x) or isnan(x): - x=0 - - min=int(x/60) - sec=(x-min*60.) - - str1 = "{min:0>2}:{sec:0>4.1f}".format( - min = min, - sec = sec - ) - - return str1 - -# Returns a time string from a time in seconds -def format_time(x,pos=None): - - - min = int(x/60.) - sec = int(x-min*60) - - str1 = "{min:0>2}:{sec:0>4.1f}".format( - min=min, - sec=sec, - ) - - return str1 # Formatting the distance tick marks def format_dist_tick(x,pos=None): @@ -46,13 +11,6 @@ def format_dist_tick(x,pos=None): template='%6.3f' return template % (km) -# Formatting the time tick marks (h:mm) -def format_time_tick(x,pos=None): - hour=int(x/3600) - min=int((x-hour*3600.)/60) - min_str=str(min).zfill(2) - template='%d:%s' - return template % (hour,min_str) # Utility to select reasonable y axis range # Basically the data range plus some padding, but with ultimate diff --git a/rowers/runkeeperstuff.py b/rowers/runkeeperstuff.py index 512cd1a9..8f8afb71 100644 --- a/rowers/runkeeperstuff.py +++ b/rowers/runkeeperstuff.py @@ -36,63 +36,15 @@ from rowsandall_app.settings import ( RUNKEEPER_CLIENT_ID, RUNKEEPER_CLIENT_SECRET,RUNKEEPER_REDIRECT_URI, ) -# Custom error class - to raise a NoTokenError -class RunKeeperNoTokenError(Exception): - def __init__(self,value): - self.value=value +from utils import geo_distance,ewmovingaverage,NoTokenError, custom_exception_handler - def __str__(self): - return repr(self.value) - -# Exponentially weighted moving average -# Used for data smoothing of the jagged data obtained by Strava -# See bitbucket issue 72 -def ewmovingaverage(interval,window_size): - # Experimental code using Exponential Weighted moving average - - try: - intervaldf = pd.DataFrame({'v':interval}) - idf_ewma1 = intervaldf.ewm(span=window_size) - idf_ewma2 = intervaldf[::-1].ewm(span=window_size) - - i_ewma1 = idf_ewma1.mean().ix[:,'v'] - i_ewma2 = idf_ewma2.mean().ix[:,'v'] - - interval2 = np.vstack((i_ewma1,i_ewma2[::-1])) - interval2 = np.mean( interval2, axis=0) # average - except ValueError: - interval2 = interval - - return interval2 - -from utils import geo_distance - - -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res # Checks if user has SportTracks token, renews them if they are expired def runkeeper_open(user): r = Rower.objects.get(user=user) if (r.runkeepertoken == '') or (r.runkeepertoken is None): s = "Token doesn't exist. Need to authorize" - raise RunKeeperNoTokenError("User has no token") + raise NoTokenError("User has no token") else: thetoken = r.runkeepertoken diff --git a/rowers/sporttracksstuff.py b/rowers/sporttracksstuff.py index d8de7b20..8190cbdb 100644 --- a/rowers/sporttracksstuff.py +++ b/rowers/sporttracksstuff.py @@ -34,40 +34,15 @@ from rowers.models import Rower,Workout,checkworkoutuser from rowsandall_app.settings import C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET, STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET, SPORTTRACKS_CLIENT_SECRET, SPORTTRACKS_CLIENT_ID, SPORTTRACKS_REDIRECT_URI -# Custom error class - to raise a NoTokenError -class SportTracksNoTokenError(Exception): - def __init__(self,value): - self.value=value +from utils import NoTokenError, custom_exception_handler - def __str__(self): - return repr(self.value) - - -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res # Checks if user has SportTracks token, renews them if they are expired def sporttracks_open(user): r = Rower.objects.get(user=user) if (r.sporttrackstoken == '') or (r.sporttrackstoken is None): s = "Token doesn't exist. Need to authorize" - raise SportTracksNoTokenError("User has no token") + raise NoTokenError("User has no token") else: if (timezone.now()>r.sporttrackstokenexpirydate): thetoken = rower_sporttracks_token_refresh(user) diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index b1ee7d3c..b4b39f7c 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -275,6 +275,7 @@ def create_async_workout(alldata,user,stravaid): return w.id +from utils import get_strava_stream # Get a Strava workout summary data and stroke data by ID def get_strava_workout(user,stravaid): @@ -297,18 +298,12 @@ def get_strava_workout(user,stravaid): workoutsummary['timezone'] = "Etc/UTC" startdatetime = workoutsummary['start_date'] - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/cadence?resolution="+fetchresolution+"&series_type="+series_type - spmjson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/heartrate?resolution="+fetchresolution+"&series_type="+series_type - hrjson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/time?resolution="+fetchresolution+"&series_type="+series_type - timejson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/velocity_smooth?resolution="+fetchresolution+"&series_type="+series_type - velojson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/distance?resolution="+fetchresolution+"&series_type="+series_type - distancejson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/latlng?resolution="+fetchresolution+"&series_type="+series_type - latlongjson = requests.get(url,headers=headers) + spmjson = get_strava_stream(r,'cadence',stravaid) + hrjson = get_strava_stream(r,'heartrate',stravaid) + timejson = get_strava_stream(r,'time',stravaid) + velojson = get_strava_stream(r,'velocity_smooth',stravaid) + distancejson = get_strava_stream(r,'distance',stravaid) + latlongjson = get_strava_stream(r,'latlng',stravaid) try: t = np.array(timejson.json()[0]['data']) diff --git a/rowers/tasks.py b/rowers/tasks.py index 1cad32e8..b565754c 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -67,6 +67,8 @@ import requests import longtask import arrow +from utils import get_strava_stream + siteurl = SITE_URL # testing task @@ -98,20 +100,13 @@ def handle_strava_import_stroke_data(stravatoken, workoutsummary['timezone'] = "Etc/UTC" startdatetime = workoutsummary['start_date'] - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/cadence?resolution="+fetchresolution+"&series_type="+series_type - spmjson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/heartrate?resolution="+fetchresolution+"&series_type="+series_type - hrjson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/time?resolution="+fetchresolution+"&series_type="+series_type - timejson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/velocity_smooth?resolution="+fetchresolution+"&series_type="+series_type - velojson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/distance?resolution="+fetchresolution+"&series_type="+series_type - distancejson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/latlng?resolution="+fetchresolution+"&series_type="+series_type - latlongjson = requests.get(url,headers=headers) - url = "https://www.strava.com/api/v3/activities/"+str(stravaid)+"/streams/watts?resolution="+fetchresolution+"&series_type="+series_type - wattsjson = requests.get(url,headers=headers) + spmjson = get_strava_stream(r,'cadence',stravaid) + hrjson = get_strava_stream(r,'heartrate',stravaid) + timejson = get_strava_stream(r,'time',stravaid) + velojson = get_strava_stream(r,'velocity_smooth',stravaid) + distancejson = get_strava_stream(r,'distance',stravaid) + latlongjson = get_strava_stream(r,'latlng',stravaid) + wattsjson = get_strava_stream(r,'watts',stravaid) try: t = np.array(timejson.json()[0]['data']) diff --git a/rowers/tpstuff.py b/rowers/tpstuff.py index 511e14ab..9a783d9a 100644 --- a/rowers/tpstuff.py +++ b/rowers/tpstuff.py @@ -52,63 +52,17 @@ from async_messages import message_user,messages -# Custom error class - to raise a NoTokenError -class TPNoTokenError(Exception): - def __init__(self,value): - self.value=value - def __str__(self): - return repr(self.value) - - # Exponentially weighted moving average -# Used for data smoothing of the jagged data obtained by Strava -# See bitbucket issue 72 -def ewmovingaverage(interval,window_size): - # Experimental code using Exponential Weighted moving average - - try: - intervaldf = pd.DataFrame({'v':interval}) - idf_ewma1 = intervaldf.ewm(span=window_size) - idf_ewma2 = intervaldf[::-1].ewm(span=window_size) - - i_ewma1 = idf_ewma1.mean().ix[:,'v'] - i_ewma2 = idf_ewma2.mean().ix[:,'v'] - - interval2 = np.vstack((i_ewma1,i_ewma2[::-1])) - interval2 = np.mean( interval2, axis=0) # average - except ValueError: - interval2 = interval - - return interval2 - -from utils import geo_distance +from utils import geo_distance, NoTokenError,ewmovingaverage, custom_exception_handler -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res # Checks if user has UnderArmour token, renews them if they are expired def tp_open(user): r = Rower.objects.get(user=user) if (r.tptoken == '') or (r.tptoken is None): s = "Token doesn't exist. Need to authorize" - raise TPNoTokenError("User has no token") + raise NoTokenError("User has no token") else: if (timezone.now()>r.tptokenexpirydate): res = do_refresh_token(r.tprefreshtoken) @@ -120,7 +74,7 @@ def tp_open(user): r.save() thetoken = r.tptoken else: - raise TPNoTokenError("Refresh token invalid") + raise NoTokenError("Refresh token invalid") else: thetoken = r.tptoken diff --git a/rowers/underarmourstuff.py b/rowers/underarmourstuff.py index d47d944a..cb5a479e 100644 --- a/rowers/underarmourstuff.py +++ b/rowers/underarmourstuff.py @@ -39,63 +39,18 @@ from rowsandall_app.settings import ( UNDERARMOUR_REDIRECT_URI,UNDERARMOUR_CLIENT_KEY, ) -# Custom error class - to raise a NoTokenError -class UnderArmourNoTokenError(Exception): - def __init__(self,value): - self.value=value +from utils import NoTokenError,ewmovingaverage - def __str__(self): - return repr(self.value) - - # Exponentially weighted moving average -# Used for data smoothing of the jagged data obtained by Strava -# See bitbucket issue 72 -def ewmovingaverage(interval,window_size): - # Experimental code using Exponential Weighted moving average - - try: - intervaldf = pd.DataFrame({'v':interval}) - idf_ewma1 = intervaldf.ewm(span=window_size) - idf_ewma2 = intervaldf[::-1].ewm(span=window_size) - - i_ewma1 = idf_ewma1.mean().ix[:,'v'] - i_ewma2 = idf_ewma2.mean().ix[:,'v'] - - interval2 = np.vstack((i_ewma1,i_ewma2[::-1])) - interval2 = np.mean( interval2, axis=0) # average - except ValueError: - interval2 = interval - - return interval2 - -from utils import geo_distance +from utils import geo_distance, custom_exception_handler -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res # Checks if user has UnderArmour token, renews them if they are expired def underarmour_open(user): r = Rower.objects.get(user=user) if (r.underarmourtoken == '') or (r.underarmourtoken is None): s = "Token doesn't exist. Need to authorize" - raise UnderArmourNoTokenError("User has no token") + raise NoTokenError("User has no token") else: if (timezone.now()>r.underarmourtokenexpirydate): res = do_refresh_token( diff --git a/rowers/utils.py b/rowers/utils.py index b51948ef..1efd8aed 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -7,6 +7,7 @@ from django.conf import settings import uuid import datetime +import requests lbstoN = 4.44822 @@ -398,3 +399,47 @@ def ewmovingaverage(interval,window_size): interval2 = interval return interval2 + +# Exceptions +# Custom error class - to raise a NoTokenError +class NoTokenError(Exception): + def __init__(self,value): + self.value=value + + def __str__(self): + return repr(self.value) + +# Custom exception handler, returns a 401 HTTP message +# with exception details in the json data +def custom_exception_handler(exc,message): + + response = { + "errors": [ + { + "code": str(exc), + "detail": message, + } + ] + } + + res = HttpResponse(message) + res.status_code = 401 + res.json = json.dumps(response) + + return res + +def get_strava_stream(r,metric,stravaid,series_type='time',fetchresolution='high'): + authorizationstring = str('Bearer ' + r.stravatoken) + headers = {'Authorization': authorizationstring, + 'user-agent': 'sanderroosendaal', + 'Content-Type': 'application/json', + 'resolution': 'medium',} + + url = "https://www.strava.com/api/v3/activities/{stravaid}/streams/{metric}?resolution={fetchresolutions}&series_type={series_type}".format( + stravaid=stravid, + fetchresolution=fetchresolution, + series_type=series_type, + metric=metric + ) + + return requests.get(url,headers=headers) diff --git a/rowers/views.py b/rowers/views.py index 1a773585..b4ef121c 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -90,10 +90,10 @@ import os,sys import datetime import iso8601 import c2stuff -from c2stuff import C2NoTokenError,c2_open -from runkeeperstuff import RunKeeperNoTokenError,runkeeper_open -from sporttracksstuff import SportTracksNoTokenError,sporttracks_open -from tpstuff import TPNoTokenError,tp_open +from c2stuff import c2_open +from runkeeperstuff import runkeeper_open +from sporttracksstuff import sporttracks_open +from tpstuff import tp_open from iso8601 import ParseError import stravastuff import polarstuff @@ -101,7 +101,7 @@ from polarstuff import PolarNoTokenError from stravastuff import StravaNoTokenError import sporttracksstuff import underarmourstuff -from underarmourstuff import UnderArmourNoTokenError,underarmour_open +from underarmourstuff import underarmour_open import tpstuff import runkeeperstuff import ownapistuff @@ -887,7 +887,7 @@ from utils import ( geo_distance,serialize_list,deserialize_list,uniqify, str2bool,range_to_color_hex,absolute,myqueue,get_call, calculate_age,rankingdistances,rankingdurations, - is_ranking_piece,my_dict_from_instance,wavg + is_ranking_piece,my_dict_from_instance,wavg,NoTokenError ) import datautils From 586cc2b209c5c7e0d745ecaff0ce1e99e7e6662c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Jun 2018 12:20:24 +0200 Subject: [PATCH 2/5] unified all notokenerrors --- rowers/polarstuff.py | 26 +------------------------- rowers/stravastuff.py | 30 ++---------------------------- rowers/views.py | 36 +++++++++++++++++------------------- 3 files changed, 20 insertions(+), 72 deletions(-) diff --git a/rowers/polarstuff.py b/rowers/polarstuff.py index 9b9c0e9e..a1962bcc 100644 --- a/rowers/polarstuff.py +++ b/rowers/polarstuff.py @@ -50,32 +50,8 @@ from rowsandall_app.settings import ( #baseurl = 'https://polaraccesslink.com/v3-example' baseurl = 'https://polaraccesslink.com/v3' -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res - -# Custom error class - to raise a NoTokenError -class PolarNoTokenError(Exception): - def __init__(self,value): - self.value=value - - def __str__(self): - return repr(self.value) +from utils import NoTokenError, custom_exception_handler # Exchange access code for long-lived access token diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index b4b39f7c..b1c2d3ed 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -40,7 +40,7 @@ from rowers.models import Rower,Workout from rowers.models import checkworkoutuser import dataprep from dataprep import columndict -from utils import uniqify,isprorower,myqueue +from utils import uniqify,isprorower,myqueue,NoTokenError, custom_exception_handler from uuid import uuid4 import stravalib from stravalib.exc import ActivityUploadFailed,TimeoutExceeded @@ -63,32 +63,6 @@ except ImportError: from utils import geo_distance,ewmovingaverage -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res - -# Custom error class - to raise a NoTokenError -class StravaNoTokenError(Exception): - def __init__(self,value): - self.value=value - - def __str__(self): - return repr(self.value) # Exchange access code for long-lived access token @@ -462,7 +436,7 @@ def workout_strava_upload(user,w): res = -1 if (r.stravatoken == '') or (r.stravatoken is None): s = "Token doesn't exist. Need to authorize" - raise StravaNoTokenError("Your hovercraft is full of eels") + raise NoTokenError("Your hovercraft is full of eels") else: if (checkworkoutuser(user,w)): try: diff --git a/rowers/views.py b/rowers/views.py index b4ef121c..60416947 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -97,8 +97,6 @@ from tpstuff import tp_open from iso8601 import ParseError import stravastuff import polarstuff -from polarstuff import PolarNoTokenError -from stravastuff import StravaNoTokenError import sporttracksstuff import underarmourstuff from underarmourstuff import underarmour_open @@ -2065,7 +2063,7 @@ def workout_tp_upload_view(request,id=0): res = -1 try: thetoken = tp_open(r.user) - except TPNoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/tpauthorize/") # ready to upload. Hurray @@ -2216,7 +2214,7 @@ def workout_c2_upload_view(request,id=0): try: message,c2id = c2stuff.workout_c2_upload(request.user,w) - except C2NoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") if message and c2id <=0: @@ -2241,7 +2239,7 @@ def workout_runkeeper_upload_view(request,id=0): try: thetoken = runkeeper_open(r.user) - except RunKeeperNoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/runkeeperauthorize/") # ready to upload. Hurray @@ -2303,7 +2301,7 @@ def workout_underarmour_upload_view(request,id=0): try: thetoken = underarmour_open(r.user) - except UnderArmourNoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/underarmourauthorize/") # ready to upload. Hurray @@ -2367,7 +2365,7 @@ def workout_sporttracks_upload_view(request,id=0): try: thetoken = sporttracks_open(r.user) - except SportTracksNoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/sporttracksauthorize/") @@ -8950,7 +8948,7 @@ def workout_export_view(request,id=0, message="", successmessage=""): try: thetoken = c2_open(request.user) - except C2NoTokenError: + except NoTokenError: thetoken = 0 if (checkworkoutuser(request.user,row)) and thetoken: @@ -8960,7 +8958,7 @@ def workout_export_view(request,id=0, message="", successmessage=""): try: rktoken = runkeeper_open(request.user) - except RunKeeperNoTokenError: + except NoTokenError: rktoken = 0 if (checkworkoutuser(request.user,row)) and rktoken: @@ -9940,7 +9938,7 @@ def workout_sporttracksimport_view(request,message=""): def c2listdebug_view(request,page=1,message=""): try: thetoken = c2_open(request.user) - except C2NoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") r = getrower(request.user) @@ -9983,7 +9981,7 @@ def c2listdebug_view(request,page=1,message=""): def workout_getc2workout_all(request,page=1,message=""): try: thetoken = c2_open(request.user) - except C2NoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") res = c2stuff.get_c2_workout_list(request.user,page=page) @@ -10016,7 +10014,7 @@ def workout_getc2workout_all(request,page=1,message=""): def workout_c2import_view(request,page=1,message=""): try: thetoken = c2_open(request.user) - except C2NoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") res = c2stuff.get_c2_workout_list(request.user,page=page) @@ -10242,7 +10240,7 @@ def workout_getstravaworkout_all(request): def workout_getc2workout_view(request,c2id): try: thetoken = c2_open(request.user) - except C2NoTokenError: + except NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") res = c2stuff.get_c2_workout(request.user,c2id) @@ -10643,7 +10641,7 @@ def workout_upload_view(request, if (upload_to_c2) or (w.user.c2_auto_export and isprorower(w.user)): try: message,id = c2stuff.workout_c2_upload(request.user,w) - except C2NoTokenError: + except NoTokenError: id = 0 message = "Something went wrong with the Concept2 sync" if id>1: @@ -10656,7 +10654,7 @@ def workout_upload_view(request, message,id = stravastuff.workout_strava_upload( request.user,w ) - except StravaNoTokenError: + except NoTokenError: id = 0 message = "Please connect to Strava first" if id>1: @@ -10669,7 +10667,7 @@ def workout_upload_view(request, message,id = sporttracksstuff.workout_sporttracks_upload( request.user,w ) - except SportTracksNoTokenError: + except NoTokenError: message = "Please connect to SportTracks first" id = 0 if id>1: @@ -10682,7 +10680,7 @@ def workout_upload_view(request, message,id = runkeeperstuff.workout_runkeeper_upload( request.user,w ) - except RunKeeperNoTokenError: + except NoTokenError: message = "Please connect to Runkeeper first" id = 0 @@ -10697,7 +10695,7 @@ def workout_upload_view(request, message,id = underarmourstuff.workout_ua_upload( request.user,w ) - except UnderArmourNoTokenError: + except NoTokenError: message = "Please connect to MapMyFitness first" id = 0 @@ -10712,7 +10710,7 @@ def workout_upload_view(request, message,id = tpstuff.workout_tp_upload( request.user,w ) - except TPNoTokenError: + except NoTokenError: message = "Please connect to TrainingPeaks first" id = 0 From 3dc998d62305e60de18454ebb32d3d342988ac1f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Jun 2018 12:50:36 +0200 Subject: [PATCH 3/5] C2NoTokenError = NoTokenError --- rowers/c2stuff.py | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index dca87e85..ed1e827a 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -34,7 +34,7 @@ import sys import urllib from requests import Request, Session -from utils import myqueue,uniqify,isprorower +from utils import myqueue,uniqify,isprorower, custom_exception_handler, NoTokenError from rowers.types import otwtypes @@ -46,32 +46,7 @@ queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low') -# Custom error class - to raise a NoTokenError -class C2NoTokenError(Exception): - def __init__(self,value): - self.value=value - def __str__(self): - return repr(self.value) - -# Custom exception handler, returns a 401 HTTP message -# with exception details in the json data -def custom_exception_handler(exc,message): - - response = { - "errors": [ - { - "code": str(exc), - "detail": message, - } - ] - } - - res = HttpResponse(message) - res.status_code = 401 - res.json = json.dumps(response) - - return res # Checks if user has Concept2 tokens, resets tokens if they are # expired. @@ -84,11 +59,11 @@ def c2_open(user): if (timezone.now()>r.tokenexpirydate): res = rower_c2_token_refresh(user) if res == None: - raise C2NoTokenError("User has no token") + raise NoTokenError("User has no token") if res[0] != None: thetoken = res[0] else: - raise C2NoTokenError("User has no token") + raise NoTokenError("User has no token") else: thetoken = r.c2token @@ -693,7 +668,7 @@ def workout_c2_upload(user,w): if (checkworkoutuser(user,w)): c2userid = get_userid(r.c2token) if not c2userid: - raise C2NoTokenError + raise NoTokenError data = createc2workoutdata(w) if data == 0: From 55dd757823aebee4c5cf36bdc349329425b5a455 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Jun 2018 12:54:27 +0200 Subject: [PATCH 4/5] removed some more old notokenerrors --- rowers/c2stuff.py | 4 ++-- rowers/tests.py | 4 ++-- rowers/traverselinktest.py | 2 +- rowers/uploads.py | 14 +++++++------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index ed1e827a..41201a7e 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -54,7 +54,7 @@ def c2_open(user): r = Rower.objects.get(user=user) if (r.c2token == '') or (r.c2token is None): s = "Token doesn't exist. Need to authorize" - raise C2NoTokenError("User has no token") + raise NoTokenError("User has no token") else: if (timezone.now()>r.tokenexpirydate): res = rower_c2_token_refresh(user) @@ -97,7 +97,7 @@ def get_c2_workouts(rower): try: thetoken = c2_open(rower.user) - except C2NoTokenError: + except NoTokenError: return 0 res = get_c2_workout_list(rower.user,page=1) diff --git a/rowers/tests.py b/rowers/tests.py index 59afd8e3..f39d983a 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -20,7 +20,7 @@ from time import strftime,strptime,mktime,time,daylight import os from rowers.tasks import handle_makeplot from rowers.utils import serialize_list,deserialize_list -from rowers.c2stuff import C2NoTokenError +from rowers.utils import NoTokenError from shutil import copyfile from minimocktest import MockTestCase @@ -425,7 +425,7 @@ class C2Tests(TestCase): def c2_notokentest(self): thetoken = c2_open(self.u) # should raise C2NoTokenError - self.assertRaises(C2NoTokenError) + self.assertRaises(NoTokenError) class DataTest(TestCase): def setUp(self): diff --git a/rowers/traverselinktest.py b/rowers/traverselinktest.py index bb9826a2..75a22fd0 100644 --- a/rowers/traverselinktest.py +++ b/rowers/traverselinktest.py @@ -20,7 +20,7 @@ from time import strftime,strptime,mktime,time,daylight import os from rowers.tasks import handle_makeplot from rowers.utils import serialize_list,deserialize_list -from rowers.c2stuff import C2NoTokenError + from shutil import copyfile from minimocktest import MockTestCase diff --git a/rowers/uploads.py b/rowers/uploads.py index 07b5cdce..47a6f1c1 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -36,7 +36,7 @@ except: from rowers.utils import ( geo_distance,serialize_list,deserialize_list,uniqify, - str2bool,range_to_color_hex,absolute,myqueue + str2bool,range_to_color_hex,absolute,myqueue,NoTokenError ) def cleanbody(body): @@ -379,7 +379,7 @@ def do_sync(w,options): if ('upload_to_C2' in options and options['upload_to_C2']) or (w.user.c2_auto_export and isprorower(w.user)): try: message,id = c2stuff.workout_c2_upload(w.user.user,w) - except c2stuff.C2NoTokenError: + except NoTokenError: id = 0 message = "Something went wrong with the Concept2 sync" @@ -388,7 +388,7 @@ def do_sync(w,options): message,id = stravastuff.workout_strava_upload( w.user.user,w ) - except stravastuff.StravaNoTokenError: + except NoTokenError: id = 0 message = "Please connect to Strava first" @@ -398,7 +398,7 @@ def do_sync(w,options): message,id = sporttracksstuff.workout_sporttracks_upload( w.user.user,w ) - except sporttracksstuff.SportTracksNoTokenError: + except NoTokenError: message = "Please connect to SportTracks first" id = 0 @@ -408,7 +408,7 @@ def do_sync(w,options): message,id = runkeeperstuff.workout_runkeeper_upload( w.user.user,w ) - except runkeeperstuff.RunKeeperNoTokenError: + except NoTokenError: message = "Please connect to Runkeeper first" id = 0 @@ -417,7 +417,7 @@ def do_sync(w,options): message,id = underarmourstuff.workout_ua_upload( w.user.user,w ) - except underarmourstuff.UnderArmourNoTokenError: + except NoTokenError: message = "Please connect to MapMyFitness first" id = 0 @@ -427,7 +427,7 @@ def do_sync(w,options): message,id = tpstuff.workout_tp_upload( w.user.user,w ) - except tpstuff.TPNoTokenError: + except NoTokenError: message = "Please connect to TrainingPeaks first" id = 0 From bc173cbd9a859495f08227bdf69441c13fe330bf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 26 Jun 2018 13:15:31 +0200 Subject: [PATCH 5/5] changed tests to use NoTokenError --- rowers/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/tests.py b/rowers/tests.py index f39d983a..bbdcc5ef 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -424,7 +424,7 @@ class C2Tests(TestCase): def c2_notokentest(self): thetoken = c2_open(self.u) - # should raise C2NoTokenError + # should raise NoTokenError self.assertRaises(NoTokenError) class DataTest(TestCase):