Merge branch 'release/teamrequests'
This commit is contained in:
@@ -4,7 +4,7 @@ from django.contrib.auth.models import User
|
||||
|
||||
from .models import (
|
||||
Rower, Workout,GraphImage,FavoriteChart,SiteAnnouncement,
|
||||
Team,TeamInvite
|
||||
Team,TeamInvite,TeamRequest
|
||||
)
|
||||
|
||||
# Register your models here so you can use them in the Admin module
|
||||
@@ -34,6 +34,9 @@ class TeamAdmin(admin.ModelAdmin):
|
||||
class TeamInviteAdmin(admin.ModelAdmin):
|
||||
list_display = ('issuedate','team','user','code')
|
||||
|
||||
class TeamRequestAdmin(admin.ModelAdmin):
|
||||
list_display = ('issuedate','team','user','code')
|
||||
|
||||
admin.site.unregister(User)
|
||||
admin.site.register(User,UserAdmin)
|
||||
admin.site.register(Workout,WorkoutAdmin)
|
||||
@@ -42,3 +45,4 @@ admin.site.register(Team,TeamAdmin)
|
||||
admin.site.register(FavoriteChart,FavoriteChartAdmin)
|
||||
admin.site.register(SiteAnnouncement,SiteAnnouncementAdmin)
|
||||
admin.site.register(TeamInvite,TeamInviteAdmin)
|
||||
admin.site.register(TeamRequest,TeamRequestAdmin)
|
||||
|
||||
@@ -133,6 +133,13 @@ class TeamInviteForm(ModelForm):
|
||||
class Meta:
|
||||
model = TeamInvite
|
||||
fields = ['user','email']
|
||||
|
||||
class TeamRequest(models.Model):
|
||||
team = models.ForeignKey(Team)
|
||||
user = models.ForeignKey(User,null=True)
|
||||
issuedate = models.DateField(default=timezone.now)
|
||||
code = models.CharField(max_length=150,unique=True)
|
||||
|
||||
|
||||
# Extension of User with rowing specific data
|
||||
class Rower(models.Model):
|
||||
|
||||
125
rowers/tasks.py
125
rowers/tasks.py
@@ -269,6 +269,131 @@ def handle_sendemail_invite(email,name,code,teamname,manager):
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_request(email,name,code,teamname,requestor,id):
|
||||
fullemail = name+' <'+email+'>'
|
||||
subject = 'Request to join team '+teamname
|
||||
message = 'Dear '+name+',\n\n'
|
||||
message += requestor+' is requesting admission to your team '+teamname
|
||||
message += ' on rowsandall.com\n\n'
|
||||
message += 'Click the direct link to accept: \n'
|
||||
message += 'https://rowsandall.com/rowers/me/request/'+code+' \n\n'
|
||||
message += 'Click the following link to reject the request: \n'
|
||||
message += 'https://rowsandall.com/rowers/me/request/'+id+' \n\n'
|
||||
message += 'You can find all pending requests on your team management page:\n'
|
||||
message += 'https://rowsandall.com/rowers/me/teams\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_request_accept(email,name,teamname,managername):
|
||||
fullemail = name+' <'+email+'>'
|
||||
subject = 'Welcome to '+teamname
|
||||
message = 'Dear '+name+',\n\n'
|
||||
message += managername
|
||||
message += ' has accepted your request to be part of the team '
|
||||
message += teamname
|
||||
message += '\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_request_reject(email,name,teamname,managername):
|
||||
fullemail = name+' <'+email+'>'
|
||||
subject = 'Your application to '+teamname+' was rejected'
|
||||
message = 'Dear '+name+',\n\n'
|
||||
message += 'Unfortunately, '
|
||||
message += managername
|
||||
message += ' has rejected your request to be part of the team '
|
||||
message += teamname
|
||||
message += '\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_member_dropped(email,name,teamname,managername):
|
||||
fullemail = name+' <'+email+'>'
|
||||
subject = 'You were removed from '+teamname
|
||||
message = 'Dear '+name+',\n\n'
|
||||
message += 'Unfortunately, '
|
||||
message += managername
|
||||
message += ' has removed you from the team '
|
||||
message += teamname
|
||||
message += '\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_invite_reject(email,name,teamname,managername):
|
||||
fullemail = managername+' <'+email+'>'
|
||||
subject = 'Your invitation to '+name+' was rejected'
|
||||
message = 'Dear '+managername+',\n\n'
|
||||
message += 'Unfortunately, '
|
||||
message += name
|
||||
message += ' has rejected your invitation to be part of the team '
|
||||
message += teamname
|
||||
message += '\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
@app.task
|
||||
def handle_sendemail_invite_accept(email,name,teamname,managername):
|
||||
fullemail = managername+' <'+email+'>'
|
||||
subject = 'Your invitation to '+name+' was accepted'
|
||||
message = 'Dear '+managername+',\n\n'
|
||||
message += name+' has accepted your invitation to be part of the team '+teamname+'\n\n'
|
||||
message += "Best Regards, the Rowsandall Team"
|
||||
|
||||
email = EmailMessage(subject, message,
|
||||
'Rowsandall <info@rowsandall.com>',
|
||||
[fullemail])
|
||||
|
||||
|
||||
res = email.send()
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@app.task
|
||||
def handle_remove_workouts_team(ws,t):
|
||||
for w in ws:
|
||||
|
||||
219
rowers/teams.py
219
rowers/teams.py
@@ -15,12 +15,15 @@ queuelow = django_rq.get_queue('low')
|
||||
queuehigh = django_rq.get_queue('low')
|
||||
|
||||
from rowers.models import (
|
||||
Rower, Workout, Team, TeamInvite,User
|
||||
Rower, Workout, Team, TeamInvite,User,TeamRequest
|
||||
)
|
||||
|
||||
from rowers.tasks import (
|
||||
handle_remove_workouts_team,handle_sendemail_invite,
|
||||
handle_add_workouts_team
|
||||
handle_add_workouts_team,handle_sendemail_request,
|
||||
handle_sendemail_member_dropped,handle_sendemail_request_accept,
|
||||
handle_sendemail_request_reject,handle_sendemail_invite_reject,
|
||||
handle_sendemail_invite_accept,
|
||||
)
|
||||
|
||||
# Low level functions - to be called by higher level methods
|
||||
@@ -91,6 +94,7 @@ def mgr_remove_member(id,manager,rower):
|
||||
t = Team.objects.get(id=id)
|
||||
if t.manager == manager:
|
||||
remove_member(id,rower)
|
||||
send_email_member_dropped(id,rower)
|
||||
return (id,'Member removed')
|
||||
else:
|
||||
return (0,'You are not the team manager')
|
||||
@@ -127,6 +131,31 @@ def get_team_workouts(id):
|
||||
|
||||
# Medium level functionality
|
||||
|
||||
def create_request(team,user):
|
||||
r2 = Rower.objects.get(user=user)
|
||||
r = Rower.objects.get(user=team.manager)
|
||||
if r2 in Rower.objects.filter(team=team):
|
||||
return (0,'Already a member of that team')
|
||||
|
||||
if count_club_members(team.manager)+count_invites(team.manager) < r.clubsize:
|
||||
codes = [i.code for i in TeamRequest.objects.all()]
|
||||
code = uuid.uuid4().hex[:10].upper()
|
||||
# prevent duplicates
|
||||
while code in codes:
|
||||
code = uuid.uuid4().hex[:10].upper()
|
||||
|
||||
u = User.objects.get(id=user)
|
||||
rekwest = TeamRequest(team=team,user=u,code=code)
|
||||
rekwest.save()
|
||||
|
||||
send_request_email(rekwest)
|
||||
|
||||
return (rekwest.id,'The request was created')
|
||||
else:
|
||||
return (0,'That team has reached its maximum number of members')
|
||||
|
||||
return (0,'Something went wrong in create_request')
|
||||
|
||||
def create_invite(team,manager,user=None,email=''):
|
||||
r = Rower.objects.get(user=manager)
|
||||
if team.manager != manager:
|
||||
@@ -158,11 +187,58 @@ def create_invite(team,manager,user=None,email=''):
|
||||
|
||||
return (0,'Nothing done')
|
||||
|
||||
def revoke_invite(id):
|
||||
invitation = TeamInvite.objects.get(id=id)
|
||||
invitation.delete()
|
||||
def revoke_request(user,id):
|
||||
try:
|
||||
rekwest = TeamRequest.objects.get(id=id)
|
||||
except TeamRequest.DoesNotExist:
|
||||
return (0,'The request is invalid')
|
||||
|
||||
return (1,'Invitation revoked')
|
||||
t = rekwest.team
|
||||
|
||||
if rekwest.user==user:
|
||||
rekwest.delete()
|
||||
return (1,'Request revoked')
|
||||
else:
|
||||
return (0,'You are not the requestor')
|
||||
|
||||
def revoke_invite(manager,id):
|
||||
try:
|
||||
invite = TeamInvite.objects.get(id=id)
|
||||
except TeamInvite.DoesNotExist:
|
||||
return (0,'The invitation is invalid')
|
||||
|
||||
if invite.team.manager==manager:
|
||||
invite.delete()
|
||||
return (1,'Invitation revoked')
|
||||
else:
|
||||
return (0,'You are not the team manager')
|
||||
|
||||
def reject_request(manager,id):
|
||||
try:
|
||||
rekwest = TeamRequest.objects.get(id=id)
|
||||
except TeamRequest.DoesNotExist:
|
||||
return (0,'The request is invalid')
|
||||
|
||||
if rekwest.team.manager==manager:
|
||||
send_request_reject_email(rekwest)
|
||||
rekwest.delete()
|
||||
return (1,'Request rejected')
|
||||
else:
|
||||
return (0,'You are not the manager for this request')
|
||||
|
||||
|
||||
def reject_invitation(user,id):
|
||||
try:
|
||||
invite = TeamInvite.objects.get(id=id)
|
||||
except TeamInvite.DoesNotExist:
|
||||
return (0,'The invitation is invalid')
|
||||
|
||||
if invite.user==user:
|
||||
send_invite_reject_email(invite)
|
||||
invite.delete()
|
||||
return (1,'Invitation rejected')
|
||||
else:
|
||||
return (0,'This request was not for you')
|
||||
|
||||
|
||||
def send_invite_email(id):
|
||||
@@ -186,6 +262,132 @@ def send_invite_email(id):
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
def send_email_member_dropped(teamid,rower):
|
||||
t = Team.objects.get(id=teamid)
|
||||
u = rower.user
|
||||
teamname = t.name
|
||||
email = u.email
|
||||
name = u.first_name+' '+u.last_name
|
||||
manager = t.manager.first_name+' '+t.manager.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_member_dropped.delay(email,name,teamname,manager)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_member_dropped,
|
||||
email,name,teamname,manager)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
|
||||
def send_request_accept_email(rekwest):
|
||||
id = rekwest.id
|
||||
email = rekwest.user.email
|
||||
teamname = rekwest.team.name
|
||||
name = rekwest.user.first_name+' '+rekwest.user.last_name
|
||||
manager = rekwest.team.manager.first_name+' '+rekwest.team.manager.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_request_accept.delay(email,name,teamname,manager)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_request_accept,
|
||||
email,name,teamname,manager)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
|
||||
def send_request_reject_email(rekwest):
|
||||
id = rekwest.id
|
||||
teamname = rekwest.team.name
|
||||
email = rekwest.user.email
|
||||
name = rekwest.user.first_name+' '+rekwest.user.last_name
|
||||
manager = rekwest.team.manager.first_name+' '+rekwest.team.manager.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_request_reject.delay(email,name,teamname,manager)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_request_reject,
|
||||
email,name,teamname,manager)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
|
||||
def send_invite_reject_email(invitation):
|
||||
id = invitation.id
|
||||
email = invitation.team.manager.email
|
||||
if invitation.user:
|
||||
name = invitation.user.first_name+' '+invitation.user.last_name
|
||||
else:
|
||||
name = invitation.email
|
||||
|
||||
teamname = invitation.team.name
|
||||
manager = invitation.team.manager.first_name+' '+invitation.team.manager.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_invite_reject.delay(email,name,teamname,manager)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_invite_reject,
|
||||
email,name,teamname,manager)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
|
||||
def send_invite_accept_email(invitation):
|
||||
id = invitation.id
|
||||
email = invitation.team.manager.email
|
||||
if invitation.user:
|
||||
name = invitation.user.first_name+' '+invitation.user.last_name
|
||||
else:
|
||||
name = invitation.email
|
||||
|
||||
teamname = invitation.team.name
|
||||
manager = invitation.team.manager.first_name+' '+invitation.team.manager.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_invite_accept.delay(email,name,teamname,manager)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_invite_accept,
|
||||
email,name,teamname,manager)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
|
||||
|
||||
def send_request_email(rekwest):
|
||||
email = rekwest.team.manager.email
|
||||
id = rekwest.id
|
||||
name = rekwest.team.manager.first_name + " " + rekwest.team.manager.last_name
|
||||
code = rekwest.code
|
||||
teamname = rekwest.team.name
|
||||
requestor = rekwest.user.first_name+' '+rekwest.user.last_name
|
||||
|
||||
if settings.DEBUG:
|
||||
res = handle_sendemail_request.delay(email,name,code,teamname,
|
||||
requestor,id)
|
||||
else:
|
||||
res = queuehigh.enqueue(handle_sendemail_request,
|
||||
email,name,code,teamname,requestor,id)
|
||||
|
||||
return (1,'Invitation email sent')
|
||||
|
||||
def process_request_code(manager,code):
|
||||
code = code.upper()
|
||||
|
||||
try:
|
||||
rekwest = TeamRequest.objects.get(code=code)
|
||||
except TeamRequest.DoesNotExist:
|
||||
return (0,'The request has been revoked or the code is invalid')
|
||||
|
||||
r = Rower.objects.get(user=rekwest.user)
|
||||
t = rekwest.team
|
||||
|
||||
if rekwest.team.manager != manager:
|
||||
return (0,'You are not the manager of this team')
|
||||
|
||||
result = add_member(t.id,r)
|
||||
send_request_accept_email(rekwest)
|
||||
rekwest.delete()
|
||||
return result
|
||||
|
||||
def process_invite_code(user,code):
|
||||
code = code.upper()
|
||||
try:
|
||||
@@ -196,11 +398,12 @@ def process_invite_code(user,code):
|
||||
r = Rower.objects.get(user=user)
|
||||
nu = datetime.date(timezone.now())
|
||||
if nu > invitation.issuedate+timedelta(days=inviteduration):
|
||||
revoke_invite(invitation.id)
|
||||
revoke_invite(invitation.team.manager,invitation.id)
|
||||
return (0,'The invitation has expired')
|
||||
|
||||
t = invitation.team
|
||||
result = add_member(t.id,r)
|
||||
send_invite_accept_email(invitation.id)
|
||||
invitation.delete()
|
||||
return result
|
||||
|
||||
@@ -209,6 +412,6 @@ def remove_expired_invites():
|
||||
issuedate = datetime.date(issuedate)
|
||||
invitations = TeamInvite.objects.filter(issuedate__lt=issuedate)
|
||||
for i in invitations:
|
||||
revoke_invite(i.id)
|
||||
revoke_invite(i.team.manager,i.id)
|
||||
|
||||
return (1,'Expired invitations deleted')
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
<div class="grid_2 suffix_10 alpha">
|
||||
<a class="button red small" href="/rowers/team/{{ team.id }}/leaveconfirm">Leave this team</a>
|
||||
</div>
|
||||
{% elif hasrequested %}
|
||||
<p>You have requested access to this team</p>
|
||||
{% else %}
|
||||
<div class="grid_2 suffix_10 alpha tooltip">
|
||||
<a class="button green small" href="/rowers/team/{{ team.id }}/requestmembership/{{ user.id }}">Join</a>
|
||||
@@ -21,16 +23,22 @@
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>Members</h2>
|
||||
<table width="100%" class="listtable">
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for member in members %}
|
||||
<tr>
|
||||
<td> {{ member.user.first_name }} {{ member.user.last_name }}</td>
|
||||
{% if team.manager == user %}
|
||||
<td><a class="button red small" href="/rowers/me/team/{{ team.id }}/drop/{{ member.user.id }}">Drop</a></td>
|
||||
{% else %}
|
||||
<td> </td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@@ -41,7 +49,7 @@
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{% if team.manager == user %}
|
||||
<p>Use the form to add a new user. You can either select a user from the slist, or you can type his email address, which also works for users who have not registered to the site yet.</p>
|
||||
<p>Use the form to add a new user. You can either select a user from the list of your existing club members who are not on this team yet, or you can type the user's email address, which also works for users who have not registered to the site yet.</p>
|
||||
{% if inviteform.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ inviteform.errors|pluralize }} below.
|
||||
|
||||
@@ -38,14 +38,16 @@
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{% if invites %}
|
||||
{% if invites or requests or myrequests %}
|
||||
<p>
|
||||
<h2>Invitations</h2>
|
||||
<table width="70%" class="listtable">
|
||||
<h2>Invitations and Requests</h2>
|
||||
<table width="90%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Team</th>
|
||||
<th>Manager</th>
|
||||
<th>User</th>
|
||||
<th>Action</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -54,7 +56,32 @@
|
||||
<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>
|
||||
<td>{{ user.first_name }} {{ user.last_name }}</td>
|
||||
<td><a class="button small green" href="/rowers/me/invitation/{{ i.code }}">Accept</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="button small red" href="/rowers/me/invitation/{{ i.id }}/reject">Reject</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for i in requests %}
|
||||
<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>{{ user.first_name }} {{ user.last_name }}</td>
|
||||
<td></td>
|
||||
<td><a class="button red small" href="/rowers/me/request/{{ i.id }}/revoke">Revoke</a>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% for i in myrequests %}
|
||||
<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>{{ user.first_name }} {{ user.last_name }}</td>
|
||||
<td><a class="button small green" href="/rowers/me/request/{{ i.code }}">Accept</a>
|
||||
<td>
|
||||
<a class="button small red" href="/rowers/me/request/{{ i.id }}/reject">Reject</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
@@ -199,8 +199,11 @@ urlpatterns = [
|
||||
url(r'^workout/(\d+)/stravauploadw/$',views.workout_strava_upload_view),
|
||||
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'^me/teams/c/(?P<message>\w+.*)/s/(?P<successmessage>\w+.*)$',views.rower_teams_view),
|
||||
url(r'^me/teams/s/(?P<successmessage>\w+.*)$',views.rower_teams_view),
|
||||
url(r'^me/teams/c/(?P<message>\w+.*)$',views.rower_teams_view),
|
||||
url(r'^team/(?P<id>\d+)/s/(?P<successmessage>\w+.*)/c/(?P<message>\w+.*)$',views.team_view),
|
||||
url(r'^me/teams/$',views.rower_teams_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),
|
||||
@@ -210,9 +213,16 @@ urlpatterns = [
|
||||
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/team/(\d+)/drop/(\d+)$',views.manager_member_drop_view),
|
||||
url(r'^me/invitation/(\d+)/reject$',views.invitation_reject_view),
|
||||
url(r'^me/invitation/c/(?P<message>\w+.*)/$',views.rower_invitations_view),
|
||||
url(r'^me/invitation/$',views.rower_invitations_view),
|
||||
url(r'^me/invitation/(\w+.*)/$',views.rower_invitations_view),
|
||||
url(r'^me/request/c/(?P<message>\w+.*)/$',views.manager_requests_view),
|
||||
url(r'^me/request/(\d+)/revoke',views.request_revoke_view),
|
||||
url(r'^me/request/(\d+)/reject',views.request_reject_view),
|
||||
url(r'^me/request/(\w+.*)/$',views.manager_requests_view),
|
||||
url(r'^me/request/$',views.manager_requests_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),
|
||||
url(r'^me/edit/$',views.rower_edit_view),
|
||||
|
||||
154
rowers/views.py
154
rowers/views.py
@@ -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,TeamInvite
|
||||
Team,TeamForm,TeamInviteForm,TeamInvite,TeamRequest
|
||||
)
|
||||
from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement
|
||||
from django.forms.formsets import formset_factory
|
||||
@@ -5291,8 +5291,9 @@ import teams
|
||||
|
||||
@login_required()
|
||||
def team_view(request,id=0,message='',successmessage=''):
|
||||
ismember = 0
|
||||
ismember = 0
|
||||
hasrequested = 0
|
||||
r = Rower.objects.get(user=request.user)
|
||||
myteams = Team.objects.filter(manager=request.user)
|
||||
|
||||
|
||||
@@ -5304,6 +5305,7 @@ def team_view(request,id=0,message='',successmessage=''):
|
||||
|
||||
|
||||
if request.method == 'POST' and request.user == t.manager:
|
||||
inviteform = TeamInviteForm(request.POST)
|
||||
inviteform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).exclude(rower__team__name=t.name)
|
||||
if inviteform.is_valid():
|
||||
cd = inviteform.cleaned_data
|
||||
@@ -5319,14 +5321,19 @@ def team_view(request,id=0,message='',successmessage=''):
|
||||
message = text
|
||||
|
||||
elif request.user == t.manager:
|
||||
inviteform = TeamInviteForm()
|
||||
inviteform = TeamInviteForm()
|
||||
inviteform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).exclude(rower__team__name=t.name)
|
||||
else:
|
||||
inviteform = ''
|
||||
|
||||
members = Rower.objects.filter(team=t).order_by('user__last_name','user__first_name')
|
||||
thisteammyrequests = TeamRequest.objects.filter(team=t,user=request.user)
|
||||
if len(thisteammyrequests):
|
||||
hasrequested = 1
|
||||
|
||||
if r in members:
|
||||
ismember = 1
|
||||
|
||||
|
||||
|
||||
return render(request, 'team.html',
|
||||
@@ -5336,6 +5343,7 @@ def team_view(request,id=0,message='',successmessage=''):
|
||||
'inviteform':inviteform,
|
||||
'message':message,
|
||||
'successmessage':successmessage,
|
||||
'ismember':ismember,
|
||||
'hasrequested':hasrequested,
|
||||
})
|
||||
|
||||
@@ -5360,7 +5368,7 @@ def team_leave_view(request,id=0):
|
||||
response = HttpResponseRedirect(url)
|
||||
return response
|
||||
|
||||
@login_required()
|
||||
@login_required()
|
||||
def rower_teams_view(request,message='',successmessage=''):
|
||||
r = Rower.objects.get(user=request.user)
|
||||
ts = Team.objects.filter(rower=r)
|
||||
@@ -5368,6 +5376,8 @@ def rower_teams_view(request):
|
||||
otherteams = Team.objects.filter(private='open').exclude(rower=r).exclude(manager=request.user).order_by('name')
|
||||
teams.remove_expired_invites()
|
||||
|
||||
invites = TeamInvite.objects.filter(user=request.user)
|
||||
requests = TeamRequest.objects.filter(user=request.user)
|
||||
myrequests = TeamRequest.objects.filter(team__in=myteams)
|
||||
|
||||
return render(request, 'teams.html',
|
||||
@@ -5375,8 +5385,118 @@ def rower_teams_view(request):
|
||||
'teams':ts,
|
||||
'myteams':myteams,
|
||||
'invites':invites,
|
||||
'otherteams':otherteams,
|
||||
'requests':requests,
|
||||
'myrequests':myrequests,
|
||||
'message':message,
|
||||
'successmessage':successmessage,
|
||||
})
|
||||
|
||||
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
|
||||
def manager_member_drop_view(request,teamid,userid,
|
||||
message='',successmessage=''):
|
||||
rower = Rower.objects.get(user__id=userid)
|
||||
res, text = teams.mgr_remove_member(teamid,request.user,rower)
|
||||
if res:
|
||||
successmessage = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'successmessage':successmessage
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'message':message
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
|
||||
def manager_requests_view(request,code=None,message='',successmessage=''):
|
||||
if code:
|
||||
res,text = teams.process_request_code(request.user,code)
|
||||
if res:
|
||||
successmessage = text
|
||||
message = ''
|
||||
else:
|
||||
message = text
|
||||
successmessage = ''
|
||||
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
})
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
@login_required()
|
||||
def team_requestmembership_view(request,teamid,userid):
|
||||
t = Team.objects.get(id=teamid)
|
||||
res,text = teams.create_request(t,userid)
|
||||
if res:
|
||||
successmessage = text
|
||||
url = reverse(team_view,kwargs={
|
||||
'id':teamid,
|
||||
'successmessage': successmessage,
|
||||
})
|
||||
|
||||
else:
|
||||
message = text
|
||||
url = reverse(team_view,kwargs={
|
||||
'id':teamid,
|
||||
'message': message,
|
||||
})
|
||||
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@login_required()
|
||||
def request_revoke_view(request,id=0):
|
||||
res,text = teams.revoke_request(request.user,id)
|
||||
|
||||
if res:
|
||||
successmessage = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'successmessage':successmessage,
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'message':message,
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
|
||||
def request_reject_view(request,id=0):
|
||||
res,text = teams.reject_request(request.user,id)
|
||||
|
||||
if res:
|
||||
successmessage = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'successmessage':successmessage,
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'message':message,
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
|
||||
def invitation_reject_view(request,id=0):
|
||||
res,text = teams.reject_invitation(request.user,id)
|
||||
|
||||
if res:
|
||||
successmessage = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'successmessage':successmessage,
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
'message':message,
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@login_required()
|
||||
def rower_invitations_view(request,code=None,message='',successmessage=''):
|
||||
@@ -5393,32 +5513,16 @@ def rower_invitations_view(request,code=None,message='',successmessage=''):
|
||||
})
|
||||
else:
|
||||
message = text
|
||||
url = reverse(rower_invitations_view,kwargs={
|
||||
url = reverse(rower_invitations_view,kwargs={
|
||||
'message':message,
|
||||
})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
url = reverse(rower_teams_view,kwargs={
|
||||
})
|
||||
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').exclude(rower=r).exclude(manager=request.user).order_by('name')
|
||||
|
||||
return render(request, 'teams.html',
|
||||
{
|
||||
'teams':ts,
|
||||
'myteams':myteams,
|
||||
'invites':invites,
|
||||
'message':message,
|
||||
'successmessage':successmessage,
|
||||
'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)
|
||||
def team_create_view(request):
|
||||
|
||||
Reference in New Issue
Block a user