def post(self):
        # Ensuer the user can add an outing
        if not hu.userIsAuthorized(self, uau.poster):
            return

        # Get the data
        outingName, description, departureTime, returnTime, meetLocation, outingLocation, showcase = hu.getQueryValues(
            self,
            [ 'i_outing_name',
              'ta_description',
              'i_departure_time',
              'i_return_time',
              'i_meet_location',
              'i_outing_location',
              'i_showcase' ])

        departureTime = du.tryHtmlDatetimeToPythonDatetime(departureTime)
        returnTime = du.tryHtmlDatetimeToPythonDatetime(returnTime)
        showcase = True if showcase == 'True' else False

        valid, errorMessage = ou.outingParametersAreValid(outingName, description, departureTime, returnTime, meetLocation, outingLocation, showcase)

        # If all parameters are valid, then create and store the outing
        if valid:
            creatorId = ''
            try:
                uau.getLoggedInUser(self).key().id()
            except:
                logging.info('Warning: could not determine logged in user when creating outing.')

            newOuting = ou.createOuting(outingName, description, departureTime, returnTime, meetLocation, outingLocation, showcase, creatorId)
            newOuting.put()

            time.sleep(0.25)
            self.redirect('/outings')
            return

        # Otherwise, tell the user what the errors are
        else:    
            departureTime = du.tryPythonDatetimeToHtmlDatetime(departureTime)
            returnTime = du.tryPythonDatetimeToHtmlDatetime(returnTime)

            contentTemplateValues = {
                'outings_buttons_top': ou.getOutingButtonsTop(self),
                'outing_name': outingName,
                'description': description,
                'departure_time': departureTime,
                'error_message': jtr.getRenderedErrorMessage(errorMessage),
                'meet_location': meetLocation,
                'outing_location': outingLocation,
                'return_time': returnTime,
                'showcase': showcase
            }

            # Render the page
            jtr.renderContentAndPage(self, pathToContent, contentFilename, contentTemplateValues, pageTemplateValues)
def getOutingButtonsTop(handler):
    """
    Renders and returns the buttons for the top of an outings page.

    handler: the current page handler

    returns: string
    """
    # Determine if the user can add an outing
    loggedInUser = uau.getLoggedInUser(handler)
    canAddOuting = False
    if loggedInUser != None and uau.doesUserHavePermission(loggedInUser.accountLevel, uau.poster):
        canAddOuting = True

    # Get the rendered buttons
    return jtr.getRenderedTemplate(pathToOutingTemplates, buttonsTopTemplateName, { 'can_add_outing': canAddOuting })
def userIsAuthorized(handler, requiredAccountLevel):
    """    
    Determines whether the current user's account level meets the required account level.
    If the user does not, sets the redirect flags to the unauthroized page. Usually, if this
    method returns false the caller will want to immediately return.

    handler: the current page handler
    requiredAccountLevel: the required level

    returns: bool
    """
    currentUser = uau.getLoggedInUser(handler)
    userAccountLevel = uau.loggedOut    
    if currentUser != None:
        userAccountLevel = currentUser.accountLevel

    if not uau.doesUserHavePermission(userAccountLevel, requiredAccountLevel):
        handler.redirect('/unauthorized')
        return False

    return True
def getRenderedPage(handler, templateValues):
    """
    Renders and returns page_base.html after inserting the template values. The templateValues
    dictionary should contain 'page_title', 'content_title', 'content', optionally
    'login_redirect_link', 'scripts' and 'stylesheets', and no other values. Any additional templating
    to be done to 'content' should be done before calling this method.

    handler: the current page handler
    templateValues: a dictionary of values for the template

    returns: string
    """
    # Get an environment for the html blocks
    jinjaEnv = getJinjaEnv(os.path.join(rh.rootDir, 'html/templates'))

    # Get the current user
    currentUser = uau.getLoggedInUser(handler)

    # Render the buttons_top
    tempVals = {
        'user': '******',
        'logged_in': False
    }

    if 'login_redirect_link' in templateValues.keys():
        # Get the login redirect link if possible
        tempVals['login_redirect_link'] = templateValues['login_redirect_link']
        
    if currentUser != None:
        # Get the user information if possible
        tempVals['user'] = '******' % (currentUser.firstName, currentUser.lastName)
        tempVals['logged_in'] = True
    
    templateValues['buttons_top'] = getRenderedTemplateWithEnvironment(jinjaEnv, 'buttons_top.html', tempVals)
        
    # Render the buttons_side
    templateValues['buttons_side'] = getRenderedTemplateWithEnvironment(jinjaEnv, 'buttons_side.html')

    # Render page_base.html
    return getRenderedTemplateWithEnvironment(jinjaEnv, 'page_base.html', templateValues)