Changeset - a4dea58195bc
[Not reviewed]
0 4 0
James Tauber - 12 years ago 2012-08-02 02:49:27
jtauber@jtauber.com
implemented join/leave teams
4 files changed with 87 insertions and 13 deletions:
0 comments (0 inline, 0 general)
symposion/teams/urls.py
Show inline comments
...
 
@@ -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"),
 
    
 
)
symposion/teams/views.py
Show inline comments
 
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)
symposion_project/templates/dashboard.html
Show inline comments
...
 
@@ -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 %}
symposion_project/templates/teams/team_detail.html
Show inline comments
...
 
@@ -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 %}
0 comments (0 inline, 0 general)