From 6986e65665d6419a047ca2cf4f5f4831441c8e29 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Mon, 6 Nov 2023 18:22:42 +0100 Subject: [PATCH] fix: prevent creation of duplicate MeetingRegistration records (#6593) * fix: prevent creation of duplicate MeetingRegistration records * fix: use get_or_create to prevent duplicate MeetingRegistrations --------- Co-authored-by: Robert Sparks --- ietf/stats/tests.py | 28 ++++++++++++++++++++++++++++ ietf/stats/utils.py | 3 +-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ietf/stats/tests.py b/ietf/stats/tests.py index a0b95989f..5f23b1b0a 100644 --- a/ietf/stats/tests.py +++ b/ietf/stats/tests.py @@ -272,3 +272,31 @@ class StatisticsTests(TestCase): self.assertEqual(query.count(), 1) self.assertEqual(query.filter(reg_type='onsite').count(), 1) self.assertEqual(query.filter(reg_type='hackathon').count(), 0) + + @patch('requests.get') + def test_get_meeting_registration_data_duplicates(self, mock_get): + '''Test that get_meeting_registration_data does not create duplicate + MeetingRegistration records + ''' + person = PersonFactory() + data = { + 'LastName': person.last_name() + ' ', + 'FirstName': person.first_name(), + 'Company': 'ABC', + 'Country': 'US', + 'Email': person.email().address, + 'RegType': 'onsite', + 'TicketType': 'week_pass', + 'CheckedIn': 'True', + } + data2 = data.copy() + data2['RegType'] = 'hackathon' + response = Response() + response.status_code = 200 + response._content = json.dumps([data, data2, data]).encode('utf8') + mock_get.return_value = response + meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016, 7, 14), number="96") + self.assertEqual(MeetingRegistration.objects.count(), 0) + get_meeting_registration_data(meeting) + query = MeetingRegistration.objects.all() + self.assertEqual(query.count(), 2) diff --git a/ietf/stats/utils.py b/ietf/stats/utils.py index ca1163e07..1f9c0e3c3 100644 --- a/ietf/stats/utils.py +++ b/ietf/stats/utils.py @@ -270,11 +270,10 @@ def get_meeting_registration_data(meeting): object = meeting_registrations.pop((address, reg_type)) created = False else: - object = MeetingRegistration.objects.create( + object, created = MeetingRegistration.objects.get_or_create( meeting_id=meeting.pk, email=address, reg_type=reg_type) - created = True if (object.first_name != first_name[:200] or object.last_name != last_name[:200] or