def _createSessionObject(self, request): '''Create a new session object Note: Only conference owner can add sessions ''' user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException('Authorization required') user_id = getUserId(user) # get conference using websafe key conf = ndb.Key(urlsafe=request.websafeConferenceKey).get() # Raise if conference doesn't exist if not conf: raise endpoints.NotFoundException( 'No conference found with key: %s' % request.websafeConferenceKey) # check that user is owner if user_id != conf.organizerUserId: raise endpoints.ForbiddenException( 'Only the owner can add a session to the conference.') # Check request has session required attribute name if not request.name: raise endpoints.BadRequestException("Conference 'name' field required") # copy SessionForm/ProtoRPC Message into dict data = {field.name: getattr(request, field.name) for field in request.all_fields()} del data['websafeKey'] del data['websafeConferenceKey'] # add default values for those missing (both data model & outbound Message) for df in SESSION_DEFAULTS: if data[df] in (None, []): data[df] = SESSION_DEFAULTS[df] setattr(request, df, SESSION_DEFAULTS[df]) # convert session type to string if data['typeOfSession']: data['typeOfSession'] = str(data['typeOfSession']) # convert dates from strings to Date and TimeDuration objects if data['date']: data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date() if data['startTime']: data['startTime'] = datetime.strptime(data['startTime'][:5], "%H:%M").time() if data['duration']: data['duration'] = datetime.strptime(data['duration'][:5], "%H:%M").time() # Transform list of speaker names into list of speaker keys # Speaker names are case-insensitive data['speakers'] = [ Speaker.get_or_insert(speaker.lower().strip(), name=speaker).key for speaker in data['speakers'] ] # get Conference Key, allocate Session ID c_key = conf.key s_id = Session.allocate_ids(size=1, parent=c_key)[0] # create Session's key and store in data s_key = ndb.Key(Session, s_id, parent=c_key) data['key'] = s_key # add task to queue to update featured speaker taskqueue.add(params={'conf_key': c_key.urlsafe()}, url='/tasks/featured_speaker') # creation of Session & return (modified) SessionForm Session(**data).put() return self._copySessionToForm(s_key.get())
def _createSessionObject(self, request): """ Creates Session object, returning a variation of the SessionForm object. """ # check if user is already logged in user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException('Authorization required') user_id = getUserId(user) # convert websafeKey to a conference key conf = ndb.Key(urlsafe=request.websafeConferenceKey).get() # check that conference exists if not conf: raise endpoints.NotFoundException( 'No conference found with key: %s' % request.websafeConferenceKey) # check that user is the owner if user_id != conf.organizerUserId: raise endpoints.ForbiddenException( 'The conference can only be changed by the owner.') if not request.name: raise endpoints.BadRequestException("Session 'name' field \ required") # copy SessionForm/ProtoRPC Message into dict data = { field.name: getattr(request, field.name) for field in request.all_fields() } del data['websafeKey'] del data['websafeConfKey'] del data['websafeConferenceKey'] # add default values for those missing (both data model & outbound # Message) for df in DEFAULT_SESS: if data[df] in (None, []): data[df] = DEFAULT_SESS[df] setattr(request, df, DEFAULT_SESS[df]) # convert type of session object to string if data['typeOfSession']: data['typeOfSession'] = str(data['typeOfSession']) # convert date from a string to Date objects if data['date']: data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date() # convert startTime from a string to Time objects if data['startTime']: data['startTime'] = datetime.strptime(data['startTime'][:5], "%H:%M").time() # convert duration from a string to Time objects if data['duration']: data['duration'] = datetime.strptime(data['duration'][:5], "%H:%M").time() # convert speakers from strings as list to Speaker entity keys as list if data['speakers']: # Check that each provided speaker for a session exists in the # database. If the speaker exists in the database, then retrieve # the key value. Otherwise, make a new speaker having the provided # name as the key. speakersForSession = [] for speaker in data['speakers']: # The function get_or_insert(key_name, args) gets as a # transaction an existing entity or it makes a new entity, # which eliminates the problem of duplicate speakers when # multiple sessions that have the same speaker are formed # during the same time. The speaker string value is put in # lowercase with no whitespaces for the key name. spkr_for_sess_key = Speaker.get_or_insert( speaker.lower().strip().replace(" ", "_"), name=speaker).key # add speaker for session key to speakersForSession list speakersForSession.append(spkr_for_sess_key) # update data['speakers'] with newly formed list of keys data['speakers'] = speakersForSession # get Conference key c_key = conf.key # designate new Session ID with the Conference key as a parent s_id = Session.allocate_ids(size=1, parent=c_key)[0] # create key for new Session having Conference key as a parent s_key = ndb.Key(Session, s_id, parent=c_key) # put key into dict data['key'] = s_key # create a Session Session(**data).put() # allows for the session to be copied back to form sess = s_key.get() # reviews speakers for conference when task is added to queue taskqueue.add(params={'c_key_str': c_key.urlsafe()}, url='/tasks/review_speakers_for_sessions') return self._copySessionToForm(sess)
def _createSessionObject(self, request): """ Creates Session object, returning a variation of the SessionForm object. """ # check if user is already logged in user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException('Authorization required') user_id = getUserId(user) # convert websafeKey to a conference key conf = ndb.Key(urlsafe=request.websafeConferenceKey).get() # check that conference exists if not conf: raise endpoints.NotFoundException( 'No conference found with key: %s' % request.websafeConferenceKey) # check that user is the owner if user_id != conf.organizerUserId: raise endpoints.ForbiddenException( 'The conference can only be changed by the owner.') if not request.name: raise endpoints.BadRequestException("Session 'name' field \ required") # copy SessionForm/ProtoRPC Message into dict data = {field.name: getattr(request, field.name) for field in request.all_fields()} del data['websafeKey'] del data['websafeConfKey'] del data['websafeConferenceKey'] # add default values for those missing (both data model & outbound # Message) for df in DEFAULT_SESS: if data[df] in (None, []): data[df] = DEFAULT_SESS[df] setattr(request, df, DEFAULT_SESS[df]) # convert type of session object to string if data['typeOfSession']: data['typeOfSession'] = str(data['typeOfSession']) # convert date from a string to Date objects if data['date']: data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date() # convert startTime from a string to Time objects if data['startTime']: data['startTime'] = datetime.strptime(data['startTime'][:5], "%H:%M").time() # convert duration from a string to Time objects if data['duration']: data['duration'] = datetime.strptime(data['duration'][:5], "%H:%M").time() # convert speakers from strings as list to Speaker entity keys as list if data['speakers']: # Check that each provided speaker for a session exists in the # database. If the speaker exists in the database, then retrieve # the key value. Otherwise, make a new speaker having the provided # name as the key. speakersForSession = [] for speaker in data['speakers']: # The function get_or_insert(key_name, args) gets as a # transaction an existing entity or it makes a new entity, # which eliminates the problem of duplicate speakers when # multiple sessions that have the same speaker are formed # during the same time. The speaker string value is put in # lowercase with no whitespaces for the key name. spkr_for_sess_key = Speaker.get_or_insert( speaker.lower().strip().replace(" ", "_"), name=speaker).key # add speaker for session key to speakersForSession list speakersForSession.append(spkr_for_sess_key) # update data['speakers'] with newly formed list of keys data['speakers'] = speakersForSession # get Conference key c_key = conf.key # designate new Session ID with the Conference key as a parent s_id = Session.allocate_ids(size=1, parent=c_key)[0] # create key for new Session having Conference key as a parent s_key = ndb.Key(Session, s_id, parent=c_key) # put key into dict data['key'] = s_key # create a Session Session(**data).put() # allows for the session to be copied back to form sess = s_key.get() # reviews speakers for conference when task is added to queue taskqueue.add(params={'c_key_str': c_key.urlsafe()}, url='/tasks/review_speakers_for_sessions') return self._copySessionToForm(sess)
def _createSessionObject(self, request): """Creates a Session and returns an altered SessionForm object. args: request: Combined Container of a SessionForm object and a websafeConferenceKey identifying the conference. returns: sform: Altered SessionForm object with possible filled in default values and a websafeKey identifying the session. """ # check if user is logged in user = endpoints.get_current_user() if not user: raise endpoints.UnauthorizedException('Authorization required') user_id = getUserId(user) # convert websafeKey to conference key conf = ndb.Key(urlsafe=request.websafeConferenceKey).get() # check that conference exists if not conf: raise endpoints.NotFoundException( 'No conference found with key: %s' % request.websafeConferenceKey) # check that user is owner if user_id != conf.organizerUserId: raise endpoints.ForbiddenException( 'Only the owner can update the conference.') if not request.name: raise endpoints.BadRequestException("Session 'name' field \ required") # copy SessionForm/ProtoRPC Message into dict data = {field.name: getattr(request, field.name) for field in request.all_fields()} del data['websafeKey'] del data['websafeConfKey'] del data['websafeConferenceKey'] # add default values for those missing (both data model & outbound # Message) for df in DEFAULTS_SESSION: if data[df] in (None, []): data[df] = DEFAULTS_SESSION[df] setattr(request, df, DEFAULTS_SESSION[df]) # convert type of session object to string if data['typeOfSession']: data['typeOfSession'] = str(data['typeOfSession']) # convert date from string to Date objects if data['date']: data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date() # convert startTime from string to Time objects if data['startTime']: data['startTime'] = datetime.strptime(data['startTime'][:5], "%H:%M").time() # convert duration from string to Time objects if data['duration']: data['duration'] = datetime.strptime(data['duration'][:5], "%H:%M").time() # convert speakers from a list of strings to a list of Speaker entity # keys if data['speakers']: # check for each provided session speaker if he exists already in # the database. If yes, get the key value, if not, create a new # speaker with the provided name as key. # NOTE: For simplification, it is assumed that a name uniquely # identifies a speaker and therefore can be set as id as well. sessionSpeakers = [] for speaker in data['speakers']: # get_or_insert(key_name, args) transactionally retrieves an # existing entity or creates a new one. This also prevents the # risk of duplicate speaker records when multiple sessions with # the same speaker are created at the same time. # For the key name, the speaker string is formatted in lower # case without whitespaces. To be safe, it should also be # converted to an ascii string in case of special unicode # characters. However, as this is more complicated, its not # been done for this exercise. session_speaker_key = Speaker.get_or_insert( speaker.lower().strip().replace(" ", "_"), name=speaker).key # Add Speaker key to the list of sessionSpeakers. sessionSpeakers.append(session_speaker_key) # overwrite data['speakers'] with the new created key list. data['speakers'] = sessionSpeakers # get Conference Key c_key = conf.key # allocate new Session ID with Conference key as parent s_id = Session.allocate_ids(size=1, parent=c_key)[0] # create a key for for the new Session with conference key as parent s_key = ndb.Key(Session, s_id, parent=c_key) # add key into dictionary data['key'] = s_key # create Session Session(**data).put() # get session to copy it back to the form as return sess = s_key.get() # add task to queue to check the speakers of the conference taskqueue.add(params={'c_key_str': c_key.urlsafe()}, url='/tasks/check_speakers') return self._copySessionToForm(sess)