88
99from django .conf import settings
1010from django .contrib .auth .decorators import login_required
11+ from django .contrib .auth .models import User
12+ from django .core .exceptions import ValidationError
13+ from django .core .validators import validate_email
1114from django .http import HttpResponse
1215from django .shortcuts import render , get_object_or_404
1316from django .urls import reverse
2326
2427import debug # pyflakes:ignore
2528
26- from ietf .person .models import Person
29+ from ietf .person .models import Person , Email
2730from ietf .api import _api_list
2831from ietf .api .serializer import JsonExportMixin
29- from ietf .utils . decorators import require_api_key
32+ from ietf .ietfauth . views import send_account_creation_email
3033from ietf .ietfauth .utils import role_required
34+ from ietf .meeting .models import Meeting
35+ from ietf .stats .models import MeetingRegistration
36+ from ietf .utils .decorators import require_api_key
3137
3238
3339def top_level (request ):
@@ -108,3 +114,61 @@ def person_access_meetecho(request):
108114 'secr' : list (person .role_set .filter (name = 'secr' , group__state__in = ['active' , 'bof' , 'proposed' ]).values_list ('group__acronym' , flat = True )),
109115 }
110116 }), content_type = 'application/json' )
117+
118+ @require_api_key
119+ @role_required ('Robot' )
120+ @csrf_exempt
121+ def api_new_meeting_registration (request ):
122+ '''REST API to notify the datatracker about a new meeting registration'''
123+ def err (code , text ):
124+ return HttpResponse (text , status = code , content_type = 'text/plain' )
125+ required_fields = [ 'meeting' , 'first_name' , 'last_name' , 'affiliation' , 'country_code' , 'email' , 'reg_type' , 'ticket_type' , ]
126+ fields = required_fields + []
127+ if request .method == 'POST' :
128+ # parameters:
129+ # apikey:
130+ # meeting
131+ # name
132+ # email
133+ # reg_type (In Person, Remote, Hackathon Only)
134+ # ticket_type (full_week, one_day, student)
135+ #
136+ data = {}
137+ missing_fields = []
138+ for item in fields :
139+ value = request .POST .get (item , None )
140+ if value is None and item in required_fields :
141+ missing_fields .append (item )
142+ data [item ] = value
143+ if missing_fields :
144+ return err (400 , "Missing parameters: %s" % ', ' .join (missing_fields ))
145+ number = data ['meeting' ]
146+ try :
147+ meeting = Meeting .objects .get (number = number )
148+ except Meeting .DoesNotExist :
149+ return err (400 , "Invalid meeting value: '%s'" % (number , ))
150+ email = data ['email' ]
151+ try :
152+ validate_email (email )
153+ except ValidationError :
154+ return err (400 , "Invalid email value: '%s'" % (email , ))
155+ if request .POST .get ('cancelled' , 'false' ) == 'true' :
156+ MeetingRegistration .objects .filter (meeting_id = meeting .pk , email = email ).delete ()
157+ return HttpResponse ('OK' , status = 200 , content_type = 'text/plain' )
158+ else :
159+ object , created = MeetingRegistration .objects .get_or_create (meeting_id = meeting .pk , email = email )
160+ try :
161+ MeetingRegistration .objects .filter (id = object .id ).update (** data )
162+ object .save ()
163+ except ValueError as e :
164+ return err (400 , "Unexpected POST data: %s" % e )
165+ response = "Accepted, New registration" if created else "Accepted, Updated registration"
166+ if User .objects .filter (username = email ).exists () or Email .objects .filter (address = email ).exists ():
167+ pass
168+ else :
169+ send_account_creation_email (request , email )
170+ response += ", Email sent"
171+ return HttpResponse (response , status = 202 , content_type = 'text/plain' )
172+ else :
173+ return HttpResponse (status = 405 )
174+
0 commit comments