diff --git a/rowers/dataprep.py b/rowers/dataprep.py
index b8b054a4..61116cea 100644
--- a/rowers/dataprep.py
+++ b/rowers/dataprep.py
@@ -759,9 +759,11 @@ def create_row_df(r,distance,duration,startdatetime,
totalseconds += duration.second
totalseconds += duration.microsecond/1.e6
-
- spm = 60.*nr_strokes/totalseconds
-
+ try:
+ spm = 60.*nr_strokes/totalseconds
+ except ZeroDivisionError:
+ spm = 20.
+
step = totalseconds/float(nr_strokes)
elapsed = np.arange(nr_strokes)*totalseconds/(float(nr_strokes-1))
@@ -775,7 +777,10 @@ def create_row_df(r,distance,duration,startdatetime,
pace = 500.*totalseconds/distance
if workouttype in ['rower','slides','dynamic']:
- velo = distance/totalseconds
+ try:
+ velo = distance/totalseconds
+ except ZeroDivisionError:
+ velo = 2.4
power = 2.8*velo**3
else:
power = 0
diff --git a/rowers/models.py b/rowers/models.py
index 14b5fc86..b8c70042 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -1233,7 +1233,7 @@ class Workout(models.Model):
max_length=100)
distance = models.IntegerField(default=0,blank=True)
duration = models.TimeField(default=1,blank=True)
- weightcategory = models.CharField(default="hwt",max_length=10)
+ weightcategory = models.CharField(default="hwt",max_length=10,choices=weightcategories)
weightvalue = models.FloatField(default=80.0,blank=True,verbose_name = 'Average Crew Weight (kg)')
csvfilename = models.CharField(blank=True,max_length=150)
uploadedtoc2 = models.IntegerField(default=0)
@@ -1478,10 +1478,10 @@ def auto_delete_image_on_delete(sender,instance, **kwargs):
# Form to update Workout data
class WorkoutForm(ModelForm):
- duration = forms.TimeInput(format='%H:%M:%S.%f')
+# duration = forms.TimeInput(format='%H:%M:%S.%f')
class Meta:
model = Workout
- fields = ['name','date','starttime','timezone','duration','distance','workouttype','notes','privacy','rankingpiece','boattype']
+ fields = ['name','date','starttime','timezone','duration','distance','workouttype','weightcategory','notes','privacy','rankingpiece','boattype']
widgets = {
'date': AdminDateWidget(),
'notes': forms.Textarea,
@@ -1492,11 +1492,6 @@ class WorkoutForm(ModelForm):
super(WorkoutForm, self).__init__(*args, **kwargs)
# this line to be removed
del self.fields['privacy']
-# self.fields['timezone'] = forms.ChoiceField(choices=[
-# (x,x) for x in pytz.common_timezones
-# ],
-# initial='UTC',
-# label='Time Zone')
if self.instance.workouttype != 'water':
del self.fields['boattype']
@@ -1509,6 +1504,7 @@ class WorkoutForm(ModelForm):
'duration',
'distance',
'workouttype',
+ 'weightcategory',
'notes',
'rankingpiece',
'boattype'
diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html
index d8ecb60b..8ace4c3a 100644
--- a/rowers/templates/plannedsessionview.html
+++ b/rowers/templates/plannedsessionview.html
@@ -16,7 +16,7 @@
{% if user.is_authenticated and psdict.id.1|is_session_manager:user %}
-
+
Edit Session
{% else %}
diff --git a/rowers/templates/racelist.html b/rowers/templates/racelist.html
index 898d8a17..b2f391b1 100644
--- a/rowers/templates/racelist.html
+++ b/rowers/templates/racelist.html
@@ -8,7 +8,7 @@
Event |
Country |
Course |
-
Action |
+
Click for Details |
diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html
index 04610edf..dc5b7a25 100644
--- a/rowers/templates/virtualevent.html
+++ b/rowers/templates/virtualevent.html
@@ -99,10 +99,8 @@
|
|
Boat |
- Raw Time |
- In Class |
- Corrected Time |
- Corrected Place |
+ Time |
+ Details |
@@ -112,12 +110,15 @@
{{ result.username }} |
- {{ result.teamname }}
+ | {{ result.teamname }} |
{{ result.age }} |
{{ result.sex }} |
{{ result.weightcategory }} |
{{ result.boattype }} |
{{ result.duration |durationprint:"%H:%M:%S.%f" }} |
+
+
+ Details |
{% endfor %}
{% for result in dns %}
diff --git a/rowers/templates/virtualevents.html b/rowers/templates/virtualevents.html
index a83a396f..5f7c92f7 100644
--- a/rowers/templates/virtualevents.html
+++ b/rowers/templates/virtualevents.html
@@ -85,6 +85,10 @@
+
Click on the event name or on the Details button to see the event
+ details (and manage your participation and results). Click on the
+ course name to see the course details.
+
{% include 'racelist.html' %}
diff --git a/rowers/tests.py b/rowers/tests.py
index c465447d..8eef0ab1 100644
--- a/rowers/tests.py
+++ b/rowers/tests.py
@@ -448,6 +448,7 @@ class DataTest(TestCase):
'duration':'0:55:00.1',
'distance':8000,
'notes':'Aap noot \n mies',
+ 'weightcategory':'lwt',
'workouttype':'water',
}
form = WorkoutForm(data=form_data)
@@ -675,6 +676,7 @@ class ViewTest(TestCase):
'timezone':'Europe/Berlin',
'duration':'1:00:00.5',
'distance':'15000',
+ 'weightcategory':'hwt',
'workouttype':'rower',
'notes':'noot mies',
}
diff --git a/rowers/urls.py b/rowers/urls.py
index a5000cd0..d37bf26b 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -254,7 +254,6 @@ urlpatterns = [
url(r'^workout/compare/(?P\d+)/(?P\d+-\d+-\d+)/(?P\w+.*)$',views.workout_comparison_list),
url(r'^workout/(?P\d+)/edit$',views.workout_edit_view,
name='workout_edit_view'),
- url(r'^workout/(?P\d+)/navionics$',views.workout_edit_view_navionics),
url(r'^workout/(?P\d+)/map$',views.workout_map_view),
url(r'^workout/(?P\d+)/setprivate$',views.workout_setprivate_view),
url(r'^workout/(?P\d+)/updatecp$',views.workout_update_cp_view),
diff --git a/rowers/views.py b/rowers/views.py
index a944b2a8..ccb2b10c 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -181,8 +181,36 @@ class JSONResponse(HttpResponse):
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
+def getrequestrower(request,rowerid=0,userid=0,notpermanent=False):
+ if notpermanent == False:
+ if rowerid == 0 and 'rowerid' in request.session:
+ rowerid = request.session['rowerid']
+
+ if userid != 0:
+ rowerid = 0
+
+ try:
+
+ if rowerid != 0:
+ r = Rower.objects.get(id=rowerid)
+ elif userid != 0:
+ u = User.objects.get(id=userid)
+ r = getrower(u)
+ else:
+ r = getrower(request.user)
+
+ except Rower.DoesNotExist:
+ raise Http404("Rower doesn't exist")
+ if not checkaccessuser(request.user,r):
+ raise PermissionDenied("You have no access to this user")
+
+ if notpermanent == False:
+ request.session['rowerid'] = r.id
+
+ return r
+
def getrower(user):
try:
@@ -1062,8 +1090,8 @@ def start_plantrial_view(request):
messages.info(request,'We have started your 14 day trial period')
- subject2 = "User started Pro Trial"
- message2 = "User Started Pro Trial.\n"
+ subject2 = "User started Plan Trial"
+ message2 = "User Started Plan Trial.\n"
message2 += request.user.email + "\n"
message2 += "User name: "+request.user.username
@@ -2952,7 +2980,15 @@ def cum_flex(request,theuser=0,
promember=0
if theuser == 0:
- theuser = request.user.id
+ if 'rowerid' in request.session:
+ try:
+ r = Rower.objects.get(id=request.session['rowerid'])
+ theuser = r.user.id
+ except Rower.DoesNotExist:
+ theuser = request.user.id
+ else:
+ theuser = request.user.id
+
if not request.user.is_anonymous():
r = getrower(request.user)
@@ -3105,11 +3141,9 @@ def cum_flex(request,theuser=0,
def fitnessmetric_view(request,id=0,mode='rower',
startdate=timezone.now()-timezone.timedelta(days=365),
enddate=timezone.now()):
- if id==0:
- id = request.user.id
- theuser = User.objects.get(id=id)
- therower = Rower.objects.get(user=theuser)
+ therower = getrequestrower(request,userid=id)
+ theuser = therower.user
if request.method == 'POST':
@@ -3275,8 +3309,9 @@ def histo(request,theuser=0,
startdate = s
promember=0
- if theuser == 0:
- theuser = request.user.id
+ r = getrequestrower(request,userid=theuser)
+ theuser = r.user.id
+
if not request.user.is_anonymous():
r = getrower(request.user)
@@ -3431,6 +3466,7 @@ def addmanual_view(request):
starttime = form.cleaned_data['starttime']
workouttype = form.cleaned_data['workouttype']
duration = form.cleaned_data['duration']
+ weightcategory = form.cleaned_data['weightcategory']
distance = form.cleaned_data['distance']
notes = form.cleaned_data['notes']
thetimezone = form.cleaned_data['timezone']
@@ -3458,6 +3494,7 @@ def addmanual_view(request):
id,message = dataprep.create_row_df(r,
distance,
+ weightcategory,
duration,startdatetime,
title = name,
notes=notes,
@@ -4346,7 +4383,14 @@ def otwrankings_view(request,theuser=0,
startdate = s
if theuser == 0:
- theuser = request.user.id
+ if 'rowerid' in request.session:
+ try:
+ r = Rower.objects.get(id=request.session['rowerid'])
+ theuser = r.user.id
+ except Rower.DoesNotExist:
+ theuser = request.user.id
+ else:
+ theuser = request.user.id
promember=0
if not request.user.is_anonymous():
@@ -4400,6 +4444,7 @@ def otwrankings_view(request,theuser=0,
# get all 2k (if any) - this rower, in date range
try:
r = Rower.objects.get(user=theuser)
+ request.session['rowerid'] = r.id
except Rower.DoesNotExist:
raise Http404("Rower doesn't exist")
@@ -4622,7 +4667,15 @@ def oterankings_view(request,theuser=0,
startdate = s
if theuser == 0:
- theuser = request.user.id
+ if 'rowerid' in request.session:
+ try:
+ r = Rower.objects.get(id=request.session['rowerid'])
+ theuser = r.user.id
+ except Rower.DoesNotExist:
+ theuser = request.user.id
+ else:
+ theuser = request.user.id
+
promember=0
if not request.user.is_anonymous():
@@ -4676,6 +4729,7 @@ def oterankings_view(request,theuser=0,
# get all 2k (if any) - this rower, in date range
try:
r = Rower.objects.get(user=theuser)
+ request.session['rowerid'] = r.id
except Rower.DoesNotExist:
allergworkouts = []
raise Http404("Rower doesn't exist")
@@ -5493,13 +5547,8 @@ def user_multiflex_select(request,
enddate=timezone.now(),
userid=0):
- if userid == 0:
- user = request.user
- else:
- user = User.objects.get(id=userid)
-
-
- r = getrower(user)
+ r = getrequestrower(request,userid=userid)
+ user = r.user
if 'options' in request.session:
options = request.session['options']
@@ -6032,13 +6081,8 @@ def user_boxplot_select(request,
},
userid=0):
- if userid == 0:
- user = request.user
- else:
- user = User.objects.get(id=userid)
-
-
- r = getrower(user)
+ r = getrequestrower(request,userid=userid)
+ user = r.user
if 'options' in request.session:
options = request.session['options']
@@ -6423,17 +6467,7 @@ def workouts_view(request,message='',successmessage='',
teamid=0,rankingonly=False,rowerid=0,userid=0):
request.session['referer'] = absolute(request)['PATH']
- try:
- if rowerid != 0:
- r = Rower.objects.get(id=rowerid)
- elif userid != 0:
- u = User.objects.get(id=userid)
- r = getrower(u)
- else:
- r = getrower(request.user)
-
- except Rower.DoesNotExist:
- raise Http404("Rower doesn't exist")
+ r = getrequestrower(request,rowerid=rowerid,userid=userid)
# check if access is allowed
if not checkaccessuser(request.user,r):
@@ -7572,7 +7606,15 @@ def cumstats(request,theuser=0,
promember=0
if theuser == 0:
- theuser = request.user.id
+ if 'rowerid' in request.session:
+ try:
+ r = Rower.objects.get(id=request.session['rowerid'])
+ theuser = r.user.id
+ except Rower.DoesNotExist:
+ theuser = request.user.id
+ else:
+ theuser = request.user.id
+
if not request.user.is_anonymous():
r = getrower(request.user)
@@ -7696,7 +7738,8 @@ def cumstats(request,theuser=0,
datadf,extracols = dataprep.read_cols_df_sql(ids,fieldlist)
datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly)
-
+
+ request.session['rowerid'] = r.id
if datadf.empty:
stats = {}
@@ -9011,6 +9054,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
date = form.cleaned_data['date']
starttime = form.cleaned_data['starttime']
workouttype = form.cleaned_data['workouttype']
+ weightcategory = form.cleaned_data['weightcategory']
duration = form.cleaned_data['duration']
distance = form.cleaned_data['distance']
notes = form.cleaned_data['notes']
@@ -9049,6 +9093,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
row.starttime = starttime
row.startdatetime = startdatetime
row.workouttype = workouttype
+ row.weightcategory = weightcategory
row.notes = notes
row.duration = duration
row.distance = distance
@@ -9223,166 +9268,6 @@ def workout_map_view(request,id=0):
'mayedit':mayedit,
})
-# The basic edit page
-@login_required()
-def workout_edit_view_navionics(request,id=0,message="",successmessage=""):
- request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
- request.session['referer'] = absolute(request)['PATH']
-
- row = get_workout(id)
- form = WorkoutForm(instance=row)
-
- if request.method == 'POST':
- # Form was submitted
- form = WorkoutForm(request.POST)
- if form.is_valid():
- # Get values from form
- name = form.cleaned_data['name']
- date = form.cleaned_data['date']
- starttime = form.cleaned_data['starttime']
- workouttype = form.cleaned_data['workouttype']
- duration = form.cleaned_data['duration']
- distance = form.cleaned_data['distance']
- notes = form.cleaned_data['notes']
- thetimezone = form.cleaned_data['timezone']
- try:
- boattype = request.POST['boattype']
- except KeyError:
- boattype = Workout.objects.get(id=id).boattype
- try:
- privacy = request.POST['privacy']
- except KeyError:
- privacy = Workout.objects.get(id=id).privacy
- try:
- rankingpiece = form.cleaned_data['rankingpiece']
- except KeyError:
- rankingpiece =- Workout.objects.get(id=id).rankingpiece
-
- startdatetime = (str(date) + ' ' + str(starttime))
- startdatetime = datetime.datetime.strptime(startdatetime,
- "%Y-%m-%d %H:%M:%S")
- startdatetime = timezone.make_aware(startdatetime)
- startdatetime = startdatetime.astimezone(pytz.timezone(thetimezone))
-
-
- # check if user is owner of this workout
- if checkworkoutuser(request.user,row):
- row.name = name
- row.date = date
- row.starttime = starttime
- row.startdatetime = startdatetime
- row.workouttype = workouttype
- row.notes = notes
- row.duration = duration
- row.distance = distance
- row.boattype = boattype
- row.privacy = privacy
- row.rankingpiece = rankingpiece
- row.timezone = thetimezone
- try:
- row.save()
- except IntegrityError:
- pass
- # change data in csv file
-
- r = rdata(row.csvfilename)
- if r == 0:
- return HttpResponse("Error: CSV Data File Not Found")
- r.rowdatetime = startdatetime
- r.write_csv(row.csvfilename,gzip=True)
- dataprep.update_strokedata(id,r.df)
- successmessage = "Changes saved"
- messages.info(request,successmessage)
- url = reverse(workout_edit_view,
- kwargs = {
- 'id':str(row.id),
- })
- response = HttpResponseRedirect(url)
- else:
- message = "You are not allowed to change this workout"
- messages.error(request,message)
- url = reverse(workouts_view)
-
- response = HttpResponseRedirect(url)
-
- #else: # form not POSTed
- form = WorkoutForm(instance=row)
-
- row = get_workout(id)
-
- g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime")
- 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
-
- comments = WorkoutComment.objects.filter(workout=row)
-
- aantalcomments = len(comments)
-
- if (checkworkoutuser(request.user,row)==False):
- raise PermissionDenied("Access denied")
-
- # create interactive plot
- f1 = row.csvfilename
- u = row.user.user
- r = getrower(u)
- rowdata = rdata(f1)
- hascoordinates = 1
- if rowdata != 0:
- try:
- latitude = rowdata.df[' latitude']
- if not latitude.std():
- hascoordinates = 0
- except KeyError,AttributeError:
- hascoordinates = 0
-
- else:
- hascoordinates = 0
-
-
- if hascoordinates:
- mapscript,mapdiv = leaflet_chart2(rowdata.df[' latitude'],
- rowdata.df[' longitude'],
- row.name)
-
- else:
- mapscript = ""
- mapdiv = ""
-
-
- # render page
- if (len(g)<=3):
- return render(request, 'workout_form.html',
- {'form':form,
- 'workout':row,
- 'teams':get_my_teams(request.user),
- 'graphs1':g[0:3],
- 'mapscript':mapscript,
- 'aantalcomments':aantalcomments,
- 'mapdiv':mapdiv,
- })
-
- else:
- return render(request, 'workout_form.html',
- {'form':form,
- 'teams':get_my_teams(request.user),
- 'workout':row,
- 'graphs1':g[0:3],
- 'graphs2':g[3:6],
- 'mapscript':mapscript,
- 'aantalcomments':aantalcomments,
- 'mapdiv':mapdiv,
- })
-
-
- return HttpResponseRedirect(url)
# Image upload
@login_required()
@@ -11346,12 +11231,7 @@ def rower_exportsettings_view(request):
# Add email address to form so user can change his email address
@login_required()
def rower_edit_view(request,rowerid=0,message=""):
- if rowerid==0:
- r = getrower(request.user)
- else:
- r = Rower.objects.get(id=rowerid)
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You have no access to these user settings")
+ r = getrequestrower(request,rowerid=rowerid,notpermanent=True)
rowerid = r.id
@@ -12297,16 +12177,8 @@ def plannedsession_multiclone_view(
rowerid=0,
startdate=timezone.now()-datetime.timedelta(days=30),
enddate=timezone.now()):
-
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+
+ r = getrequestrower(request,rowerid=rowerid)
if 'startdate' in request.session:
startdate = iso8601.parse_date(request.session['startdate'])
@@ -12402,15 +12274,8 @@ def plannedsession_multiclone_view(
@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/",
redirect_field_name=None)
def plannedsession_create_view(request,timeperiod='thisweek',rowerid=0):
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+
+ r = getrequestrower(request,rowerid=rowerid)
if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST)
@@ -12505,15 +12370,7 @@ def plannedsession_multicreate_view(request,timeperiod='thisweek',
extrasessions=int(extrasessions)
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)
sps = get_sessions(r,startdate=startdate,enddate=enddate)
@@ -12876,15 +12733,7 @@ def plannedsessions_coach_view(request,timeperiod='thisweek',
@login_required()
def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)
@@ -12921,15 +12770,7 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0):
@login_required()
def plannedsessions_print_view(request,timeperiod='thisweek',rowerid=0):
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)
@@ -12958,15 +12799,7 @@ def plannedsessions_manage_view(request,timeperiod='thisweek',rowerid=0,
if request.is_ajax():
is_ajax = True
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)
@@ -13084,15 +12917,8 @@ def plannedsessions_manage_view(request,timeperiod='thisweek',rowerid=0,
redirect_field_name=None)
def plannedsession_clone_view(request,id=0,rowerid=0,
timeperiod='thisweek'):
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)
@@ -13137,16 +12963,8 @@ def plannedsession_clone_view(request,id=0,rowerid=0,
@user_passes_test(hasplannedsessions,login_url="/rowers/planmembership/",
redirect_field_name=None)
def plannedsession_edit_view(request,id=0,timeperiod='thisweek',rowerid=0):
-
- if rowerid==0:
- r = getrower(request.user)
- else:
- try:
- r = Rower.objects.get(id=rowerid)
- except Rower.DoesNotExist:
- raise Http404("This rower doesn't exist")
- if not checkaccessuser(request.user,r):
- raise PermissionDenied("You don't have access to this plan")
+
+ r = getrequestrower(request,rowerid=rowerid)
startdate,enddate = get_dates_timeperiod(timeperiod)