File diff 96596dc5ddb2 → 6d5c24e6354f
symposion/teams/views.py
Show inline comments
 
from django.http import Http404, HttpResponseNotAllowed
 
from django.shortcuts import render, redirect, get_object_or_404
 

	
 
from django.contrib.auth.decorators import login_required
 
from django.contrib import messages
 

	
 
from symposion.utils.mail import send_email
 

	
 
from symposion.teams.forms import TeamInvitationForm
 
from symposion.teams.models import Team, Membership
 

	
 

	
 
## perm checks
 
# 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 state == "invited":
 
        return True
 
    elif user.is_staff and state is None:
 
        return True
 
    else:
...
 
@@ -41,97 +41,97 @@ def can_apply(team, user):
 
    else:
 
        return False
 

	
 

	
 
def can_invite(team, user):
 
    state = team.get_state_for_user(user)
 
    if team.access == "invitation":
 
        if state == "manager" or user.is_staff:
 
            return True
 
    return False
 

	
 

	
 
## views
 
# views
 

	
 

	
 
@login_required
 
def team_detail(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 and not request.user.is_staff:
 
        raise Http404()
 
    
 

 
    if can_invite(team, request.user):
 
        if request.method == "POST":
 
            form = TeamInvitationForm(request.POST, team=team)
 
            if form.is_valid():
 
                form.invite()
 
                send_email([form.user.email], "teams_user_invited", context={"team": team})
 
                messages.success(request, "Invitation created.")
 
                return redirect("team_detail", slug=slug)
 
        else:
 
            form = TeamInvitationForm(team=team)
 
    else:
 
        form = None
 
    
 

 
    return render(request, "teams/team_detail.html", {
 
        "team": team,
 
        "state": state,
 
        "invite_form": form,
 
        "can_join": can_join(team, request.user),
 
        "can_leave": can_leave(team, request.user),
 
        "can_apply": can_apply(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 and not request.user.is_staff:
 
        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()
 
        messages.success(request, "Joined team.")
 
        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 and not request.user.is_staff:
 
        raise Http404()
 
    
 

 
    if can_leave(team, request.user) and request.method == "POST":
 
        membership = Membership.objects.get(team=team, user=request.user)
 
        membership.delete()
 
        messages.success(request, "Left team.")
 
        return redirect("dashboard")
 
    else:
 
        return redirect("team_detail", slug=slug)
 

	
 

	
 
@login_required
 
def team_apply(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 and not request.user.is_staff:
 
        raise Http404()
 
    
 

 
    if can_apply(team, request.user) and request.method == "POST":
 
        membership, created = Membership.objects.get_or_create(team=team, user=request.user)
 
        membership.state = "applied"
 
        membership.save()
 
        managers = [m.user.email for m in team.managers()]
 
        send_email(managers, "teams_user_applied", context={
 
            "team": team,
 
            "user": request.user
 
        })
 
        messages.success(request, "Applied to join team.")
 
        return redirect("team_detail", slug=slug)
 
    else: