Merge branch 'release/v16.4.10'
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user