def getConferenceSessions(self, request):
     """Gets all the child sessions of the target conference"""
     conf = getConferenceFromRequest(request)
     sessions = Session.query(ancestor=conf.key)
     return SessionForms(
         items=[self._copySessionToForm(session) for session in sessions]
     )
 def getConference(self, request):
     """Return requested conference (by websafeConferenceKey)."""
     # get Conference object from request; bail if not found
     conf = getConferenceFromRequest(request)
     prof = conf.key.parent().get()
     # return ConferenceForm
     return self._copyConferenceToForm(conf, getattr(prof, 'displayName'))
    def _updateConferenceObject(self, request):
        user = endpoints.get_current_user()
        if not user:
            raise endpoints.UnauthorizedException('Authorization required')
        user_id = getUserId(user)

        conf = getConferenceFromRequest(request)

        # check that user is owner
        if user_id != conf.organizerUserId:
            raise endpoints.ForbiddenException(
                'Only the owner can update the conference.')

        # Not getting all the fields, so don't create a new object; just
        # copy relevant fields from ConferenceForm to Conference object
        for field in request.all_fields():
            data = getattr(request, field.name)
            # only copy fields where we get data
            if data not in (None, []):
                # special handling for dates (convert string to Date)
                if field.name in ('startDate', 'endDate'):
                    data = datetime.strptime(data, "%Y-%m-%d").date()
                    if field.name == 'startDate':
                        conf.month = data.month
                # write to Conference object
                setattr(conf, field.name, data)
        conf.put()
        prof = ndb.Key(Profile, user_id).get()
        return self._copyConferenceToForm(conf, getattr(prof, 'displayName'))
    def getConferenceSessionsByType(self, request):
        """
        Gets sessions in conference of the specified type

        """
        conf = getConferenceFromRequest(request)
        sessions = Session.query(ancestor=conf.key).\
            filter(Session.sessionType == request.sessionType.name)
        return SessionForms(
            items=[self._copySessionToForm(session) for session in sessions]
        )
    def _createSessionObject(self, request):
        """
        Creates Session under provided conference
        websafeConferenceKey - key of parent Conference
        duration - session duration in minutes
        date - formated YYYY-MM-DD
        time - formated HH:MM:SS
        other fields are self explanatory
        """
        user = endpoints.get_current_user()
        if not user:
            raise endpoints.UnauthorizedException('Authorization required')
        user_id = getUserId(user)

        conf = getConferenceFromRequest(request)
        c_key = conf.key

        # check that user is owner
        if user_id != conf.organizerUserId:
            raise endpoints.ForbiddenException(
                'Only the owner can create session in this conference.')

        # copy ConferenceForm/ProtoRPC Message into dict
        data = {
            field.name: getattr(request, field.name) for field in request.all_fields()
        }
        del data['websafeConferenceKey']
        del data['websafeKey']

        # convert date/time from strings to Date/Time objects
        if data['date']:
            data['date'] = datetime.strptime(data['date'][:10], "%Y-%m-%d").date()
        else:
            data['date'] = conf.startDate

        if data['sessionType']:
            data['sessionType'] = data['sessionType'].name

        if data['startTime']:
            data['startTime'] = datetime.strptime(data['startTime'][:8], "%H:%M:%S").time()

        # generate Session Key based on user ID and Conference
        # ID based on Conference key get Session key from ID
        s_id = Session.allocate_ids(size=1, parent=c_key)[0]
        s_key = ndb.Key(Session, s_id, parent=c_key)
        data['key'] = s_key

        # create Session, send email to organizer confirming
        # creation of Conference & return (modified) ConferenceForm
        Session(**data).put()
        return s_key
    def _conferenceRegistration(self, request, reg=True):
        """Register or unregister user for selected conference."""
        retval = None
        prof = self._getProfileFromUser()  # get user Profile

        conf = getConferenceFromRequest(request)
        wsck = conf.key.urlsafe()

        # register
        if reg:
            # check if user already registered otherwise add
            if wsck in prof.conferenceKeysToAttend:
                raise ConflictException(
                    "You have already registered for this conference")

            # check if seats avail
            if conf.seatsAvailable <= 0:
                raise ConflictException(
                    "There are no seats available.")

            # register user, take away one seat
            prof.conferenceKeysToAttend.append(wsck)
            conf.seatsAvailable -= 1
            retval = True

        # unregister
        else:
            # check if user already registered
            if wsck in prof.conferenceKeysToAttend:

                # unregister user, add back one seat
                prof.conferenceKeysToAttend.remove(wsck)
                conf.seatsAvailable += 1
                retval = True
            else:
                retval = False

        # write things back to the datastore & return
        prof.put()
        conf.put()
        return BooleanMessage(data=retval)
    def getConferenceAttendee(self, request):
        """
        Get all user (profile) attending the conference order by name
        """

        user = endpoints.get_current_user()
        if not user:
            raise endpoints.UnauthorizedException('Authorization required')
        user_id = getUserId(user)
        conf = getConferenceFromRequest(request)
        owner_profile = conf.key.parent().get()
        if owner_profile.mainEmail != user_id:
            raise endpoints.UnauthorizedException('Conference owner only')

        wspk = conf.key.urlsafe()
        profs = Profile.query().\
            filter(Profile.conferenceKeysToAttend == wspk).\
            order(Profile.displayName)
        return ProfileForms(
            items=[self._copyProfileToForm(prof) for prof in profs]
        )