From 34a0cea51461ffdeb6d3be010da4822709403aab Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 18 Dec 2023 15:34:47 -0600 Subject: [PATCH 1/4] fix: don't create a volunteer object when a person has already volunteered --- ietf/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ietf/api/views.py b/ietf/api/views.py index e587b37121..ce2f65ff26 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -209,7 +209,7 @@ def err(code, text): nomcom = NomCom.objects.get(is_accepting_volunteers=True) except (NomCom.DoesNotExist, NomCom.MultipleObjectsReturned): nomcom = None - if nomcom: + if nomcom and not Volunteer.objects.filter(nomcom=nomcom,person=object.person).exists(): Volunteer.objects.create( nomcom=nomcom, person=object.person, From dec99e5872a7576491461e12d999de4c6bbfeae9 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 18 Dec 2023 15:56:50 -0600 Subject: [PATCH 2/4] fix: safer create --- ietf/api/views.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ietf/api/views.py b/ietf/api/views.py index ce2f65ff26..b2dc062fd8 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -209,12 +209,12 @@ def err(code, text): nomcom = NomCom.objects.get(is_accepting_volunteers=True) except (NomCom.DoesNotExist, NomCom.MultipleObjectsReturned): nomcom = None - if nomcom and not Volunteer.objects.filter(nomcom=nomcom,person=object.person).exists(): - Volunteer.objects.create( - nomcom=nomcom, - person=object.person, - affiliation=data['affiliation'], - origin='registration') + if nomcom: + v, created = Volunteer.objects.get_or_create(nomcom=nomcom,person=object.person) + if created: + v.affiliation=data['affiliation'] + v.origin='registration' + v.save() return HttpResponse(response, status=202, content_type='text/plain') else: return HttpResponse(status=405) From 3fbbde5713a581ded6ed351d734eb4218e09093c Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 18 Dec 2023 16:05:46 -0600 Subject: [PATCH 3/4] refactor: use shorthand from django --- ietf/api/views.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ietf/api/views.py b/ietf/api/views.py index b2dc062fd8..73b873f5f3 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -210,11 +210,14 @@ def err(code, text): except (NomCom.DoesNotExist, NomCom.MultipleObjectsReturned): nomcom = None if nomcom: - v, created = Volunteer.objects.get_or_create(nomcom=nomcom,person=object.person) - if created: - v.affiliation=data['affiliation'] - v.origin='registration' - v.save() + Volunteer.objects.get_or_create( + nomcom=nomcom, + person=object.person, + defaults={ + "affiliation": data["affiliation"], + "origin": "registration" + } + ) return HttpResponse(response, status=202, content_type='text/plain') else: return HttpResponse(status=405) From 8fdf2ae07ea9bf8721e4d2a6a7cef1be7899015f Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 18 Dec 2023 16:11:32 -0600 Subject: [PATCH 4/4] fix: also protect volunteer from datatracker from race --- ietf/nomcom/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index ce7ca9a82d..7705be5697 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -1373,7 +1373,7 @@ def volunteer(request): form = VolunteerForm(person=person, data=request.POST) if form.is_valid(): for nc in form.cleaned_data['nomcoms']: - nc.volunteer_set.create(person=person, affiliation=form.cleaned_data['affiliation']) + nc.volunteer_set.get_or_create(person=person, defaults={"affiliation": form.cleaned_data["affiliation"], "origin":"datatracker"}) return redirect('ietf.ietfauth.views.profile') else: form = VolunteerForm(person=person,initial=dict(nomcoms=can_volunteer, affiliation=suggest_affiliation(person)))