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/interactiveplots.py b/rowers/interactiveplots.py
index 1264b7af..5bc84a34 100644
--- a/rowers/interactiveplots.py
+++ b/rowers/interactiveplots.py
@@ -33,7 +33,7 @@ import datetime
from rowers import mytypes
from rowers.courses import (
course_coord_center, course_coord_maxmin,
- polygon_coord_center
+ polygon_coord_center, course_coord_crewnerd_navigation,
)
from django.conf import settings
from collections import OrderedDict
@@ -2165,6 +2165,8 @@ def interactive_histoall(theworkouts, histoparam, includereststrokes,
def course_map(course):
latmean, lonmean, coordinates = course_coord_center(course)
+ if course.with_cn_nav_waypoints:
+ latmean, lonmean, coordinates = course_coord_crewnerd_navigation(course)
lat_min, lat_max, long_min, long_max = course_coord_maxmin(course)
coordinates = course_spline(coordinates)
diff --git a/rowers/models.py b/rowers/models.py
index 6d0adf97..a05e0be3 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -8,7 +8,7 @@ from rowers.utils import (
steps_read_fit, steps_write_fit, ps_dict_order, uniqify
)
from rowers.metrics import axlabels
-from rowers.utils import geo_distance
+from rowers.utils import geo_distance, move_one_meter
from rowers.formfields import *
from rowers.database import *
import uuid
@@ -594,7 +594,65 @@ def course_spline(coordinates):
return newcoordinates
+def polygon_nearest_point(polygon, latitude, longitude,debug=False):
+ points = GeoPoint.objects.filter(polygon=polygon)
+ points = sorted(points, key = lambda p: geo_distance(p.latitude, p.longitude, latitude, longitude))
+ #if debug:
+ # for p in points:
+ # print(p,p.latitude, p.longitude, latitude, longitude, geo_distance(p.latitude, p.longitude, latitude, longitude))
+
+ return points[0].latitude, points[0].longitude
+
+def polygon_exit_point(polygon, lat1, lon1, lat2, lon2):
+ dist, bearing = geo_distance(lat1, lon1, lat2, lon2)
+ dirveclat = (lat2-lat1)/dist
+ dirveclon = (lon2-lon1)/dist
+
+ newlat, newlon = move_one_meter(lat2, lon2, bearing)
+ path = polygon_to_path(polygon)
+ while path.contains_points([(newlat, newlon)])[0]:
+ newlat, newlon = move_one_meter(newlat, newlon, bearing)
+
+ return newlat, newlon
+
+def course_coord_crewnerd_navigation(course):
+ polygons = GeoPolygon.objects.filter(
+ course=course).order_by("order_in_course")
+
+ latitudes = []
+ longitudes = []
+
+ latitude, longitude = polygon_coord_center(polygons[0])
+
+ latitudes.append(latitude)
+ longitudes.append(longitude)
+
+ debug = True
+
+ for p in polygons[1:]:
+ oldlat = latitude
+ oldlon = longitude
+ latitude, longitude = polygon_nearest_point(p,latitude,longitude, debug=debug)
+ debug = False
+ latitudes.append(latitude)
+ longitudes.append(longitude)
+ latitude, longitude = polygon_exit_point(p, oldlat, oldlon, latitude, longitude)
+ latitudes.append(latitude)
+ longitudes.append(longitude)
+
+
+ latitude = pd.Series(latitudes).median()
+ longitude = pd.Series(longitudes).median()
+
+ coordinates = pd.DataFrame({
+ 'latitude': latitudes,
+ 'longitude': longitudes,
+ })
+
+ return latitude, longitude, coordinates
+
+
def course_coord_center(course):
polygons = GeoPolygon.objects.filter(
@@ -1590,6 +1648,24 @@ class GeoCourse(models.Model):
def coord(self):
return course_coord_center(self)
+ @property
+ def with_cn_nav_waypoints(self):
+ polygons = GeoPolygon.objects.filter(course=self).order_by("order_in_course")
+
+ if polygons[0].name != "Start":
+ return False
+ if polygons[len(polygons)-1].name != "Finish":
+ return False
+ for i in range(1,len(polygons)-1):
+ if polygons[i].name[0:2].lower() != 'wp':
+ return False
+ try:
+ getal = float(polygons[i].name[2:])
+ except ValueError:
+ return False
+
+ return True
+
class GeoCourseEditForm(ModelForm):
class Meta:
diff --git a/rowers/tasks.py b/rowers/tasks.py
index dac27df8..388af488 100644
--- a/rowers/tasks.py
+++ b/rowers/tasks.py
@@ -94,7 +94,7 @@ SITE_URL_DEV = CFG['site_url']
PROGRESS_CACHE_SECRET = CFG['progress_cache_secret']
try:
SETTINGS_NAME = CFG['settings_name']
-except KeyError:
+except KeyError: # pragma: no cover
SETTINGS_NAME = 'rowsandall_ap.settings'
try:
@@ -321,7 +321,7 @@ def summaryfromsplitdata(splitdata, data, filename, sep='|', workouttype='rower'
return sums, sa, results
@app.task
-def handle_post_workout_api(uploadoptions, debug=False, **kwargs):
+def handle_post_workout_api(uploadoptions, debug=False, **kwargs): # pragma: no cover
session = requests.session()
newHeaders = {'Content-type': 'application/json', 'Accept': 'text/plain'}
session.headers.update(newHeaders)
@@ -335,14 +335,14 @@ def handle_post_workout_api(uploadoptions, debug=False, **kwargs):
@app.task
-def handle_remove_workouts_team(ws, t, debug=False, **kwargs):
+def handle_remove_workouts_team(ws, t, debug=False, **kwargs): # pragma: no cover
for w in ws:
w.team.remove(t)
return 1
@app.task
-def handle_add_workouts_team(ws, t, debug=False, **kwargs):
+def handle_add_workouts_team(ws, t, debug=False, **kwargs): # pragma: no cover
for w in ws:
w.team.add(t)
@@ -350,7 +350,7 @@ def handle_add_workouts_team(ws, t, debug=False, **kwargs):
return 1
def uploadactivity(access_token, filename, description='',
- name='Rowsandall.com workout'):
+ name='Rowsandall.com workout'): # pragma: no cover
data_gz = BytesIO()
try:
@@ -393,7 +393,7 @@ def uploadactivity(access_token, filename, description='',
@app.task
-def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs):
+def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs): # pragma: no cover
authorizationstring = str('Bearer ' + workout.user.tptoken)
headers = {'Authorization': authorizationstring,
'user-agent': 'sanderroosendaal',
@@ -411,7 +411,7 @@ def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs):
return 1
@app.task
-def handle_workout_tp_upload(w, thetoken, tcxfilename, debug=False, **kwargs):
+def handle_workout_tp_upload(w, thetoken, tcxfilename, debug=False, **kwargs): # pragma: no cover
tpid = 0
r = w.user
if not tcxfilename:
@@ -443,7 +443,7 @@ def handle_workout_tp_upload(w, thetoken, tcxfilename, debug=False, **kwargs):
return tpid
@app.task
-def instroke_static(w, metric, debug=False, **kwargs):
+def instroke_static(w, metric, debug=False, **kwargs): # pragma: no cover
f1 = w.csvfilename[6:-4]
rowdata = rdata(csvfile=w.csvfilename)
@@ -512,7 +512,7 @@ def handle_c2_sync(workoutid, url, headers, data, debug=False, **kwargs):
try:
workout = Workout.objects.get(id=workoutid)
- except Workout.DoesNotExist:
+ except Workout.DoesNotExist: # pragma: no cover
dologging('c2_log.log','failed for c2id {c2id}'.format(c2id=c2id))
return 0
@@ -531,7 +531,7 @@ def handle_c2_sync(workoutid, url, headers, data, debug=False, **kwargs):
return 1
-def splitstdata(lijst):
+def splitstdata(lijst): # pragma: no cover
t = []
latlong = []
while len(lijst) >= 2:
@@ -543,7 +543,7 @@ def splitstdata(lijst):
@app.task
def handle_sporttracks_workout_from_data(user, importid, source,
- workoutsource, debug=False, **kwargs):
+ workoutsource, debug=False, **kwargs): # pragma: no cover
r = user.rower
authorizationstring = str('Bearer ' + r.sporttrackstoken)
@@ -812,7 +812,7 @@ def handle_strava_sync(stravatoken,
if not failed:
try:
workout = Workout.objects.get(id=workoutid)
- except Workout.DoesNotExist:
+ except Workout.DoesNotExist: # pragma: no cover
return 0
workout.uploadedtostrava = res.id
@@ -1562,7 +1562,7 @@ def handle_calctrimp(id,
try:
workout = Workout.objects.get(id=id)
- except Workout.DoesNotExist:
+ except Workout.DoesNotExist: # pragma: no cover
dologging('metrics.log','Could not find workout {id}'.format(id=id))
return 0
@@ -2037,7 +2037,7 @@ def handle_sendemail_expired(useremail, userfirstname, userlastname, expireddate
return 1
@app.task
-def handle_sendemail_newftp(rower,power,mode, **kwargs):
+def handle_sendemail_newftp(rower,power,mode, **kwargs): # pragma: no cover
subject = "You may want to update your FTP on rowsandall.com"
from_email = 'Rowsandall
-
-
-
+
-
-
-
- {% 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/test_aworkouts.py b/rowers/tests/test_aworkouts.py
index 3f5f8f24..595f0148 100644
--- a/rowers/tests/test_aworkouts.py
+++ b/rowers/tests/test_aworkouts.py
@@ -32,858 +32,902 @@ 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')
+ @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_select')
- response = self.c.get(url)
- self.assertEqual(response.status_code,200)
+ form = DateRangeForm(form_data)
+ self.assertTrue(form.is_valid())
- d1 = self.werg1.date-datetime.timedelta(days=2)
- d2 = self.werg2.date+datetime.timedelta(days=2)
+ form = TrendFlexModalForm(form_data)
+ self.assertTrue(form.is_valid())
- 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())
+ url = reverse('workouts_join_view')
+
+ 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')
+ form = WorkoutMultipleCompareForm(form_data)
+ self.assertTrue(form.is_valid())
- response = self.c.get(url,follow=True)
- self.assertEqual(response.status_code,200)
+ form = WorkoutJoinParamForm(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,follow=True)
+ 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)],
- }
-
- form = WorkoutMultipleCompareForm(form_data)
- self.assertTrue(form.is_valid())
-
- 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 = {
+ 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_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..f67f2da0 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