implemented join/leave teams
This commit is contained in:
parent
4f888ffd57
commit
a4dea58195
4 changed files with 87 additions and 13 deletions
|
@ -2,5 +2,8 @@ from django.conf.urls.defaults import *
|
|||
|
||||
|
||||
urlpatterns = patterns("symposion.teams.views",
|
||||
url(r"^([\w\-]+)/$", "team_detail", name="team_detail"),
|
||||
url(r"^(?P<slug>[\w\-]+)/$", "team_detail", name="team_detail"),
|
||||
url(r"^(?P<slug>[\w\-]+)/join/$", "team_join", name="team_join"),
|
||||
url(r"^(?P<slug>[\w\-]+)/leave/$", "team_leave", name="team_leave"),
|
||||
|
||||
)
|
||||
|
|
|
@ -1,9 +1,35 @@
|
|||
from django.http import Http404
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
||||
from symposion.teams.models import Team
|
||||
from symposion.teams.models import Team, Membership
|
||||
|
||||
|
||||
## perm checks
|
||||
#
|
||||
# @@@ these can be moved
|
||||
|
||||
def can_join(team, user):
|
||||
state = team.get_state_for_user(user)
|
||||
|
||||
if team.access == "open" and state is None:
|
||||
return True
|
||||
elif team.access == "invitation" and state is "invited":
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def can_leave(team, user):
|
||||
state = team.get_state_for_user(user)
|
||||
if state == "member": # managers can't leave at the moment
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
## views
|
||||
|
||||
|
||||
@login_required
|
||||
|
@ -16,4 +42,39 @@ def team_detail(request, slug):
|
|||
return render(request, "teams/team_detail.html", {
|
||||
"team": team,
|
||||
"state": state,
|
||||
"can_join": can_join(team, request.user),
|
||||
"can_leave": can_leave(team, request.user),
|
||||
})
|
||||
|
||||
|
||||
@login_required
|
||||
def team_join(request, slug):
|
||||
team = get_object_or_404(Team, slug=slug)
|
||||
state = team.get_state_for_user(request.user)
|
||||
if team.access == "invitation" and state is None:
|
||||
raise Http404()
|
||||
|
||||
if can_join(team, request.user) and request.method == "POST":
|
||||
membership, created = Membership.objects.get_or_create(team=team, user=request.user)
|
||||
membership.state = "member"
|
||||
membership.save()
|
||||
# contrib.message
|
||||
return redirect("team_detail", slug=slug)
|
||||
else:
|
||||
return redirect("team_detail", slug=slug)
|
||||
|
||||
|
||||
@login_required
|
||||
def team_leave(request, slug):
|
||||
team = get_object_or_404(Team, slug=slug)
|
||||
state = team.get_state_for_user(request.user)
|
||||
if team.access == "invitation" and state is None:
|
||||
raise Http404()
|
||||
|
||||
if can_leave(team, request.user) and request.method == "POST":
|
||||
membership = Membership.objects.get(team=team, user=request.user)
|
||||
membership.delete()
|
||||
# contrib.message
|
||||
return redirect("dashboard")
|
||||
else:
|
||||
return redirect("team_detail", slug=slug)
|
||||
|
|
|
@ -132,18 +132,14 @@
|
|||
<div class="dashboard-panel-content">
|
||||
{% if user.memberships.exists %}
|
||||
<h4>Your Teams</h4>
|
||||
<ul>
|
||||
<dl>
|
||||
{% for membership in user.memberships.all %}
|
||||
<li>
|
||||
{% if membership.state == "manager" %}
|
||||
<a href="{% url team_detail membership.team.slug %}">{{ membership.team.name }}</a>
|
||||
{% else %}
|
||||
{{ membership.team.name }}
|
||||
{% endif %}
|
||||
<span class="badge">{{ membership.get_state_display }}</span>
|
||||
</li>
|
||||
<dt>
|
||||
<a href="{% url team_detail membership.team.slug %}">{{ membership.team.name }}</a>
|
||||
<span class="label">{{ membership.get_state_display }}</span>
|
||||
</dt>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</dl>
|
||||
{% endif %}
|
||||
{% available_teams as available_teams %}
|
||||
{% if available_teams %}
|
||||
|
|
|
@ -5,4 +5,18 @@
|
|||
{% block body %}
|
||||
<h1>{{ team.name }}</h1>
|
||||
|
||||
{% if can_join %}
|
||||
<form method="post" action="{% url team_join team.slug %}">
|
||||
{% csrf_token %}
|
||||
<input type="submit" class="btn btn-primary" value="join">
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
{% if can_leave %}
|
||||
<form method="post" action="{% url team_leave team.slug %}">
|
||||
{% csrf_token %}
|
||||
<input type="submit" class="btn" value="leave">
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
|
Loading…
Reference in a new issue