diff --git a/rowers/templates/developers.html b/rowers/templates/developers.html
index 889080ae..ce4f8d05 100644
--- a/rowers/templates/developers.html
+++ b/rowers/templates/developers.html
@@ -147,7 +147,7 @@
separately.
- - API documentation
+
- API documentation
(But refer to the below for stroke data.)
- Try out the workout summary API
- GET stroke data
diff --git a/rowers/tests/.#test_simplefunctions.py b/rowers/tests/.#test_simplefunctions.py
new file mode 100644
index 00000000..5b56c42e
--- /dev/null
+++ b/rowers/tests/.#test_simplefunctions.py
@@ -0,0 +1 @@
+E408191@CZ27LT9RCGN72.11684:1547623002
\ No newline at end of file
diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py
index c609fee7..c3679e3b 100644
--- a/rowers/tests/statements.py
+++ b/rowers/tests/statements.py
@@ -134,18 +134,13 @@ class WorkoutFactory(factory.DjangoModelFactory):
name = factory.LazyAttribute(lambda _: faker.word())
notes = faker.text()
- startdatetime = factory.LazyAttribute(
- lambda _:get_random_file(name=faker.word())['startdatetime'])
- starttime = factory.LazyAttribute(
- lambda _:get_random_file(name=faker.word())['starttime'])
+ startdatetime = get_random_file(name=faker.word())['startdatetime']
+ starttime = get_random_file(name=faker.word())['starttime']
workouttype='water'
date=timezone.now().date()
- duration=factory.LazyAttribute(
- lambda _:get_random_file(name=faker.word())['duration'])
- distance=factory.LazyAttribute(
- lambda _:get_random_file(name=faker.word())['totaldist'])
- csvfilename=factory.LazyAttribute(
- lambda _:get_random_file(name=faker.word())['filename'])
+ duration=get_random_file(name=faker.word())['duration']
+ distance=get_random_file(name=faker.word())['totaldist']
+ csvfilename=get_random_file(name=faker.word())['filename']
class SessionFactory(factory.DjangoModelFactory):
diff --git a/rowers/tests/test_basicrower.py b/rowers/tests/test_basicrower.py
new file mode 100644
index 00000000..5aed0f37
--- /dev/null
+++ b/rowers/tests/test_basicrower.py
@@ -0,0 +1,57 @@
+from statements import *
+
+nu = datetime.datetime.now()
+
+from django.http import Http404
+
+from rowers.views import get_workout
+
+# tests simple functions from views.py
+class SimpleViewTest(TestCase):
+ def setUp(self):
+ self.u = UserFactory()
+
+ self.r = Rower.objects.create(user=self.u,
+ birthdate=faker.profile()['birthdate'],
+ gdproptin=True,
+ gdproptindate=timezone.now(),
+ rowerplan='basic')
+
+ self.c = Client()
+ 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()
+
+ def tearDown(self):
+ for workout in self.user_workouts:
+ try:
+ os.remove(workout.csvfilename)
+ except (IOError, WindowsError):
+ pass
+
+ def start_protrial(self):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = '/rowers/starttrial/'
+
+ response = self.c.get(url,follow=True)
+
+ self.assertRedirects(response,
+ expected_url='/rowers/list-workouts/',
+ status_code=302,target_status_code=200)
+
+ def start_plantrial(self):
+ login = self.c.login(username=self.u.username, password=self.password)
+ self.assertTrue(login)
+
+ url = '/rowers/startplantrial/'
+
+ 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_imports.py b/rowers/tests/test_imports.py
index cfc12ddf..a302967f 100644
--- a/rowers/tests/test_imports.py
+++ b/rowers/tests/test_imports.py
@@ -306,7 +306,7 @@ class StravaObjects(DjangoTestCase):
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
def test_strava_callback(self, mock_post):
- response = self.c.get('/stravacall_back?code=absdef23',follow=True)
+ response = self.c.get('/stravacall_back?code=absdef23&scope=read',follow=True)
self.assertEqual(response.status_code, 200)
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
diff --git a/rowers/tests/test_plans.py b/rowers/tests/test_plans.py
new file mode 100644
index 00000000..de2fce3d
--- /dev/null
+++ b/rowers/tests/test_plans.py
@@ -0,0 +1,3 @@
+#from __future__ import print_function
+from statements import *
+nu = datetime.datetime.now()
diff --git a/rowers/tests/test_simplefunctions.py b/rowers/tests/test_simplefunctions.py
index 08bc2493..bb52f43f 100644
--- a/rowers/tests/test_simplefunctions.py
+++ b/rowers/tests/test_simplefunctions.py
@@ -67,7 +67,7 @@ class SimpleViewTest(TestCase):
self.assertEqual(response.status_code,200)
self.assertRedirects(response,
- expected_url='/rowerss/email/',
+ expected_url='/rowers/email/',
status_code=302,target_status_code=200)
diff --git a/rowers/tests/test_virtualevents.py b/rowers/tests/test_virtualevents.py
new file mode 100644
index 00000000..de2fce3d
--- /dev/null
+++ b/rowers/tests/test_virtualevents.py
@@ -0,0 +1,3 @@
+#from __future__ import print_function
+from statements import *
+nu = datetime.datetime.now()
diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz
index 3a9b7c02..097173d2 100644
Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ
diff --git a/rowers/tests/testdata/testdata.tcx b/rowers/tests/testdata/testdata.tcx
index 15c2daa8..85615036 100644
--- a/rowers/tests/testdata/testdata.tcx
+++ b/rowers/tests/testdata/testdata.tcx
@@ -2502,7 +2502,7 @@
- <Element 'Notes' at 0x13397b70>
+ <Element 'Notes' at 0x146d99e8>
diff --git a/rowers/urls.py b/rowers/urls.py
index 7328859b..3e070748 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -260,7 +260,7 @@ urlpatterns = [
url(r'^otwcpdatatoadmin/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.otwcp_toadmin_view),
# url(r'^workout/compare/(?P\d+)/$',views.workout_comparison_list),
# url(r'^workout/compare2/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P\w+.*)/$',views.workout_comparison_view),
- url(r'^workout/compare/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workout_comparison_list),
+# url(r'^workout/compare/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/$',views.workout_comparison_list),
url(r'^workout/(?P\d+)/edit/$',views.workout_edit_view,
name='workout_edit_view'),
url(r'^workout/(?P\d+)/map/$',views.workout_map_view),
@@ -585,7 +585,6 @@ urlpatterns = [
if settings.DEBUG:
urlpatterns += [
- url(r'^testreverse/$',views.test_reverse_view),
url(r'^c2listug/(?P\d+)/$',views.c2listdebug_view),
url(r'^c2listug/$',views.c2listdebug_view),
]
diff --git a/rowers/views.py b/rowers/views.py
index 73500df4..fdded646 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -2840,42 +2840,6 @@ def rower_process_callback(request):
return HttpResponseRedirect(url)
-# The imports page
-@login_required()
-def imports_view(request):
-
- r = getrower(request.user)
-
- if request.method == 'POST':
- form = RowerImportExportForm(request.POST)
- if form.is_valid():
- cd = form.cleaned_data
-
- for attr, value in cd.items():
- setattr(r,attr,value)
-
- r.save()
- messages.info(request,'Settings Saved')
-
- else:
- form = RowerImportExportForm(instance=r)
-
-
- return render(request,"imports.html",
- {
- 'teams':get_my_teams(request.user),
- 'form':form,
- })
-
-# Just for testing purposes
-@login_required()
-def test_reverse_view(request):
- successmessage = "Tokens stored. Good to go"
- messages.info(request,successmessage)
-
- url = reverse(workouts_view)
-
- return HttpResponseRedirect(url)
# dummy
@login_required()
@@ -5613,65 +5577,6 @@ def workout_recalcsummary_view(request,id=0):
return HttpResponseRedirect(url)
-@login_required()
-def workout_makepublic_view(request,id,
- message='',
- successmessage=''):
-
- row = get_workout(id)
-
- if (checkworkoutuser(request.user,row)==False):
- message = "You are not allowed to edit this workout"
- messages.error(request,message)
- url = reverse(workouts_view)
-
- return HttpResponseRedirect(url)
-
- row.privacy = 'visible'
- row.save()
- rr = getrower(request.user)
-
- teams = rr.team.all()
- for team in teams:
- row.team.add(team)
-
-
- message = "Workout set to public. Your followers and team members will see it"
- messages.info(request,message)
-
- url = reverse(workout_edit_view,
- kwargs = {
- 'id':int(id),
- })
- return HttpResponseRedirect(url)
-
-@login_required()
-def workout_setprivate_view(request,id,
- message='',
- successmessage=''):
- row = get_workout(id)
-
- if (checkworkoutuser(request.user,row)==False):
- message = "You are not allowed to edit this workout"
- messages.error(request,message)
- url = reverse(workouts_view)
-
- return HttpResponseRedirect(url)
-
- row.privacy = 'private'
- row.save()
-
- for team in row.team.all():
- row.team.remove(team)
-
- message = "Workout set to private. Only you will see it"
- messages.info(request,message)
-
- url = reverse(workout_edit_view,
- kwargs = {
- 'id':int(id),
- })
- return HttpResponseRedirect(url)
# Joining workout
@user_passes_test(ispromember,login_url="/rowers/paidplans",
@@ -7735,90 +7640,6 @@ def workouts_view(request,message='',successmessage='',
})
-# List of workouts to compare a selected workout to
-@user_passes_test(ispromember,login_url="/rowers/paidplans",
- message="This functionality requires a Pro plan or higher",
- redirect_field_name=None)
-def workout_comparison_list(request,id=0,message='',successmessage='',
- startdatestring="",enddatestring="",
- startdate=timezone.now()-datetime.timedelta(days=365),
- enddate=timezone.now()):
-
- try:
- r = getrower(request.user)
- except Rower.DoesNotExist:
- raise Http404("User has no rower instance")
- u = User.objects.get(id=r.user.id)
-
- if request.method == 'POST':
- dateform = DateRangeForm(request.POST)
- if dateform.is_valid():
- startdate = dateform.cleaned_data['startdate']
- enddate = dateform.cleaned_data['enddate']
- else:
- dateform = DateRangeForm(initial={
- 'startdate':startdate,
- 'enddate':enddate,
- })
-
- if startdatestring:
- startdate = iso8601.parse_date(startdatestring)
- if enddatestring:
- enddate = iso8601.parse_date(enddatestring)
-
- startdate = datetime.datetime.combine(startdate,datetime.time())
- enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
- #enddate = enddate+datetime.timedelta(days=1)
-
- if enddate < startdate:
- s = enddate
- enddate = startdate
- startdate = s
-
- workouts = Workout.objects.filter(user=r,
- startdatetime__gte=startdate,
- startdatetime__lte=enddate).order_by("-date", "-starttime").exclude(id=id)
-
- query = request.GET.get('q')
- if query:
- query_list = query.split()
- workouts = workouts.filter(
- reduce(operator.and_,
- (Q(name__icontains=q) for q in query_list)) |
- reduce(operator.and_,
- (Q(notes__icontains=q) for q in query_list))
- )
- searchform = SearchForm(initial={'q':query})
- else:
- searchform = SearchForm()
-
- paginator = Paginator(workouts,15) # show 25 workouts per page
- page = request.GET.get('page')
-
- try:
- workouts = paginator.page(page)
- except PageNotAnInteger:
- workouts = paginator.page(1)
- except EmptyPage:
- workouts = paginator.page(paginator.num_pages)
-
- row = get_workout(id)
-
- messages.error(request,message)
- messages.info(request,successmessage)
-
- return render(request, 'comparison_list.html',
- {'id':int(id),
- 'workout':row,
- 'workouts': workouts,
- 'last_name':u.last_name,
- 'first_name':u.first_name,
- 'searchform':searchform,
- 'dateform':dateform,
- 'startdate':startdate,
- 'enddate':enddate,
- 'teams':get_my_teams(request.user),
- })
# List of workouts to compare a selected workout to
@@ -8740,67 +8561,6 @@ def instroke_view(request,id=0):
'instrokemetrics':instrokemetrics,
})
-# A special Edit page with all the Geeky functionality for the workout
-@login_required()
-def workout_geeky_view(request,id=0,message="",successmessage=""):
- row = get_workout(id)
-
-# form = WorkoutForm(instance=row)
- g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime")
- rowdata = rrdata(csvfile=row.csvfilename)
- instrokemetrics = rowdata.get_instroke_columns()
-
-
- for i in g:
- try:
- width,height = Image.open(i.filename).size
- i.width = width
- i.height = height
- i.save()
- except:
- pass
-
- # check if user is owner of this workout
-
- if (checkworkoutuser(request.user,row)==False):
- message = "You are not allowed to edit this workout"
- messages.error(request,message)
- url = reverse(workouts_view)
-
- return HttpResponseRedirect(url)
-
-
- # create interactive plot
- f1 = row.csvfilename
- u = row.user.user
- r = getrower(u)
-
- # create interactive plot
- try:
- res = interactive_chart(id,promember=1)
- script = res[0]
- div = res[1]
- except ValueError:
- pass
-
- messages.error(request,message)
- messages.info(request,successmessage)
-
- if row.workouttype in mytypes.otwtypes:
- return render(request,
- 'otwgeeky.html',
- {'workout':row,
- 'teams':get_my_teams(request.user),
- 'interactiveplot':script,
- 'instrokemetrics':instrokemetrics,
- 'the_div':div})
- else:
- return render(request,
- 'advancededit.html',
- {'workout':row,
- 'teams':get_my_teams(request.user),
- 'interactiveplot':script,
- 'the_div':div})
# generate instroke chart
@login_required()