Files
@ 64b4d93470bd
Branch filter:
Location: symposion_app/vendor/symposion/teams/views.py - annotation
64b4d93470bd
6.4 KiB
text/x-python
Add django-user-accounts app for use in place of SSO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | bb2ffd2df062 a4dea58195bc 86a346f62804 5fed9fef176f d5986de87043 3207621058b8 7f0c8496c74a 11f697d13757 4272c8f8a8b4 a4dea58195bc a4dea58195bc a4dea58195bc 36ab6d599ffc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc da9db62b9ad2 a4dea58195bc 7de1763de0d0 7de1763de0d0 a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 36ab6d599ffc 86a346f62804 86a346f62804 86a346f62804 86a346f62804 86a346f62804 4f888ffd576e e96e416bdce9 86a346f62804 36ab6d599ffc 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 7f0c8496c74a 3207621058b8 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 4272c8f8a8b4 36ab6d599ffc 11f697d13757 6e67b505013b 4f888ffd576e 4272c8f8a8b4 a4dea58195bc a4dea58195bc 1bfd0cc2f048 86a346f62804 a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc e96e416bdce9 a4dea58195bc 36ab6d599ffc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc 3207621058b8 a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc a4dea58195bc e96e416bdce9 a4dea58195bc 36ab6d599ffc a4dea58195bc a4dea58195bc a4dea58195bc 3207621058b8 a4dea58195bc a4dea58195bc a4dea58195bc 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 e96e416bdce9 1bfd0cc2f048 36ab6d599ffc 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 7f0c8496c74a 7f0c8496c74a 7f0c8496c74a 7f0c8496c74a 7f0c8496c74a 3207621058b8 1bfd0cc2f048 1bfd0cc2f048 1bfd0cc2f048 2c69596ec668 2c69596ec668 2c69596ec668 2c69596ec668 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 3207621058b8 2c69596ec668 2c69596ec668 2c69596ec668 2c69596ec668 2c69596ec668 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 3207621058b8 2c69596ec668 7fe481ee98c5 7fe481ee98c5 7fe481ee98c5 7fe481ee98c5 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 3207621058b8 7fe481ee98c5 7fe481ee98c5 7fe481ee98c5 7fe481ee98c5 7fe481ee98c5 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 bb2ffd2df062 3207621058b8 7fe481ee98c5 | from django.http import Http404, HttpResponseNotAllowed
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext_lazy as _
from symposion.utils.mail import send_email
from symposion.teams.forms import TeamInvitationForm
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 state == "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
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
@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, "symposion/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:
return redirect("team_detail", slug=slug)
@login_required
def team_promote(request, pk):
if request.method != "POST":
return HttpResponseNotAllowed(["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()
messages.success(request, _("Promoted to manager."))
return redirect("team_detail", slug=membership.team.slug)
@login_required
def team_demote(request, pk):
if request.method != "POST":
return HttpResponseNotAllowed(["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()
messages.success(request, _("Demoted from manager."))
return redirect("team_detail", slug=membership.team.slug)
@login_required
def team_accept(request, pk):
if request.method != "POST":
return HttpResponseNotAllowed(["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()
messages.success(request, _("Accepted application."))
return redirect("team_detail", slug=membership.team.slug)
@login_required
def team_reject(request, pk):
if request.method != "POST":
return HttpResponseNotAllowed(["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()
messages.success(request, _("Rejected application."))
return redirect("team_detail", slug=membership.team.slug)
|