diff --git a/ietf/ietfauth/tests.py b/ietf/ietfauth/tests.py index 45719c7b1..27ef217ab 100644 --- a/ietf/ietfauth/tests.py +++ b/ietf/ietfauth/tests.py @@ -767,10 +767,13 @@ class OpenIDConnectTests(TestCase): # Get a user for which we want to get access person = PersonFactory() RoleFactory(name_id='chair', person=person) + # an additional email + EmailFactory(person=person) + email_list = person.email_set.all().values_list('address', flat=True) meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) MeetingRegistration.objects.create( meeting=meeting, person=None, first_name=person.first_name(), last_name=person.last_name(), - email=person.email(), ticket_type='full_week', reg_type='remote', affiliation='Some Company', + email=email_list[0], ticket_type='full_week', reg_type='remote', affiliation='Some Company', ) # Get access authorisation @@ -830,7 +833,21 @@ class OpenIDConnectTests(TestCase): for key in [ 'email', 'family_name', 'given_name', 'meeting', 'name', 'roles', 'ticket_type', 'reg_type', 'affiliation', ]: self.assertIn(key, userinfo) + self.assertIn('remote', set(userinfo['reg_type'].split())) + self.assertNotIn('hackathon', set(userinfo['reg_type'].split())) + # Create another registration, with a different email + MeetingRegistration.objects.create( + meeting=meeting, person=None, first_name=person.first_name(), last_name=person.last_name(), + email=email_list[1], ticket_type='one_day', reg_type='hackathon', affiliation='Some Company, Inc', + ) + userinfo = client.do_user_info_request(state=params["state"], scope=args['scope']) + self.assertIn('hackathon', set(userinfo['reg_type'].split())) + self.assertIn('remote', set(userinfo['reg_type'].split())) + self.assertIn('full_week', set(userinfo['ticket_type'].split())) + self.assertIn('Some Company', userinfo['affiliation']) + + # Check that ending a session works r = client.do_end_session_request(state=params["state"], scope=args['scope']) self.assertEqual(r.status_code, 302) self.assertEqual(r.headers["Location"], urlreverse('ietf.ietfauth.views.login')) diff --git a/ietf/ietfauth/utils.py b/ietf/ietfauth/utils.py index 1f2e10098..6f2565b70 100644 --- a/ietf/ietfauth/utils.py +++ b/ietf/ietfauth/utils.py @@ -249,33 +249,32 @@ class OidcExtraScopeClaims(oidc_provider.lib.claims.ScopeClaims): from ietf.stats.models import MeetingRegistration meeting = get_current_ietf_meeting() person = self.user.person - reg = MeetingRegistration.objects.filter(person=person, meeting=meeting).first() - if not reg: - # No person match; try to match by email address. They could - # have registered with a new address and added it to the account - # later. - email_list = person.email_set.values_list('address') - reg = MeetingRegistration.objects.filter(email__in=email_list, meeting=meeting).first() - if reg: + email_list = person.email_set.values_list('address') + q = Q(person=person, meeting=meeting) | Q(email__in=email_list, meeting=meeting) + regs = MeetingRegistration.objects.filter(q).distinct() + for reg in regs: + if not reg.person_id: reg.person = person reg.save() info = {} - if reg: - # maybe register attendence if logged in to follow a meeting + if regs: + # maybe register attendance if logged in to follow a meeting today = datetime.date.today() if meeting.date <= today <= meeting.end_date(): client = ClientRecord.objects.get(client_id=self.client.client_id) - if client.name == 'Meetecho' and not reg.attended: - reg.attended = True - reg.save() + if client.name == 'Meetecho': + for reg in regs: + if not reg.attended: + reg.attended = True + reg.save() # fill in info to return info = { - 'meeting': reg.meeting.number, + 'meeting': meeting.number, # full_week, one_day, student: - 'ticket_type': reg.ticket_type, + 'ticket_type': ' '.join(set( reg.ticket_type for reg in regs )), # in_person, onliine, hackathon: - 'reg_type': reg.reg_type, - 'affiliation': reg.affiliation, + 'reg_type': ' '.join(set( reg.reg_type for reg in regs )), + 'affiliation': ([ reg.affiliation for reg in regs if reg.affiliation ] or [''])[0], } return info