From a0a6d205cbf1acf3326ba8c4eb5b9edbc8f48a15 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Dec 2016 15:03:48 +0100 Subject: [PATCH 1/3] Some error tracking with C2 log --- rowers/c2stuff.py | 14 +++++-- rowers/views.py | 94 ++++++++++++++++++++--------------------------- 2 files changed, 51 insertions(+), 57 deletions(-) diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 57c960b1..5da14e0a 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -22,6 +22,7 @@ from rowingdata import rowingdata import pandas as pd import numpy as np from rowers.models import Rower,Workout +import sys from rowsandall_app.settings import C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET @@ -243,9 +244,16 @@ def do_refresh_token(refreshtoken): headers=headers) token_json = response.json() - thetoken = token_json['access_token'] - expires_in = token_json['expires_in'] - refresh_token = token_json['refresh_token'] + try: + thetoken = token_json['access_token'] + expires_in = token_json['expires_in'] + refresh_token = token_json['refresh_token'] + except: + with open("media/c2errors.log","a") as errorlog: + errorlog.write("Unexpected Error: "+str(sys.exc_info()[0])) + thetoken = None + expires_in = None + refresh_token = None return [thetoken,expires_in,refresh_token] diff --git a/rowers/views.py b/rowers/views.py index 7c006d7b..db10c787 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -748,7 +748,11 @@ def c2_open(user): # return HttpResponseRedirect("/rowers/me/c2authorize/") else: if (timezone.now()>r.tokenexpirydate): - thetoken = c2stuff.rower_c2_token_refresh(user) + res = c2stuff.rower_c2_token_refresh(user) + if res[0] != None: + thetoken = res[0] + else: + thetoken = r.c2token else: thetoken = r.c2token @@ -967,8 +971,13 @@ def workout_c2_upload_view(request,id=0): 'user-agent': 'sanderroosendaal', 'Content-Type': 'application/json'} import urllib - url = "https://log.concept2.com/api/users/%s/results" % (c2userid) - response = requests.post(url,headers=headers,data=json.dumps(data)) + try: + url = "https://log.concept2.com/api/users/%s/results" % (c2userid) + response = requests.post(url,headers=headers,data=json.dumps(data)) + except: + message = "Unexpected Error: "+sys.exc_info()[0] + with open("media/c2errors.log","a") as errorlog: + errorlog.write("Unexpected Error: "+sys.exc_info()[0]) # check for duplicate error first if (response.status_code == 409 ): @@ -984,10 +993,15 @@ def workout_c2_upload_view(request,id=0): url = "/rowers/workout/"+str(w.id)+"/export" return HttpResponseRedirect(url) except: - message = "Something went wrong in workout_c2_upload_view. Response code 200/201 but C2 sync failed: "+response.text + message = "Something went wrong in workout_c2_upload_view. Response code 200/201 but C2 sync failed: "+response.text + with open("media/c2errors.log","a") as errorlog: + errorlog.write("Unexpected Error: "+sys.exc_info()[0]) + else: s = response message = "Something went wrong in workout_c2_upload_view. C2 sync failed." + with open("media/c2errors.log","a") as errorlog: + errorlog.write("Unexpected Error: "+response.text()) else: message = "You are not authorized to upload this workout" @@ -1104,20 +1118,25 @@ def rower_sporttracks_authorize(request): def rower_c2_token_refresh(request): r = Rower.objects.get(user=request.user) res = c2stuff.do_refresh_token(r.c2refreshtoken) - access_token = res[0] - expires_in = res[1] - refresh_token = res[2] - expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in) + if res[0] != None: + access_token = res[0] + expires_in = res[1] + refresh_token = res[2] + expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in) + r = Rower.objects.get(user=request.user) + r.c2token = access_token + r.tokenexpirydate = expirydatetime + r.c2refreshtoken = refresh_token - r = Rower.objects.get(user=request.user) - r.c2token = access_token - r.tokenexpirydate = expirydatetime - r.c2refreshtoken = refresh_token + r.save() - r.save() - - successmessage = "Tokens refreshed. Good to go" - return imports_view(request,successmessage=successmessage) + successmessage = "Tokens refreshed. Good to go" + message = "" + else: + successmessage = "" + message = "Something went wrong (refreshing tokens). Please reauthorize:" + + return imports_view(request,successmessage=successmessage,message=message) @login_required() def rower_sporttracks_token_refresh(request): @@ -3499,13 +3518,6 @@ def c2listdebug_view(request,message=""): return HttpResponseRedirect("/rowers/me/c2authorize/") r = Rower.objects.get(user=request.user) - #if (r.c2token == '') or (r.c2token is None): - #s = "Token doesn't exist. Need to authorize" - #return HttpResponseRedirect("/rowers/me/c2authorize/") - - #elif (timezone.now()>r.tokenexpirydate): - #s = "Token expired. Needs to refresh." - #res = c2stuff.rower_c2_token_refresh(request.user) res = c2stuff.get_c2_workout_list(request.user) @@ -3548,15 +3560,6 @@ def workout_c2import_view(request,message=""): except C2NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") - #r = Rower.objects.get(user=request.user) - #if (r.c2token == '') or (r.c2token is None): - #s = "Token doesn't exist. Need to authorize" - #return HttpResponseRedirect("/rowers/me/c2authorize/") - - #elif (timezone.now()>r.tokenexpirydate): - #s = "Token expired. Needs to refresh." - #res = c2stuff.rower_c2_token_refresh(request.user) - res = c2stuff.get_c2_workout_list(request.user) if (res.status_code != 200): @@ -3617,6 +3620,11 @@ def workout_getsporttracksworkout_view(request,sporttracksid): @login_required() def workout_getc2workout_view(request,c2id): + try: + thetoken = c2_open(request.user) + except C2NoTokenError: + return HttpResponseRedirect("/rowers/me/c2authorize/") + res = c2stuff.get_c2_workout(request.user,c2id) if (res.status_code == 200): data = res.json()['data'] @@ -3913,16 +3921,6 @@ def workout_upload_view(request,message=""): thetoken = c2_open(request.user) except C2NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") - - #r = Rower.objects.get(user=request.user) - #if (r.c2token == '') or (r.c2token is None): - # s = "Token doesn't exist. Need to authorize" - #return HttpResponseRedirect("/rowers/me/c2authorize/") - - #elif (timezone.now()>r.tokenexpirydate): - #s = "Token expired. Needs to refresh." - #res = c2stuff.rower_c2_token_refresh(request.user) - try: c2userid = c2stuff.get_userid(thetoken) @@ -4146,9 +4144,6 @@ def workout_upload_view_debug(request,message=""): i = GraphImage(workout=w, creationdatetime=timezone.now(), filename=fullpathimagename) - # i = GraphImage(workout=w, - # creationdatetime=datetime.datetime.now(), - # filename=fullpathimagename) i.save() # upload to C2 @@ -4158,15 +4153,6 @@ def workout_upload_view_debug(request,message=""): except C2NoTokenError: return HttpResponseRedirect("/rowers/me/c2authorize/") - #r = Rower.objects.get(user=request.user) - #if (r.c2token == '') or (r.c2token is None): - # s = "Token doesn't exist. Need to authorize" - #return HttpResponseRedirect("/rowers/me/c2authorize/") - - #elif (timezone.now()>r.tokenexpirydate): - #s = "Token expired. Needs to refresh." - #res = c2stuff.rower_c2_token_refresh(request.user) - try: response = c2stuff.workout_c2_upload(request.user,w) if (response.status_code != 201): From 2ffd31f8a6ca1b5a43ed67ab3feee983ec5ad870 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Dec 2016 15:05:02 +0100 Subject: [PATCH 2/3] some more --- rowers/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rowers/views.py b/rowers/views.py index db10c787..87d2991c 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -975,9 +975,9 @@ def workout_c2_upload_view(request,id=0): url = "https://log.concept2.com/api/users/%s/results" % (c2userid) response = requests.post(url,headers=headers,data=json.dumps(data)) except: - message = "Unexpected Error: "+sys.exc_info()[0] + message = "Unexpected Error: "+str(sys.exc_info()[0]) with open("media/c2errors.log","a") as errorlog: - errorlog.write("Unexpected Error: "+sys.exc_info()[0]) + errorlog.write("Unexpected Error: "+str(sys.exc_info()[0])) # check for duplicate error first if (response.status_code == 409 ): @@ -995,7 +995,7 @@ def workout_c2_upload_view(request,id=0): except: message = "Something went wrong in workout_c2_upload_view. Response code 200/201 but C2 sync failed: "+response.text with open("media/c2errors.log","a") as errorlog: - errorlog.write("Unexpected Error: "+sys.exc_info()[0]) + errorlog.write("Unexpected Error: "+str(sys.exc_info()[0])) else: s = response From 4bda2f35398dfd2dcfc2100ea0b337151fe4ad0b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 18 Dec 2016 16:57:42 +0100 Subject: [PATCH 3/3] Processing of zipped files --- rowers/forms.py | 1 + rowers/mailprocessing.py | 8 ++++++++ rowers/views.py | 7 +++++++ rowsandall_app/rows.py | 2 +- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/rowers/forms.py b/rowers/forms.py index d27030bd..9666b376 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -42,6 +42,7 @@ class DocumentsForm(forms.Form): ('ergdata' , 'ErgData CSV'), ('ergstick' , 'ErgStick CSV'), ('painsleddesktop' , 'Painsled Desktop CSV'), + ('zip','Zipped file'), ) title = forms.CharField(required=False) file = forms.FileField(required=True, diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py index 424241d3..3c4fb3d3 100644 --- a/rowers/mailprocessing.py +++ b/rowers/mailprocessing.py @@ -100,6 +100,14 @@ def make_new_workout_from_email(rr,f2,name,cntr=0): workouttype = 'rower' f2 = f2.name fileformat = get_file_type('media/'+f2) + + if len(fileformat)==3 and fileformat[0]=='zip': + f_to_be_deleted = f2 + with zipfile.ZipFile(f2) as z: + f2 = z.extract(z.namelist()[0],path='media/') + fileformat = fileformat[2] + os.remove(f_to_be_deleted) + if fileformat == 'unknown': if settings.DEBUG: res = handle_sendemail_unrecognized.delay(f2, diff --git a/rowers/views.py b/rowers/views.py index 87d2991c..5f1f1cc7 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1,4 +1,5 @@ import time +import zipfile import operator from django.views.generic.base import TemplateView from django.db.models import Q @@ -3694,6 +3695,12 @@ def workout_upload_view(request,message=""): # new fileformat = get_file_type(f2) + if len(fileformat)==3 and fileformat[0]=='zip': + f_to_be_deleted = f2 + with zipfile.ZipFile(f2) as z: + f2 = z.extract(z.namelist()[0],path='media/') + fileformat = fileformat[2] + os.remove(f_to_be_deleted) if fileformat == 'unknown': message = "We couldn't recognize the file type" diff --git a/rowsandall_app/rows.py b/rowsandall_app/rows.py index 1d9848c9..c93e7a69 100644 --- a/rowsandall_app/rows.py +++ b/rowsandall_app/rows.py @@ -48,7 +48,7 @@ def format_time(x,pos=None): def validate_file_extension(value): import os ext = os.path.splitext(value.name)[1] - valid_extensions = ['.tcx','.csv','.TCX','.CSV','.fit','.FIT'] + valid_extensions = ['.tcx','.csv','.TCX','.CSV','.fit','.FIT','.zip','.ZIP'] if not ext in valid_extensions: raise ValidationError(u'File not supported!')