removing imports.py and increasing coverage
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<a href="/boatmovers/">Ranglijst</a>
|
<a href="/boatmovers/">Ranglijst</a>
|
||||||
<a href="/boatmovers/faq/">F.A.Q.</a>
|
<a href="/boatmovers/faq/">F.A.Q.</a>
|
||||||
|
<a href="/boatmovers/compare/">History</a>
|
||||||
</div>
|
</div>
|
||||||
{% if WARNING_MESSAGE != '' %}
|
{% if WARNING_MESSAGE != '' %}
|
||||||
<p class="message">
|
<p class="message">
|
||||||
|
|||||||
@@ -7,14 +7,13 @@ from rowers.utils import myqueue
|
|||||||
# (There is still some stuff defined directly in views.py. Need to
|
# (There is still some stuff defined directly in views.py. Need to
|
||||||
# move that here.)
|
# move that here.)
|
||||||
|
|
||||||
from rowers.imports import *
|
|
||||||
import datetime
|
import datetime
|
||||||
from requests import Request, Session
|
from requests import Request, Session
|
||||||
import rowers.mytypes as mytypes
|
import rowers.mytypes as mytypes
|
||||||
from rowers.mytypes import otwtypes
|
from rowers.mytypes import otwtypes
|
||||||
from rowers.rower_rules import is_workout_user, ispromember
|
from rowers.rower_rules import is_workout_user, ispromember
|
||||||
from iso8601 import ParseError
|
from iso8601 import ParseError
|
||||||
|
import pandas as pd
|
||||||
import numpy
|
import numpy
|
||||||
import json
|
import json
|
||||||
from scipy import optimize
|
from scipy import optimize
|
||||||
@@ -22,6 +21,7 @@ from json.decoder import JSONDecodeError
|
|||||||
|
|
||||||
from pytz.exceptions import UnknownTimeZoneError
|
from pytz.exceptions import UnknownTimeZoneError
|
||||||
from rowers.utils import dologging
|
from rowers.utils import dologging
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
from rowsandall_app.settings import (
|
from rowsandall_app.settings import (
|
||||||
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET,
|
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET,
|
||||||
@@ -83,6 +83,8 @@ def getagegrouprecord(age, sex='male', weightcategory='hwt',
|
|||||||
|
|
||||||
p0 = [700, 120, 700, 10, 100, 100]
|
p0 = [700, 120, 700, 10, 100, 100]
|
||||||
|
|
||||||
|
p1, success = optimize.leastsq(errfunc, p0[:],
|
||||||
|
args=(ages, powers))
|
||||||
try:
|
try:
|
||||||
p1, success = optimize.leastsq(errfunc, p0[:],
|
p1, success = optimize.leastsq(errfunc, p0[:],
|
||||||
args=(ages, powers))
|
args=(ages, powers))
|
||||||
@@ -99,5 +101,6 @@ def getagegrouprecord(age, sex='male', weightcategory='hwt',
|
|||||||
else:
|
else:
|
||||||
power = 0
|
power = 0
|
||||||
|
|
||||||
|
|
||||||
return power
|
return power
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ from rowers.utils import custom_exception_handler, NoTokenError
|
|||||||
from rowingdata import rowingdata
|
from rowingdata import rowingdata
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from rowers.utils import myqueue
|
from rowers.utils import myqueue
|
||||||
from rowers.imports import *
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
@@ -20,7 +19,9 @@ from iso8601 import ParseError
|
|||||||
from rowers.plannedsessions import ps_dict_get_description
|
from rowers.plannedsessions import ps_dict_get_description
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
import arrow
|
||||||
|
from rowers import dataprep
|
||||||
|
import pytz
|
||||||
|
|
||||||
import numpy
|
import numpy
|
||||||
import json
|
import json
|
||||||
|
|||||||
@@ -1,291 +0,0 @@
|
|||||||
|
|
||||||
# All the functionality to connect to SportTracks
|
|
||||||
|
|
||||||
# Python
|
|
||||||
import oauth2 as oauth
|
|
||||||
import cgi
|
|
||||||
import pytz
|
|
||||||
import requests
|
|
||||||
import requests.auth
|
|
||||||
import json
|
|
||||||
from django.utils import timezone
|
|
||||||
from datetime import datetime
|
|
||||||
from datetime import timedelta
|
|
||||||
import arrow
|
|
||||||
import numpy as np
|
|
||||||
from dateutil import parser
|
|
||||||
import time
|
|
||||||
from time import strftime
|
|
||||||
|
|
||||||
import rowers.dataprep as dataprep
|
|
||||||
import math
|
|
||||||
from math import sin, cos, atan2, sqrt
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import urllib
|
|
||||||
import iso8601
|
|
||||||
from uuid import uuid4
|
|
||||||
|
|
||||||
|
|
||||||
# Django
|
|
||||||
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
|
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib.auth import authenticate, login, logout
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
|
|
||||||
# Project
|
|
||||||
# from .models import Profile
|
|
||||||
from rowingdata import rowingdata, make_cumvalues
|
|
||||||
import pandas as pd
|
|
||||||
from rowers.models import Rower, Workout, TombStone
|
|
||||||
import rowers.mytypes as mytypes
|
|
||||||
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
|
|
||||||
)
|
|
||||||
|
|
||||||
from rowers.utils import (
|
|
||||||
NoTokenError, custom_exception_handler, ewmovingaverage,
|
|
||||||
geo_distance, uniqify
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Splits SportTracks data which is one long sequence of
|
|
||||||
# [t,[lat,lon],t2,[lat2,lon2] ...]
|
|
||||||
# to [t,t2,t3, ...], [[lat,long],[lat2,long2],...
|
|
||||||
def splitstdata(lijst):
|
|
||||||
t = []
|
|
||||||
latlong = []
|
|
||||||
while len(lijst) >= 2:
|
|
||||||
t.append(lijst[0])
|
|
||||||
latlong.append(lijst[1])
|
|
||||||
lijst = lijst[2:]
|
|
||||||
|
|
||||||
return [np.array(t), np.array(latlong)]
|
|
||||||
|
|
||||||
# covered in integrations
|
|
||||||
def imports_open(user, oauth_data):
|
|
||||||
r = Rower.objects.get(user=user)
|
|
||||||
token = getattr(r, oauth_data['tokenname'])
|
|
||||||
|
|
||||||
try:
|
|
||||||
tokenexpirydate = getattr(r, oauth_data['expirydatename'])
|
|
||||||
except (TypeError, AttributeError, KeyError): # pragma: no cover
|
|
||||||
tokenexpirydate = None
|
|
||||||
|
|
||||||
if (token == '') or (token is None):
|
|
||||||
raise NoTokenError("User has no token")
|
|
||||||
else:
|
|
||||||
tokenname = oauth_data['tokenname']
|
|
||||||
refreshtokenname = oauth_data['refreshtokenname']
|
|
||||||
expirydatename = oauth_data['expirydatename']
|
|
||||||
if tokenexpirydate and timezone.now()+timedelta(seconds=60) > tokenexpirydate:
|
|
||||||
token = imports_token_refresh(
|
|
||||||
user,
|
|
||||||
tokenname,
|
|
||||||
refreshtokenname,
|
|
||||||
expirydatename,
|
|
||||||
oauth_data,
|
|
||||||
)
|
|
||||||
elif tokenexpirydate is None and expirydatename is not None and 'strava' in expirydatename: # pragma: no cover
|
|
||||||
token = imports_token_refresh(
|
|
||||||
user,
|
|
||||||
tokenname,
|
|
||||||
refreshtokenname,
|
|
||||||
expirydatename,
|
|
||||||
oauth_data,
|
|
||||||
)
|
|
||||||
|
|
||||||
return token
|
|
||||||
|
|
||||||
# covered in integrations
|
|
||||||
# Refresh token using refresh token
|
|
||||||
def imports_do_refresh_token(refreshtoken, oauth_data, access_token=''):
|
|
||||||
# client_auth = requests.auth.HTTPBasicAuth(
|
|
||||||
# oauth_data['client_id'],
|
|
||||||
# oauth_data['client_secret']
|
|
||||||
# )
|
|
||||||
|
|
||||||
post_data = {"grant_type": "refresh_token",
|
|
||||||
"client_secret": oauth_data['client_secret'],
|
|
||||||
"client_id": oauth_data['client_id'],
|
|
||||||
"refresh_token": refreshtoken,
|
|
||||||
}
|
|
||||||
headers = {'user-agent': 'sanderroosendaal',
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': oauth_data['content_type']}
|
|
||||||
|
|
||||||
# for Strava
|
|
||||||
if 'grant_type' in oauth_data:
|
|
||||||
if oauth_data['grant_type']:
|
|
||||||
post_data['grant_type'] = oauth_data['grant_type']
|
|
||||||
|
|
||||||
if oauth_data['bearer_auth']:
|
|
||||||
headers['authorization'] = 'Bearer %s' % access_token
|
|
||||||
|
|
||||||
baseurl = oauth_data['base_url']
|
|
||||||
|
|
||||||
if 'json' in oauth_data['content_type']:
|
|
||||||
try:
|
|
||||||
response = requests.post(baseurl,
|
|
||||||
data=json.dumps(post_data),
|
|
||||||
headers=headers, verify=False)
|
|
||||||
except: # pragma: no cover
|
|
||||||
raise NoTokenError("Failed to get token")
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
response = requests.post(baseurl,
|
|
||||||
data=post_data,
|
|
||||||
headers=headers, verify=False,
|
|
||||||
)
|
|
||||||
except: # pragma: no cover
|
|
||||||
raise NoTokenError("Failed to get token")
|
|
||||||
|
|
||||||
if response.status_code == 200 or response.status_code == 201:
|
|
||||||
token_json = response.json()
|
|
||||||
else: # pragma: no cover
|
|
||||||
raise NoTokenError("User has no token")
|
|
||||||
|
|
||||||
try:
|
|
||||||
thetoken = token_json['access_token']
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
raise NoTokenError("User has no token")
|
|
||||||
|
|
||||||
try:
|
|
||||||
expires_in = token_json['expires_in']
|
|
||||||
except KeyError:
|
|
||||||
try:
|
|
||||||
expires_at = arrow.get(token_json['expires_at']).timestamp()
|
|
||||||
expires_in = expires_at - arrow.now().timestamp()
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
expires_in = 0
|
|
||||||
try:
|
|
||||||
refresh_token = token_json['refresh_token']
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
refresh_token = refreshtoken
|
|
||||||
try:
|
|
||||||
expires_in = int(expires_in)
|
|
||||||
except (TypeError, ValueError): # pragma: no cover
|
|
||||||
expires_in = 0
|
|
||||||
|
|
||||||
return [thetoken, expires_in, refresh_token]
|
|
||||||
|
|
||||||
# Exchange ST access code for long-lived ST access token
|
|
||||||
|
|
||||||
# implemented in integrations
|
|
||||||
def imports_get_token(
|
|
||||||
code, oauth_data
|
|
||||||
):
|
|
||||||
|
|
||||||
redirect_uri = oauth_data['redirect_uri']
|
|
||||||
client_secret = oauth_data['client_secret']
|
|
||||||
client_id = oauth_data['client_id']
|
|
||||||
base_uri = oauth_data['base_url']
|
|
||||||
|
|
||||||
# client_auth = requests.auth.HTTPBasicAuth(
|
|
||||||
# client_id, client_secret
|
|
||||||
# )
|
|
||||||
|
|
||||||
post_data = {"grant_type": "authorization_code",
|
|
||||||
"code": code,
|
|
||||||
"redirect_uri": redirect_uri,
|
|
||||||
"client_secret": client_secret,
|
|
||||||
"client_id": client_id,
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
headers = oauth_data['headers']
|
|
||||||
except KeyError:
|
|
||||||
headers = {'Accept': 'application/json',
|
|
||||||
'Api-Key': client_id,
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'user-agent': 'sanderroosendaal'}
|
|
||||||
|
|
||||||
if 'grant_type' in oauth_data:
|
|
||||||
if oauth_data['grant_type']:
|
|
||||||
post_data['grant_type'] = oauth_data['grant_type']
|
|
||||||
if 'strava' in oauth_data['autorization_uri']:
|
|
||||||
post_data['grant_type'] = "authorization_code"
|
|
||||||
|
|
||||||
if 'json' in oauth_data['content_type']:
|
|
||||||
response = requests.post(
|
|
||||||
base_uri,
|
|
||||||
data=json.dumps(post_data),
|
|
||||||
headers=headers)
|
|
||||||
else: # pragma: no cover
|
|
||||||
response = requests.post(
|
|
||||||
base_uri,
|
|
||||||
data=post_data,
|
|
||||||
headers=headers, verify=False)
|
|
||||||
|
|
||||||
if response.status_code == 200 or response.status_code == 201:
|
|
||||||
token_json = response.json()
|
|
||||||
try:
|
|
||||||
thetoken = token_json['access_token']
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
return [0, 0, 0]
|
|
||||||
try:
|
|
||||||
refresh_token = token_json['refresh_token']
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
refresh_token = ''
|
|
||||||
try:
|
|
||||||
expires_in = token_json['expires_in']
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
expires_in = 0
|
|
||||||
try:
|
|
||||||
expires_in = int(expires_in)
|
|
||||||
except (ValueError, TypeError): # pragma: no cover
|
|
||||||
expires_in = 0
|
|
||||||
else: # pragma: no cover
|
|
||||||
return [0, response.text, 0]
|
|
||||||
|
|
||||||
return [thetoken, expires_in, refresh_token]
|
|
||||||
|
|
||||||
# Make authorization URL including random string
|
|
||||||
|
|
||||||
|
|
||||||
def imports_make_authorization_url(oauth_data): # pragma: no cover
|
|
||||||
# Generate a random string for the state parameter
|
|
||||||
# Save it for use later to prevent xsrf attacks
|
|
||||||
|
|
||||||
state = str(uuid4())
|
|
||||||
|
|
||||||
params = {"client_id": oauth_data['client_id'],
|
|
||||||
"response_type": "code",
|
|
||||||
"redirect_uri": oauth_data['redirect_uri'],
|
|
||||||
"scope": oauth_data['scope'],
|
|
||||||
"state": state}
|
|
||||||
|
|
||||||
url = oauth_data['authorizaton_uri']+urllib.parse.urlencode(params)
|
|
||||||
|
|
||||||
return HttpResponseRedirect(url)
|
|
||||||
|
|
||||||
# This is token refresh. Looks for tokens in our database, then refreshes
|
|
||||||
|
|
||||||
|
|
||||||
def imports_token_refresh(user, tokenname, refreshtokenname, expirydatename, oauth_data):
|
|
||||||
r = Rower.objects.get(user=user)
|
|
||||||
|
|
||||||
refreshtoken = getattr(r, refreshtokenname)
|
|
||||||
|
|
||||||
# for Strava transition
|
|
||||||
if not refreshtoken: # pragma: no cover
|
|
||||||
refreshtoken = getattr(r, tokenname)
|
|
||||||
|
|
||||||
res = imports_do_refresh_token(refreshtoken, oauth_data)
|
|
||||||
access_token = res[0]
|
|
||||||
expires_in = res[1]
|
|
||||||
refresh_token = res[2]
|
|
||||||
expirydatetime = timezone.now()+timedelta(seconds=expires_in)
|
|
||||||
|
|
||||||
setattr(r, tokenname, access_token)
|
|
||||||
if expirydatename is not None:
|
|
||||||
setattr(r, expirydatename, expirydatetime)
|
|
||||||
if refreshtokenname is not None:
|
|
||||||
setattr(r, refreshtokenname, refresh_token)
|
|
||||||
|
|
||||||
r.save()
|
|
||||||
return access_token
|
|
||||||
@@ -10,13 +10,17 @@ from rowers.rower_rules import is_workout_user, ispromember
|
|||||||
from rowers.utils import get_strava_stream
|
from rowers.utils import get_strava_stream
|
||||||
|
|
||||||
from rowers.utils import myqueue, dologging
|
from rowers.utils import myqueue, dologging
|
||||||
from rowers.imports import *
|
#from rowers.imports import *
|
||||||
|
|
||||||
import gzip
|
import gzip
|
||||||
import time
|
import time
|
||||||
import requests
|
import requests
|
||||||
import arrow
|
import arrow
|
||||||
import datetime
|
import datetime
|
||||||
|
import os
|
||||||
|
from uuid import uuid4
|
||||||
|
from django.utils import timezone
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from rowsandall_app.settings import (
|
from rowsandall_app.settings import (
|
||||||
STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET,
|
STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET,
|
||||||
@@ -154,7 +158,7 @@ class StravaIntegration(SyncIntegration):
|
|||||||
outF.write(s)
|
outF.write(s)
|
||||||
try:
|
try:
|
||||||
os.remove(tcxfilename)
|
os.remove(tcxfilename)
|
||||||
except WindowError: # pragma: no cover
|
except WindowsError: # pragma: no cover
|
||||||
pass
|
pass
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
return ''
|
return ''
|
||||||
|
|||||||
@@ -718,7 +718,7 @@ def interactive_activitychart2(workouts, startdate, enddate, stack='type', toolb
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
rowers.append(rowers[0])
|
rowers.append(rowers[0])
|
||||||
except IndexError:
|
except IndexError: # pragma: no cover
|
||||||
try:
|
try:
|
||||||
rowers.append(str(workouts[0].user))
|
rowers.append(str(workouts[0].user))
|
||||||
except IndexError:
|
except IndexError:
|
||||||
@@ -1278,7 +1278,7 @@ def interactive_forcecurve(theworkouts, workstrokesonly=True, plottype='scatter'
|
|||||||
plot.yaxis.axis_label = "Force (N)"
|
plot.yaxis.axis_label = "Force (N)"
|
||||||
try:
|
try:
|
||||||
plot.title.text = theworkouts[0].name
|
plot.title.text = theworkouts[0].name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
plot.title.text_font_size = "1.0em"
|
plot.title.text_font_size = "1.0em"
|
||||||
|
|
||||||
@@ -1507,10 +1507,10 @@ def weightfromrecord(row,metricchoice):
|
|||||||
vv = row[metricchoice]
|
vv = row[metricchoice]
|
||||||
if vv > 0:
|
if vv > 0:
|
||||||
return vv
|
return vv
|
||||||
if metricchoice == 'rscore':
|
if metricchoice == 'rscore': # pragma: no cover
|
||||||
return rscore_approx(row)
|
return rscore_approx(row)
|
||||||
|
|
||||||
return 0
|
return 0 # pragma: no cover
|
||||||
|
|
||||||
|
|
||||||
def getfatigues(
|
def getfatigues(
|
||||||
@@ -1538,7 +1538,7 @@ def getfatigues(
|
|||||||
try:
|
try:
|
||||||
df2 = df.loc[date.date()]
|
df2 = df.loc[date.date()]
|
||||||
|
|
||||||
if type(df2) == pd.Series:
|
if type(df2) == pd.Series: # pragma: no cover
|
||||||
weight += weightfromrecord(df2,metricchoice)
|
weight += weightfromrecord(df2,metricchoice)
|
||||||
else:
|
else:
|
||||||
for index, row in df2.iterrows():
|
for index, row in df2.iterrows():
|
||||||
@@ -1772,6 +1772,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
|
|||||||
|
|
||||||
# make fast dict for dates / workouts
|
# make fast dict for dates / workouts
|
||||||
records = []
|
records = []
|
||||||
|
|
||||||
for w in workouts:
|
for w in workouts:
|
||||||
dd = {
|
dd = {
|
||||||
'date':w.date,
|
'date':w.date,
|
||||||
@@ -1785,7 +1786,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
|
|||||||
records.append(dd)
|
records.append(dd)
|
||||||
|
|
||||||
df = pd.DataFrame.from_records(records)
|
df = pd.DataFrame.from_records(records)
|
||||||
if df.empty:
|
if df.empty: # pragma: no cover
|
||||||
return ['', 'No Data', 0, 0, 0, outids]
|
return ['', 'No Data', 0, 0, 0, outids]
|
||||||
df.set_index('date', inplace=True)
|
df.set_index('date', inplace=True)
|
||||||
|
|
||||||
@@ -1895,7 +1896,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
|
|||||||
rightaxlabel = 'Freshness'
|
rightaxlabel = 'Freshness'
|
||||||
if dofatigue: # pragma: no cover
|
if dofatigue: # pragma: no cover
|
||||||
yaxlabel = 'Fitness/Fatigue'
|
yaxlabel = 'Fitness/Fatigue'
|
||||||
else:
|
else: # pragma: no cover
|
||||||
yaxlabel = 'Fitness'
|
yaxlabel = 'Fitness'
|
||||||
|
|
||||||
if modelchoice == 'banister': # pragma: no cover
|
if modelchoice == 'banister': # pragma: no cover
|
||||||
@@ -1917,7 +1918,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
|
|||||||
|
|
||||||
if dofatigue: # pragma: no cover
|
if dofatigue: # pragma: no cover
|
||||||
y1rangemax = df.loc[:, ['fitness', 'fatigue']].max().max()*1.02
|
y1rangemax = df.loc[:, ['fitness', 'fatigue']].max().max()*1.02
|
||||||
else:
|
else: # pragma: no cover
|
||||||
y1rangemax = df.loc[:, ['fitness']].max().max()*1.02
|
y1rangemax = df.loc[:, ['fitness']].max().max()*1.02
|
||||||
|
|
||||||
if doform: # pragma: no cover
|
if doform: # pragma: no cover
|
||||||
@@ -2676,7 +2677,7 @@ def leaflet_chart_compare(course, workoutids, labeldict={}, startenddict={}):
|
|||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
df = pd.concat(data, axis=0)
|
df = pd.concat(data, axis=0)
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
df = pd.DataFrame()
|
df = pd.DataFrame()
|
||||||
|
|
||||||
latmean, lonmean, coordinates = course_coord_center(course)
|
latmean, lonmean, coordinates = course_coord_center(course)
|
||||||
@@ -2735,7 +2736,7 @@ def leaflet_chart_compare(course, workoutids, labeldict={}, startenddict={}):
|
|||||||
try:
|
try:
|
||||||
lat = df['lat']
|
lat = df['lat']
|
||||||
lon = df['lon']
|
lon = df['lon']
|
||||||
except KeyError:
|
except KeyError: # pragma: no cover
|
||||||
return [0, "invalid coordinate data"]
|
return [0, "invalid coordinate data"]
|
||||||
if lat.empty or lon.empty: # pragma: no cover
|
if lat.empty or lon.empty: # pragma: no cover
|
||||||
return [0, "invalid coordinate data"]
|
return [0, "invalid coordinate data"]
|
||||||
@@ -4052,7 +4053,7 @@ def interactive_windchart(id=0, promember=0):
|
|||||||
legend_label="Tail (+)/Head (-) Wind (m/s)", color='black')
|
legend_label="Tail (+)/Head (-) Wind (m/s)", color='black')
|
||||||
try:
|
try:
|
||||||
plot.title.text = row.name
|
plot.title.text = row.name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
# plot.title.text_font_size="1.0em"
|
# plot.title.text_font_size="1.0em"
|
||||||
plot.title.text_font = "1.0em"
|
plot.title.text_font = "1.0em"
|
||||||
@@ -4122,7 +4123,7 @@ def interactive_streamchart(id=0, promember=0):
|
|||||||
plot.line(dist, vstream, legend_label="River Stream Velocity (m/s)")
|
plot.line(dist, vstream, legend_label="River Stream Velocity (m/s)")
|
||||||
try:
|
try:
|
||||||
plot.title.text = row.name
|
plot.title.text = row.name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
plot.title.text_font_size = "1.0em"
|
plot.title.text_font_size = "1.0em"
|
||||||
plot.xaxis.axis_label = "Distance (m)"
|
plot.xaxis.axis_label = "Distance (m)"
|
||||||
@@ -4134,7 +4135,7 @@ def interactive_streamchart(id=0, promember=0):
|
|||||||
|
|
||||||
return [script, div]
|
return [script, div]
|
||||||
|
|
||||||
def forcecurve_multi_interactive_chart(selected):
|
def forcecurve_multi_interactive_chart(selected): # pragma: no cover
|
||||||
df_plot = pd.DataFrame()
|
df_plot = pd.DataFrame()
|
||||||
ids = [analysis.id for analysis in selected]
|
ids = [analysis.id for analysis in selected]
|
||||||
|
|
||||||
@@ -4248,7 +4249,7 @@ def forcecurve_multi_interactive_chart(selected):
|
|||||||
|
|
||||||
return (script, div)
|
return (script, div)
|
||||||
|
|
||||||
def instroke_multi_interactive_chart(selected, *args, **kwargs):
|
def instroke_multi_interactive_chart(selected, *args, **kwargs): # pragma: no cover
|
||||||
df_plot = pd.DataFrame()
|
df_plot = pd.DataFrame()
|
||||||
ids = [analysis.id for analysis in selected]
|
ids = [analysis.id for analysis in selected]
|
||||||
metrics = list(set([analysis.metric for analysis in selected]))
|
metrics = list(set([analysis.metric for analysis in selected]))
|
||||||
@@ -4351,7 +4352,7 @@ def instroke_multi_interactive_chart(selected, *args, **kwargs):
|
|||||||
def instroke_interactive_chart(df,metric, workout, spm_min, spm_max,
|
def instroke_interactive_chart(df,metric, workout, spm_min, spm_max,
|
||||||
activeminutesmin, activeminutesmax,
|
activeminutesmin, activeminutesmax,
|
||||||
individual_curves,
|
individual_curves,
|
||||||
name='',notes=''):
|
name='',notes=''): # pragma: no cover
|
||||||
|
|
||||||
df_pos = (df+abs(df))/2.
|
df_pos = (df+abs(df))/2.
|
||||||
df_min = -(-df+abs(-df))/2.
|
df_min = -(-df+abs(-df))/2.
|
||||||
@@ -4578,7 +4579,7 @@ def interactive_chart(id=0, promember=0, intervaldata={}):
|
|||||||
plot.line('time', 'pace', source=source, legend_label="Pace", name="pace")
|
plot.line('time', 'pace', source=source, legend_label="Pace", name="pace")
|
||||||
try:
|
try:
|
||||||
plot.title.text = row.name
|
plot.title.text = row.name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
plot.title.text_font_size = "1.0em"
|
plot.title.text_font_size = "1.0em"
|
||||||
#plot.sizing_mode = 'stretch_both'
|
#plot.sizing_mode = 'stretch_both'
|
||||||
@@ -5776,7 +5777,7 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
doclean=False,
|
doclean=False,
|
||||||
workstrokesonly=False)
|
workstrokesonly=False)
|
||||||
workstrokesonly = False
|
workstrokesonly = False
|
||||||
except TypeError:
|
except TypeError: # pragma: no cover
|
||||||
workstrokesonly = False
|
workstrokesonly = False
|
||||||
try:
|
try:
|
||||||
_ = rowdata[yparam2]
|
_ = rowdata[yparam2]
|
||||||
@@ -6029,7 +6030,7 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
legend_label="Constant Power")
|
legend_label="Constant Power")
|
||||||
|
|
||||||
# trendline
|
# trendline
|
||||||
if trendline:
|
if trendline: # pragma: no cover
|
||||||
plot.line('x1', 'ytrend', source=source2, legend_label=yaxlabel+' (trend)')
|
plot.line('x1', 'ytrend', source=source2, legend_label=yaxlabel+' (trend)')
|
||||||
|
|
||||||
if plottype == 'line':
|
if plottype == 'line':
|
||||||
@@ -6040,7 +6041,7 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
plot.title.text = row.name
|
plot.title.text = row.name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
plot.title.text_font_size = "1.0em"
|
plot.title.text_font_size = "1.0em"
|
||||||
|
|
||||||
@@ -6340,7 +6341,7 @@ def thumbnails_set(r, id, favorites):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata.dropna(axis=1, how='all', inplace=True)
|
rowdata.dropna(axis=1, how='all', inplace=True)
|
||||||
except TypeError:
|
except TypeError: # pragma: no cover
|
||||||
return [
|
return [
|
||||||
{'script': "",
|
{'script': "",
|
||||||
'div': "",
|
'div': "",
|
||||||
@@ -6844,7 +6845,7 @@ def interactive_otw_advanced_pace_chart(id=0, promember=0):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
plot.title.text = row.name
|
plot.title.text = row.name
|
||||||
except ValueError:
|
except ValueError: # pragma: no cover
|
||||||
plot.title.text = ""
|
plot.title.text = ""
|
||||||
#plot.title.text_font_size = value("1.2em")
|
#plot.title.text_font_size = value("1.2em")
|
||||||
plot.xaxis.axis_label = "Time"
|
plot.xaxis.axis_label = "Time"
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
from rowers.models import Rower, Workout, TombStone
|
from rowers.models import Rower, Workout, TombStone
|
||||||
from rowers import utils
|
from rowers import utils
|
||||||
import datetime
|
import datetime
|
||||||
|
from django.utils import timezone
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
from rowers.imports import *
|
|
||||||
from rowsandall_app.settings import (
|
from rowsandall_app.settings import (
|
||||||
ROJABO_CLIENT_ID, ROJABO_REDIRECT_URI, ROJABO_CLIENT_SECRET,
|
ROJABO_CLIENT_ID, ROJABO_REDIRECT_URI, ROJABO_CLIENT_SECRET,
|
||||||
SITE_URL, ROJABO_OAUTH_LOCATION,
|
SITE_URL, ROJABO_OAUTH_LOCATION,
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ from redis import StrictRedis
|
|||||||
redis_connection = StrictRedis()
|
redis_connection = StrictRedis()
|
||||||
|
|
||||||
|
|
||||||
def mocked_grpc(*args, **kwargs):
|
def mocked_grpc(*args, **kwargs): # pragma: no cover
|
||||||
class insecure_channel:
|
class insecure_channel:
|
||||||
def __init__(*args,**kwargs):
|
def __init__(*args,**kwargs):
|
||||||
pass
|
pass
|
||||||
@@ -84,7 +84,7 @@ def mocked_grpc(*args, **kwargs):
|
|||||||
def mocked_send_template_email(*args,**kwargs):
|
def mocked_send_template_email(*args,**kwargs):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
def mocked_myqueue(*args, **kwargs):
|
def mocked_myqueue(*args, **kwargs): # pragma: no cover
|
||||||
class Job:
|
class Job:
|
||||||
def __init__(self,*args, **kwargs):
|
def __init__(self,*args, **kwargs):
|
||||||
self.result = 1
|
self.result = 1
|
||||||
@@ -95,7 +95,7 @@ def mocked_myqueue(*args, **kwargs):
|
|||||||
|
|
||||||
return Job()
|
return Job()
|
||||||
|
|
||||||
def mock_c2open(*args, **kwargs):
|
def mock_c2open(*args, **kwargs): # pragma: no cover
|
||||||
return('aap')
|
return('aap')
|
||||||
|
|
||||||
def mocked_session(*args, **kwargs):
|
def mocked_session(*args, **kwargs):
|
||||||
@@ -124,7 +124,7 @@ def mocked_session(*args, **kwargs):
|
|||||||
def json(self):
|
def json(self):
|
||||||
return self.json_data
|
return self.json_data
|
||||||
|
|
||||||
class MockContentResponse:
|
class MockContentResponse: # pragma: no cover
|
||||||
def __init__(self,filename,status_code):
|
def __init__(self,filename,status_code):
|
||||||
with open(filename,'rb') as f:
|
with open(filename,'rb') as f:
|
||||||
s = f.read()
|
s = f.read()
|
||||||
@@ -135,7 +135,7 @@ def mocked_session(*args, **kwargs):
|
|||||||
|
|
||||||
return MockEngine()
|
return MockEngine()
|
||||||
|
|
||||||
def mocked_sqlalchemy(*args, **kwargs):
|
def mocked_sqlalchemy(*args, **kwargs): # pragma: no cover
|
||||||
# return object with method
|
# return object with method
|
||||||
|
|
||||||
class MockEngine:
|
class MockEngine:
|
||||||
@@ -177,7 +177,7 @@ def mocked_sqlalchemy(*args, **kwargs):
|
|||||||
|
|
||||||
from rowers import courses
|
from rowers import courses
|
||||||
|
|
||||||
def mocked_sqlalchemy_courses(*args, **kwargs):
|
def mocked_sqlalchemy_courses(*args, **kwargs): # pragma: no cover
|
||||||
# return object with method
|
# return object with method
|
||||||
cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml')
|
cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml')
|
||||||
course = cs[0]
|
course = cs[0]
|
||||||
@@ -251,7 +251,7 @@ class DjangoTestCase(TestCase): #, MockTestCase):
|
|||||||
#MockTestCase.tearDown(self)
|
#MockTestCase.tearDown(self)
|
||||||
# delete_strokedata(1)
|
# delete_strokedata(1)
|
||||||
|
|
||||||
def mocked_tcx_parser(*args, **kwargs):
|
def mocked_tcx_parser(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
|
df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
|
||||||
|
|
||||||
return rowingdata(df=df)
|
return rowingdata(df=df)
|
||||||
@@ -272,12 +272,12 @@ def mocked_fetchcperg(*args, **kwargs):
|
|||||||
return df
|
return df
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
def mocked_read_df_sql(id):
|
def mocked_read_df_sql(id): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
|
df = pd.read_csv('rowers/tests/testdata/fake_strokedata.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_sendmail(*args,**kwargs):
|
def mocked_sendmail(*args,**kwargs): # pragma: no cover
|
||||||
return HttpResponseRedirect('/rowers/email/')
|
return HttpResponseRedirect('/rowers/email/')
|
||||||
|
|
||||||
def mocked_get_video_data(*args, **kwargs):
|
def mocked_get_video_data(*args, **kwargs):
|
||||||
@@ -299,7 +299,7 @@ def mocked_getrowdata_db(*args, **kwargs):
|
|||||||
|
|
||||||
return df,row
|
return df,row
|
||||||
|
|
||||||
def mocked_getrowdata_uh(*args, **kwargs):
|
def mocked_getrowdata_uh(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/uhfull.csv')
|
df = pd.read_csv('rowers/tests/testdata/uhfull.csv')
|
||||||
|
|
||||||
id = kwargs['id']
|
id = kwargs['id']
|
||||||
@@ -308,7 +308,7 @@ def mocked_getrowdata_uh(*args, **kwargs):
|
|||||||
|
|
||||||
return df, row
|
return df, row
|
||||||
|
|
||||||
def mocked_getsmallrowdata_uh(*args, **kwargs):
|
def mocked_getsmallrowdata_uh(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/uhfull.csv')
|
df = pd.read_csv('rowers/tests/testdata/uhfull.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
@@ -335,33 +335,33 @@ def mocked_getsmallrowdata_db(*args, **kwargs):
|
|||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_getsmallrowdata_db_updatecp(*args, **kwargs):
|
def mocked_getsmallrowdata_db_updatecp(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv')
|
df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_getsmallrowdata_db_setcp(*args, **kwargs):
|
def mocked_getsmallrowdata_db_setcp(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/colsfromdb2.csv')
|
df = pd.read_csv('rowers/tests/testdata/colsfromdb2.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
|
|
||||||
def mocked_getsmallrowdata_db_water(*args, **kwargs):
|
def mocked_getsmallrowdata_db_water(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/colsfromdb3.csv')
|
df = pd.read_csv('rowers/tests/testdata/colsfromdb3.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_getsmallrowdata_db_wps(*args, **kwargs):
|
def mocked_getsmallrowdata_db_wps(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/driveenergies.csv')
|
df = pd.read_csv('rowers/tests/testdata/driveenergies.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_getpowerdata_db(*args, **kwargs):
|
def mocked_getpowerdata_db(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/fake_powerdata.csv')
|
df = pd.read_csv('rowers/tests/testdata/fake_powerdata.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mock_for_interactive_chart(*args, **kwargs):
|
def mock_for_interactive_chart(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/interactivechart.csv')
|
df = pd.read_csv('rowers/tests/testdata/interactivechart.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
@@ -371,7 +371,7 @@ def mocked_getempowerdata_db(*args, **kwargs):
|
|||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_read_df_cols_sql_multistats(ids,columns,convertnewtons=True):
|
def mocked_read_df_cols_sql_multistats(ids,columns,convertnewtons=True): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/cumstats.csv')
|
df = pd.read_csv('rowers/tests/testdata/cumstats.csv')
|
||||||
extracols = []
|
extracols = []
|
||||||
|
|
||||||
@@ -387,13 +387,13 @@ def mock_workout_summaries(*args, **kwargs):
|
|||||||
df = pd.read_csv('rowers/tests/testdata/workout_summaries.csv')
|
df = pd.read_csv('rowers/tests/testdata/workout_summaries.csv')
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_read_df_cols_sql_multi(ids, columns, convertnewtons=True):
|
def mocked_read_df_cols_sql_multi(ids, columns, convertnewtons=True): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/fake_strokedata2.csv')
|
df = pd.read_csv('rowers/tests/testdata/fake_strokedata2.csv')
|
||||||
extracols = []
|
extracols = []
|
||||||
|
|
||||||
return df, extracols
|
return df, extracols
|
||||||
|
|
||||||
def mocked_read_df_cols_sql_multiflex(ids, columns, convertnewtons=True):
|
def mocked_read_df_cols_sql_multiflex(ids, columns, convertnewtons=True): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/multiflexdata.csv')
|
df = pd.read_csv('rowers/tests/testdata/multiflexdata.csv')
|
||||||
extracols = []
|
extracols = []
|
||||||
|
|
||||||
@@ -402,11 +402,11 @@ def mocked_read_df_cols_sql_multiflex(ids, columns, convertnewtons=True):
|
|||||||
# Mocked Strava
|
# Mocked Strava
|
||||||
|
|
||||||
def mocked_stravaexport(f2,workoutname,stravatoken,description='',
|
def mocked_stravaexport(f2,workoutname,stravatoken,description='',
|
||||||
activity_type='Rowing'):
|
activity_type='Rowing'): # pragma: no cover
|
||||||
print("this is mocked strava export")
|
print("this is mocked strava export")
|
||||||
return 1,'success'
|
return 1,'success'
|
||||||
|
|
||||||
def mocked_fetchcp(*args, **kwargs):
|
def mocked_fetchcp(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/otwcpresult.csv')
|
df = pd.read_csv('rowers/tests/testdata/otwcpresult.csv')
|
||||||
delta = df['delta']
|
delta = df['delta']
|
||||||
cpvalue = df['cpvalue']
|
cpvalue = df['cpvalue']
|
||||||
@@ -426,14 +426,14 @@ def mocked_fetchcp(*args, **kwargs):
|
|||||||
|
|
||||||
return delta, cpvalue, avgpower
|
return delta, cpvalue, avgpower
|
||||||
|
|
||||||
def mocked_getcpdata_sql(*args, **kwargs):
|
def mocked_getcpdata_sql(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/otwcpresult.csv')
|
df = pd.read_csv('rowers/tests/testdata/otwcpresult.csv')
|
||||||
|
|
||||||
df['cp'] = df['cpvalue']
|
df['cp'] = df['cpvalue']
|
||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
def mocked_cpraw(*args, **kwargs):
|
def mocked_cpraw(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/otwcp_df.csv')
|
df = pd.read_csv('rowers/tests/testdata/otwcp_df.csv')
|
||||||
|
|
||||||
return df
|
return df
|
||||||
@@ -465,17 +465,17 @@ class MockStravalibClient():
|
|||||||
|
|
||||||
## Higher level - unfortunately didn't succeed in mocking the gateway
|
## Higher level - unfortunately didn't succeed in mocking the gateway
|
||||||
|
|
||||||
def get_client_token(*args, **kwargs):
|
def get_client_token(*args, **kwargs): # pragma: no cover
|
||||||
return "aap"
|
return "aap"
|
||||||
|
|
||||||
def mock_create_customer(*args, **kwargs):
|
def mock_create_customer(*args, **kwargs):
|
||||||
return 121
|
return 121
|
||||||
|
|
||||||
def mock_make_payment(*args, **kwargs):
|
def mock_make_payment(*args, **kwargs): # pragma: no cover
|
||||||
return 15,''
|
return 15,''
|
||||||
|
|
||||||
def mock_update_subscription(*args, **kwargs):
|
def mock_update_subscription(*args, **kwargs):
|
||||||
try:
|
try: # pragma: no cover
|
||||||
rower = args[0]
|
rower = args[0]
|
||||||
data = args[1]
|
data = args[1]
|
||||||
planid = data['plan']
|
planid = data['plan']
|
||||||
@@ -497,7 +497,7 @@ def mock_update_subscription(*args, **kwargs):
|
|||||||
def mock_create_subscription(*args, **kwargs):
|
def mock_create_subscription(*args, **kwargs):
|
||||||
return mock_update_subscription(*args, **kwargs)
|
return mock_update_subscription(*args, **kwargs)
|
||||||
|
|
||||||
def mock_cancel_subscription(*args, **kwargs):
|
def mock_cancel_subscription(*args, **kwargs): # pragma: no cover
|
||||||
themessages = []
|
themessages = []
|
||||||
errormessages = []
|
errormessages = []
|
||||||
try:
|
try:
|
||||||
@@ -521,7 +521,7 @@ def mock_mocktest(*args, **kwargs):
|
|||||||
|
|
||||||
## Gateway stuff (not working)
|
## Gateway stuff (not working)
|
||||||
|
|
||||||
class gatewayresult():
|
class gatewayresult(): # pragma: no cover
|
||||||
def __init__(self,*args,**kwargs):
|
def __init__(self,*args,**kwargs):
|
||||||
self.is_success = kwargs.pop('is_success',True)
|
self.is_success = kwargs.pop('is_success',True)
|
||||||
self.customer_id = 1
|
self.customer_id = 1
|
||||||
@@ -533,22 +533,22 @@ class gatewayresult():
|
|||||||
def __unicode__():
|
def __unicode__():
|
||||||
return "mockedgatewayresult"
|
return "mockedgatewayresult"
|
||||||
|
|
||||||
class credit_card():
|
class credit_card(): # pragma: no cover
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.subscriptions = [vsubscription()]
|
self.subscriptions = [vsubscription()]
|
||||||
self.country_of_issuance = 'US'
|
self.country_of_issuance = 'US'
|
||||||
|
|
||||||
class paypal_account():
|
class paypal_account(): # pragma: no cover
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.subscriptions = [vsubscription(),vsubscription()]
|
self.subscriptions = [vsubscription(),vsubscription()]
|
||||||
|
|
||||||
class customercreateresult:
|
class customercreateresult: # pragma: no cover
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.customer = kwargs.pop('customer',customer())
|
self.customer = kwargs.pop('customer',customer())
|
||||||
self.is_success = kwargs.pop('is_success',True)
|
self.is_success = kwargs.pop('is_success',True)
|
||||||
self.customer_id = 1
|
self.customer_id = 1
|
||||||
|
|
||||||
class customer():
|
class customer(): # pragma: no cover
|
||||||
def find(*arg, **kwargs):
|
def find(*arg, **kwargs):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@@ -560,17 +560,17 @@ class customer():
|
|||||||
self.paypal_accounts = [paypal_account()]
|
self.paypal_accounts = [paypal_account()]
|
||||||
self.id = 1
|
self.id = 1
|
||||||
|
|
||||||
class client_token():
|
class client_token(): # pragma: no cover
|
||||||
def generate(*args, **kwargs):
|
def generate(*args, **kwargs):
|
||||||
return 'aapnooit'
|
return 'aapnooit'
|
||||||
|
|
||||||
class plan():
|
class plan(): # pragma: no cover
|
||||||
def all(*args, **kwargs):
|
def all(*args, **kwargs):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class transaction():
|
class transaction(): # pragma: no cover
|
||||||
def sale(*args, **kwargs):
|
def sale(*args, **kwargs):
|
||||||
return gatewayresult(is_success=True)
|
return gatewayresult(is_success=True)
|
||||||
|
|
||||||
@@ -588,7 +588,7 @@ class transaction():
|
|||||||
self.created_at = datetime.datetime.now()
|
self.created_at = datetime.datetime.now()
|
||||||
self.currency_iso_code = 'EUR'
|
self.currency_iso_code = 'EUR'
|
||||||
|
|
||||||
class vtransaction():
|
class vtransaction(): # pragma: no cover
|
||||||
def __init__(self,*args, **kwargs):
|
def __init__(self,*args, **kwargs):
|
||||||
self.amount = 15
|
self.amount = 15
|
||||||
self.credit_card_details = credit_card()
|
self.credit_card_details = credit_card()
|
||||||
@@ -600,7 +600,7 @@ class vtransaction():
|
|||||||
self.created_at = datetime.datetime.now()
|
self.created_at = datetime.datetime.now()
|
||||||
self.currency_iso_code = 'EUR'
|
self.currency_iso_code = 'EUR'
|
||||||
|
|
||||||
class vsubscription():
|
class vsubscription(): # pragma: no cover
|
||||||
def update(*args, **kwargs):
|
def update(*args, **kwargs):
|
||||||
return gatewayresult(is_success=True)
|
return gatewayresult(is_success=True)
|
||||||
|
|
||||||
@@ -615,7 +615,7 @@ class vsubscription():
|
|||||||
self.price = 15
|
self.price = 15
|
||||||
self.never_expires = True
|
self.never_expires = True
|
||||||
|
|
||||||
class subscription():
|
class subscription(): # pragma: no cover
|
||||||
def create(*args, **kwargs):
|
def create(*args, **kwargs):
|
||||||
return gatewayresult(is_success=True)
|
return gatewayresult(is_success=True)
|
||||||
|
|
||||||
@@ -634,7 +634,7 @@ class subscription():
|
|||||||
self.price = 15
|
self.price = 15
|
||||||
self.never_expires = True
|
self.never_expires = True
|
||||||
|
|
||||||
class vpayment_method():
|
class vpayment_method(): # pragma: no cover
|
||||||
def create(*args, **kwargs):
|
def create(*args, **kwargs):
|
||||||
return gatewayresult()
|
return gatewayresult()
|
||||||
|
|
||||||
@@ -642,25 +642,25 @@ class vpayment_method():
|
|||||||
self.token = 'liesjeleerdelotje'
|
self.token = 'liesjeleerdelotje'
|
||||||
|
|
||||||
|
|
||||||
class payment_method():
|
class payment_method(): # pragma: no cover
|
||||||
def create(*args, **kwargs):
|
def create(*args, **kwargs):
|
||||||
return gatewayresult()
|
return gatewayresult()
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.token = 'liesjeleerdelotje'
|
self.token = 'liesjeleerdelotje'
|
||||||
|
|
||||||
class notification():
|
class notification(): # pragma: no cover
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
print('notifucation')
|
print('notifucation')
|
||||||
self.kind = 'subscription_canceled'
|
self.kind = 'subscription_canceled'
|
||||||
|
|
||||||
class webhook_notification():
|
class webhook_notification(): # pragma: no cover
|
||||||
def parse(*args, **kwargs):
|
def parse(*args, **kwargs):
|
||||||
print(args,kwargs,'parse')
|
print(args,kwargs,'parse')
|
||||||
return notification()
|
return notification()
|
||||||
|
|
||||||
# mock braintree gateway
|
# mock braintree gateway
|
||||||
class MockBraintreeGateway:
|
class MockBraintreeGateway: # pragma: no cover
|
||||||
def __init__(self,*args, **kwargs):
|
def __init__(self,*args, **kwargs):
|
||||||
self.customer = customer()
|
self.customer = customer()
|
||||||
self.client_token = client_token()
|
self.client_token = client_token()
|
||||||
@@ -671,13 +671,13 @@ class MockBraintreeGateway:
|
|||||||
self.webhook_notification = webhook_notification()
|
self.webhook_notification = webhook_notification()
|
||||||
|
|
||||||
|
|
||||||
def mocked_gateway(*args, **kwargs):
|
def mocked_gateway(*args, **kwargs): # pragma: no cover
|
||||||
return MockBraintreeGateway()
|
return MockBraintreeGateway()
|
||||||
|
|
||||||
|
|
||||||
# Mocked Rowingdata
|
# Mocked Rowingdata
|
||||||
|
|
||||||
class mocked_rowingdata(rowingdata):
|
class mocked_rowingdata(rowingdata): # pragma: no cover
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(mocked_rowingdata).__init__(*args, **kwargs)
|
super(mocked_rowingdata).__init__(*args, **kwargs)
|
||||||
|
|
||||||
@@ -938,19 +938,19 @@ def mocked_requests(*args, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MockHeaderResponse:
|
class MockHeaderResponse: # pragma: no cover
|
||||||
def __init__(self, header_data, status_code):
|
def __init__(self, header_data, status_code):
|
||||||
self.headers = header_data
|
self.headers = header_data
|
||||||
self.status_code = status_code
|
self.status_code = status_code
|
||||||
|
|
||||||
class MockStreamResponse:
|
class MockStreamResponse: # pragma: no cover
|
||||||
def __init__(self, file_name, status_code):
|
def __init__(self, file_name, status_code):
|
||||||
self.raw = open(file_name,'rb')
|
self.raw = open(file_name,'rb')
|
||||||
self.status_code = status_code
|
self.status_code = status_code
|
||||||
self.ok = True
|
self.ok = True
|
||||||
self.file_name = file_name
|
self.file_name = file_name
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self): # pragma: no cover
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_value, traceback):
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
@@ -977,7 +977,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
|
|
||||||
class MockSession:
|
class MockSession:
|
||||||
class headers:
|
class headers:
|
||||||
def __init__(self,*args,**kwargs):
|
def __init__(self,*args,**kwargs): # pragma: no cover
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def update(self,*args,**kwargs):
|
def update(self,*args,**kwargs):
|
||||||
@@ -1013,7 +1013,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
args = [kwargs['url']]
|
args = [kwargs['url']]
|
||||||
if "tofit" in kwargs['url']:
|
if "tofit" in kwargs['url']:
|
||||||
args = [kwargs['url']]
|
args = [kwargs['url']]
|
||||||
if "tojson" in kwargs['url']:
|
if "tojson" in kwargs['url']: # pragma: no cover
|
||||||
args = [kwargs['url']]
|
args = [kwargs['url']]
|
||||||
|
|
||||||
if not args:
|
if not args:
|
||||||
@@ -1156,7 +1156,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
garmintrainingscheduletester = re.compile(garmintrainingscheduleregex)
|
garmintrainingscheduletester = re.compile(garmintrainingscheduleregex)
|
||||||
|
|
||||||
if garmintester.match(args[0]):
|
if garmintester.match(args[0]):
|
||||||
if garmindownloadtester.match(args[0]):
|
if garmindownloadtester.match(args[0]): # pragma: no cover
|
||||||
return MockStreamResponse('rowers/tests/testdata/3x250m.fit',200)
|
return MockStreamResponse('rowers/tests/testdata/3x250m.fit',200)
|
||||||
if garmintrainingtester.match(args[0]):
|
if garmintrainingtester.match(args[0]):
|
||||||
json_data = {
|
json_data = {
|
||||||
@@ -1222,10 +1222,10 @@ def mocked_requests(*args, **kwargs):
|
|||||||
'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
|
'refresh_token': 'jHJhFzCfOOKB8oyiayubhLAlxaMkG3ruC1E8YxaR'
|
||||||
}
|
}
|
||||||
return MockResponse(json_data,200)
|
return MockResponse(json_data,200)
|
||||||
elif tpuploadtester.match(args[0]):
|
elif tpuploadtester.match(args[0]): # pragma: no cover
|
||||||
return MockResponse(tpuploadresponse,200)
|
return MockResponse(tpuploadresponse,200)
|
||||||
|
|
||||||
if uaapitester.match(args[0]):
|
if uaapitester.match(args[0]): # pragma: no cover
|
||||||
if 'access_token' in args[0]:
|
if 'access_token' in args[0]:
|
||||||
json_data = {
|
json_data = {
|
||||||
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
||||||
@@ -1244,7 +1244,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
return MockResponse(uauserjson,200)
|
return MockResponse(uauserjson,200)
|
||||||
|
|
||||||
|
|
||||||
if uatester.match(args[0]):
|
if uatester.match(args[0]): # pragma: no cover
|
||||||
if 'access_token' in args[0]:
|
if 'access_token' in args[0]:
|
||||||
json_data = {
|
json_data = {
|
||||||
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
||||||
@@ -1254,7 +1254,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
return MockResponse(json_data,200)
|
return MockResponse(json_data,200)
|
||||||
|
|
||||||
|
|
||||||
if rktester.match(args[0]):
|
if rktester.match(args[0]): # pragma: no cover
|
||||||
if 'token' in args[0]:
|
if 'token' in args[0]:
|
||||||
json_data = {
|
json_data = {
|
||||||
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
||||||
@@ -1272,7 +1272,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
else:
|
else:
|
||||||
json_data = rkworkoutlistjson
|
json_data = rkworkoutlistjson
|
||||||
return MockResponse(json_data,200)
|
return MockResponse(json_data,200)
|
||||||
elif rkusertester.match(args[0]):
|
elif rkusertester.match(args[0]): # pragma: no cover
|
||||||
json_data = {
|
json_data = {
|
||||||
"userID": 1234567890,
|
"userID": 1234567890,
|
||||||
"profile": "/profile",
|
"profile": "/profile",
|
||||||
@@ -1289,10 +1289,10 @@ def mocked_requests(*args, **kwargs):
|
|||||||
"team": "/team"
|
"team": "/team"
|
||||||
}
|
}
|
||||||
return MockResponse(json_data, 200)
|
return MockResponse(json_data, 200)
|
||||||
elif rkstrokestester.match(args[0]):
|
elif rkstrokestester.match(args[0]): # pragma: no cover
|
||||||
return MockResponse(rkstrokesjson,200)
|
return MockResponse(rkstrokesjson,200)
|
||||||
|
|
||||||
if sttester.match(args[0]):
|
if sttester.match(args[0]): # pragma: no cover
|
||||||
if 'oauth2/token' in args[0]:
|
if 'oauth2/token' in args[0]:
|
||||||
json_data = {
|
json_data = {
|
||||||
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
'access_token': 'TA3n1vrNjuQJWw0TdCDHnjSmrjIPULhTlejMIWqq',
|
||||||
@@ -1327,13 +1327,13 @@ def mocked_requests(*args, **kwargs):
|
|||||||
if nkstrokestester.match(args[0]):
|
if nkstrokestester.match(args[0]):
|
||||||
params = kwargs.pop('params',{})
|
params = kwargs.pop('params',{})
|
||||||
|
|
||||||
if 'sessionIds' in params and params['sessionIds'] == '404':
|
if 'sessionIds' in params and params['sessionIds'] == '404': # pragma: no cover
|
||||||
return MockResponse(nkimpellerstrokedata, 200)
|
return MockResponse(nkimpellerstrokedata, 200)
|
||||||
return MockResponse(nkstrokedata,200)
|
return MockResponse(nkstrokedata,200)
|
||||||
if nkworkoutlisttester.match(args[0]):
|
if nkworkoutlisttester.match(args[0]):
|
||||||
params = kwargs.pop('params',{})
|
params = kwargs.pop('params',{})
|
||||||
|
|
||||||
if 'after' in params and params['after'] == '1267049972000':
|
if 'after' in params and params['after'] == '1267049972000': # pragma: no cover
|
||||||
return MockResponse(nkimpellerworkoutlist,200)
|
return MockResponse(nkimpellerworkoutlist,200)
|
||||||
return MockResponse(nkworkoutlist,200)
|
return MockResponse(nkworkoutlist,200)
|
||||||
|
|
||||||
@@ -1357,7 +1357,7 @@ def mocked_requests(*args, **kwargs):
|
|||||||
query = kwargs['json']['query']
|
query = kwargs['json']['query']
|
||||||
if 'download' in query:
|
if 'download' in query:
|
||||||
return MockResponse(rp3linkready,200)
|
return MockResponse(rp3linkready,200)
|
||||||
except KeyError:
|
except KeyError: # pragma: no cover
|
||||||
pass
|
pass
|
||||||
json_data = rp3workoutlist
|
json_data = rp3workoutlist
|
||||||
return MockResponse(json_data,200)
|
return MockResponse(json_data,200)
|
||||||
@@ -1392,13 +1392,13 @@ def mocked_requests(*args, **kwargs):
|
|||||||
if c2strokestester.match(args[0]):
|
if c2strokestester.match(args[0]):
|
||||||
return MockResponse(c2strokedata,200)
|
return MockResponse(c2strokedata,200)
|
||||||
elif c2importtester.match(args[0]):
|
elif c2importtester.match(args[0]):
|
||||||
if '12' in args[0]:
|
if '12' in args[0]: # pragma: no cover
|
||||||
return MockResponse(c2workoutdata,200)
|
return MockResponse(c2workoutdata,200)
|
||||||
elif '31' in args[0]:
|
elif '31' in args[0]:
|
||||||
return MockResponse(c2timezoneworkoutdata2,200)
|
return MockResponse(c2timezoneworkoutdata2,200)
|
||||||
elif '32' in args[0]:
|
elif '32' in args[0]: # pragma: no cover
|
||||||
return MockResponse(c2timezoneworkoutdatabad,200)
|
return MockResponse(c2timezoneworkoutdatabad,200)
|
||||||
else:
|
else: # pragma: no cover
|
||||||
return MockResponse(c2timezoneworkoutdata,200)
|
return MockResponse(c2timezoneworkoutdata,200)
|
||||||
elif c2workoutlisttester.match(args[0]):
|
elif c2workoutlisttester.match(args[0]):
|
||||||
return MockResponse(c2workoutlist,200)
|
return MockResponse(c2workoutlist,200)
|
||||||
@@ -1417,13 +1417,13 @@ def mocked_requests(*args, **kwargs):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return MockResponse(json_data,200)
|
return MockResponse(json_data,200)
|
||||||
elif 'results' in args[0]:
|
elif 'results' in args[0]: # pragma: no cover
|
||||||
json_data = {
|
json_data = {
|
||||||
'data': {
|
'data': {
|
||||||
'id': 1223,
|
'id': 1223,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else:
|
else: # pragma: no cover
|
||||||
return MockResponse(c2workoutdata,200)
|
return MockResponse(c2workoutdata,200)
|
||||||
|
|
||||||
if fakturoidtester.match(args[0]):
|
if fakturoidtester.match(args[0]):
|
||||||
@@ -1451,7 +1451,7 @@ class MockEmailMessage:
|
|||||||
def send(self):
|
def send(self):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
class MockResponse:
|
class MockResponse: # pragma: no cover
|
||||||
def __init__(self, json_data, status_code):
|
def __init__(self, json_data, status_code):
|
||||||
self.json_data = json_data
|
self.json_data = json_data
|
||||||
self.status_code = status_code
|
self.status_code = status_code
|
||||||
@@ -1465,7 +1465,7 @@ class MockResponse:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MockOAuth1Session:
|
class MockOAuth1Session: # pragma: no cover
|
||||||
def __init__(self,*args, **kwargs):
|
def __init__(self,*args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ pytestmark = pytest.mark.django_db
|
|||||||
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import re
|
import re
|
||||||
|
import pytz
|
||||||
from parameterized import parameterized
|
from parameterized import parameterized
|
||||||
|
|
||||||
from django.test import TestCase, Client,override_settings, RequestFactory, TransactionTestCase
|
from django.test import TestCase, Client,override_settings, RequestFactory, TransactionTestCase
|
||||||
@@ -34,6 +35,8 @@ from django.core.management import call_command
|
|||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
|
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
import factory
|
||||||
|
from factory.fuzzy import FuzzyDateTime
|
||||||
|
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
from rowers.integrations import *
|
from rowers.integrations import *
|
||||||
@@ -41,7 +44,7 @@ from rowers.integrations import *
|
|||||||
from rowers.forms import (
|
from rowers.forms import (
|
||||||
DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
|
DocumentsForm,CNsummaryForm,RegistrationFormUniqueEmail,
|
||||||
ChartParamChoiceForm,WorkoutMultipleCompareForm,
|
ChartParamChoiceForm,WorkoutMultipleCompareForm,
|
||||||
BoxPlotChoiceForm,PerformanceManagerForm,
|
BoxPlotChoiceForm,PerformanceManagerForm,ForceCurveOptionsForm
|
||||||
)
|
)
|
||||||
import rowers.plots as plots
|
import rowers.plots as plots
|
||||||
import rowers.interactiveplots as iplots
|
import rowers.interactiveplots as iplots
|
||||||
@@ -94,7 +97,7 @@ from rowers.models import *
|
|||||||
from rowers.forms import *
|
from rowers.forms import *
|
||||||
from rowers.tests.mocks import *
|
from rowers.tests.mocks import *
|
||||||
import factory
|
import factory
|
||||||
from faker import Factory
|
from faker import Factory, Faker
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
faker = Factory.create()
|
faker = Factory.create()
|
||||||
|
|
||||||
@@ -181,13 +184,18 @@ class RaceFactory(factory.DjangoModelFactory):
|
|||||||
sessionvalue = 1
|
sessionvalue = 1
|
||||||
sessionmode = 'time'
|
sessionmode = 'time'
|
||||||
|
|
||||||
|
|
||||||
|
fake = Faker()
|
||||||
|
now = datetime.datetime.now(tz=pytz.timezone("America/New_York"))
|
||||||
|
one_month_ago = now - datetime.timedelta(days=30)
|
||||||
|
|
||||||
class WorkoutFactory(factory.DjangoModelFactory):
|
class WorkoutFactory(factory.DjangoModelFactory):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Workout
|
model = Workout
|
||||||
|
|
||||||
name = factory.LazyAttribute(lambda _: faker.word())
|
name = factory.LazyAttribute(lambda _: faker.word())
|
||||||
notes = faker.text()
|
notes = faker.text()
|
||||||
startdatetime = get_random_file(name=faker.word())['startdatetime']
|
startdatetime = FuzzyDateTime(start_dt=one_month_ago, force_year=datetime.date.today().year)
|
||||||
starttime = get_random_file(name=faker.word())['starttime']
|
starttime = get_random_file(name=faker.word())['starttime']
|
||||||
workouttype='water'
|
workouttype='water'
|
||||||
date=timezone.now().date()
|
date=timezone.now().date()
|
||||||
|
|||||||
@@ -154,6 +154,37 @@ class ForcecurveTest(TestCase):
|
|||||||
response = self.c.get(url)
|
response = self.c.get(url)
|
||||||
self.assertEqual(response.status_code,200)
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
# saving
|
||||||
|
form_data = {
|
||||||
|
'spm_min': 19,
|
||||||
|
'spm_max': 25,
|
||||||
|
'dist_min': 0,
|
||||||
|
'dist_max': 10000,
|
||||||
|
'work_min': 0,
|
||||||
|
'work_max': 3444,
|
||||||
|
'notes': 'aap',
|
||||||
|
'name': 'sdsd',
|
||||||
|
'includereststrokes': True,
|
||||||
|
'plottype':'none',
|
||||||
|
'_save_as_new':'Save'
|
||||||
|
}
|
||||||
|
|
||||||
|
form = ForceCurveOptionsForm(form_data)
|
||||||
|
result = form.is_valid()
|
||||||
|
if not result:
|
||||||
|
print(form.errors)
|
||||||
|
self.assertTrue(form.is_valid())
|
||||||
|
|
||||||
|
response = self.c.post(url, form_data)
|
||||||
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
url = '/rowers/analysis/forcecurveanalysis/'
|
||||||
|
response = self.c.get(url)
|
||||||
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class WorkoutCompareTestNew(TestCase):
|
class WorkoutCompareTestNew(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|||||||
@@ -1332,7 +1332,7 @@ class STObjects(DjangoTestCase):
|
|||||||
|
|
||||||
self.assertEqual(response.status_code,200)
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
@patch('rowers.imports.requests.get', side_effect=mocked_requests)
|
@patch('rowers.integrations.sporttracks.requests.get', side_effect=mocked_requests)
|
||||||
def test_sporttracks_import(self, mock_get):
|
def test_sporttracks_import(self, mock_get):
|
||||||
|
|
||||||
response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
|
response = self.c.get('/rowers/workout/sporttracksimport/12/',follow=True)
|
||||||
@@ -1343,7 +1343,7 @@ class STObjects(DjangoTestCase):
|
|||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
@patch('rowers.imports.requests.get', side_effect=mocked_requests)
|
@patch('rowers.integrations.sporttracks.requests.get', side_effect=mocked_requests)
|
||||||
def test_sporttracks_import(self, mock_get):
|
def test_sporttracks_import(self, mock_get):
|
||||||
|
|
||||||
response = self.c.get('/rowers/workout/sporttracksimport/13/',follow=True)
|
response = self.c.get('/rowers/workout/sporttracksimport/13/',follow=True)
|
||||||
@@ -1356,7 +1356,7 @@ class STObjects(DjangoTestCase):
|
|||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
@patch('rowers.imports.requests.get', side_effect=mocked_requests)
|
@patch('rowers.integrations.sporttracks.requests.get', side_effect=mocked_requests)
|
||||||
def test_sporttracks_import_all(self, mock_get):
|
def test_sporttracks_import_all(self, mock_get):
|
||||||
|
|
||||||
response = self.c.get('/rowers/workout/sporttracksimport/?selectallnew=true')
|
response = self.c.get('/rowers/workout/sporttracksimport/?selectallnew=true')
|
||||||
@@ -1422,7 +1422,7 @@ class TPObjects(DjangoTestCase):
|
|||||||
csvfilename=filename
|
csvfilename=filename
|
||||||
)
|
)
|
||||||
|
|
||||||
@patch('rowers.imports.requests.post', side_effect=mocked_requests)
|
@patch('rowers.integrations.trainingpeaks.requests.post', side_effect=mocked_requests)
|
||||||
def test_tp_callback(self, mock_post):
|
def test_tp_callback(self, mock_post):
|
||||||
response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
|
response = self.c.get('/tp_callback?code=dsdoij232s',follow=True)
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ class URLTests(TestCase):
|
|||||||
'/rowers/laboratory/',
|
'/rowers/laboratory/',
|
||||||
'/rowers/laboratory/user/1/',
|
'/rowers/laboratory/user/1/',
|
||||||
'/rowers/legal/',
|
'/rowers/legal/',
|
||||||
|
'/rowers/workouts/setrpe/',
|
||||||
|
'/boatmovers/',
|
||||||
|
'/boatmovers/faq/',
|
||||||
|
'/boatmovers/compare/',
|
||||||
'/rowers/list-courses/',
|
'/rowers/list-courses/',
|
||||||
'/rowers/list-graphs/',
|
'/rowers/list-graphs/',
|
||||||
'/rowers/list-jobs/',
|
'/rowers/list-jobs/',
|
||||||
|
|||||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
@@ -292,6 +292,8 @@ urlpatterns = [
|
|||||||
views.agegrouprecordview, name='agegrouprecordview'),
|
views.agegrouprecordview, name='agegrouprecordview'),
|
||||||
re_path(r'^workouts/setrpe/$', views.workouts_setrpe_view,
|
re_path(r'^workouts/setrpe/$', views.workouts_setrpe_view,
|
||||||
name='workouts_setrpe_view'),
|
name='workouts_setrpe_view'),
|
||||||
|
re_path(r'^workouts/setrpe/user/(?P<userid>\d+)/$', views.workouts_setrpe_view,
|
||||||
|
name='workouts_setrpe_view'),
|
||||||
re_path(r'^list-workouts/team/(?P<teamid>\d+)/$', views.workouts_view,
|
re_path(r'^list-workouts/team/(?P<teamid>\d+)/$', views.workouts_view,
|
||||||
name='workouts_view'),
|
name='workouts_view'),
|
||||||
re_path(r'^(?P<rowerid>\d+)/list-workouts/$', views.workouts_view,
|
re_path(r'^(?P<rowerid>\d+)/list-workouts/$', views.workouts_view,
|
||||||
|
|||||||
@@ -417,7 +417,7 @@ def workout_forcecurve_view(request, id=0, analysis=0, userid=0, workstrokesonly
|
|||||||
if r == row.user:
|
if r == row.user:
|
||||||
mayedit = 1
|
mayedit = 1
|
||||||
|
|
||||||
if analysis:
|
if analysis: # pragma: no cover
|
||||||
try:
|
try:
|
||||||
forceanalysis = ForceCurveAnalysis.objects.get(id=analysis)
|
forceanalysis = ForceCurveAnalysis.objects.get(id=analysis)
|
||||||
dist_min = forceanalysis.dist_min
|
dist_min = forceanalysis.dist_min
|
||||||
@@ -473,7 +473,7 @@ def workout_forcecurve_view(request, id=0, analysis=0, userid=0, workstrokesonly
|
|||||||
plottype = form.cleaned_data['plottype']
|
plottype = form.cleaned_data['plottype']
|
||||||
workstrokesonly = not includereststrokes
|
workstrokesonly = not includereststrokes
|
||||||
|
|
||||||
if "_save" in request.POST and "new" not in request.POST:
|
if "_save" in request.POST and "new" not in request.POST: # pragma: no cover
|
||||||
if not analysis:
|
if not analysis:
|
||||||
forceanalysis = ForceCurveAnalysis(
|
forceanalysis = ForceCurveAnalysis(
|
||||||
workout = row,
|
workout = row,
|
||||||
@@ -929,7 +929,7 @@ def workout_recalcsummary_view(request, id=0):
|
|||||||
def workouts_duplicates_select_view(request, userid=0):
|
def workouts_duplicates_select_view(request, userid=0):
|
||||||
r = getrequestrower(request, userid=userid)
|
r = getrequestrower(request, userid=userid)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST': # pragma: no cover
|
||||||
form = WorkoutMultipleCompareForm(request.POST)
|
form = WorkoutMultipleCompareForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
workouts = form.cleaned_data['workouts']
|
workouts = form.cleaned_data['workouts']
|
||||||
@@ -1922,16 +1922,17 @@ def plannedsession_compare_view(request, id=0, userid=0):
|
|||||||
|
|
||||||
# set RPE for list of workouts
|
# set RPE for list of workouts
|
||||||
@login_required()
|
@login_required()
|
||||||
def workouts_setrpe_view(request):
|
def workouts_setrpe_view(request,userid=0):
|
||||||
today = timezone.now()
|
today = timezone.now()
|
||||||
startdate = today-timezone.timedelta(days=32)
|
startdate = today-timezone.timedelta(days=32)
|
||||||
enddate = today+timezone.timedelta(days=1)
|
enddate = today+timezone.timedelta(days=1)
|
||||||
|
|
||||||
r = getrequestrower(request)
|
r = getrequestrower(request,userid=userid)
|
||||||
|
|
||||||
startdate = datetime.datetime.combine(startdate, datetime.time())
|
startdate = datetime.datetime.combine(startdate, datetime.time())
|
||||||
enddate = datetime.datetime.combine(enddate, datetime.time(23, 59, 59))
|
enddate = datetime.datetime.combine(enddate, datetime.time(23, 59, 59))
|
||||||
|
startdate = pytz.utc.localize(startdate)
|
||||||
|
enddate = pytz.utc.localize(enddate)
|
||||||
|
|
||||||
workouts = Workout.objects.filter(
|
workouts = Workout.objects.filter(
|
||||||
user=r,rpe=0,
|
user=r,rpe=0,
|
||||||
@@ -1950,9 +1951,14 @@ def workouts_setrpe_view(request):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST': # pragma: no cover
|
||||||
dateform = DateRangeForm(request.POST)
|
dateform = DateRangeForm(request.POST)
|
||||||
rpe_formset = WorkoutsRPEFormSet(request.POST)
|
rpe_formset = WorkoutsRPEFormSet(request.POST,
|
||||||
|
queryset=Workout.objects.filter(user=r,rpe=0,duplicate=False,
|
||||||
|
startdatetime__gte=startdate,
|
||||||
|
startdatetime__lte=enddate
|
||||||
|
)
|
||||||
|
)
|
||||||
if dateform.is_valid(): # pragma: no cover
|
if dateform.is_valid(): # pragma: no cover
|
||||||
startdate = dateform.cleaned_data['startdate']
|
startdate = dateform.cleaned_data['startdate']
|
||||||
enddate = dateform.cleaned_data['enddate']
|
enddate = dateform.cleaned_data['enddate']
|
||||||
@@ -2209,7 +2215,7 @@ def workouts_view(request, message='', successmessage='',
|
|||||||
'%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d')
|
'%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d')
|
||||||
|
|
||||||
norpecount = len([w for w in workouts if w.rpe==0 and not w.duplicate])
|
norpecount = len([w for w in workouts if w.rpe==0 and not w.duplicate])
|
||||||
if norpecount and r.get_rpe_warnings:
|
if norpecount and r.get_rpe_warnings: # pragma: no cover
|
||||||
messages.info(request,'You have workouts with no RPE value set. \
|
messages.info(request,'You have workouts with no RPE value set. \
|
||||||
Click <a href="/rowers/workouts/setrpe">here</a> to update them. \
|
Click <a href="/rowers/workouts/setrpe">here</a> to update them. \
|
||||||
You can switch off this warning in <a href="/rowers/me/edit">settings</a>.')
|
You can switch off this warning in <a href="/rowers/me/edit">settings</a>.')
|
||||||
@@ -3138,7 +3144,7 @@ def instroke_chart(request, id=0, metric=''): # pragma: no cover
|
|||||||
" If you are already a Pro user, please log in to access this functionality",
|
" If you are already a Pro user, please log in to access this functionality",
|
||||||
redirect_field_name=None)
|
redirect_field_name=None)
|
||||||
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
|
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
|
||||||
def instroke_data(request, metric='', spm_min=15, spm_max=45, activeminutesmin=0, activeminutesmax=0, id=0, ):
|
def instroke_data(request, metric='', spm_min=15, spm_max=45, activeminutesmin=0, activeminutesmax=0, id=0, ): # pragma: no cover
|
||||||
r = getrequestrower(request, userid=0)
|
r = getrequestrower(request, userid=0)
|
||||||
w = get_workoutuser(id, request)
|
w = get_workoutuser(id, request)
|
||||||
rowdata = rrdata(csvfile=w.csvfilename)
|
rowdata = rrdata(csvfile=w.csvfilename)
|
||||||
@@ -3255,7 +3261,7 @@ def instroke_chart_interactive(request, id=0, analysis=0, userid=0):
|
|||||||
'maxminutes': maxminutes,
|
'maxminutes': maxminutes,
|
||||||
})
|
})
|
||||||
|
|
||||||
if analysis:
|
if analysis: # pragma: no cover
|
||||||
try:
|
try:
|
||||||
instroke_analysis = InStrokeAnalysis.objects.get(id=analysis)
|
instroke_analysis = InStrokeAnalysis.objects.get(id=analysis)
|
||||||
if instroke_analysis.rower != r:
|
if instroke_analysis.rower != r:
|
||||||
|
|||||||
Reference in New Issue
Block a user