Please correct the error{{ form.errors|pluralize }} below.
diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html
index 9073b53a..9adf278b 100644
--- a/rowers/templates/list_workouts.html
+++ b/rowers/templates/list_workouts.html
@@ -35,7 +35,9 @@
{% if team %}
- {% include "teambuttons.html" with teamid=team.id %}
+
+ {% include "teambuttons.html" with teamid=team.id %}
+
{{ team.name }} Team Workouts
{% else %}
My Workouts
diff --git a/rowers/templates/team_document_form.html b/rowers/templates/team_document_form.html
new file mode 100644
index 00000000..aadc4f9e
--- /dev/null
+++ b/rowers/templates/team_document_form.html
@@ -0,0 +1,55 @@
+{% extends "base.html" %}
+{% load staticfiles %}
+
+{% block title %}File loading{% endblock %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/rowers/templates/teambuttons.html b/rowers/templates/teambuttons.html
index 6fa2c663..12351b95 100644
--- a/rowers/templates/teambuttons.html
+++ b/rowers/templates/teambuttons.html
@@ -1,3 +1,4 @@
+{% load rowerfilters %}
-
+
+ {% if user|is_manager and user|has_teams %}
+
+ Upload Workout
+
+ {% else %}
+
+ {% endif %}
+
diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py
index dcbef68d..d3a610fd 100644
--- a/rowers/templatetags/rowerfilters.py
+++ b/rowers/templatetags/rowerfilters.py
@@ -65,3 +65,35 @@ def times(number):
def get_field_id(id,s,form):
field_name = s+str(id)
return form.__getitem__(field_name)
+
+from rowers.models import Rower,Team
+
+@register.filter
+def is_manager(user):
+ r = Rower.objects.get(user=user)
+ return r.rowerplan == 'coach'
+
+@register.filter
+def user_teams(user):
+ try:
+ therower = Rower.objects.get(user=user)
+ teams1 = therower.team.all()
+ teams2 = Team.objects.filter(manager=user)
+ teams = list(set(teams1).union(set(teams2)))
+ except TypeError:
+ teams = []
+
+ return teams
+
+@register.filter
+def has_teams(user):
+ try:
+ therower = Rower.objects.get(user=user)
+ teams1 = therower.team.all()
+ teams2 = Team.objects.filter(manager=user)
+ teams = list(set(teams1).union(set(teams2)))
+ return True
+ except TypeError:
+ return False
+
+ return False
diff --git a/rowers/urls.py b/rowers/urls.py
index 9097ed93..48d544fe 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -157,8 +157,12 @@ urlpatterns = [
url(r'^graph/(\d+)/$',views.graph_show_view),
url(r'^graph/(\d+)/deleteconfirm$',views.graph_delete_confirm_view),
url(r'^graph/(\d+)/delete$',views.graph_delete_view),
+ url(r'^workout/upload/team/s/(?P
\w+.*)/c/(?P\w+.*)/$',views.team_workout_upload_view),
+ url(r'^workout/upload/team/c/(?P\w+.*)/$',views.team_workout_upload_view),
+ url(r'^workout/upload/team/s/(?P\w+.*)/$',views.team_workout_upload_view),
+ url(r'^workout/upload/team/$',views.team_workout_upload_view),
url(r'^workout/upload/$',views.workout_upload_view),
- url(r'^workout/upload/(.+.*)$',views.workout_upload_view),
+ url(r'^workout/upload/c/(?P\w+.*)$',views.workout_upload_view),
url(r'^workout/(?P\d+)/histo$',views.workout_histo_view),
url(r'^workout/(?P\d+)/forcecurve$',views.workout_forcecurve_view),
url(r'^workout/(?P\d+)/unsubscribe$',views.workout_unsubscribe_view),
diff --git a/rowers/views.py b/rowers/views.py
index 837296b1..41747d68 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -14,7 +14,10 @@ from django.http import (
HttpResponseNotFound,Http404
)
from django.contrib.auth import authenticate, login, logout
-from rowers.forms import LoginForm,DocumentsForm,UploadOptionsForm
+from rowers.forms import (
+ LoginForm,DocumentsForm,UploadOptionsForm,
+ TeamUploadOptionsForm,
+ )
from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied
from django.template import RequestContext
@@ -5350,6 +5353,183 @@ def workout_upload_view(request,message="",
'optionsform': optionsform,
'message':message})
+# This is the main view for processing uploaded files
+@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
+def team_workout_upload_view(request,message="",
+ successmessage="",
+ uploadoptions={
+ 'make_plot':False,
+ 'plottype':'timeplot',
+ }):
+
+ if 'uploadoptions' in request.session:
+ uploadoptions = request.session['uploadoptions']
+ else:
+ request.session['uploadoptions'] = uploadoptions
+
+
+ myteams = Team.objects.filter(manager=request.user)
+
+ make_plot = uploadoptions['make_plot']
+ plottype = uploadoptions['plottype']
+
+ r = Rower.objects.get(user=request.user)
+ if request.method == 'POST':
+ form = DocumentsForm(request.POST,request.FILES)
+ optionsform = TeamUploadOptionsForm(request.POST)
+
+ rowerform = TeamInviteForm(request.POST)
+ rowerform.fields.pop('email')
+ rowerform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct()
+ if form.is_valid():
+ f = request.FILES['file']
+ res = handle_uploaded_file(f)
+ t = form.cleaned_data['title']
+ if rowerform.is_valid():
+ u = rowerform.cleaned_data['user']
+ if u:
+ r = Rower.objects.get(user=u)
+ else:
+ message = 'Please select a rower'
+ response = render(request,
+ 'team_document_form.html',
+ {'form':form,
+ 'teams':get_my_teams(request.user),
+ 'optionsform': optionsform,
+ 'rowerform': rowerform,
+ 'message':message,
+ 'successmessage':successmessage,
+ })
+
+ return response
+
+ workouttype = form.cleaned_data['workouttype']
+
+ notes = form.cleaned_data['notes']
+
+ if optionsform.is_valid():
+ make_plot = optionsform.cleaned_data['make_plot']
+ plottype = optionsform.cleaned_data['plottype']
+
+ uploadoptions = {
+ 'makeprivate':False,
+ 'make_plot':make_plot,
+ 'plottype':plottype,
+ 'upload_to_C2':False,
+ }
+
+
+ request.session['uploadoptions'] = uploadoptions
+
+ f1 = res[0] # file name
+ f2 = res[1] # file name incl media directory
+
+
+ id,message,f2 = dataprep.new_workout_from_file(r,f2,
+ workouttype=workouttype,
+ makeprivate=False,
+ title = t,
+ notes='')
+ if not id:
+ url = reverse(team_workout_upload_view,
+ args=[str(message)])
+ response = HttpResponseRedirect(url)
+ return response
+
+ else:
+ if message:
+ successmessage = "The workout was added to the user's account"
+ url = reverse(team_workout_upload_view,
+ kwargs = {
+ 'message':message,
+ 'successmessage':successmessage,
+ })
+ else:
+ successmessage = "The workout was added to the user's account"
+ url = reverse(team_workout_upload_view,
+ kwargs = {
+ 'successmessage':successmessage,
+ })
+
+ response = HttpResponseRedirect(url)
+ w = Workout.objects.get(id=id)
+
+ if (make_plot):
+ imagename = f1[:-4]+'.png'
+ fullpathimagename = 'static/plots/'+imagename
+ powerperc = 100*np.array([r.pw_ut2,
+ r.pw_ut1,
+ r.pw_at,
+ r.pw_tr,r.pw_an])/r.ftp
+
+ hrpwrdata = {
+ 'hrmax':r.max,
+ 'hrut2':r.ut2,
+ 'hrut1':r.ut1,
+ 'hrat':r.at,
+ 'hrtr':r.tr,
+ 'hran':r.an,
+ 'ftp':r.ftp,
+ 'powerperc':serialize_list(powerperc),
+ 'powerzones':serialize_list(r.powerzones),
+ }
+
+ # make plot - asynchronous task
+ plotnrs = {
+ 'timeplot':1,
+ 'distanceplot':2,
+ 'pieplot':3,
+ }
+
+ plotnr = plotnrs[plottype]
+ if (workouttype=='water'):
+ plotnr = plotnr+3
+
+
+ if settings.DEBUG:
+ res = handle_makeplot.delay(f1,f2,t,
+ hrpwrdata,plotnr,
+ imagename)
+ else:
+ res = queue.enqueue(handle_makeplot,f1,f2,
+ t,hrpwrdata,
+ plotnr,imagename)
+
+
+ i = GraphImage(workout=w,
+ creationdatetime=timezone.now(),
+ filename=fullpathimagename)
+ i.save()
+
+
+
+ else:
+ response = render(request,
+ 'team_document_form.html',
+ {'form':form,
+ 'teams':get_my_teams(request.user),
+ 'optionsform': optionsform,
+ 'rowerform': rowerform,
+ 'message':message,
+ 'successmessage':successmessage,
+ })
+
+ return response
+ else:
+ form = DocumentsForm()
+ optionsform = TeamUploadOptionsForm(initial=uploadoptions)
+ rowerform = TeamInviteForm()
+ rowerform.fields.pop('email')
+ rowerform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct()
+ return render(request, 'team_document_form.html',
+ {'form':form,
+ 'teams':get_my_teams(request.user),
+ 'optionsform': optionsform,
+ 'rowerform':rowerform,
+ 'message':message,
+ 'successmessage':successmessage,
+ })
+
# Ask the user if he really wants to delete the workout
@@ -6434,6 +6614,7 @@ def rower_teams_view(request,message='',successmessage=''):
'successmessage':successmessage,
'myinvites':myinvites,
})
+
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
def invitation_revoke_view(request,id):
res,text = teams.revoke_invite(request.user,id)