Skip to content

Commit 425cbe2

Browse files
rpcrossrjsparks
andauthored
feat: use new meeting.Registration model (#8983)
* refactor: use new meeting.Registration model for OidcExtraScopeClaims * refactor: use new meeting.Registration model for nomcom eligibility calculations * refactor: use new meeting.Registration model for various meeting views * fix: revert to on_delete=PROTECT * refactor: update new APIs and corresponding tests * fix: tweaks for clarity * fix: fix assert syntax * fix: fix minor issue with MeetingRegistrtion migration * fix: add missing meeting.tasks.fetch_meeting_attendance_task (#8987) --------- Co-authored-by: Robert Sparks <[email protected]>
1 parent 01170df commit 425cbe2

21 files changed

+951
-478
lines changed

ietf/api/tests.py

Lines changed: 90 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -833,111 +833,91 @@ def test_api_new_meeting_registration_nomcom_volunteer(self):
833833
def test_api_new_meeting_registration_v2(self):
834834
meeting = MeetingFactory(type_id='ietf')
835835
person = PersonFactory()
836-
regs = [
837-
{
838-
'affiliation': "Alguma Corporação",
839-
'country_code': 'PT',
840-
'email': person.email().address,
841-
'first_name': person.first_name(),
842-
'last_name': person.last_name(),
843-
'meeting': str(meeting.number),
844-
'reg_type': 'onsite',
845-
'ticket_type': 'week_pass',
846-
'checkedin': False,
847-
'is_nomcom_volunteer': False,
848-
'cancelled': False,
849-
}
850-
]
851-
836+
reg_detail = {
837+
'email': person.email().address,
838+
'first_name': person.first_name(),
839+
'last_name': person.last_name(),
840+
'meeting': meeting.number,
841+
'affiliation': "Alguma Corporação",
842+
'country_code': 'PT',
843+
'checkedin': False,
844+
'is_nomcom_volunteer': False,
845+
'cancelled': False,
846+
'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}],
847+
}
848+
reg_data = {'objects': {reg_detail['email']: reg_detail}}
852849
url = urlreverse('ietf.api.views.api_new_meeting_registration_v2')
853850
#
854851
# Test invalid key
855-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "invalid-token"})
852+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "invalid-token"})
856853
self.assertEqual(r.status_code, 403)
857854
#
858855
# Test invalid data
859-
bad_regs = copy.deepcopy(regs)
860-
del(bad_regs[0]['email'])
861-
r = self.client.post(url, data=json.dumps(bad_regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
856+
bad_reg_data = copy.deepcopy(reg_data)
857+
del bad_reg_data['objects'][reg_detail['email']]['email']
858+
r = self.client.post(url, data=json.dumps(bad_reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
862859
self.assertEqual(r.status_code, 400)
863860
#
864861
# Test valid POST
865-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
862+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
866863
self.assertContains(r, "Success", status_code=202)
867864
#
868865
# Check record
869-
reg = regs[0]
870-
objects = Registration.objects.filter(email=reg['email'], meeting__number=reg['meeting'])
866+
objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting'])
871867
self.assertEqual(objects.count(), 1)
872868
obj = objects[0]
873869
for key in ['affiliation', 'country_code', 'first_name', 'last_name', 'checkedin']:
874-
self.assertEqual(getattr(obj, key), False if key=='checkedin' else reg.get(key) , "Bad data for field '%s'" % key)
870+
self.assertEqual(getattr(obj, key), False if key == 'checkedin' else reg_detail.get(key), f"Bad data for field {key}")
875871
self.assertEqual(obj.tickets.count(), 1)
876872
ticket = obj.tickets.first()
877-
self.assertEqual(ticket.ticket_type.slug, regs[0]['ticket_type'])
878-
self.assertEqual(ticket.attendance_type.slug, regs[0]['reg_type'])
873+
self.assertEqual(ticket.ticket_type.slug, reg_detail['tickets'][0]['ticket_type'])
874+
self.assertEqual(ticket.attendance_type.slug, reg_detail['tickets'][0]['attendance_type'])
879875
self.assertEqual(obj.person, person)
880876
#
881877
# Test update (switch to remote)
882-
regs = [
883-
{
884-
'affiliation': "Alguma Corporação",
885-
'country_code': 'PT',
886-
'email': person.email().address,
887-
'first_name': person.first_name(),
888-
'last_name': person.last_name(),
889-
'meeting': str(meeting.number),
890-
'reg_type': 'remote',
891-
'ticket_type': 'week_pass',
892-
'checkedin': False,
893-
'is_nomcom_volunteer': False,
894-
'cancelled': False,
895-
}
896-
]
897-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
878+
reg_detail = {
879+
'affiliation': "Alguma Corporação",
880+
'country_code': 'PT',
881+
'email': person.email().address,
882+
'first_name': person.first_name(),
883+
'last_name': person.last_name(),
884+
'meeting': meeting.number,
885+
'checkedin': False,
886+
'is_nomcom_volunteer': False,
887+
'cancelled': False,
888+
'tickets': [{'attendance_type': 'remote', 'ticket_type': 'week_pass'}],
889+
}
890+
reg_data = {'objects': {reg_detail['email']: reg_detail}}
891+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
898892
self.assertContains(r, "Success", status_code=202)
899-
objects = Registration.objects.filter(email=reg['email'], meeting__number=reg['meeting'])
893+
objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting'])
900894
self.assertEqual(objects.count(), 1)
901895
obj = objects[0]
902896
self.assertEqual(obj.tickets.count(), 1)
903897
ticket = obj.tickets.first()
904-
self.assertEqual(ticket.ticket_type.slug, regs[0]['ticket_type'])
905-
self.assertEqual(ticket.attendance_type.slug, regs[0]['reg_type'])
898+
self.assertEqual(ticket.ticket_type.slug, reg_detail['tickets'][0]['ticket_type'])
899+
self.assertEqual(ticket.attendance_type.slug, reg_detail['tickets'][0]['attendance_type'])
906900
#
907901
# Test multiple
908-
regs = [
909-
{
910-
'affiliation': "Alguma Corporação",
911-
'country_code': 'PT',
912-
'email': person.email().address,
913-
'first_name': person.first_name(),
914-
'last_name': person.last_name(),
915-
'meeting': str(meeting.number),
916-
'reg_type': 'onsite',
917-
'ticket_type': 'one_day',
918-
'checkedin': False,
919-
'is_nomcom_volunteer': False,
920-
'cancelled': False,
921-
},
922-
923-
{
924-
'affiliation': "Alguma Corporação",
925-
'country_code': 'PT',
926-
'email': person.email().address,
927-
'first_name': person.first_name(),
928-
'last_name': person.last_name(),
929-
'meeting': str(meeting.number),
930-
'reg_type': 'remote',
931-
'ticket_type': 'week_pass',
932-
'checkedin': False,
933-
'is_nomcom_volunteer': False,
934-
'cancelled': False,
935-
}
936-
]
937-
938-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
902+
reg_detail = {
903+
'affiliation': "Alguma Corporação",
904+
'country_code': 'PT',
905+
'email': person.email().address,
906+
'first_name': person.first_name(),
907+
'last_name': person.last_name(),
908+
'meeting': meeting.number,
909+
'checkedin': False,
910+
'is_nomcom_volunteer': False,
911+
'cancelled': False,
912+
'tickets': [
913+
{'attendance_type': 'onsite', 'ticket_type': 'one_day'},
914+
{'attendance_type': 'remote', 'ticket_type': 'week_pass'},
915+
],
916+
}
917+
reg_data = {'objects': {reg_detail['email']: reg_detail}}
918+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
939919
self.assertContains(r, "Success", status_code=202)
940-
objects = Registration.objects.filter(email=reg['email'], meeting__number=reg['meeting'])
920+
objects = Registration.objects.filter(email=reg_detail['email'], meeting__number=reg_detail['meeting'])
941921
self.assertEqual(objects.count(), 1)
942922
obj = objects[0]
943923
self.assertEqual(obj.tickets.count(), 2)
@@ -948,51 +928,46 @@ def test_api_new_meeting_registration_v2(self):
948928
def test_api_new_meeting_registration_v2_cancelled(self):
949929
meeting = MeetingFactory(type_id='ietf')
950930
person = PersonFactory()
951-
regs = [
952-
{
953-
'affiliation': "Acme",
954-
'country_code': 'US',
955-
'email': person.email().address,
956-
'first_name': person.first_name(),
957-
'last_name': person.last_name(),
958-
'meeting': str(meeting.number),
959-
'reg_type': 'onsite',
960-
'ticket_type': 'week_pass',
961-
'checkedin': False,
962-
'is_nomcom_volunteer': False,
963-
'cancelled': False,
964-
}
965-
]
931+
reg_detail = {
932+
'affiliation': "Acme",
933+
'country_code': 'US',
934+
'email': person.email().address,
935+
'first_name': person.first_name(),
936+
'last_name': person.last_name(),
937+
'meeting': meeting.number,
938+
'checkedin': False,
939+
'is_nomcom_volunteer': False,
940+
'cancelled': False,
941+
'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}],
942+
}
943+
reg_data = {'objects': {reg_detail['email']: reg_detail}}
966944
url = urlreverse('ietf.api.views.api_new_meeting_registration_v2')
967945
self.assertEqual(Registration.objects.count(), 0)
968-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
946+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
969947
self.assertContains(r, "Success", status_code=202)
970948
self.assertEqual(Registration.objects.count(), 1)
971-
regs[0]['cancelled'] = True
972-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
949+
reg_detail['cancelled'] = True
950+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
973951
self.assertContains(r, "Success", status_code=202)
974952
self.assertEqual(Registration.objects.count(), 0)
975953

976-
@override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]})
954+
@override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]})
977955
def test_api_new_meeting_registration_v2_nomcom(self):
978956
meeting = MeetingFactory(type_id='ietf')
979957
person = PersonFactory()
980-
regs = [
981-
{
982-
'affiliation': "Acme",
983-
'country_code': 'US',
984-
'email': person.email().address,
985-
'first_name': person.first_name(),
986-
'last_name': person.last_name(),
987-
'meeting': str(meeting.number),
988-
'reg_type': 'onsite',
989-
'ticket_type': 'week_pass',
990-
'checkedin': False,
991-
'is_nomcom_volunteer': False,
992-
'cancelled': False,
993-
}
994-
]
995-
958+
reg_detail = {
959+
'affiliation': "Acme",
960+
'country_code': 'US',
961+
'email': person.email().address,
962+
'first_name': person.first_name(),
963+
'last_name': person.last_name(),
964+
'meeting': meeting.number,
965+
'checkedin': False,
966+
'is_nomcom_volunteer': False,
967+
'cancelled': False,
968+
'tickets': [{'attendance_type': 'onsite', 'ticket_type': 'week_pass'}],
969+
}
970+
reg_data = {'objects': {reg_detail['email']: reg_detail}}
996971
url = urlreverse('ietf.api.views.api_new_meeting_registration_v2')
997972
now = datetime.datetime.now()
998973
if now.month > 10:
@@ -1003,14 +978,14 @@ def test_api_new_meeting_registration_v2_nomcom(self):
1003978
nomcom = NomComFactory.create(is_accepting_volunteers=True, **nomcom_kwargs_for_year(year))
1004979

1005980
# first test is_nomcom_volunteer False
1006-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
981+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
1007982
self.assertContains(r, "Success", status_code=202)
1008983
# assert no Volunteers exists
1009984
self.assertEqual(Volunteer.objects.count(), 0)
1010985

1011986
# test is_nomcom_volunteer True
1012-
regs[0]['is_nomcom_volunteer'] = True
1013-
r = self.client.post(url, data=json.dumps(regs), content_type='application/json', headers={"X-Api-Key": "valid-token"})
987+
reg_detail['is_nomcom_volunteer'] = True
988+
r = self.client.post(url, data=json.dumps(reg_data), content_type='application/json', headers={"X-Api-Key": "valid-token"})
1014989
self.assertContains(r, "Success", status_code=202)
1015990
# assert Volunteer exists
1016991
self.assertEqual(Volunteer.objects.count(), 1)

0 commit comments

Comments
 (0)