Skip to content

Commit

Permalink
Merge pull request #79 from LCOGT/fix/many-proposal-invites
Browse files Browse the repository at this point in the history
Fix/many proposal invites
  • Loading branch information
eheinrich committed Sep 16, 2019
2 parents f7e0dd1 + a5830ac commit 6273b44
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
10 changes: 8 additions & 2 deletions observation_portal/accounts/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,14 @@ def save(self, commit=True):
view_authored_requests_only=self.cleaned_data['education_user'],
simple_interface=self.cleaned_data['education_user']
)
for invite in ProposalInvite.objects.filter(email__iexact=new_user_instance.email):
invite.accept(new_user_instance)
# There may be more than one proposal invite for the same proposal for the same user. Use the latest invite
# that was sent if this is the case.
proposal_invites = {}
for proposal_invite in ProposalInvite.objects.filter(email__iexact=new_user_instance.email).order_by('sent'):
proposal_invites[proposal_invite.proposal.id] = proposal_invite

for proposal_id in proposal_invites:
proposal_invites[proposal_id].accept(new_user_instance)

return new_user_instance

Expand Down
20 changes: 20 additions & 0 deletions observation_portal/accounts/test_views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from datetime import datetime
from django.test import TestCase
from django.urls import reverse
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
from django.contrib import auth
from mixer.backend.django import mixer
from django.utils import timezone
from django.core import mail
from django_dramatiq.test import DramatiqTestCase

Expand Down Expand Up @@ -122,6 +124,24 @@ def test_registration_with_multiple_invites(self):
self.assertTrue(invitation.used)
self.assertTrue(Membership.objects.filter(user__username=self.reg_data['username']).exists())

def test_reqistration_with_multiple_invites_for_same_proposal(self):
proposal = mixer.blend(Proposal)
first_invitation = mixer.blend(
ProposalInvite, email=self.reg_data['email'], proposal=proposal,
sent=datetime(year=2018, month=10, day=10, tzinfo=timezone.utc), used=None
)
second_invitation = mixer.blend(
ProposalInvite, email=self.reg_data['email'].upper(), proposal=proposal,
sent=datetime(year=2019, month=10, day=10, tzinfo=timezone.utc), used=None
)
self.assertEqual(ProposalInvite.objects.all().count(), 2)
self.client.post(reverse('registration_register'), self.reg_data, follow=True)
first_invitation.refresh_from_db()
second_invitation.refresh_from_db()
self.assertFalse(first_invitation.used)
self.assertTrue(second_invitation.used)
self.assertTrue(Membership.objects.filter(user__username=self.reg_data['username']).exists())

def test_education_register(self):
reg_data = self.reg_data.copy()
reg_data['education_user'] = True
Expand Down
11 changes: 11 additions & 0 deletions observation_portal/proposals/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,17 @@ def test_validate_email(self):
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Please enter a valid email address')

def test_pi_cannot_invite_themselves_as_coi(self):
self.client.force_login(self.pi_user)
response = self.client.post(
reverse('proposals:invite', kwargs={'pk': self.proposal.id}),
data={'email': self.pi_user.email},
follow=True
)
self.assertFalse(ProposalInvite.objects.filter(email=self.pi_user.email, proposal=self.proposal).exists())
self.assertEqual(response.status_code, 200)
self.assertContains(response, f'You cannot invite yourself ({self.pi_user.email}) to be a Co-Investigator')


class TestProposalList(TestCase):
def setUp(self):
Expand Down
5 changes: 4 additions & 1 deletion observation_portal/proposals/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@ def post(self, request, **kwargs):
validate_email(email)
except ValidationError:
valid = False
messages.error(request, _('Please enter a valid email address: {}'.format(email)))
messages.error(request, _(f'Please enter a valid email address: {email}'))
if email.lower() == request.user.email.lower():
messages.error(request, f'You cannot invite yourself ({email}) to be a Co-Investigator')
valid = False
if valid:
proposal.add_users(emails, Membership.CI)
messages.success(request, _('Co Investigator(s) invited'))
Expand Down

0 comments on commit 6273b44

Please sign in to comment.