diff --git a/rowers/courses.py b/rowers/courses.py
index 7fa3d8f9..1c2afa85 100644
--- a/rowers/courses.py
+++ b/rowers/courses.py
@@ -4,6 +4,7 @@ from rowers.models import (
Rower, Workout,
GeoPoint, GeoPolygon, GeoCourse,
course_length, course_coord_center, course_coord_maxmin,
+ course_coord_crewnerd_navigation,
polygon_coord_center, PlannedSession,
polygon_to_path, coordinate_in_path
)
@@ -22,6 +23,7 @@ import time
from django.db import IntegrityError
import uuid
from django.conf import settings
+import math
import geocoder
@@ -120,6 +122,50 @@ xmlns_uris_dict = {'gx': 'http://www.google.com/kml/ext/2.2',
'': "http://www.opengis.net/kml/2.2"}
+def get_polar_angle(point, reference_point):
+ """
+ Calculate the polar angle of a point with respect to a reference point.
+ """
+ try:
+ delta_x = point.longitude - reference_point.longitude
+ delta_y = point.latitude - reference_point.latitude
+ except AttributeError:
+ delta_x = point['longitude'] - reference_point.longitude
+ delta_y = point['latitude'] - reference_point.latitude
+
+
+ return math.atan2(delta_y, delta_x)
+
+class Coordinate:
+ def __init__(self, latitude, longitude):
+ self.latitude = latitude
+ self.longitude = longitude
+
+def get_coordinates_centerpoint(coordinates):
+ try:
+ centroid_latitude = sum(coord.latitude for coord in coordinates) / len(coordinates)
+ centroid_longitude = sum(coord.longitude for coord in coordinates) / len(coordinates)
+ centroid = Coordinate(centroid_latitude, centroid_longitude)
+ except AttributeError:
+ centroid_latitude = sum(coord['latitude'] for coord in coordinates) / len(coordinates)
+ centroid_longitude = sum(coord['longitude'] for coord in coordinates) / len(coordinates)
+ centroid = Coordinate(centroid_latitude, centroid_longitude)
+
+ return centroid
+
+def sort_coordinates_ccw(coordinates):
+ """
+ Sort coordinates in counterclockwise order.
+ """
+ # Find the reference point (centroid)
+ centroid = get_coordinates_centerpoint(coordinates)
+
+ # Sort coordinates based on polar angle with respect to the centroid
+ sorted_coords = sorted(coordinates, key=lambda coord: get_polar_angle(coord, centroid))
+
+ return sorted_coords
+
+
def crewnerdcourse(doc):
courses = []
for course in doc:
@@ -162,6 +208,8 @@ def get_polygons(polygonpms):
'latitude': float(coordinates[1]),
})
+ points = sort_coordinates_ccw(points)
+
polygons.append({
'name': name,
'points': points
@@ -169,34 +217,45 @@ def get_polygons(polygonpms):
return polygons
+def crewnerdify(polygons):
+ polygons[0].name = "Start"
+ polygons[len(polygons)-1].name = "Finish"
-def coursetokml(course):
- top = Element('kml')
- for prefix, uri in xmlns_uris_dict.items():
- if prefix != '':
- top.attrib['xmlns:' + prefix] = uri
- else:
- top.attrib['xmlns'] = uri
+ if len(polygons) > 2:
+ for i in range(1,len(polygons)-1):
+ polygons[i].name = 'WP{n}'.format(n=polygons[i].order_in_course)
- document = SubElement(top, 'Document')
- name = SubElement(document, 'name')
- name.text = 'Courses.kml'
- folder = SubElement(document, 'Folder')
- foldername = SubElement(folder, 'name')
- foldername.text = 'Courses'
- folder2 = SubElement(folder, 'Folder')
+ return polygons
+
+def removewhitespace(s):
+ regels = s.split('\n')
+ regels = [regel for regel in regels if regel.strip()]
+ return "\n".join(regels)
+
+def getcoursefolder(course, document, cn=False):
+ folder2 = SubElement(document, 'Folder', id="{id}".format(id=course.id))
coursename = SubElement(folder2, 'name')
coursename.text = course.name
- open = SubElement(folder2, 'open')
- open.text = '1'
+ openst = SubElement(folder2, 'open')
+ openst.text = '1'
+ coursedescription = SubElement(folder2, 'description')
+ if len(removewhitespace(course.notes)):
+ coursedescription.text = "Rowsandall.com\n" + removewhitespace(course.notes)
+ else:
+ coursedescription.text = "Rowsandall.com " + course.name
polygons = GeoPolygon.objects.filter(
course=course).order_by("order_in_course")
+ if cn:
+ polygons = crewnerdify(polygons)
+
for polygon in polygons:
placemark = SubElement(folder2, 'Placemark')
polygonname = SubElement(placemark, 'name')
polygonname.text = polygon.name
+ polygonstyle = SubElement(placemark, 'styleUrl')
+ polygonstyle.text = "#default0"
p = SubElement(placemark, 'Polygon')
tessellate = SubElement(p, 'tessellate')
tessellate.text = '1'
@@ -206,6 +265,7 @@ def coursetokml(course):
coordinates.text = ''
points = GeoPoint.objects.filter(
polygon=polygon).order_by("order_in_poly")
+ points = sort_coordinates_ccw(points)
for point in points:
coordinates.text += '{lon},{lat},0 '.format(
lat=point.latitude,
@@ -215,6 +275,87 @@ def coursetokml(course):
lat=points[0].latitude,
lon=points[0].longitude,
)
+ return folder2
+
+def getstyle(document, id):
+ style = SubElement(document,'Style', id=id)
+ iconstyle = SubElement(style, 'IconStyle')
+ scale = SubElement(iconstyle, 'scale')
+ scale.text = "1.2"
+ linestyle = SubElement(style, 'LineStyle')
+ linestylecolor = SubElement(linestyle, 'color')
+ linestylecolor.text = "ff00ffff"
+ polystyle = SubElement(style, 'PolyStyle')
+ polystylecolor = SubElement(polystyle, 'color')
+ polystylecolor.text = "ff7fffff"
+
+ return style
+
+def getstylemap(document, id):
+ stylemap = SubElement(document, 'StyleMap', id=id)
+ pair1 = SubElement(stylemap, 'Pair')
+ pair1key = SubElement(pair1, 'key')
+ pair1key.text = "normal"
+ pair1styleurl = SubElement(pair1, 'styleUrl')
+ pair1styleurl.text = "#default"
+ pair2 = SubElement(stylemap, 'Pair')
+ pair2key = SubElement(pair2, 'key')
+ pair2key.text = "highlight"
+ pair2styleurl = SubElement(pair2, 'styleUrl')
+ pair2styleurl.text = "#hl"
+
+ return stylemap
+
+def coursestokml(courseids, cn=False):
+ courses = GeoCourse.objects.filter(id__in=courseids)
+ top = Element('kml')
+ for prefix, uri in xmlns_uris_dict.items():
+ if prefix != '':
+ top.attrib['xmlns:' + prefix] = uri
+ else:
+ top.attrib['xmlns'] = uri
+
+ document = SubElement(top, 'Document')
+ name = SubElement(document, 'name')
+ name.text = 'courses'
+
+ opendoc = SubElement(document,'open')
+ opendoc.text = '1'
+
+ style = getstyle(document, "default")
+
+ stylemap = getstylemap(document, 'default0')
+
+ stylehl = getstyle(document, "hl")
+
+ for course in courses:
+ coursefolder = getcoursefolder(course, document, cn=cn)
+
+ return prettify(top)
+
+def coursetokml(course,cn=False):
+ top = Element('kml')
+ for prefix, uri in xmlns_uris_dict.items():
+ if prefix != '':
+ top.attrib['xmlns:' + prefix] = uri
+ else:
+ top.attrib['xmlns'] = uri
+
+ document = SubElement(top, 'Document')
+ name = SubElement(document, 'name')
+ name.text = 'courses'
+
+ opendoc = SubElement(document,'open')
+ opendoc.text = '1'
+
+ style = getstyle(document, "default")
+
+ stylemap = getstylemap(document, 'default0')
+
+ stylehl = getstyle(document, "hl")
+
+ coursefolder = getcoursefolder(course, document, cn=cn)
+
return prettify(top)
diff --git a/rowers/dataprep.py b/rowers/dataprep.py
index 35a7ec9f..57c9d176 100644
--- a/rowers/dataprep.py
+++ b/rowers/dataprep.py
@@ -31,6 +31,11 @@ from zipfile import BadZipFile
import zipfile
import os
from rowers.models import strokedatafields
+import grpc
+import grpc.experimental
+import rowers.rowing_workout_metrics_pb2 as metrics_pb2
+import rowers.rowing_workout_metrics_pb2_grpc as metrics_pb2_grpc
+import traceback
from rowingdata import (
KinoMapParser,
@@ -120,10 +125,10 @@ from rowers.datautils import rpetotss
def rscore_approx(row):
if row['rscore'] > 0:
return row['rscore']
- if row['rscore'] == 0:
+ if row['rscore'] == 0: # pragma: no cover
if row['hrtss'] > 0:
return row['hrtss']
- else:
+ else: # pragma: no cover
dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second
dd = dd/3600
try:
@@ -135,7 +140,7 @@ def rscore_approx(row):
w = Workout.objects.get(id=row['id'])
trimp, hrtss = workout_trimp(w)
rscore, normp = workout_rscore(w)
- if row['rpe'] and row['rpe'] > 0:
+ if row['rpe'] and row['rpe'] > 0: # pragma: no cover
dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second
dd = dd/3600
return int(rpetotss[row['rpe']]*dd)
@@ -143,7 +148,7 @@ def rscore_approx(row):
minutes = row['duration'].hour*60+row['duration'].minute
return minutes
- return 0
+ return 0 # pragma: no cover
thetimezone = get_current_timezone()
@@ -177,7 +182,7 @@ def workout_goldmedalstandard(workout, reset=False):
if workout.workouttype in otwtypes:
try:
factor = 100./(100.-workout.user.otwslack)
- except ZeroDivisionError:
+ except ZeroDivisionError: # pragma: no cover
factor = 1.
workout.user.otwslack = 0
workout.user.save()
@@ -186,8 +191,8 @@ def workout_goldmedalstandard(workout, reset=False):
workout.goldmedalseconds = goldmedalseconds
workout.save()
return goldmedalstandard, goldmedalseconds
- else:
- return 0, 0
+
+ return 0, 0 # pragma: no cover
def check_marker(workout):
@@ -497,53 +502,85 @@ def calculate_goldmedalstandard(rower, workout, recurrance=True):
def setcp(workout, background=False, recurrance=True):
- filename = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id)
+ try:
+ filename = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id)
+ df = pd.read_parquet(filename)
+
+ if not df.empty:
+ # check dts
+ tarr = datautils.getlogarr(4000)
+ if df['delta'][0] in tarr:
+ return(df, df['delta'], df['cp'])
+ except:
+ pass
strokesdf = getsmallrowdata_db(
['power', 'workoutid', 'time'], ids=[workout.id])
- try:
- if strokesdf['power'].std() == 0:
- return pd.DataFrame(), pd.Series(dtype='float'), pd.Series(dtype='float')
- except (KeyError, TypeError):
- return pd.DataFrame(), pd.Series(dtype='float'), pd.Series(dtype='float')
-
- if background: # pragma: no cover
- _ = myqueue(queuelow, handle_setcp, strokesdf, filename, workout.id)
+ if strokesdf.empty:
return pd.DataFrame({'delta': [], 'cp': []}), pd.Series(dtype='float'), pd.Series(dtype='float')
+
+ totaltime = strokesdf['time'].max()
+ maxt = totaltime/1000.
+ logarr = datautils.getlogarr(maxt)
+
+ csvfilename = workout.csvfilename
+ # check what the real file name is
+ if os.path.exists(csvfilename):
+ csvfile = csvfilename
+ elif os.path.exists(csvfilename+'.csv'): # pragma: no cover
+ csvfile = csvfilename+'.csv'
+ elif os.path.exists(csvfilename+'.gz'): # pragma: no cover
+ csvfile = csvfilename+'.gz'
+ else: # pragma: no cover
+ return pd.DataFrame({'delta': [], 'cp': []}), pd.Series(dtype='float'), pd.Series(dtype='float')
+ csvfile = os.path.abspath(csvfile)
- if not strokesdf.empty:
- totaltime = strokesdf['time'].max()
+
+ with grpc.insecure_channel(
+ target='localhost:50052',
+ options=[('grpc.lb_policy_name', 'pick_first'),
+ ('grpc.enable_retries', 0), ('grpc.keepalive_timeout_ms',
+ 10000)]
+ ) as channel:
try:
- powermean = strokesdf['power'].mean()
- except KeyError: # pragma: no cover
- powermean = 0
+ grpc.channel_ready_future(channel).result(timeout=10)
+ except grpc.FutureTimeoutError: # pragma: no cover
+ dologging('metrics.log','grpc channel time out in setcp')
+ return pd.DataFrame({'delta': [], 'cp': []}), pd.Series(dtype='float'), pd.Series(dtype='float')
- if powermean != 0:
- thesecs = totaltime
- maxt = 1.05 * thesecs
+ stub = metrics_pb2_grpc.MetricsStub(channel)
+ req = metrics_pb2.CPRequest(filename = csvfile, filetype = "CSV", tarr = logarr)
- if maxt > 0:
- logarr = datautils.getlogarr(maxt)
- dfgrouped = strokesdf.groupby(['workoutid'])
- delta, cpvalues, avgpower = datautils.getcp(dfgrouped, logarr)
+ try:
+ response = stub.GetCP(req, timeout=60)
+ except Exception as e:
+ dologging('metrics.log', traceback.format_exc())
+ return pd.DataFrame({'delta': [], 'cp': []}), pd.Series(dtype='float'), pd.Series(dtype='float')
- df = pd.DataFrame({
- 'delta': delta,
- 'cp': cpvalues,
- 'id': workout.id,
- })
- df.to_parquet(filename, engine='fastparquet',
- compression='GZIP')
- if recurrance:
- goldmedalstandard, goldmedalduration = calculate_goldmedalstandard(
- workout.user, workout)
- workout.goldmedalstandard = goldmedalstandard
- workout.goldmedalduration = goldmedalduration
- workout.save()
- return df, delta, cpvalues
+ delta = pd.Series(np.array(response.delta))
+ cpvalues = pd.Series(np.array(response.power))
+ powermean = response.avgpower
- return pd.DataFrame({'delta': [], 'cp': []}), pd.Series(dtype='float'), pd.Series(dtype='float')
+
+
+ df = pd.DataFrame({
+ 'delta': delta,
+ 'cp': cpvalues,
+ 'id': workout.id,
+ })
+
+ df.to_parquet(filename, engine='fastparquet', compression='GZIP')
+
+ if recurrance:
+ goldmedalstandard, goldmedalduration = calculate_goldmedalstandard(
+ workout.user, workout)
+ workout.goldmedalstandard = goldmedalstandard
+ workout.goldmedalduration = goldmedalduration
+ workout.save()
+
+ return df, delta, cpvalues
+
def update_wps(r, types, mode='water', asynchron=True):
@@ -679,9 +716,11 @@ def join_workouts(r, ids, title='Joined Workout',
def fetchcp_new(rower, workouts):
data = []
+
for workout in workouts:
cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=workout.id)
try:
+ df, delta, cpvalues = setcp(workout)
df = pd.read_parquet(cpfile)
df['workout'] = str(workout)
df['url'] = workout.url()
@@ -698,12 +737,15 @@ def fetchcp_new(rower, workouts):
if len(data) > 1:
df = pd.concat(data, axis=0)
+
try:
df = df[df['cp'] == df.groupby(['delta'])['cp'].transform('max')]
except KeyError: # pragma: no cover
return pd.Series(dtype='float'), pd.Series(dtype='float'), 0, pd.Series(dtype='float'), pd.Series(dtype='float')
df = df.sort_values(['delta']).reset_index()
+ df = df[df['cp']>20]
+
return df['delta'], df['cp'], 0, df['workout'], df['url']
@@ -1011,14 +1053,22 @@ def checkbreakthrough(w, r):
cpdf, delta, cpvalues = setcp(w)
if not cpdf.empty:
if workouttype in otwtypes:
- res, btvalues, res2 = utils.isbreakthrough(
- delta, cpvalues, r.p0, r.p1, r.p2, r.p3, r.cpratio)
- _ = update_rolling_cp(r, otwtypes, 'water')
+ try:
+ res, btvalues, res2 = utils.isbreakthrough(
+ delta, cpvalues, r.p0, r.p1, r.p2, r.p3, r.cpratio)
+ _ = update_rolling_cp(r, otwtypes, 'water')
+ except ValueError:
+ res = 0
+ res2 = 0
elif workouttype in otetypes:
- res, btvalues, res2 = utils.isbreakthrough(
- delta, cpvalues, r.ep0, r.ep1, r.ep2, r.ep3, r.ecpratio)
- _ = update_rolling_cp(r, otetypes, 'erg')
+ try:
+ res, btvalues, res2 = utils.isbreakthrough(
+ delta, cpvalues, r.ep0, r.ep1, r.ep2, r.ep3, r.ecpratio)
+ _ = update_rolling_cp(r, otetypes, 'erg')
+ except ValueError:
+ res = 0
+ res2 = 0
else: # pragma: no cover
res = 0
res2 = 0
diff --git a/rowers/datautils.py b/rowers/datautils.py
index 029de2f3..cb17a357 100644
--- a/rowers/datautils.py
+++ b/rowers/datautils.py
@@ -1,4 +1,3 @@
-
import pandas as pd
import numpy as np
from scipy.interpolate import griddata
@@ -124,18 +123,18 @@ def cpfit(powerdf, fraclimit=0.0001, nmax=1000):
def getlogarr(maxt):
- maxlog10 = np.log10(maxt-5)
+ dtmin = 10
+ maxlog10 = np.log10(maxt)
# print(maxlog10,round(maxlog10))
- aantal = 10*round(maxlog10)
+ aantal = 40
logarr = np.arange(aantal+1)/10.
+ vs = 10.**logarr
+
res = []
- for la in logarr:
- try:
- v = 5+int(10.**(la))
- except ValueError: # pragma: no cover
- v = 0
- res.append(v)
+ for v in vs:
+ if v > dtmin and v
-
-
-
+
-
-
-
- {% for course in courses %}
- Country
- Name
- Distance
-
-
-
- {% endfor %}
-
- {{ course.country }}
-
- {{ course.name }}
-
-
- {{ course.distance }} m
-
-
-
No courses found
@@ -106,6 +112,7 @@CrewNerd has published a nice video tutorial of the process. Click here to see the video. The part we're interested in starts at 2:05. + There is also a written tutorial by CrewNerd.
diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py
index 7fa4e1ed..3b88c2e2 100644
--- a/rowers/tests/statements.py
+++ b/rowers/tests/statements.py
@@ -198,7 +198,7 @@ class WorkoutFactory(factory.DjangoModelFactory):
startdatetime = FuzzyDateTime(start_dt=one_month_ago, force_year=datetime.date.today().year)
starttime = get_random_file(name=faker.word())['starttime']
workouttype='water'
- date=timezone.now().date()
+ date=startdatetime.evaluate(2,None, False).date()
duration=get_random_file(name=faker.word())['duration']
distance=get_random_file(name=faker.word())['totaldist']
csvfilename=get_random_file(name=faker.word())['filename']
diff --git a/rowers/tests/test_analysis.py b/rowers/tests/test_analysis.py
index fe0997e4..8c7bc3e0 100644
--- a/rowers/tests/test_analysis.py
+++ b/rowers/tests/test_analysis.py
@@ -25,6 +25,11 @@ class ListWorkoutTest(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
+
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -79,6 +84,10 @@ class PlannedSessionTests(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -130,6 +139,22 @@ class ForcecurveTest(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
+
+ result = get_random_file(filename='rowers/tests/testdata/quiske_in_stroke.csv')
+
+ self.winstroke = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'water',
+ )
+
self.factory = RequestFactory()
self.password = faker.word()
@@ -143,6 +168,7 @@ class ForcecurveTest(TestCase):
except (IOError, FileNotFoundError,OSError):
pass
+
@patch('rowers.dataprep.getsmallrowdata_db',side_effect = mocked_getempowerdata_db)
def test_forcecurve_plot(self, mocked_getsmallrowdata_db):
login = self.c.login(username=self.u.username, password = self.password)
@@ -182,7 +208,62 @@ class ForcecurveTest(TestCase):
response = self.c.get(url)
self.assertEqual(response.status_code,200)
+ url = '/rowers/analysis/forcecurveanalysis/1/delete/'
+ response = self.c.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ form_data = {}
+ response = self.c.post(url, form_data, follow=True)
+
+ expected_url = '/rowers/analysis/forcecurveanalysis/'
+ self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200)
+
+ def test_instroke_analysis(self):
+ login = self.c.login(username=self.u.username, password = self.password)
+ self.assertTrue(login)
+
+ encoded1 = str(encoder.encode_hex(self.winstroke.id))
+ url = '/rowers/workout/'+encoded1+'/instroke/interactive/'
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ # saving
+ form_data = {
+ 'spm_min': 19,
+ 'spm_max': 25,
+ 'activeminutesmin': 0,
+ 'activeminutesmax': 10,
+ 'individual_curves': False,
+ 'notes': 'aap',
+ 'name': 'sdsd',
+ 'metric': 'boat accelerator curve',
+ '_save_as_new':'Save'
+ }
+
+ form = InstrokeForm(form_data,choices=['boat accelerator curve', 'oar angle velocity curve'])
+ 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/instrokeanalysis/'
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ url = '/rowers/analysis/instrokeanalysis/1/delete/'
+ response = self.c.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ form_data = {}
+ response = self.c.post(url, form_data, follow=True)
+
+ expected_url = '/rowers/analysis/instrokeanalysis/'
+ self.assertRedirects(response, expected_url=expected_url, status_code=302,target_status_code=200)
@@ -198,6 +279,10 @@ class WorkoutCompareTestNew(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -296,6 +381,10 @@ class WorkoutBoxPlotTestNew(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -393,6 +482,10 @@ class WorkoutHistoTestNew(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -490,6 +583,10 @@ class History(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(20, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -577,6 +674,10 @@ class GoldMedalScores(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(20, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
result = get_random_file(filename='rowers/tests/testdata/onwater2.csv')
self.w1 = WorkoutFactory(user=self.r,
csvfilename=result['filename'],
@@ -677,6 +778,10 @@ class WorkoutFlexallTestNew(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -774,6 +879,10 @@ class WorkoutStatsTestNew(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
today = datetime.date.today()
i = 0
@@ -1082,6 +1191,10 @@ class MarkerPerformanceTest(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
@@ -1095,6 +1208,8 @@ class MarkerPerformanceTest(TestCase):
workouttype='rower',
rankingpiece=True,
)
+ self.werg2k.date = self.werg2k.startdatetime.date()
+ self.werg2k.save()
# need a 2k, 5k, 1h row
self.werg5k = WorkoutFactory(
@@ -1104,6 +1219,8 @@ class MarkerPerformanceTest(TestCase):
workouttype='rower',
rankingpiece=True,
)
+ self.werg5k.date = self.werg5k.startdatetime.date()
+ self.werg5k.save()
# need a 2k, 5k, 1h row
self.werg1h = WorkoutFactory(
@@ -1113,6 +1230,8 @@ class MarkerPerformanceTest(TestCase):
workouttype='rower',
rankingpiece=True,
)
+ self.werg1h.date = self.werg1h.startdatetime.date()
+ self.werg1h.save()
def tearDown(self):
for workout in self.user_workouts:
@@ -1280,6 +1399,10 @@ class AlertTest(TestCase):
self.c = Client()
self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ for w in self.user_workouts:
+ if w.date != w.startdatetime.date():
+ w.date = w.startdatetime.date()
+ w.save()
self.factory = RequestFactory()
self.password = faker.word()
self.u.set_password(self.password)
diff --git a/rowers/tests/test_aworkouts.py b/rowers/tests/test_aworkouts.py
index 3f5f8f24..fdbb7e75 100644
--- a/rowers/tests/test_aworkouts.py
+++ b/rowers/tests/test_aworkouts.py
@@ -32,858 +32,930 @@ def create_image(storage, filename, size=(100, 100), image_mode='RGB', image_for
return storage.save(filename, image_file)
class ListWorkoutTest(TestCase):
- def setUp(self):
- self.u = UserFactory()
+ def setUp(self):
+ self.u = UserFactory()
+
+ self.r = Rower.objects.create(user=self.u,
+ birthdate=faker.profile()['birthdate'],
+ gdproptin=True, ftpset=True,surveydone=True,
+ gdproptindate=timezone.now(),
+ rowerplan='coach')
- self.r = Rower.objects.create(user=self.u,
- birthdate=faker.profile()['birthdate'],
- gdproptin=True, ftpset=True,surveydone=True,
- gdproptindate=timezone.now(),
- rowerplan='coach')
+ self.c = Client()
+ self.user_workouts = WorkoutFactory.create_batch(len(workouttypes), user=self.r)
+ i = 0
+ for workouttype in workouttypes:
+ self.user_workouts[i].workouttype = workouttype[0]
+ self.user_workouts[i].save()
+ i = i+1
- self.c = Client()
- self.user_workouts = WorkoutFactory.create_batch(len(workouttypes), user=self.r)
- i = 0
- for workouttype in workouttypes:
- self.user_workouts[i].workouttype = workouttype[0]
- self.user_workouts[i].save()
- i = i+1
+ self.factory = RequestFactory()
+ self.password = faker.word()
+ self.u.set_password(self.password)
+ self.u.save()
- self.factory = RequestFactory()
- self.password = faker.word()
- self.u.set_password(self.password)
- self.u.save()
+ def tearDown(self):
+ for workout in self.user_workouts:
+ try:
+ os.remove(workout.csvfilename)
+ except (IOError, FileNotFoundError,OSError):
+ pass
- def tearDown(self):
- for workout in self.user_workouts:
- try:
- os.remove(workout.csvfilename)
- except (IOError, FileNotFoundError,OSError):
- pass
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.dataprep.myqueue')
+ def test_list_workouts(self, mocked_sqlalchemy,
+ mocked_getsmallrowdata_db,
+ mocked_myqueue):
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.dataprep.myqueue')
- def test_list_workouts(self, mocked_sqlalchemy,
- mocked_getsmallrowdata_db,
- mocked_myqueue):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
+ url = reverse('workouts_view')
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ url2 = url+'?page=2'
+
+ response = self.c.get(url2)
+ self.assertEqual(response.status_code,200)
+
+ url3 = url+'?page=3'
+
+ response = self.c.get(url3)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.dataprep.myqueue')
+ def test_bulk_workouts(self, mocked_sqlalchemy,
+ mocked_getsmallrowdata_db,
+ mocked_myqueue):
+
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+ url = '/rowers/list-workouts/?selectworkouts=true'
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
- url = reverse('workouts_view')
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
+ form_data = {
+ 'action': ['remove'],
+ 'selectworkouts': ['Submit'],
+ 'workoutid': [encoder.encode_hex(1), encoder.encode_hex(2)],
+ }
- url2 = url+'?page=2'
+ response = self.c.post(url, form_data, follow=True)
+ expected_url = reverse('workouts_bulk_actions')
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,
+ target_status_code=200)
- response = self.c.get(url2)
- self.assertEqual(response.status_code,200)
+ form_data = {
+ 'workouts': ['1','2'],
+ 'action': ['export'],
+ 'destination': 'strava',
+ }
- url3 = url+'?page=3'
-
- response = self.c.get(url3)
- self.assertEqual(response.status_code,200)
+ response = self.c.post(expected_url, form_data, follow=True)
+ url = expected_url
+ expected_url = reverse('workouts_view')
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,
+ target_status_code=200)
+ form_data = {
+ 'workouts': ['1','2'],
+ 'action': ['remove'],
+ }
+ response = self.c.post(url, form_data, follow=True)
+ expected_url = reverse('workouts_view')
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,
+ target_status_code=200)
+
@override_settings(TESTING=True)
class WorkoutViewTest(TestCase):
- def setUp(self):
- self.u = UserFactory()
+ def setUp(self):
+ self.u = UserFactory()
- self.r = Rower.objects.create(user=self.u,
- birthdate=faker.profile()['birthdate'],
- gdproptin=True, ftpset=True,surveydone=True,
- gdproptindate=timezone.now(),
- rowerplan='coach')
+ self.r = Rower.objects.create(user=self.u,
+ birthdate=faker.profile()['birthdate'],
+ gdproptin=True, ftpset=True,surveydone=True,
+ gdproptindate=timezone.now(),
+ rowerplan='coach')
- self.c = Client()
- self.c2 = Client() # for anonymous
- self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
- self.factory = RequestFactory()
- self.password = faker.word()
- self.u.set_password(self.password)
- self.u.save()
+ self.c = Client()
+ self.c2 = Client() # for anonymous
+ self.user_workouts = WorkoutFactory.create_batch(5, user=self.r)
+ self.factory = RequestFactory()
+ self.password = faker.word()
+ self.u.set_password(self.password)
+ self.u.save()
- result = get_random_file(filename='rowers/tests/testdata/onwater2.csv')
+ result = get_random_file(filename='rowers/tests/testdata/onwater2.csv')
- self.wwater = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'water',
- )
+ self.wwater = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'water',
+ )
-# self.comments = CommentFactory.create_batch(5,
-# user = self.u,
-# created = timezone.now,
-# workout = self.wwater)
+ result = get_random_file(filename='rowers/tests/testdata/quiske_in_stroke.csv')
+
+ self.winstroke = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'water',
+ )
- result = get_random_file(filename='rowers/tests/testdata/quiske_in_stroke.csv')
+ result = get_random_file(filename='rowers/tests/testdata/erg1.csv')
+
+ self.werg1 = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'rower',
+ )
- self.winstroke = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'water',
- )
+ result = get_random_file(filename='rowers/tests/testdata/erg2.csv')
- result = get_random_file(filename='rowers/tests/testdata/erg1.csv')
+ self.werg2 = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'rower',
+ )
- self.werg1 = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'rower',
- )
+ result = get_random_file(filename='rowers/tests/testdata/erg2.csv')
- result = get_random_file(filename='rowers/tests/testdata/erg2.csv')
-
- self.werg2 = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'rower',
- )
-
- result = get_random_file(filename='rowers/tests/testdata/erg2.csv')
-
- self.werg2copy = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'rower',
- )
+ self.werg2copy = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'rower',
+ )
- result = get_random_file(filename='rowers/tests/testdata/erg3.csv')
+ result = get_random_file(filename='rowers/tests/testdata/erg3.csv')
- self.werg3 = WorkoutFactory(user=self.r,
- csvfilename=result['filename'],
- starttime=result['starttime'],
- startdatetime=result['startdatetime'],
- duration=result['duration'],
- distance=result['totaldist'],
- workouttype = 'rower',
- )
-
- def tearDown(self):
- vs = VideoAnalysis.objects.all()
- for v in vs:
+ self.werg3 = WorkoutFactory(user=self.r,
+ csvfilename=result['filename'],
+ starttime=result['starttime'],
+ startdatetime=result['startdatetime'],
+ duration=result['duration'],
+ distance=result['totaldist'],
+ workouttype = 'rower',
+ )
+
+ def tearDown(self):
+ vs = VideoAnalysis.objects.all()
+ for v in vs:
v.delete()
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.middleware.myqueue')
- def test_forcecurve(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
- mocked_myqueue):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
+
- url = reverse('workout_forcecurve_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.middleware.myqueue')
+ def test_forcecurve(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_myqueue):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
+ url = reverse('workout_forcecurve_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
- form_data = {
- 'workstrokesonly': True,
- 'plottype': 'scatter'
- }
+ form_data = {
+ 'workstrokesonly': True,
+ 'plottype': 'scatter'
+ }
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @pytest.mark.django_db(transaction=True)
- def test_joins(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- with transaction.atomic():
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.middleware.myqueue')
+ def test_resample(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_myqueue):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
- url = reverse('workouts_join_select')
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
+ url = reverse('workout_resample_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
- d1 = self.werg1.date-datetime.timedelta(days=2)
- d2 = self.werg2.date+datetime.timedelta(days=2)
+ form_data = {
+ 'resamplechoice': 'copy',
+ }
- form_data = {
- 'startdate': d1.strftime('%Y-%m-%d'),
- 'enddate': d2.strftime('%Y-%m-%d'),
- 'modality':'water',
- 'waterboattype':['1x'],
- }
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
- form = DateRangeForm(form_data)
- self.assertTrue(form.is_valid())
+ form_data = {
+ 'resamplechoice': 'overwrite',
+ }
- form = TrendFlexModalForm(form_data)
- self.assertTrue(form.is_valid())
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @pytest.mark.django_db(transaction=True)
+ def test_joins(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ with transaction.atomic():
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workouts_join_select')
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ d1 = self.werg1.date-datetime.timedelta(days=2)
+ d2 = self.werg2.date+datetime.timedelta(days=2)
+
+ form_data = {
+ 'startdate': d1.strftime('%Y-%m-%d'),
+ 'enddate': d2.strftime('%Y-%m-%d'),
+ 'modality':'water',
+ 'waterboattype':['1x'],
+ }
- url = reverse('workouts_join_view')
+ form = DateRangeForm(form_data)
+ self.assertTrue(form.is_valid())
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
+ form = TrendFlexModalForm(form_data)
+ self.assertTrue(form.is_valid())
- expected_url = reverse('workouts_join_select')
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,
- target_status_code=200)
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
- form_data = {
- 'workout_name': 'joined',
- 'set_private': False,
- 'workouts': [str(self.werg1.id),str(self.werg2.id),str(self.werg3.id)],
- }
+ url = reverse('workouts_join_view')
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
- form = WorkoutMultipleCompareForm(form_data)
- self.assertTrue(form.is_valid())
+ expected_url = reverse('workouts_join_select')
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,
+ target_status_code=200)
- form = WorkoutJoinParamForm(form_data)
- self.assertTrue(form.is_valid())
+ form_data = {
+ 'workout_name': 'joined',
+ 'set_private': False,
+ 'workouts': [str(self.werg1.id),str(self.werg2.id),str(self.werg3.id)],
+ }
- response = self.c.post(url,form_data,follow=True)
- self.assertEqual(response.status_code,200)
+ form = WorkoutMultipleCompareForm(form_data)
+ self.assertTrue(form.is_valid())
- expected_url = reverse(self.r.defaultlandingpage,
- kwargs = {
+ form = WorkoutJoinParamForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ expected_url = reverse(self.r.defaultlandingpage,
+ kwargs = {
'id':encoder.encode_hex(12)
- })
-
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
-
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.weather.requests.get', side_effect=mocked_requests)
- def test_waterworkout_view(self,
- mocked_sqlalchemy, mocked_getsmallrowdata_db, mocked_requests):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_downloadmetar_view',kwargs={
- 'id': encoder.encode_hex(self.wwater.id),
- 'airportcode': 'LKHO'
- }
- )
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_downloadwind_view',kwargs={
- 'id': encoder.encode_hex(self.wwater.id),
- }
- )
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- # Stacked Flex Chart
- url = reverse('workout_flexchart_stacked_view',kwargs={
- 'id': encoder.encode_hex(self.wwater.id),
- })
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'xaxis':'time',
- 'yaxis1':'power',
- 'yaxis2':'pace',
- 'yaxis3':'hr',
- 'yaxis4':'spm'
- }
-
-
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_erase_column_view',kwargs={'id':encoder.encode_hex(self.wwater.id),'column':'hr'})
- expected_url = reverse('workout_data_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- form_data = {}
- response = self.c.post(url,form_data,follow=True)
- self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200)
-
- url = expected_url
- form_data = {
- 'cols':['hr','spm']
- }
- form = DataFrameColumnsForm(form_data)
-
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_smoothen(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- expected_url = reverse(self.r.defaultlandingpage,
- kwargs = {
- 'id':encoder.encode_hex(self.wwater.id)
- }
- )
-
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
-
- url = reverse('workout_undo_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
-
- expected_url = reverse(self.r.defaultlandingpage,
- kwargs = {
- 'id':encoder.encode_hex(self.wwater.id)
- }
- )
-
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
-
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_windform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_wind_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'dist1':1000,
- 'dist2':2000,
- 'vwind1':2.0,
- 'vwind2':1.4,
- 'windunit':'m',
- 'winddirection1': 0,
- 'winddirection2': 90,
- }
-
- form = UpdateWindForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_streamform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_stream_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'dist1':1000,
- 'dist2':2000,
- 'stream1':2.0,
- 'stream2':1.4,
- 'streamunit':'m',
- }
-
- form = UpdateStreamForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
-
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.middleware.myqueue')
- def test_setpowerform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
- mocked_myqueue):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('instroke_view',kwargs={'id':encoder.encode_hex(self.winstroke.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- rowdata = rowingdata.rowingdata(csvfile=self.winstroke.csvfilename)
- instrokemetrics = rowdata.get_instroke_columns()
-
- self.assertTrue(len(instrokemetrics)>0)
-
- url = reverse('instroke_chart',
- kwargs={
- 'id':encoder.encode_hex(self.winstroke.id),
- 'metric':instrokemetrics[0],
- })
- url2 = reverse(self.r.defaultlandingpage,kwargs={'id':encoder.encode_hex(self.winstroke.id)})
- response = self.c.get(url)
- self.assertRedirects(response,
- expected_url=url2,
- status_code=302,target_status_code=200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_setpowerform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_otwsetpower_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'quick_calc':True,
- 'boattype': '1x',
- 'weightvalue': 75.0,
- 'boatbrand':'maas',
- }
-
- form = AdvancedWorkoutForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data,follow=True)
- self.assertEqual(response.status_code,200)
-
- expected_url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_commentview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_comment_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'comment': faker.text()
- }
-
- form = WorkoutCommentForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data,follow=True)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_unsubscribe_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_mapview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
-
- url = reverse('workout_map_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def notworking_test_workout_image(self, mocked_sqlalchemy,
- mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_uploadimage_view',
- kwargs={'id':encoder.encode_hex(self.werg1.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- with open('rowers/tests/testdata/lofoten.jpg','rb') as screenshot_file:
- file_data = {'file':screenshot_file}
- form_data = {
- 'file':screenshot_file,
- }
-
- #form = ImageForm(form_data, file_data)
- #if not form.is_valid():
- # print form.errors
- #self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data,format='multipart',follow=True)
-
- expected_url = reverse(self.r.defaultlandingpage,
+ })
+
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
+
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.weather.requests.get', side_effect=mocked_requests)
+ def test_waterworkout_view(self,
+ mocked_sqlalchemy, mocked_getsmallrowdata_db, mocked_requests):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_downloadmetar_view',kwargs={
+ 'id': encoder.encode_hex(self.wwater.id),
+ 'airportcode': 'LKHO'
+ }
+ )
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_downloadwind_view',kwargs={
+ 'id': encoder.encode_hex(self.wwater.id),
+ }
+ )
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ # Stacked Flex Chart
+ url = reverse('workout_flexchart_stacked_view',kwargs={
+ 'id': encoder.encode_hex(self.wwater.id),
+ })
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'xaxis':'time',
+ 'yaxis1':'power',
+ 'yaxis2':'pace',
+ 'yaxis3':'hr',
+ 'yaxis4':'spm'
+ }
+
+
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_erase_column_view',kwargs={'id':encoder.encode_hex(self.wwater.id),'column':'hr'})
+ expected_url = reverse('workout_data_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {}
+ response = self.c.post(url,form_data,follow=True)
+ self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200)
+
+ url = expected_url
+ form_data = {
+ 'cols':['hr','spm']
+ }
+ form = DataFrameColumnsForm(form_data)
+
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_smoothen(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ expected_url = reverse(self.r.defaultlandingpage,
+ kwargs = {
+ 'id':encoder.encode_hex(self.wwater.id)
+ }
+ )
+
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
+
+ url = reverse('workout_undo_smoothenpace_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ expected_url = reverse(self.r.defaultlandingpage,
+ kwargs = {
+ 'id':encoder.encode_hex(self.wwater.id)
+ }
+ )
+
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
+
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_windform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_wind_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'dist1':1000,
+ 'dist2':2000,
+ 'vwind1':2.0,
+ 'vwind2':1.4,
+ 'windunit':'m',
+ 'winddirection1': 0,
+ 'winddirection2': 90,
+ }
+
+ form = UpdateWindForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_streamform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_stream_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'dist1':1000,
+ 'dist2':2000,
+ 'stream1':2.0,
+ 'stream2':1.4,
+ 'streamunit':'m',
+ }
+
+ form = UpdateStreamForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.middleware.myqueue')
+ def test_setpowerform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_myqueue):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('instroke_view',kwargs={'id':encoder.encode_hex(self.winstroke.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ rowdata = rowingdata.rowingdata(csvfile=self.winstroke.csvfilename)
+ instrokemetrics = rowdata.get_instroke_columns()
+
+ self.assertTrue(len(instrokemetrics)>0)
+
+ url = reverse('instroke_chart',
+ kwargs={
+ 'id':encoder.encode_hex(self.winstroke.id),
+ 'metric':instrokemetrics[0],
+ })
+ url2 = reverse(self.r.defaultlandingpage,kwargs={'id':encoder.encode_hex(self.winstroke.id)})
+ response = self.c.get(url)
+ self.assertRedirects(response,
+ expected_url=url2,
+ status_code=302,target_status_code=200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_setpowerform(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_otwsetpower_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'quick_calc':True,
+ 'boattype': '1x',
+ 'weightvalue': 75.0,
+ 'boatbrand':'maas',
+ }
+
+ form = AdvancedWorkoutForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ expected_url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_commentview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_comment_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'comment': faker.text()
+ }
+
+ form = WorkoutCommentForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_unsubscribe_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_mapview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_map_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def notworking_test_workout_image(self, mocked_sqlalchemy,
+ mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_uploadimage_view',
+ kwargs={'id':encoder.encode_hex(self.werg1.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ with open('rowers/tests/testdata/lofoten.jpg','rb') as screenshot_file:
+ file_data = {'file':screenshot_file}
+ form_data = {
+ 'file':screenshot_file,
+ }
+
+ response = self.c.post(url,form_data,format='multipart',follow=True)
+
+ expected_url = reverse(self.r.defaultlandingpage,
kwargs={'id':encoder.encode_hex(self.werg1.id)})
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
+ @pytest.mark.django_db(transaction=True)
+ def test_workout_split(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_getrowdata_db):
+ with transaction.atomic():
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_split_view',kwargs={'id':encoder.encode_hex(self.werg1.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'splittime': '2:00',
+ 'splitmode': ['keep original','keep first','keep second']
+ }
+
+ form = WorkoutSplitForm(form_data)
+
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url, form_data,follow=True)
+ self.assertEqual(response.status_code,200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
+ @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_forfusion)
+ def test_workout_fusion(self, mocked_sqlalchemy, mocked_getrowdata_db,
+ mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_fusion_view',
+ kwargs={'id1':encoder.encode_hex(self.werg2.id),
+ 'id2':encoder.encode_hex(self.werg2copy.id)})
+
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'posneg':'pos',
+ 'offset': datetime.timedelta(seconds=0),
+ 'columns': ['power','hr'
+ ]
+ }
+
+ form = FusionMetricChoiceForm(form_data,instance=self.werg2copy)
+
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data,follow=True)
+ self.assertEqual(response.status_code,200)
+
+
+ def test_remove_power_view(self):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('remove_power_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+ url2 = reverse(self.r.defaultlandingpage,
+ kwargs={
+ 'id':encoder.encode_hex(self.wwater.id)
+ }
+ )
+ response = self.c.get(url)
+ self.assertRedirects(response,
+ expected_url=url2,
+ status_code=302,
+ target_status_code=200
+ )
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
- @pytest.mark.django_db(transaction=True)
- def test_workout_split(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
- mocked_getrowdata_db):
- with transaction.atomic():
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_split_view',kwargs={'id':encoder.encode_hex(self.werg1.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'splittime': '2:00',
- 'splitmode': ['keep original','keep first','keep second']
- }
-
- form = WorkoutSplitForm(form_data)
-
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url, form_data,follow=True)
- self.assertEqual(response.status_code,200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
- @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_forfusion)
- def test_workout_fusion(self, mocked_sqlalchemy, mocked_getrowdata_db,
- mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_fusion_view',
- kwargs={'id1':encoder.encode_hex(self.werg2.id),
- 'id2':encoder.encode_hex(self.werg2copy.id)})
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
+ def test_workout_video_view(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_videodata):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+ url2 = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
+ yturl = 'https://youtu.be/6UzaWm1Ybrw'
+
+ response = self.c.get(url)
+
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'url': yturl,
+ 'delay': -119,
+ 'groups': ['basic'],
+ 'name': 'Video A',
+ 'save_button':'Save',
+ }
- form_data = {
- 'posneg':'pos',
- 'offset': datetime.timedelta(seconds=0),
- 'columns': ['power','hr'
- ]
- }
+ response = self.c.post(url,form_data)
+ self.assertRedirects(response,
+ expected_url=url2,
+ status_code=302,
+ target_status_code=200)
+
+ response = self.c.get(url2)
+ self.assertEqual(response.status_code,200)
- form = FusionMetricChoiceForm(form_data,instance=self.werg2copy)
+ form_data = {
+ 'url': yturl,
+ 'delay': -119,
+ 'groups': ['basic'],
+ 'name': 'Video A',
+ 'save_button': 'Save',
+ }
- self.assertTrue(form.is_valid())
+ response = self.c.post(url2,form_data)
+ self.assertEqual(response.status_code,200)
- response = self.c.post(url,form_data,follow=True)
- self.assertEqual(response.status_code,200)
+ url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ # delete video
+ url = reverse('video_delete',kwargs={'pk':1})
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ response = self.c.post(url,{},follow=True)
+ expected_url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+ self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200)
+
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
+ def test_workout_video_view_erg(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ mocked_videodata):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(self.werg1.id)})
+ url2 = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
+
+
+ yturl = 'https://youtu.be/6UzaWm1Ybrw'
+
+ response = self.c.get(url)
+
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'url': yturl,
+ 'delay': -119,
+ 'groups': ['basic'],
+ 'name': 'Video A',
+ 'save_button':'Save',
+ }
+
+ response = self.c.post(url,form_data)
+ self.assertRedirects(response,
+ expected_url=url2,
+ status_code=302,
+ target_status_code=200)
+
+ response = self.c.get(url2)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'url': yturl,
+ 'delay': -119,
+ 'groups': ['basic'],
+ 'name': 'Video A',
+ 'save_button': 'Save',
+ }
+
+ response = self.c.post(url2,form_data)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
+ response = self.c2.get(url)
+ self.assertEqual(response.status_code,200)
+
+ url = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
+ response = self.c2.get(url)
+ self.assertEqual(response.status_code,200)
- def test_remove_power_view(self):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('remove_power_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
- url2 = reverse(self.r.defaultlandingpage,
- kwargs={
- 'id':encoder.encode_hex(self.wwater.id)
- }
- )
- response = self.c.get(url)
- self.assertRedirects(response,
- expected_url=url2,
- status_code=302,
- target_status_code=200
- )
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
- def test_workout_video_view(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
+ @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
+ def test_video_selectworkout(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
mocked_videodata):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
- url = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
- url2 = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
+ url = reverse('video_selectworkout')
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ d1 = self.wwater.date-datetime.timedelta(days=24)
+ d2 = self.wwater.date+datetime.timedelta(days=24)
+
+ form_data = {
+ 'workout':'1',
+ 'startdate': d1.strftime("%Y-%m-%d"),
+ 'enddate': d2.strftime("%Y-%m-%d")
+ }
- yturl = 'https://youtu.be/6UzaWm1Ybrw'
+ url2 = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(1)})
- response = self.c.get(url)
-
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'url': yturl,
- 'delay': -119,
- 'groups': ['basic'],
- 'name': 'Video A',
- 'save_button':'Save',
- }
-
- response = self.c.post(url,form_data)
- self.assertRedirects(response,
- expected_url=url2,
- status_code=302,
- target_status_code=200)
-
- response = self.c.get(url2)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'url': yturl,
- 'delay': -119,
- 'groups': ['basic'],
- 'name': 'Video A',
- 'save_button': 'Save',
- }
-
- response = self.c.post(url2,form_data)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- # delete video
- url = reverse('video_delete',kwargs={'pk':1})
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- response = self.c.post(url,{},follow=True)
- expected_url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
- self.assertRedirects(response,expected_url=expected_url,status_code=302,target_status_code=200)
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
- def test_workout_video_view_erg(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
- mocked_videodata):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(self.werg1.id)})
- url2 = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
-
-
- yturl = 'https://youtu.be/6UzaWm1Ybrw'
-
- response = self.c.get(url)
-
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'url': yturl,
- 'delay': -119,
- 'groups': ['basic'],
- 'name': 'Video A',
- 'save_button':'Save',
- }
-
- response = self.c.post(url,form_data)
- self.assertRedirects(response,
- expected_url=url2,
- status_code=302,
- target_status_code=200)
-
- response = self.c.get(url2)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'url': yturl,
- 'delay': -119,
- 'groups': ['basic'],
- 'name': 'Video A',
- 'save_button': 'Save',
- }
-
- response = self.c.post(url2,form_data)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_video_view_mini',kwargs={'id':encoder.encode_hex(1)})
- response = self.c2.get(url)
- self.assertEqual(response.status_code,200)
-
- url = reverse('workout_video_view',kwargs={'id':encoder.encode_hex(1)})
- response = self.c2.get(url)
- self.assertEqual(response.status_code,200)
-
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getrowdata_db',side_effect=mocked_getrowdata_db)
- @patch('rowers.dataprep.get_video_data',side_effect=mocked_videodata)
- def test_video_selectworkout(self, mocked_sqlalchemy, mocked_getsmallrowdata_db,
- mocked_videodata):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('video_selectworkout')
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- d1 = self.wwater.date-datetime.timedelta(days=24)
- d2 = self.wwater.date+datetime.timedelta(days=24)
-
-
- form_data = {
- 'workout':'1',
- 'startdate': d1.strftime("%Y-%m-%d"),
- 'enddate': d2.strftime("%Y-%m-%d")
- }
-
- url2 = reverse('workout_video_create_view',kwargs={'id':encoder.encode_hex(1)})
-
- response = self.c.post(url,form_data)
- self.assertRedirects(response,
- expected_url=url2,
- status_code=302,
- target_status_code=200)
+ response = self.c.post(url,form_data)
+ self.assertRedirects(response,
+ expected_url=url2,
+ status_code=302,
+ target_status_code=200)
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_editsummaryview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_editsummaryview(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+
+ url = reverse('workout_summary_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'ruptures':'ruptures',
+ }
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'intervalstring':'4x2min/1min',
+ }
+
+ form = SummaryStringForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'powerorpace':'power',
+ 'value_pace':'2:23',
+ 'value_power':'200',
+ 'value_work':'400',
+ 'value_spm':'20',
+ 'activeminutesmin':'0',
+ 'activeminutesmax':'60',
+ 'savepowerpaceform':True,
+ }
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'savestringform':'4x2min/1min',
+ }
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
+
+ form_data = {
+ 'selector':'power',
+ 'power': 200,
+ 'pace': '2:30',
+ 'work': 400,
+ 'activeminutesmin':'0',
+ 'activeminutesmax': '60',
+ }
+
+ form = PowerIntervalUpdateForm(form_data)
+ self.assertTrue(form.is_valid())
+
+ response = self.c.post(url,form_data)
+ self.assertEqual(response.status_code,200)
- url = reverse('workout_summary_edit_view',kwargs={'id':encoder.encode_hex(self.wwater.id)})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'ruptures':'ruptures',
- }
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'intervalstring':'4x2min/1min',
- }
-
- form = SummaryStringForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'powerorpace':'power',
- 'value_pace':'2:23',
- 'value_power':'200',
- 'value_work':'400',
- 'value_spm':'20',
- 'activeminutesmin':'0',
- 'activeminutesmax':'60',
- 'savepowerpaceform':True,
- }
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'savestringform':'4x2min/1min',
- }
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
- form_data = {
- 'selector':'power',
- 'power': 200,
- 'pace': '2:30',
- 'work': 400,
- 'activeminutesmin':'0',
- 'activeminutesmax': '60',
- }
-
- form = PowerIntervalUpdateForm(form_data)
- self.assertTrue(form.is_valid())
-
- response = self.c.post(url,form_data)
- self.assertEqual(response.status_code,200)
-
-
- @patch('rowers.dataprep.create_engine')
- @patch('rowers.dataprep.getsmallrowdata_db')
- def test_workout_delete(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
- login = self.c.login(username=self.u.username, password=self.password)
- self.assertTrue(login)
-
- url = reverse('workout_delete',kwargs={'pk':self.wwater.id})
-
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
-
- post_data = {}
-
- response = self.c.post(url,follow=True)
-
- expected_url = reverse('workouts_view')
-
- self.assertRedirects(response,
- expected_url=expected_url,
- status_code=302,target_status_code=200)
+ @patch('rowers.dataprep.create_engine')
+ @patch('rowers.dataprep.getsmallrowdata_db')
+ def test_workout_delete(self, mocked_sqlalchemy, mocked_getsmallrowdata_db):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = reverse('workout_delete',kwargs={'pk':self.wwater.id})
+
+ response = self.c.get(url)
+ self.assertEqual(response.status_code,200)
+
+ post_data = {}
+
+ response = self.c.post(url,follow=True)
+
+ expected_url = reverse('workouts_view')
+
+ self.assertRedirects(response,
+ expected_url=expected_url,
+ status_code=302,target_status_code=200)
diff --git a/rowers/tests/test_basicrower.py b/rowers/tests/test_basicrower.py
index 39a9b1f6..934c7737 100644
--- a/rowers/tests/test_basicrower.py
+++ b/rowers/tests/test_basicrower.py
@@ -61,3 +61,15 @@ class SimpleViewTest(TestCase):
self.assertRedirects(response,
expected_url='/rowers/list-workouts/',
status_code=302,target_status_code=200)
+
+ def test_start_coachtrial(self):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = '/rowers/startcoachtrial/'
+
+ response = self.c.get(url,follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/list-workouts/',
+ status_code=302,target_status_code=200)
diff --git a/rowers/tests/test_uploads.py b/rowers/tests/test_uploads.py
index 9c6ba94b..68a61119 100644
--- a/rowers/tests/test_uploads.py
+++ b/rowers/tests/test_uploads.py
@@ -28,15 +28,6 @@ class ViewTest(TestCase):
self.nu = datetime.datetime.now()
- def test_upload_view_notloggedin(self):
- response = self.c.post('/rowers/workout/upload/',follow=True)
-
-
- self.assertRedirects(response, expected_url='/login/?next=/rowers/workout/upload/',
- status_code=302,target_status_code=200)
-
- self.assertEqual(response.status_code, 200)
-
@patch('rowers.dataprep.create_engine')
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
def test_upload_view_sled(self, mocked_sqlalchemy,mocked_getsmallrowdata_db):
@@ -129,7 +120,7 @@ class ViewTest(TestCase):
f_to_be_deleted = w.csvfilename
try:
os.remove(f_to_be_deleted+'.gz')
- except (FileNotFoundError,OSError):
+ except (FileNotFoundError,OSError): # pragma: no cover
pass
@patch('rowers.dataprep.create_engine')
@@ -230,7 +221,7 @@ class ViewTest(TestCase):
f_to_be_deleted = w.csvfilename
try:
os.remove(f_to_be_deleted+'.gz')
- except (FileNotFoundError,OSError):
+ except (FileNotFoundError,OSError): # pragma: no cover
pass
@@ -271,7 +262,7 @@ class ViewTest(TestCase):
f_to_be_deleted = w.csvfilename
try:
os.remove(f_to_be_deleted+'.gz')
- except (FileNotFoundError,OSError):
+ except (FileNotFoundError,OSError): # pragma: no cover
pass
@patch('rowers.dataprep.create_engine')
@@ -341,19 +332,6 @@ class ViewTest(TestCase):
self.assertEqual(response.status_code, 200)
- filename = 'rowers/tests/testdata/crewnerddata.CSV'
- f = open(filename,'rb')
- file_data = {'file': f}
- form_data = {}
- form = CNsummaryForm(form_data,file_data)
-
- response = self.c.post('rowers/workout/'+encoded1+'/crewnerdsummary',
- form_data,
- follow=True)
-
- f.close()
-
- self.assertEqual(response.status_code, 200)
w = Workout.objects.get(id=1)
f_to_be_deleted = w.csvfilename
try:
@@ -660,7 +638,7 @@ class ViewTest(TestCase):
@patch('rowers.dataprep.create_engine')
@patch('rowers.dataprep.TCXParser')
- def test_upload_view_TCX_CN(self, mocked_sqlalchemy,
+ def test_upload_view_TCX_Rim(self, mocked_sqlalchemy,
mocked_tcx_parser):
self.c.login(username='john',password='koeinsloot')
diff --git a/rowers/tests/test_urls.py b/rowers/tests/test_urls.py
index 87da9b7d..c798445f 100644
--- a/rowers/tests/test_urls.py
+++ b/rowers/tests/test_urls.py
@@ -7,6 +7,7 @@ from __future__ import unicode_literals
from .statements import *
nu = datetime.datetime.now()
+import rowers.courses as courses
tested = [
@@ -27,6 +28,14 @@ class URLTests(TestCase):
r = Rower.objects.create(user=u,rowerplan='coach',gdproptin=True, ftpset=True,
gdproptindate=timezone.now())
self.c = Client()
+ cs = courses.kmltocourse('rowers/tests/testdata/thyro.kml')
+ course = cs[0]
+ cname = course['name']
+ cnotes = course['description']
+ polygons = course['polygons']
+ self.ThyroBaantje = courses.createcourse(r,cname,polygons,notes=cnotes)
+ self.ThyroBaantje.save()
+
self.nu = datetime.datetime.now()
filename = 'rowers/tests/testdata/testdata.csv'
@@ -168,6 +177,19 @@ class URLTests(TestCase):
'/rowers/workout/upload/team/',
'/rowers/workouts-join/',
'/rowers/workouts-join-select/',
+ '/rowers/api/courses/',
+ '/rowers/api/courses/?name=Brno',
+ '/rowers/api/courses/?course_distance=2000',
+ '/rowers/api/courses/?course_distance=aap',
+ '/rowers/api/courses/?distance_from=52&latitude=42&longitude=7',
+ '/rowers/api/courses/?distance_from=50&latitude=42&longitude=-aap',
+ '/rowers/api/courses/',
+ '/rowers/api/courses/1/',
+ '/rowers/list-workouts/?selectworkouts=true',
+ '/rowers/api/courses/kml/',
+ '/rowers/api/courses/kml/?id=1',
+ '/rowers/api/courses/kml?id=1&id=4/',
+ '/rowers/api/courses/kml/?id=aap',
]
diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz
index 4d5ff824..535be5e4 100644
Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ
diff --git a/rowers/urls.py b/rowers/urls.py
index 6824aa6f..30326a73 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -251,6 +251,9 @@ urlpatterns = [
name='strokedatajson_v3'),
re_path(r'^api/TCX/workouts/$', views.strokedata_tcx,
name='strokedata_tcx'),
+ re_path(r'^api/courses/$', views.course_list, name='course_list'),
+ re_path(r'^api/courses/(?P