forked from CGM_Public/pretix_original
* 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:
@@ -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'))
|
||||||
|
|
||||||
|
|||||||
@@ -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 }}"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user