Process team invites
This commit is contained in:
@@ -66,7 +66,7 @@ def add_member(id,rower):
|
||||
|
||||
set_teamplanexpires(rower)
|
||||
|
||||
return (1,'Member added')
|
||||
return (id,'Member added')
|
||||
|
||||
def remove_member(id,rower):
|
||||
t = Team.objects.get(id=id)
|
||||
@@ -80,17 +80,17 @@ def remove_member(id,rower):
|
||||
res = queuehigh.enqueue(handle_remove_workouts_team,ws,t)
|
||||
|
||||
set_teamplanexpires(rower)
|
||||
return (1,'Member removed')
|
||||
return (id,'Member removed')
|
||||
|
||||
def mgr_remove_member(id,manager,rower):
|
||||
t = Team.objects.get(id=id)
|
||||
if t.manager == manager:
|
||||
remove_member(id,rower)
|
||||
return (1,'Member removed')
|
||||
return (id,'Member removed')
|
||||
else:
|
||||
return (0,'You are not the team manager')
|
||||
|
||||
return 0
|
||||
return (0,'')
|
||||
|
||||
def count_invites(manager):
|
||||
ts = Team.objects.filter(manager=manager)
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/me/edit">{{ user.first_name }}</a>
|
||||
</p>
|
||||
<span class="tooltiptext">Edit user data, e.g. heart rate zones</span>
|
||||
<span class="tooltiptext">Edit user account, e.g. heart rate zones, power zones, email, teams</span>
|
||||
|
||||
{% else %}
|
||||
<p><a class="button gray small" href="{% url 'login' %}">login</a> </p>
|
||||
|
||||
@@ -6,9 +6,18 @@
|
||||
<div class="grid_12 alpha">
|
||||
<h1>{{ team.name }}</h1>
|
||||
<p>{{ team.notes }}</p>
|
||||
<p><b>Manager:</b> {{ team.manager.first_name }} {{ team.manager.last_name }}</p>
|
||||
{% if ismember %}
|
||||
<div class="grid_2 suffix_10 alpha">
|
||||
<a class="button red small" href="/rowers/team/{{ team.id }}/leaveconfirm">Leave this team</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="grid_2 suffix_10 alpha tooltip">
|
||||
<a class="button green small" href="/rowers/team/{{ team.id }}/requestmembership/{{ user.id }}">Join</a>
|
||||
<span class="tooltiptext">A request will be sent to the team manager</span>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>Members</h2>
|
||||
|
||||
@@ -38,9 +38,31 @@
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{% if invites %}
|
||||
<p>
|
||||
<h2>Invitations</h2>
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Manager</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for i in invites %}
|
||||
<tr>
|
||||
<td><a href="/rowers/team/{{ i.team.id }}">{{ i.team.name }}</a></td>
|
||||
<td>{{ i.team.manager.first_name }} {{ i.team.manager.last_name }}</td>
|
||||
<td><a class="button small green" href="/rowers/me/invitation/{{ i.code }}">Accept</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% else %}
|
||||
<p> </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -53,7 +75,7 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th> </th>
|
||||
<th>Manager</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -72,10 +94,38 @@
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
<div class="grid_2 suffix_2 prefix_2 alpha">
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<a class="button green" href="/rowers/team/create">New Team</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{% if otherteams %}
|
||||
<h2>Other Teams</h2>
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for team in otherteams %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/rowers/team/{{ team.id }}/">{{ team.name }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{{ team.manager.first_name }} {{ team.manager.last_name }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p> </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
@@ -200,13 +200,18 @@ urlpatterns = [
|
||||
url(r'^workout/(\d+)/recalcsummary/$',views.workout_recalcsummary_view),
|
||||
url(r'^workout/(\d+)/sporttracksuploadw/$',views.workout_sporttracks_upload_view),
|
||||
url(r'^me/teams/$',views.rower_teams_view),
|
||||
url(r'^team/(?P<id>\d+)/s/(?P<successmessage>\w+.*)/c/(?P<message>\w+.*)$',views.team_view),
|
||||
url(r'^team/(?P<id>\d+)/c/(?P<message>\w+.*)$',views.team_view),
|
||||
url(r'^team/(?P<id>\d+)/s/(?P<successmessage>\w+.*)$',views.team_view),
|
||||
url(r'^team/(\d+)/$',views.team_view),
|
||||
url(r'^team/(\d+)/leaveconfirm/$',views.team_leaveconfirm_view),
|
||||
url(r'^team/(\d+)/leave/$',views.team_leave_view),
|
||||
url(r'^team/(\d+)/deleteconfirm/$',views.team_deleteconfirm_view),
|
||||
url(r'^team/(\d+)/requestmembership/(\d+)$',views.team_requestmembership_view),
|
||||
url(r'^team/(\d+)/delete/$',views.team_delete_view),
|
||||
url(r'^team/create/$',views.team_create_view),
|
||||
url(r'^me/invitation/$',views.rower_invitations_view),
|
||||
url(r'^me/invitation/c/(?P<message>\w+.*)/$',views.rower_invitations_view),
|
||||
url(r'^me/invitation/(\w+.*)/$',views.rower_invitations_view),
|
||||
url(r'^me/edit/c/(?P<message>\w+.*)$',views.rower_edit_view),
|
||||
url(r'^me/edit/s/(?P<successmessage>\w+.*)$',views.rower_edit_view),
|
||||
|
||||
@@ -31,7 +31,7 @@ from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
|
||||
from rowers.models import (
|
||||
RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm,
|
||||
RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData,
|
||||
Team,TeamForm,TeamInviteForm
|
||||
Team,TeamForm,TeamInviteForm,TeamInvite
|
||||
)
|
||||
from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement
|
||||
from django.forms.formsets import formset_factory
|
||||
@@ -5289,25 +5289,34 @@ def strokedatajson(request,id):
|
||||
# Teams related views
|
||||
import teams
|
||||
|
||||
@login_required()
|
||||
@login_required()
|
||||
def team_view(request,id=0,message='',successmessage=''):
|
||||
ismember = 0
|
||||
|
||||
r = Rower.objects.get(user=request.user)
|
||||
|
||||
|
||||
|
||||
try:
|
||||
t = Team.objects.get(id=id)
|
||||
except Team.DoesNotExist:
|
||||
return HttpResponse("Team doesn't exist")
|
||||
|
||||
|
||||
if request.method == 'POST' and request.user == t.manager:
|
||||
inviteform = TeamInviteForm(request.POST)
|
||||
if inviteform.is_valid():
|
||||
cd = inviteform.cleaned_data
|
||||
newmember = cd['user']
|
||||
email = cd['email']
|
||||
email = cd['email']
|
||||
inviteid,text = teams.create_invite(t,t.manager,
|
||||
user=newmember,
|
||||
email=email)
|
||||
if inviteid:
|
||||
teams.send_invite_email(inviteid)
|
||||
teams.send_invite_email(inviteid)
|
||||
successmessage = text
|
||||
else:
|
||||
message = text
|
||||
|
||||
elif request.user == t.manager:
|
||||
inviteform = TeamInviteForm()
|
||||
@@ -5316,13 +5325,17 @@ def team_view(request,id=0):
|
||||
inviteform = ''
|
||||
|
||||
members = Rower.objects.filter(team=t).order_by('user__last_name','user__first_name')
|
||||
|
||||
|
||||
if r in members:
|
||||
ismember = 1
|
||||
|
||||
return render(request, 'team.html',
|
||||
{
|
||||
'team':t,
|
||||
'members':members,
|
||||
'inviteform':inviteform,
|
||||
'message':message,
|
||||
'successmessage':successmessage,
|
||||
'ismember':ismember,
|
||||
})
|
||||
|
||||
@@ -5349,21 +5362,60 @@ def team_leave_view(request,id=0):
|
||||
|
||||
@login_required()
|
||||
def rower_teams_view(request):
|
||||
r = Rower.objects.get(user=request.user)
|
||||
r = Rower.objects.get(user=request.user)
|
||||
ts = Team.objects.filter(rower=r)
|
||||
myteams = Team.objects.filter(manager=request.user)
|
||||
otherteams = Team.objects.filter(private='open').exclude(rower=r).order_by('name')
|
||||
teams.remove_expired_invites()
|
||||
|
||||
invites = TeamInvite.objects.filter(user=request.user)
|
||||
|
||||
return render(request, 'teams.html',
|
||||
{
|
||||
{
|
||||
'teams':ts,
|
||||
'myteams':myteams,
|
||||
'invites':invites,
|
||||
'otherteams':otherteams,
|
||||
})
|
||||
|
||||
@login_required()
|
||||
def rower_invitations_view(request,code=None):
|
||||
return render(request, 'invitations.html',
|
||||
{
|
||||
@login_required()
|
||||
def rower_invitations_view(request,code=None,message='',successmessage=''):
|
||||
|
||||
if code:
|
||||
teams.remove_expired_invites()
|
||||
res,text = teams.process_invite_code(request.user,code)
|
||||
if res:
|
||||
successmessage = text
|
||||
teamid=res
|
||||
url = reverse(team_view,kwargs={
|
||||
'id':teamid,
|
||||
'successmessage': successmessage,
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_invitations_view,kwargs={
|
||||
'message':message
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
r = Rower.objects.get(user=request.user)
|
||||
ts = Team.objects.filter(rower=r)
|
||||
myteams = Team.objects.filter(manager=request.user)
|
||||
invites = TeamInvite.objects.filter(user=request.user)
|
||||
otherteams = Team.objects.filter(private='open').drop(rower=r)
|
||||
|
||||
return render(request, 'teams.html',
|
||||
{
|
||||
'teams':ts,
|
||||
'myteams':myteams,
|
||||
'invites':invites,
|
||||
'otherteams':otherteams,
|
||||
})
|
||||
|
||||
@login_required()
|
||||
def team_requestmembership_view(request,teamid,userid):
|
||||
return HttpResponse("Not yet implemented")
|
||||
|
||||
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
|
||||
|
||||
Reference in New Issue
Block a user