implemented invitations
This commit is contained in:
parent
7fe481ee98
commit
4272c8f8a8
3 changed files with 94 additions and 0 deletions
50
symposion/teams/forms.py
Normal file
50
symposion/teams/forms.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
from django import forms
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from symposion.teams.models import Membership
|
||||
|
||||
|
||||
class TeamInvitationForm(forms.Form):
|
||||
|
||||
email = forms.EmailField(help_text="email address must be that of a user on the site")
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.team = kwargs.pop("team")
|
||||
super(TeamInvitationForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super(TeamInvitationForm, self).clean()
|
||||
email = cleaned_data.get("email")
|
||||
|
||||
if email is None:
|
||||
raise forms.ValidationError("valid email address required")
|
||||
|
||||
try:
|
||||
user = User.objects.get(email=email)
|
||||
except User.DoesNotExist:
|
||||
# eventually we can invite them but for now assume they are
|
||||
# already on the site
|
||||
raise forms.ValidationError("no known user with email address %s" % email)
|
||||
|
||||
state = self.team.get_state_for_user(user)
|
||||
|
||||
if state in ["member", "manager"]:
|
||||
raise forms.ValidationError("user already in team")
|
||||
|
||||
if state in ["invited"]:
|
||||
raise forms.ValidationError("user already invited to team")
|
||||
|
||||
self.user = user
|
||||
self.state = state
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def invite(self):
|
||||
if self.state is None:
|
||||
Membership.objects.create(team=self.team, user=self.user, state="invited")
|
||||
elif self.state == "applied":
|
||||
# if they applied we shortcut invitation process
|
||||
membership = Membership.objects.get(team=self.team, user=self.user)
|
||||
membership.state = "member"
|
||||
membership.save()
|
|
@ -3,6 +3,7 @@ from django.shortcuts import render, redirect, get_object_or_404
|
|||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
||||
from symposion.teams.forms import TeamInvitationForm
|
||||
from symposion.teams.models import Team, Membership
|
||||
|
||||
|
||||
|
@ -41,6 +42,14 @@ def can_apply(team, user):
|
|||
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
|
||||
|
||||
|
||||
|
@ -51,9 +60,22 @@ def team_detail(request, slug):
|
|||
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()
|
||||
# contrib.message
|
||||
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),
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
{% extends "site_base.html" %}
|
||||
|
||||
{% load bootstrap_tags %}
|
||||
|
||||
{% block head_title %}{{ team.name }}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
|
@ -69,5 +71,25 @@
|
|||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
{% if team.invitees %}
|
||||
<h2>Invitees</h2>
|
||||
<table class="table table-striped">
|
||||
{% for membership in team.invitees %}
|
||||
<tr>
|
||||
<td>{{ membership.user.email }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
{% if invite_form %}
|
||||
<form method="POST" action="" class="form-horizontal">
|
||||
{% csrf_token %}
|
||||
<legend>Invite User to Team</legend>
|
||||
{{ invite_form|as_bootstrap }}
|
||||
<div class="form-actions">
|
||||
<input class="btn btn-primary" type="submit" value="Invite" />
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
Loading…
Reference in a new issue