def post_account():
    # Flask apparently throws 400 errors if POST form data isn't present.
    # Full name
    user_id = session['user_id']
    location = settings.get_user(user_id)['feed_location']
    user = User(local_url=location)

    if request.form.get('full_name_changed') == 'true':
        user.full_name = request.form['full_name']
    # Username
    if request.form.get('username_changed') == 'true':
        username= request.form['username']
        if len(username) > 0:
            user.username = username
    # Bio
    if request.form.get('bio_changed') == 'true':
        user.description = request.form['bio']
    # Email
    if request.form.get('email_changed') == 'true':
        email = request.form['email']
        user_dict = settings.get_user(user_id)
        user_dict['email'] = email
        settings.add_user(user_dict)
    # Password
    if request.form.get('password_changed') == 'true':
        password = request.form['password']
        password_confirm = request.form['password_confirm']
        if password == password_confirm:
            user_dict = settings.get_user(user_id)
            user_dict['pwd_hash'] = generate_password_hash(password)
            settings.add_user(user_dict)
    # Language
    if request.form.get('language_changed') == 'true':
        user.language = request.form['language']
    return render_template('account.html', user=user, error='Your settings have been saved.')
def home():
    """ Shows the user's timeline or if no user is logged in it
    will redirect to the user's public timeline (their most
    recent posts) for public viewing. """
    # Not logged in and multi-user mode.
    if 'user_id' not in session and not settings.get('single_user_mode'):
        return render_template('welcome.html')
    # Not logged in and single-user mode.
    elif 'user_id' not in session and settings.get('single_user_mode'):
        user_id = settings.get('single_user_id')
        username = settings.get_user(user_id)['username']
        return redirect(url_for('get_user_profile', username=username))
    # Logged in
    elif 'user_id' in session:
        user_id = session['user_id']
    # Single-user mode, but no user yet.
    elif settings.get('single_user_mode') and settings.get('single_user_id') is None:
        return redirect(url_for('get_register'))
    # Single-user mode, user exists.
    else:
        user_id = settings.get('single_user_id')
    link = settings.get('registered_users').get(user_id).get('feed_location')
    user = User(local_url=link)
    posts = user.home_timeline()
    auth = True if 'user_id' in session else False
    return render_template('timeline.html', posts=posts, user=user,
            page_type='timeline', auth=auth)
def post_status():
    """ Adds a new post to the feed. """
    form = request.form
    status = Status()
    status.description = form['status_text']
    # Reply or Repost
    repost = form.get('repost')
    reply = form.get('reply')
    if repost or reply:
        status.reposted_user_id = form['user_id']
        status.reposted_user_link = form['user_link']
        if repost:
            status.reposted_status_id = form['status_id']
            status.reposted_status_pubdate = form['status_pubdate']

    my_user_id = session['user_id']
    my_user_dict = settings.get_user(my_user_id)
    user = User(local_url=my_user_dict['feed_location'])

    guid = uuid4().hex[-12:]
    reply_url = '{0}/status/{1}/reply'.format(user.profile, guid)
    status = Status({
        'description': status_text,
        'pubdate': datetime.now(pytz.UTC),
        'guid': guid,
        'reply': reply_url
        })
    user.add_post(status)
    return redirect(url_for('home'))
def post_block():
    """ Adds a new follow to the user's list. """
    user_link = request.form['follow-url']
    if user_link != '':
        user_id = session.get('user_id')
        user_dict = settings.get_user(user_id)
        user = User(local_url=user_dict['feed_location'])
        user.block(user_link=user_link)
    return redirect(url_for('home'))
def post_unblock():
    """ Unfollows a given user. """
    user_link = request.form['user_link']
    username = request.form['username']
    user_id = request.form['user_id']

    my_user_id = session.get('user_id')
    user_dict = settings.get_user(my_user_id)
    user = User(local_url=user_dict['feed_location'])
    user.unblock(user_link=user_link, user_name=username, user_id=user_id)
    return redirect(url_for('home'))
def do_login():
    """ Logs the user in. """
    error = ''
    username = request.form['username']
    password = request.form['password']
    username_and_ids = { ud['username']: uid for uid, ud in settings.get('registered_users').iteritems() }

    if username not in username_and_ids.keys():
        error = 'Invalid username'

    pwd_hash =  settings.get_user(username_and_ids[username]).get('pwd_hash')
    if not check_password_hash(pwd_hash, password):
        error = 'Invalid password'
    else:
        session['user_id'] = username_and_ids[username]
        return redirect(url_for('home'))
    return render_template('login.html', error=error)
def get_account():
    """ Allows the user to make changes to their profile. """
    user_id = session['user_id']
    location = settings.get_user(user_id)['feed_location']
    user = User(local_url=location)
    return render_template('account.html', user=user)