Files @ 7fe481ee98c5
Branch filter:

Location: symposion_app/symposion/teams/views.py - annotation

James Tauber
implemented team accept/reject
86a346f62804
a4dea58195bc
86a346f62804
86a346f62804
86a346f62804
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
7de1763de0d0
7de1763de0d0
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
7de1763de0d0
7de1763de0d0
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
a4dea58195bc
86a346f62804
86a346f62804
86a346f62804
86a346f62804
86a346f62804
4f888ffd576e
e96e416bdce9
86a346f62804
6e67b505013b
86a346f62804
6e67b505013b
4f888ffd576e
a4dea58195bc
a4dea58195bc
1bfd0cc2f048
86a346f62804
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
e96e416bdce9
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
e96e416bdce9
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
a4dea58195bc
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
e96e416bdce9
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
1bfd0cc2f048
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
2c69596ec668
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
7fe481ee98c5
from django.http import Http404
from django.shortcuts import render, redirect, get_object_or_404

from django.contrib.auth.decorators import login_required

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
    elif user.is_staff and state is None:
        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


def can_apply(team, user):
    state = team.get_state_for_user(user)
    if team.access == "application" and state is None:
        return True
    elif user.is_staff and state is None:
        return True
    else:
        return False


## 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()
    
    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),
        "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()
        # 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 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()
        # contrib.message
        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()
        # contrib.message
        return redirect("team_detail", slug=slug)
    else:
        return redirect("team_detail", slug=slug)


@login_required
def team_promote(request, pk):
    if request.method == "POST":
        membership = get_object_or_404(Membership, pk=pk)
        state = membership.team.get_state_for_user(request.user)
        if request.user.is_staff or state == "manager":
            if membership.state == "member":
                membership.state = "manager"
                membership.save()
                # contrib.message
    return redirect("team_detail", slug=membership.team.slug)


@login_required
def team_demote(request, pk):
    if request.method == "POST":
        membership = get_object_or_404(Membership, pk=pk)
        state = membership.team.get_state_for_user(request.user)
        if request.user.is_staff or state == "manager":
            if membership.state == "manager":
                membership.state = "member"
                membership.save()
                # contrib.message
    return redirect("team_detail", slug=membership.team.slug)


@login_required
def team_accept(request, pk):
    if request.method == "POST":
        membership = get_object_or_404(Membership, pk=pk)
        state = membership.team.get_state_for_user(request.user)
        if request.user.is_staff or state == "manager":
            if membership.state == "applied":
                membership.state = "member"
                membership.save()
                # contrib.message
    return redirect("team_detail", slug=membership.team.slug)


@login_required
def team_reject(request, pk):
    if request.method == "POST":
        membership = get_object_or_404(Membership, pk=pk)
        state = membership.team.get_state_for_user(request.user)
        if request.user.is_staff or state == "manager":
            if membership.state == "applied":
                membership.state = "rejected"
                membership.save()
                # contrib.message
    return redirect("team_detail", slug=membership.team.slug)