Skip to content

Commit 3d50a21

Browse files
authored
refactor: remove old reg API functions (ietf-tools#9176)
1 parent c78e360 commit 3d50a21

11 files changed

Lines changed: 3 additions & 759 deletions

File tree

ietf/api/tests.py

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
from ietf.nomcom.factories import NomComFactory, nomcom_kwargs_for_year
3838
from ietf.person.factories import PersonFactory, random_faker, EmailFactory, PersonalApiKeyFactory
3939
from ietf.person.models import Email, User
40-
from ietf.stats.models import MeetingRegistration
4140
from ietf.utils.mail import empty_outbox, outbox, get_payload_text
4241
from ietf.utils.models import DumpInfo
4342
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, reload_db_objects
@@ -705,131 +704,6 @@ def test_api_v2_person_export_view(self):
705704
self.assertEqual(data['ascii'], robot.ascii)
706705
self.assertEqual(data['user']['email'], robot.user.email)
707706

708-
def test_api_new_meeting_registration(self):
709-
meeting = MeetingFactory(type_id='ietf')
710-
reg = {
711-
'apikey': 'invalid',
712-
'affiliation': "Alguma Corporação",
713-
'country_code': 'PT',
714-
'email': 'foo@example.pt',
715-
'first_name': 'Foo',
716-
'last_name': 'Bar',
717-
'meeting': meeting.number,
718-
'reg_type': 'hackathon',
719-
'ticket_type': '',
720-
'checkedin': 'False',
721-
'is_nomcom_volunteer': 'False',
722-
}
723-
url = urlreverse('ietf.api.views.api_new_meeting_registration')
724-
r = self.client.post(url, reg)
725-
self.assertContains(r, 'Invalid apikey', status_code=403)
726-
oidcp = PersonFactory(user__is_staff=True)
727-
# Make sure 'oidcp' has an acceptable role
728-
RoleFactory(name_id='robot', person=oidcp, email=oidcp.email(), group__acronym='secretariat')
729-
key = PersonalApiKeyFactory(person=oidcp, endpoint=url)
730-
reg['apikey'] = key.hash()
731-
#
732-
# Test valid POST
733-
# FIXME: sometimes, there seems to be something in the outbox?
734-
old_len = len(outbox)
735-
r = self.client.post(url, reg)
736-
self.assertContains(r, "Accepted, New registration, Email sent", status_code=202)
737-
#
738-
# Check outgoing mail
739-
self.assertEqual(len(outbox), old_len + 1)
740-
body = get_payload_text(outbox[-1])
741-
self.assertIn(reg['email'], outbox[-1]['To'] )
742-
self.assertIn(reg['email'], body)
743-
self.assertIn('account creation request', body)
744-
#
745-
# Check record
746-
obj = MeetingRegistration.objects.get(email=reg['email'], meeting__number=reg['meeting'])
747-
for key in ['affiliation', 'country_code', 'first_name', 'last_name', 'person', 'reg_type', 'ticket_type', 'checkedin']:
748-
self.assertEqual(getattr(obj, key), False if key=='checkedin' else reg.get(key) , "Bad data for field '%s'" % key)
749-
#
750-
# Test with existing user
751-
person = PersonFactory()
752-
reg['email'] = person.email().address
753-
reg['first_name'] = person.first_name()
754-
reg['last_name'] = person.last_name()
755-
#
756-
r = self.client.post(url, reg)
757-
self.assertContains(r, "Accepted, New registration", status_code=202)
758-
#
759-
# There should be no new outgoing mail
760-
self.assertEqual(len(outbox), old_len + 1)
761-
#
762-
# Test multiple reg types
763-
reg['reg_type'] = 'remote'
764-
reg['ticket_type'] = 'full_week_pass'
765-
r = self.client.post(url, reg)
766-
self.assertContains(r, "Accepted, New registration", status_code=202)
767-
objs = MeetingRegistration.objects.filter(email=reg['email'], meeting__number=reg['meeting'])
768-
self.assertEqual(len(objs), 2)
769-
self.assertEqual(objs.filter(reg_type='hackathon').count(), 1)
770-
self.assertEqual(objs.filter(reg_type='remote', ticket_type='full_week_pass').count(), 1)
771-
self.assertEqual(len(outbox), old_len + 1)
772-
#
773-
# Test incomplete POST
774-
drop_fields = ['affiliation', 'first_name', 'reg_type']
775-
for field in drop_fields:
776-
del reg[field]
777-
r = self.client.post(url, reg)
778-
self.assertContains(r, 'Missing parameters:', status_code=400)
779-
err, fields = r.content.decode().split(':', 1)
780-
missing_fields = [f.strip() for f in fields.split(',')]
781-
self.assertEqual(set(missing_fields), set(drop_fields))
782-
783-
def test_api_new_meeting_registration_nomcom_volunteer(self):
784-
'''Test that Volunteer is created if is_nomcom_volunteer=True
785-
is submitted to API
786-
'''
787-
meeting = MeetingFactory(type_id='ietf')
788-
reg = {
789-
'apikey': 'invalid',
790-
'affiliation': "Alguma Corporação",
791-
'country_code': 'PT',
792-
'meeting': meeting.number,
793-
'reg_type': 'onsite',
794-
'ticket_type': '',
795-
'checkedin': 'False',
796-
'is_nomcom_volunteer': 'False',
797-
}
798-
person = PersonFactory()
799-
reg['email'] = person.email().address
800-
reg['first_name'] = person.first_name()
801-
reg['last_name'] = person.last_name()
802-
now = datetime.datetime.now()
803-
if now.month > 10:
804-
year = now.year + 1
805-
else:
806-
year = now.year
807-
# create appropriate group and nomcom objects
808-
nomcom = NomComFactory.create(is_accepting_volunteers=True, **nomcom_kwargs_for_year(year))
809-
url = urlreverse('ietf.api.views.api_new_meeting_registration')
810-
oidcp = PersonFactory(user__is_staff=True)
811-
# Make sure 'oidcp' has an acceptable role
812-
RoleFactory(name_id='robot', person=oidcp, email=oidcp.email(), group__acronym='secretariat')
813-
key = PersonalApiKeyFactory(person=oidcp, endpoint=url)
814-
reg['apikey'] = key.hash()
815-
816-
# first test is_nomcom_volunteer False
817-
r = self.client.post(url, reg)
818-
self.assertContains(r, "Accepted, New registration", status_code=202)
819-
# assert no Volunteers exists
820-
self.assertEqual(Volunteer.objects.count(), 0)
821-
822-
# test is_nomcom_volunteer True
823-
reg['is_nomcom_volunteer'] = 'True'
824-
r = self.client.post(url, reg)
825-
self.assertContains(r, "Accepted, Updated registration", status_code=202)
826-
# assert Volunteer exists
827-
self.assertEqual(Volunteer.objects.count(), 1)
828-
volunteer = Volunteer.objects.last()
829-
self.assertEqual(volunteer.person, person)
830-
self.assertEqual(volunteer.nomcom, nomcom)
831-
self.assertEqual(volunteer.origin, 'registration')
832-
833707
@override_settings(APP_API_TOKENS={"ietf.api.views.api_new_meeting_registration_v2": ["valid-token"]})
834708
def test_api_new_meeting_registration_v2(self):
835709
meeting = MeetingFactory(type_id='ietf')

ietf/api/urls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
url(r'^notify/session/polls/?$', meeting_views.api_upload_polls),
6868
# Let the registration system notify us about registrations
6969
url(r'^notify/meeting/registration/v2/?', api_views.api_new_meeting_registration_v2),
70-
url(r'^notify/meeting/registration/?', api_views.api_new_meeting_registration),
7170
# OpenID authentication provider
7271
url(r'^openid/$', TemplateView.as_view(template_name='api/openid-issuer.html'), name='ietf.api.urls.oidc_issuer'),
7372
url(r'^openid/', include('oidc_provider.urls', namespace='oidc_provider')),

ietf/api/views.py

Lines changed: 0 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
from django.contrib.auth import authenticate
1717
from django.contrib.auth.decorators import login_required
1818
from django.contrib.auth.models import User
19-
from django.core.exceptions import ValidationError
20-
from django.core.validators import validate_email
2119
from django.http import HttpResponse, Http404, JsonResponse, HttpResponseBadRequest
2220
from django.shortcuts import render, get_object_or_404
2321
from django.urls import reverse
@@ -43,14 +41,11 @@
4341
from ietf.doc.utils import DraftAliasGenerator, fuzzy_find_documents
4442
from ietf.group.utils import GroupAliasGenerator, role_holder_emails
4543
from ietf.ietfauth.utils import role_required
46-
from ietf.ietfauth.views import send_account_creation_email
4744
from ietf.ipr.utils import ingest_response_email as ipr_ingest_response_email
4845
from ietf.meeting.models import Meeting
4946
from ietf.meeting.utils import import_registration_json_validator, process_single_registration
50-
from ietf.nomcom.models import Volunteer, NomCom
5147
from ietf.nomcom.utils import ingest_feedback_email as nomcom_ingest_feedback_email
5248
from ietf.person.models import Person, Email
53-
from ietf.stats.models import MeetingRegistration
5449
from ietf.sync.iana import ingest_review_email as iana_ingest_review_email
5550
from ietf.utils import log
5651
from ietf.utils.decorators import require_api_key
@@ -151,96 +146,6 @@ def post(self, request):
151146
# else:
152147
# return HttpResponse(status=405)
153148

154-
@require_api_key
155-
@role_required('Robot')
156-
@csrf_exempt
157-
def api_new_meeting_registration(request):
158-
'''REST API to notify the datatracker about a new meeting registration'''
159-
def err(code, text):
160-
return HttpResponse(text, status=code, content_type='text/plain')
161-
required_fields = [ 'meeting', 'first_name', 'last_name', 'affiliation', 'country_code',
162-
'email', 'reg_type', 'ticket_type', 'checkedin', 'is_nomcom_volunteer']
163-
fields = required_fields + []
164-
if request.method == 'POST':
165-
# parameters:
166-
# apikey:
167-
# meeting
168-
# name
169-
# email
170-
# reg_type (In Person, Remote, Hackathon Only)
171-
# ticket_type (full_week, one_day, student)
172-
#
173-
data = {'attended': False, }
174-
missing_fields = []
175-
for item in fields:
176-
value = request.POST.get(item, None)
177-
if value is None and item in required_fields:
178-
missing_fields.append(item)
179-
data[item] = value
180-
if missing_fields:
181-
return err(400, "Missing parameters: %s" % ', '.join(missing_fields))
182-
number = data['meeting']
183-
try:
184-
meeting = Meeting.objects.get(number=number)
185-
except Meeting.DoesNotExist:
186-
return err(400, "Invalid meeting value: '%s'" % (number, ))
187-
reg_type = data['reg_type']
188-
email = data['email']
189-
try:
190-
validate_email(email)
191-
except ValidationError:
192-
return err(400, "Invalid email value: '%s'" % (email, ))
193-
if request.POST.get('cancelled', 'false') == 'true':
194-
MeetingRegistration.objects.filter(
195-
meeting_id=meeting.pk,
196-
email=email,
197-
reg_type=reg_type).delete()
198-
return HttpResponse('OK', status=200, content_type='text/plain')
199-
else:
200-
object, created = MeetingRegistration.objects.get_or_create(
201-
meeting_id=meeting.pk,
202-
email=email,
203-
reg_type=reg_type)
204-
try:
205-
# Update attributes
206-
for key in set(data.keys())-set(['attended', 'apikey', 'meeting', 'email']):
207-
if key == 'checkedin':
208-
new = bool(data.get(key).lower() == 'true')
209-
else:
210-
new = data.get(key)
211-
setattr(object, key, new)
212-
person = Person.objects.filter(email__address=email)
213-
if person.exists():
214-
object.person = person.first()
215-
object.save()
216-
except ValueError as e:
217-
return err(400, "Unexpected POST data: %s" % e)
218-
response = "Accepted, New registration" if created else "Accepted, Updated registration"
219-
if User.objects.filter(username__iexact=email).exists() or Email.objects.filter(address=email).exists():
220-
pass
221-
else:
222-
send_account_creation_email(request, email)
223-
response += ", Email sent"
224-
225-
# handle nomcom volunteer
226-
if request.POST.get('is_nomcom_volunteer', 'false').lower() == 'true' and object.person:
227-
try:
228-
nomcom = NomCom.objects.get(is_accepting_volunteers=True)
229-
except (NomCom.DoesNotExist, NomCom.MultipleObjectsReturned):
230-
nomcom = None
231-
if nomcom:
232-
Volunteer.objects.get_or_create(
233-
nomcom=nomcom,
234-
person=object.person,
235-
defaults={
236-
"affiliation": data["affiliation"],
237-
"origin": "registration"
238-
}
239-
)
240-
return HttpResponse(response, status=202, content_type='text/plain')
241-
else:
242-
return HttpResponse(status=405)
243-
244149

245150
@requires_api_token
246151
@csrf_exempt

ietf/meeting/tasks.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from .models import Meeting
1010
from .utils import generate_proceedings_content
1111
from .views import generate_agenda_data
12-
from .utils import migrate_registrations, check_migrate_registrations
1312
from .utils import fetch_attendance_from_meetings
1413

1514

@@ -18,23 +17,6 @@ def agenda_data_refresh():
1817
generate_agenda_data(force_refresh=True)
1918

2019

21-
@shared_task
22-
def migrate_registrations_task(initial=False):
23-
""" Migrate ietf.stats.MeetingRegistration to ietf.meeting.Registration
24-
If initial is True, migrate all meetings otherwise only future meetings.
25-
This function is idempotent. It can be run regularly from cron.
26-
"""
27-
migrate_registrations(initial=initial)
28-
29-
30-
@shared_task
31-
def check_migrate_registrations_task():
32-
""" Compare MeetingRegistration with Registration to ensure
33-
all records migrated
34-
"""
35-
check_migrate_registrations()
36-
37-
3820
@shared_task
3921
def proceedings_content_refresh_task(*, all=False):
4022
"""Refresh meeting proceedings cache

0 commit comments

Comments
 (0)