passing tests, removing some obsolete views
This commit is contained in:
@@ -147,7 +147,7 @@
|
|||||||
separately.</p>
|
separately.</p>
|
||||||
|
|
||||||
<ul class="contentli">
|
<ul class="contentli">
|
||||||
<li><a href="/rowers/api-docs">API documentation</a>
|
<li><a href="/rowers/api-docs/">API documentation</a>
|
||||||
(But refer to the below for stroke data.)</li>
|
(But refer to the below for stroke data.)</li>
|
||||||
<li><a href="/rowers/api-docs#/workouts">Try out the workout summary API</a></li>
|
<li><a href="/rowers/api-docs#/workouts">Try out the workout summary API</a></li>
|
||||||
<li><a href="/rowers/api-docs#!/workouts/strokedata_list">GET stroke data</a></li>
|
<li><a href="/rowers/api-docs#!/workouts/strokedata_list">GET stroke data</a></li>
|
||||||
|
|||||||
1
rowers/tests/.#test_simplefunctions.py
Normal file
1
rowers/tests/.#test_simplefunctions.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
E408191@CZ27LT9RCGN72.11684:1547623002
|
||||||
@@ -134,18 +134,13 @@ class WorkoutFactory(factory.DjangoModelFactory):
|
|||||||
|
|
||||||
name = factory.LazyAttribute(lambda _: faker.word())
|
name = factory.LazyAttribute(lambda _: faker.word())
|
||||||
notes = faker.text()
|
notes = faker.text()
|
||||||
startdatetime = factory.LazyAttribute(
|
startdatetime = get_random_file(name=faker.word())['startdatetime']
|
||||||
lambda _:get_random_file(name=faker.word())['startdatetime'])
|
starttime = get_random_file(name=faker.word())['starttime']
|
||||||
starttime = factory.LazyAttribute(
|
|
||||||
lambda _:get_random_file(name=faker.word())['starttime'])
|
|
||||||
workouttype='water'
|
workouttype='water'
|
||||||
date=timezone.now().date()
|
date=timezone.now().date()
|
||||||
duration=factory.LazyAttribute(
|
duration=get_random_file(name=faker.word())['duration']
|
||||||
lambda _:get_random_file(name=faker.word())['duration'])
|
distance=get_random_file(name=faker.word())['totaldist']
|
||||||
distance=factory.LazyAttribute(
|
csvfilename=get_random_file(name=faker.word())['filename']
|
||||||
lambda _:get_random_file(name=faker.word())['totaldist'])
|
|
||||||
csvfilename=factory.LazyAttribute(
|
|
||||||
lambda _:get_random_file(name=faker.word())['filename'])
|
|
||||||
|
|
||||||
|
|
||||||
class SessionFactory(factory.DjangoModelFactory):
|
class SessionFactory(factory.DjangoModelFactory):
|
||||||
|
|||||||
57
rowers/tests/test_basicrower.py
Normal file
57
rowers/tests/test_basicrower.py
Normal file
@@ -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)
|
||||||
|
|
||||||
@@ -306,7 +306,7 @@ class StravaObjects(DjangoTestCase):
|
|||||||
|
|
||||||
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||||
def test_strava_callback(self, mock_post):
|
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)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||||
|
|||||||
3
rowers/tests/test_plans.py
Normal file
3
rowers/tests/test_plans.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#from __future__ import print_function
|
||||||
|
from statements import *
|
||||||
|
nu = datetime.datetime.now()
|
||||||
@@ -67,7 +67,7 @@ class SimpleViewTest(TestCase):
|
|||||||
self.assertEqual(response.status_code,200)
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
self.assertRedirects(response,
|
self.assertRedirects(response,
|
||||||
expected_url='/rowerss/email/',
|
expected_url='/rowers/email/',
|
||||||
status_code=302,target_status_code=200)
|
status_code=302,target_status_code=200)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
3
rowers/tests/test_virtualevents.py
Normal file
3
rowers/tests/test_virtualevents.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#from __future__ import print_function
|
||||||
|
from statements import *
|
||||||
|
nu = datetime.datetime.now()
|
||||||
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
Binary file not shown.
2
rowers/tests/testdata/testdata.tcx
vendored
2
rowers/tests/testdata/testdata.tcx
vendored
@@ -2502,7 +2502,7 @@
|
|||||||
</Trackpoint>
|
</Trackpoint>
|
||||||
</Track>
|
</Track>
|
||||||
</Lap>
|
</Lap>
|
||||||
<Notes><Element 'Notes' at 0x13397b70></Notes>
|
<Notes><Element 'Notes' at 0x146d99e8></Notes>
|
||||||
</Activity>
|
</Activity>
|
||||||
</Activities>
|
</Activities>
|
||||||
<Creator>
|
<Creator>
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ urlpatterns = [
|
|||||||
url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otwcp_toadmin_view),
|
url(r'^otwcpdatatoadmin/(?P<theuser>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.otwcp_toadmin_view),
|
||||||
# url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list),
|
# url(r'^workout/compare/(?P<id>\d+)/$',views.workout_comparison_list),
|
||||||
# url(r'^workout/compare2/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>\w+.*)/$',views.workout_comparison_view),
|
# url(r'^workout/compare2/(?P<id1>\d+)/(?P<id2>\d+)/(?P<xparam>\w+.*)/(?P<yparam>\w+.*)/$',views.workout_comparison_view),
|
||||||
url(r'^workout/compare/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_comparison_list),
|
# url(r'^workout/compare/(?P<id>\d+)/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_comparison_list),
|
||||||
url(r'^workout/(?P<id>\d+)/edit/$',views.workout_edit_view,
|
url(r'^workout/(?P<id>\d+)/edit/$',views.workout_edit_view,
|
||||||
name='workout_edit_view'),
|
name='workout_edit_view'),
|
||||||
url(r'^workout/(?P<id>\d+)/map/$',views.workout_map_view),
|
url(r'^workout/(?P<id>\d+)/map/$',views.workout_map_view),
|
||||||
@@ -585,7 +585,6 @@ urlpatterns = [
|
|||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
urlpatterns += [
|
urlpatterns += [
|
||||||
url(r'^testreverse/$',views.test_reverse_view),
|
|
||||||
url(r'^c2listug/(?P<page>\d+)/$',views.c2listdebug_view),
|
url(r'^c2listug/(?P<page>\d+)/$',views.c2listdebug_view),
|
||||||
url(r'^c2listug/$',views.c2listdebug_view),
|
url(r'^c2listug/$',views.c2listdebug_view),
|
||||||
]
|
]
|
||||||
|
|||||||
240
rowers/views.py
240
rowers/views.py
@@ -2840,42 +2840,6 @@ def rower_process_callback(request):
|
|||||||
return HttpResponseRedirect(url)
|
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
|
# dummy
|
||||||
@login_required()
|
@login_required()
|
||||||
@@ -5613,65 +5577,6 @@ def workout_recalcsummary_view(request,id=0):
|
|||||||
|
|
||||||
return HttpResponseRedirect(url)
|
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
|
# Joining workout
|
||||||
@user_passes_test(ispromember,login_url="/rowers/paidplans",
|
@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
|
# List of workouts to compare a selected workout to
|
||||||
@@ -8740,67 +8561,6 @@ def instroke_view(request,id=0):
|
|||||||
'instrokemetrics':instrokemetrics,
|
'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
|
# generate instroke chart
|
||||||
@login_required()
|
@login_required()
|
||||||
|
|||||||
Reference in New Issue
Block a user