Private
Public Access
1
0

Merge branch 'release/v1.1'

This commit is contained in:
Sander Roosendaal
2017-02-22 18:05:04 +01:00
10 changed files with 231 additions and 188 deletions
+1 -2
View File
@@ -891,6 +891,7 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
yparamname1 = axlabels[yparam1] yparamname1 = axlabels[yparam1]
if yparam2 != 'None':
yparamname2 = axlabels[yparam2] yparamname2 = axlabels[yparam2]
@@ -1668,8 +1669,6 @@ def interactive_multiple_compare_chart(ids,xparam,yparam,plottype='line',
if yparam != 'time' and yparam != 'pace': if yparam != 'time' and yparam != 'pace':
plot.add_layout(ylabel) plot.add_layout(ylabel)
print cntr,id,len(group),ymean
source = ColumnDataSource( source = ColumnDataSource(
group group
) )
+1 -1
View File
@@ -393,7 +393,7 @@ class Workout(models.Model):
maxhr = models.IntegerField(blank=True,null=True) maxhr = models.IntegerField(blank=True,null=True)
uploadedtostrava = models.IntegerField(default=0) uploadedtostrava = models.IntegerField(default=0)
uploadedtosporttracks = models.IntegerField(default=0) uploadedtosporttracks = models.IntegerField(default=0)
notes = models.CharField(blank=True,null=True,max_length=200) notes = models.CharField(blank=True,null=True,max_length=1000)
summary = models.TextField(blank=True) summary = models.TextField(blank=True)
privacy = models.CharField(default='visible',max_length=30, privacy = models.CharField(default='visible',max_length=30,
choices=privacychoices) choices=privacychoices)
+1
View File
@@ -35,6 +35,7 @@
<div id="workouts_table" class="grid_8 alpha"> <div id="workouts_table" class="grid_8 alpha">
{% if team %} {% if team %}
{% include "teambuttons.html" with teamid=team.id %}
<h3>{{ team.name }} Team Workouts</h3> <h3>{{ team.name }} Team Workouts</h3>
{% else %} {% else %}
<h3>My Workouts</h3> <h3>My Workouts</h3>
+16 -8
View File
@@ -34,16 +34,24 @@
</style> </style>
<div id="workouts" class="grid_12 alpha"> <div id="workouts" class="grid_8 alpha">
<h1>Interactive Comparison</h1> <h1>Interactive Comparison</h1>
<div class="grid_2 alpha"> <div class="grid_8 alpha">
<a class="button gray small" href="/rowers/list-workouts/team/{{ teamid }}/">Team Workouts</a> {% include "teambuttons.html" with teamid=teamid%}
</div> </div>
<div class="grid_2">
<a class="button gray small" href="/rowers/team-compare-select/team/{{ teamid }}/">Multi Compare</a>
</div> </div>
<div class="grid_2 suffix_6 omega"> <div class="grid_4 omega">
<a class="button gray small" href="/rowers/team/{{ teamid }}/">Team Page</a> <form enctype="multipart/form-data" action="/rowers/multi-compare" method="post">
{% csrf_token %}
<table>
{{ chartform.as_table }}
</table>
<div class="grid_1 prefix_2 suffix_1">
<p>
<input name='workoutselectform' class="button green" type="submit" value="Submit">
</p>
</div>
</form>
</div> </div>
<div class="grid_12 alpha"> <div class="grid_12 alpha">
@@ -53,6 +61,6 @@
{{ the_div|safe }} {{ the_div|safe }}
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}
+10
View File
@@ -5,8 +5,15 @@
{% block content %} {% block content %}
<div class="grid_12 alpha"> <div class="grid_12 alpha">
<h1>{{ team.name }}</h1> <h1>{{ team.name }}</h1>
<div class="grid_8 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
<div class="grid_4 omega">
<p>{{ team.notes }}</p> <p>{{ team.notes }}</p>
<p><b>Manager:</b> {{ team.manager.first_name }} {{ team.manager.last_name }}</p> <p><b>Manager:</b> {{ team.manager.first_name }} {{ team.manager.last_name }}</p>
</div>
</div>
<div class="grid_12 alpha">
{% if ismember %} {% if ismember %}
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<a class="button red small" href="/rowers/team/{{ team.id }}/leaveconfirm">Leave this team</a> <a class="button red small" href="/rowers/team/{{ team.id }}/leaveconfirm">Leave this team</a>
@@ -29,6 +36,9 @@
</div> </div>
{% endif %} {% endif %}
</div>
<div class="grid_12 alpha">
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<p> <p>
<h2>Members</h2> <h2>Members</h2>
+8 -4
View File
@@ -8,7 +8,14 @@
<div class="grid_12"> <div class="grid_12">
<div class="grid_8 suffix_4">
{% include "teambuttons.html" with teamid=teamid%}
</div>
</div>
<div class="grid_12 alpha">
<h3>{{ team.name }} Team Workouts</h3>
</div>
<div class="grid_12 alpha">
<div class="grid_4 alpha"> <div class="grid_4 alpha">
{% if team %} {% if team %}
@@ -46,9 +53,6 @@
</div> </div>
<div class="grid_12 alpha">
<h3>{{ team.name }} Team Workouts</h3>
</div>
<form enctype="multipart/form-data" action="/rowers/multi-compare" method="post"> <form enctype="multipart/form-data" action="/rowers/multi-compare" method="post">
<div id="workouts_table" class="grid_8 alpha"> <div id="workouts_table" class="grid_8 alpha">
+9
View File
@@ -0,0 +1,9 @@
<div class="grid_2 alpha">
<a class="button gray small" href="/rowers/list-workouts/team/{{ teamid }}/">Team Workouts</a>
</div>
<div class="grid_2">
<a class="button gray small" href="/rowers/team-compare-select/team/{{ teamid }}/">Multi Compare</a>
</div>
<div class="grid_2 suffix_2 omega">
<a class="button gray small" href="/rowers/team/{{ teamid }}/">Team Page</a>
</div>
+1 -3
View File
@@ -580,9 +580,7 @@ class ViewTest(TestCase):
form = WorkoutForm(data=form_data) form = WorkoutForm(data=form_data)
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
response = self.c.post('/rowers/workout/1/edit', form_data, follow=True) response = self.c.post('/rowers/workout/1/edit', form_data, follow=True)
self.assertRedirects(response, self.assertEqual(response.status_code, 200)
expected_url='/rowers/workout/1/edit/s/Changes%20saved',
status_code=302,target_status_code=200)
w = Workout.objects.get(id=1) w = Workout.objects.get(id=1)
+56 -40
View File
@@ -357,7 +357,7 @@ def add_workout_from_strokedata(user,importid,data,strokedata,
except: except:
title = 'Imported' title = 'Imported'
starttimeunix = mktime(rowdatetime.timetuple()) starttimeunix = mktime(rowdatetime.utctimetuple())
res = make_cumvalues(0.1*strokedata['t']) res = make_cumvalues(0.1*strokedata['t'])
cum_time = res[0] cum_time = res[0]
@@ -521,7 +521,7 @@ def add_workout_from_stdata(user,importid,data):
except: except:
title = "Imported data" title = "Imported data"
starttimeunix = mktime(rowdatetime.timetuple()) starttimeunix = mktime(rowdatetime.utctimetuple())
res = splitstdata(data['distance']) res = splitstdata(data['distance'])
@@ -2059,7 +2059,12 @@ def multi_compare_view(request):
if result: if result:
promember=1 promember=1
if request.method == 'POST': if 'ids' in request.session:
print request.session['ids']
print request.POST
if request.method == 'POST' and 'workouts' in request.POST:
form = WorkoutMultipleCompareForm(request.POST) form = WorkoutMultipleCompareForm(request.POST)
chartform = ChartParamChoiceForm(request.POST) chartform = ChartParamChoiceForm(request.POST)
if form.is_valid() and chartform.is_valid(): if form.is_valid() and chartform.is_valid():
@@ -2070,6 +2075,8 @@ def multi_compare_view(request):
plottype = chartform.cleaned_data['plottype'] plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid'] teamid = chartform.cleaned_data['teamid']
ids = [int(w.id) for w in workouts] ids = [int(w.id) for w in workouts]
request.session['ids'] = ids
labeldict = { labeldict = {
int(w.id): w.__unicode__() for w in workouts int(w.id): w.__unicode__() for w in workouts
} }
@@ -2086,9 +2093,40 @@ def multi_compare_view(request):
'the_div':div, 'the_div':div,
'promember':promember, 'promember':promember,
'teamid':teamid, 'teamid':teamid,
'chartform':chartform,
}) })
else: else:
return HttpResponse("Form is not valid") return HttpResponse("Form is not valid")
if request.method == 'POST' and 'ids' in request.session:
chartform = ChartParamChoiceForm(request.POST)
if chartform.is_valid():
xparam = chartform.cleaned_data['xparam']
yparam = chartform.cleaned_data['yparam']
plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid']
ids = request.session['ids']
request.session['ids'] = ids
workouts = [Workout.objects.get(id=id) for id in ids]
labeldict = {
int(w.id): w.__unicode__() for w in workouts
}
res = interactive_multiple_compare_chart(ids,xparam,yparam,
promember=promember,
plottype=plottype,
labeldict=labeldict)
script = res[0]
div = res[1]
return render(request,'multicompare.html',
{'interactiveplot':script,
'the_div':div,
'promember':promember,
'teamid':teamid,
'chartform':chartform,
})
else: else:
url = reverse(workouts_view) url = reverse(workouts_view)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -2469,7 +2507,7 @@ def workout_downloadwind_view(request,id=0,
startdatetime = dateutil.parser.parse("{}, {}".format(row.date, startdatetime = dateutil.parser.parse("{}, {}".format(row.date,
row.starttime)) row.starttime))
starttimeunix = int(mktime(startdatetime.timetuple())) starttimeunix = int(mktime(startdatetime.utctimetuple()))
avgtime = starttimeunix+avgtime avgtime = starttimeunix+avgtime
winddata = get_wind_data(avglat,avglon,avgtime) winddata = get_wind_data(avglat,avglon,avgtime)
windspeed = winddata[0] windspeed = winddata[0]
@@ -2533,7 +2571,7 @@ def workout_downloadmetar_view(request,id=0,
startdatetime = dateutil.parser.parse("{}, {}".format(row.date, startdatetime = dateutil.parser.parse("{}, {}".format(row.date,
row.starttime)) row.starttime))
starttimeunix = int(mktime(startdatetime.timetuple())) starttimeunix = int(mktime(startdatetime.utctimetuple()))
avgtime = starttimeunix+avgtime avgtime = starttimeunix+avgtime
winddata = get_metar_data(airportcode,avgtime) winddata = get_metar_data(airportcode,avgtime)
windspeed = winddata[0] windspeed = winddata[0]
@@ -3597,6 +3635,12 @@ def workout_comment_view(request,id=0):
def workout_edit_view(request,id=0,message="",successmessage=""): def workout_edit_view(request,id=0,message="",successmessage=""):
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
try:
# check if valid ID exists (workout exists)
row = Workout.objects.get(id=id)
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
if request.method == 'POST': if request.method == 'POST':
# Form was submitted # Form was submitted
form = WorkoutForm(request.POST) form = WorkoutForm(request.POST)
@@ -3621,9 +3665,6 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
startdatetime = datetime.datetime.strptime(startdatetime, startdatetime = datetime.datetime.strptime(startdatetime,
"%Y-%m-%d %H:%M:%S") "%Y-%m-%d %H:%M:%S")
startdatetime = timezone.make_aware(startdatetime) startdatetime = timezone.make_aware(startdatetime)
try:
# check if valid ID exists (workout exists)
row = Workout.objects.get(id=id)
# check if user is owner of this workout # check if user is owner of this workout
if checkworkoutuser(request.user,row): if checkworkoutuser(request.user,row):
row.name = name row.name = name
@@ -3658,39 +3699,22 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
url = reverse(workouts_view,args=[str(message)]) url = reverse(workouts_view,args=[str(message)])
response = HttpResponseRedirect(url) response = HttpResponseRedirect(url)
except Workout.DoesNotExist:
# create new workout
r = Rower.objects.get(user=request.user)
w = Workout(name=name,date=date,workouttype=workouttype,
user=r)
w.save()
successmessage = "New Workout Created"
url = reverse(workouts_view,
kwargs = {
'successmessage':str(successmessage),
})
response = HttpResponseRedirect(url) else: # form not POSTed
else: form = WorkoutForm(instance=row)
message = "Invalid Form"
url = reverse(workouts_view,args=[str(message)])
response = HttpResponseRedirect(url)
return response
else:
try: try:
row = Workout.objects.get(id=id) row = Workout.objects.get(id=id)
form = WorkoutForm(instance=row) except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime")
# check if user is owner of this workout # check if user is owner of this workout
if (checkworkoutuser(request.user,row)==False): if (checkworkoutuser(request.user,row)==False):
message = "You are not allowed to edit this workout" raise Http404("You are not allowed to edit this workout")
url = reverse(workouts_view,args=[str(message)])
return HttpResponseRedirect(url)
else:
# create interactive plot # create interactive plot
f1 = row.csvfilename f1 = row.csvfilename
u = request.user u = request.user
@@ -3745,12 +3769,6 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
}) })
except Workout.DoesNotExist:
message = "workout doesn't exist"
url = reverse(workouts_view,
kwargs = {
'message': str(message)
})
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
# Create the chart image with wind corrected pace (OTW) # Create the chart image with wind corrected pace (OTW)
@@ -5645,8 +5663,6 @@ def rower_teams_view(request,message='',successmessage=''):
myrequests = TeamRequest.objects.filter(team__in=myteams) myrequests = TeamRequest.objects.filter(team__in=myteams)
myinvites = TeamInvite.objects.filter(team__in=myteams) myinvites = TeamInvite.objects.filter(team__in=myteams)
print form
return render(request, 'teams.html', return render(request, 'teams.html',
{ {
'teams':ts, 'teams':ts,
-2
View File
@@ -60,8 +60,6 @@ def get_metar_data(airportcode,unixtime):
return [0,0,message,'',timestamp] return [0,0,message,'',timestamp]
print temp_c,wind_dir,wind_speed
windbearing = float(wind_dir) windbearing = float(wind_dir)
wind_knots = float(wind_speed) wind_knots = float(wind_speed)
wind_ms = 0.514444*wind_knots wind_ms = 0.514444*wind_knots