def _createSessionObject(self, request): """Create Session object, returning SessionForm/request.""" user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException('Authorization required') user_id = getUserId(user) # check to see that the current user is the conference organizer conf_key = ndb.Key(urlsafe=request.websafeConferenceKey) if conf_key.parent().get().mainEmail != user_id: raise endpoints.UnauthorizedException( 'Only the organizer of the conference can create sessions') if not request.name: raise endpoints.BadRequestException("Session 'name' field required") # copy SessionForm/ProtoRPC Message into dictionary data = {field.name: getattr(request, field.name) for field in request.all_fields()} # delete the unneeded values del data['websafeKey'] del data['websafeConferenceKey'] del data['speaker_name'] del data['speaker_email'] del data['speaker_gender'] # Format date and startTime, ie. 2015-08-18 and 16:00 if data['date']: data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date() if data['startTime']: data['startTime'] = datetime.strptime(data['startTime'][:10], "%H:%M").time() # if speaker email was submitted, get or create a speaker if request.speaker_email: # check to see if this speaker exists speaker = Speaker.query(Speaker.email == request.speaker_email).get() # if so, use this speaker's values if speaker: # Update speaker from request speaker.name = request.speaker_name speaker.gender = request.speaker_gender speaker.put() speaker_key = speaker.key else: # create the speaker speaker_data = { 'name': request.speaker_name, 'email': request.speaker_email, 'gender': request.speaker_gender } speaker_key = Speaker(**speaker_data).put() data['speakerId'] = speaker_key.id() sesh_id = Session.allocate_ids(size=1, parent=conf_key)[0] sesh_key = ndb.Key(Session, sesh_id, parent=conf_key) data['key'] = sesh_key Session(**data).put() # check to see if we should create a featured speaker if speaker: # get all sessions for this conference with this speaker sessions = Session.query(Session.speakerId == data['speakerId'], ancestor=conf_key) # create a comma-delimited string of session names session_names = ', '.join(session.name for session in sessions) # if this speaker is speaking in more than one session for this # conference then pass his name and session names to the task queue if sessions.count() > 1: taskqueue.add( params={'speaker_name': speaker.name, 'session_names': session_names}, url='/tasks/set_featured_speaker' ) return self._copySessionToForm(sesh_key.get())