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…
	
	Add table
		
		Reference in a new issue