Private
Public Access
1
0

Merge branch 'release/v16.4.10'

This commit is contained in:
Sander Roosendaal
2021-06-10 09:40:09 +02:00
7 changed files with 63 additions and 7 deletions

View File

@@ -110,6 +110,10 @@ def is_staff(user): # pragma: no cover
def is_coach(user):
return user.rower.rowerplan in ['coach','freecoach']
@rules.predicate
def is_not_freecoach(user):
return user.rower.rowerplan != 'freecoach'
def is_paid_coach(user):
return user.rower.rowerplan == 'coach'
@@ -324,6 +328,7 @@ rules.add_perm('rower.add_plan',can_plan_user) # replaces checkaccessplanuser
rules.add_perm('rower.is_coach',is_coach_user) # replaces checkaccessuser
rules.add_perm('rower.is_pro',ispromember)
rules.add_perm('rower.is_staff',is_staff)
rules.add_perm('rower.is_not_freecoach',is_not_freecoach)
# WORKOUT permissions

View File

@@ -3064,16 +3064,16 @@ def df_from_summary(data):
try:
time += split['time']/10.
times.append(time)
except (KeyError, TypeError):
except (KeyError, TypeError): # pragma: no cover
times.append(0)
try:
elapsed_distance += split['distance']
distances.append(elapsed_distance)
except (KeyError, TypeError):
except (KeyError, TypeError): # pragma: no cover
distances.append(0)
try:
spms.append(split['stroke_rate'])
except (KeyError, TypeError):
except (KeyError, TypeError): # pragma: no cover
spms.append(0)
try:
hrs.append(split['heart_rate']['average'])

View File

@@ -373,6 +373,26 @@ class C2Objects(DjangoTestCase):
self.assertEqual(got, want)
self.assertEqual(workoutdate,'2021-05-26')
def test_c2_import_54838157(self):
with open('rowers/tests/testdata/c2_54838157.json','r') as infile:
data = json.load(infile)
(
startdatetime,
starttime,
workoutdate,
duration,
starttimeunix,
timezone
) = utils.get_startdatetime_from_c2data(data)
self.assertEqual(str(timezone),'America/Los_Angeles')
got = arrow.get(startdatetime).isoformat()
want = arrow.get('2021-06-06 17:14:41.400000-07:00').isoformat()
self.assertEqual(got, want)
self.assertEqual(workoutdate,'2021-06-06')
@patch('rowers.c2stuff.requests.get', side_effect=mocked_requests)

View File

@@ -497,11 +497,13 @@ urlpatterns = [
re_path(r'^workout/c2import/all/(?P<page>\d+)/$',views.workout_getc2workout_all,name='workout_getc2workout_all'),
re_path(r'^workout/nkimport/$',views.workout_nkimport_view,name='workout_nkimport_view'),
re_path(r'^workout/nkimport/(?P<after>\d+)/(?P<before>\d+)/$',views.workout_nkimport_view,name='workout_nkimport_view'),
re_path(r'^workout/nkimport/user/(?P<userid>\d+)/$',views.workout_nkimport_view,name='workout_nkimport_view'),
re_path(r'^workout/nkimport/all/$',views.workout_getnkworkout_all,name='workout_getnkworkout_all'),
re_path(r'^workout/nkimport/all/(?P<startdatestring>\d+-\d+-\d+)/(?P<enddatestring>\d+-\d+-\d+)/$',views.workout_getnkworkout_all,
name='workout_getnkworkout_all'),
re_path(r'^workout/rp3import/(?P<externalid>\d+)/$',views.workout_getrp3importview,
name='workout_getrp3importview'),
re_path(r'^workout/rp3import/user/(?P<userid>\d+)/$',views.workout_rp3import_view,name='workout_rp3import_view'),
re_path(r'^workout/rp3import/all/$',views.workout_getrp3workout_all,name='workout_getrp3workout_all'),
re_path(r'^workout/(?P<source>\w+.*)import/(?P<externalid>\d+)/$',views.workout_getimportview,name='workout_getimportview'),
re_path(r'^workout/(?P<source>\w+.*)import/(?P<externalid>\d+)/async/$',views.workout_getimportview,{'do_async':True},name='workout_getimportview'),

View File

@@ -111,7 +111,6 @@ def workout_c2_upload_view(request,id=0):
try:
message,c2id = c2stuff.workout_c2_upload(request.user,w,asynchron=True)
except NoTokenError: # pragma: no cover
print('jet')
return HttpResponseRedirect("/rowers/me/c2authorize/")
messages.info(request,'Your workout will be synchronized to the Concept2 Logbook in the background')
@@ -537,9 +536,15 @@ def workout_getnkworkout_all(request,startdatestring='',enddatestring=''):
@login_required()
@permission_required('rower.is_coach',fn=get_user_by_userid, raise_exception=True)
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_nkimport_view(request,userid=0,after=0,before=0):
startdate,enddate = get_dates_timeperiod(request,defaulttimeperiod='last30')
r = getrequestrower(request,userid=userid)
if r.user != request.user: # pragma: no cover
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_nkimport_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url)
try:
thetoken = nk_open(request.user)
except NoTokenError: # pragma: no cover
@@ -908,8 +913,13 @@ def workout_rp3import_view(request,userid=0):
# The page where you select which Strava workout to import
@login_required()
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_stravaimport_view(request,message="",userid=0):
r = getrequestrower(request,userid=userid)
if r.user != request.user:
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_stravaimport_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url)
#if r.user != request.user:
# messages.info(request,"You cannot import other people's workouts from Strava")
try:
@@ -1260,6 +1270,7 @@ def garmin_details_view(request):
# the page where you select which Polar workout to Import
@login_required()
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_polarimport_view(request,userid=0): # pragma: no cover
exercises = polarstuff.get_polar_workouts(request.user)
workouts = []
@@ -1318,8 +1329,13 @@ def workout_polarimport_view(request,userid=0): # pragma: no cover
# The page where you select which SportTracks workout to import
@login_required()
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_sporttracksimport_view(request,message="",userid=0):
r = getrequestrower(request,userid=userid)
if r.user != request.user:
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_sporttracksimport_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url)
res = sporttracksstuff.get_sporttracks_workout_list(request.user)
if (res.status_code != 200):
@@ -1339,7 +1355,7 @@ def workout_sporttracksimport_view(request,message="",userid=0):
return HttpResponseRedirect(url)
workouts = []
r = getrower(request.user)
stids = [int(getidfromuri(item['uri'])) for item in res.json()['items']]
knownstids = uniqify([
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
@@ -1469,9 +1485,14 @@ def workout_getrp3workout_all(request): # pragma: no cover
# List of workouts available on Concept2 logbook - for import
@login_required()
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_c2import_view(request,page=1,userid=0,message=""):
r = getrequestrower(request,userid=userid)
if r.user != request.user:
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_c2import_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url)
try:
thetoken = c2_open(request.user)
@@ -1581,8 +1602,13 @@ importsources = {
}
@login_required()
@permission_required('rower.is_not_freecoach',fn=get_user_by_userid, raise_exception=True)
def workout_getrp3importview(request,externalid):
r = getrequestrower(request)
if r.user != request.user: # pragma: no cover
messages.error(request,'You can only access your own workouts on the NK Logbook, not those of your athletes')
url = reverse('workout_rp3import_view',kwargs={'userid':request.user.id})
return HttpResponseRedirect(url)
token = rp3stuff.rp3_open(r.user)
startdatetime = request.GET.get('startdatetime')

View File

@@ -1194,7 +1194,7 @@ from rowers.utils import (
str2bool,range_to_color_hex,absolute,myqueue,get_call,
calculate_age,rankingdistances,rankingdurations,
my_dict_from_instance,wavg,NoTokenError,
request_is_ajax
request_is_ajax,dologging
)
import rowers.datautils as datautils

View File

@@ -4913,6 +4913,9 @@ def workout_upload_api(request):
w.starttime = w.startdatetime.strftime('%H:%M:%S')
w.timezone = timezone
dologging('debuglog.log','Start Date Time set to {s}'.format(s=w.startdatetime))
dologging('debuglog.log','Workout Date set to {s}'.format(s=w.workoutdate))
dologging('debuglog.log','Time zone set to {zone}'.format(zone=w.timezone))
w.save()