Fix #1247 -- Allow team invites to be resent (#1250)

* Fix #1247 -- Allow team invites to be resent

* Test resending invalid invites

* Fix tooltip

* Fix test

* Handle invalid types for pk parameter

* Style button
This commit is contained in:
Sohalt
2019-04-16 16:39:31 +02:00
committed by Raphael Michel
parent 66dd7c448b
commit 651f429ffb
5 changed files with 61 additions and 3 deletions

View File

@@ -389,6 +389,9 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
if logentry.action_type == 'pretix.team.invite.created': if logentry.action_type == 'pretix.team.invite.created':
return _('{user} has been invited to the team.').format(user=data.get('email')) return _('{user} has been invited to the team.').format(user=data.get('email'))
if logentry.action_type == 'pretix.team.invite.resent':
return _('Invite for {user} has been resent.').format(user=data.get('email'))
if logentry.action_type == 'pretix.team.invite.deleted': if logentry.action_type == 'pretix.team.invite.deleted':
return _('The invite for {user} has been revoked.').format(user=data.get('email')) return _('The invite for {user} has been revoked.').format(user=data.get('email'))

View File

@@ -51,6 +51,11 @@
{{ i.email }} {{ i.email }}
<span class="fa fa-envelope-o" data-toggle="tooltip" <span class="fa fa-envelope-o" data-toggle="tooltip"
title="{% trans "invited, pending response" %}"></span> title="{% trans "invited, pending response" %}"></span>
<button type="submit" name="resend-invite" value="{{ i.id }}"
data-toggle="tooltip" title="{% trans "resend invite" %}"
class="btn-invisible">
<span class="fa fa-repeat"></span>
</button>
</td> </td>
<td class="text-right"> <td class="text-right">
<button type="submit" name="remove-invite" value="{{ i.id }}" <button type="submit" name="remove-invite" value="{{ i.id }}"

View File

@@ -518,7 +518,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
if 'remove-member' in request.POST: if 'remove-member' in request.POST:
try: try:
user = User.objects.get(pk=request.POST.get('remove-member')) user = User.objects.get(pk=request.POST.get('remove-member'))
except User.DoesNotExist: except (User.DoesNotExist, ValueError):
pass pass
else: else:
other_admin_teams = self.request.organizer.teams.exclude(pk=self.object.pk).filter( other_admin_teams = self.request.organizer.teams.exclude(pk=self.object.pk).filter(
@@ -542,7 +542,7 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
elif 'remove-invite' in request.POST: elif 'remove-invite' in request.POST:
try: try:
invite = self.object.invites.get(pk=request.POST.get('remove-invite')) invite = self.object.invites.get(pk=request.POST.get('remove-invite'))
except TeamInvite.DoesNotExist: except (TeamInvite.DoesNotExist, ValueError):
messages.error(self.request, _('Invalid invite selected.')) messages.error(self.request, _('Invalid invite selected.'))
return redirect(self.get_success_url()) return redirect(self.get_success_url())
else: else:
@@ -555,10 +555,26 @@ class TeamMemberView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin,
messages.success(self.request, _('The invite has been revoked.')) messages.success(self.request, _('The invite has been revoked.'))
return redirect(self.get_success_url()) return redirect(self.get_success_url())
elif 'resend-invite' in request.POST:
try:
invite = self.object.invites.get(pk=request.POST.get('resend-invite'))
except (TeamInvite.DoesNotExist, ValueError):
messages.error(self.request, _('Invalid invite selected.'))
return redirect(self.get_success_url())
else:
self._send_invite(invite)
self.object.log_action(
'pretix.team.invite.resent', user=self.request.user, data={
'email': invite.email
}
)
messages.success(self.request, _('The invite has been resent.'))
return redirect(self.get_success_url())
elif 'remove-token' in request.POST: elif 'remove-token' in request.POST:
try: try:
token = self.object.tokens.get(pk=request.POST.get('remove-token')) token = self.object.tokens.get(pk=request.POST.get('remove-token'))
except TeamAPIToken.DoesNotExist: except (TeamAPIToken.DoesNotExist, ValueError):
messages.error(self.request, _('Invalid token selected.')) messages.error(self.request, _('Invalid token selected.'))
return redirect(self.get_success_url()) return redirect(self.get_success_url())
else: else:

View File

@@ -74,6 +74,11 @@
outline: 0; outline: 0;
} }
.btn-invisible {
background: transparent;
border: transparent;
}
.alert-primary, .alert-warning, .alert-info, .alert-success, .alert-danger { .alert-primary, .alert-warning, .alert-info, .alert-success, .alert-danger {
color: #3b3b3b; color: #3b3b3b;
} }

View File

@@ -103,6 +103,21 @@ def test_team_remove_token(event, admin_user, admin_team, client):
assert not tk.active assert not tk.active
@pytest.mark.django_db
def test_team_resend_invite(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
djmail.outbox = []
inv = admin_team.invites.create(email='foo@example.org')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'resend-invite': str(inv.pk)
}, follow=True)
assert 'Admin team' in resp.rendered_content
assert admin_user.email in resp.rendered_content
assert 'foo@example.org' in resp.rendered_content
assert len(djmail.outbox) == 1
@pytest.mark.django_db @pytest.mark.django_db
def test_team_revoke_invite(event, admin_user, admin_team, client): def test_team_revoke_invite(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')
@@ -225,6 +240,20 @@ def test_remove_last_admin_team(event, admin_user, admin_team, client):
assert 'alert-danger' in resp.rendered_content assert 'alert-danger' in resp.rendered_content
@pytest.mark.django_db
def test_resend_invalid_invite(event, admin_user, admin_team, client):
client.login(email='dummy@dummy.dummy', password='dummy')
djmail.outbox = []
inv = admin_team.invites.create(email='foo@example.org')
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
'resend-invite': inv.pk + 1
}, follow=True)
assert b'alert-danger' in resp.content
assert b'Invalid invite selected.' in resp.content
assert len(djmail.outbox) == 0
@pytest.mark.django_db @pytest.mark.django_db
def test_invite_invalid_token(event, admin_team, client): def test_invite_invalid_token(event, admin_team, client):
i = admin_team.invites.create(email='foo@bar.com') i = admin_team.invites.create(email='foo@bar.com')