Tweeder/Tweeder.py
2018-05-12 09:50:27 +01:00

376 lines
15 KiB
Python

from flask import Flask, render_template, request, redirect, url_for, session, make_response, abort
from backend import accounts, timeline, files, messages
app = Flask(__name__)
app.secret_key = "eVZ4EmVK70iETb03KqDAXV5sBHb3T73t"
@app.route('/')
def index():
if 'username' in session.keys():
return redirect(url_for('profile'))
else:
return redirect(url_for('register'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
login_attempt = accounts.login(username, password)
if login_attempt['status'] == 'success':
session['username'] = username.lower() if "@" not in username else accounts.username_for_email(username)
if 'remember' in request.form.keys():
session.permanent = True
return redirect(url_for('profile'))
else:
return render_template('login.html',
status=login_attempt['status'],
message=login_attempt['message'])
elif request.method == 'GET':
if 'username' in session.keys():
return redirect(url_for('logout'))
return render_template('login.html', title="Login")
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == "POST":
username = request.form['username']
email = request.form['email']
password = request.form['password']
confirm_password = request.form['confirm-password']
if password == confirm_password:
register_attempt = accounts.create_account(email, username, password)
return render_template('register.html',
status=register_attempt['status'],
message=register_attempt['message'])
else:
return render_template("register.html",
status="danger",
message="Passwords do not match!")
elif request.method == 'GET':
if 'username' in session.keys():
return redirect(url_for('logout'))
return render_template('register.html', title="Register")
@app.route('/profile', methods=['GET'])
@app.route('/profile/<name>', methods=['GET'])
def profile(name=None):
logged_in = session['username'] if ('username' in session.keys()) else False
if not logged_in and name is None:
return redirect(url_for('index'))
if logged_in and name is None:
name = session['username']
name = name.lower()
logged_in = accounts.get_display_name(session['username']) if 'username' in session.keys() else False
posts = list(timeline.user_posts_by_username(name))
if 'pinned' in accounts.account_details(name).keys():
pinned = timeline.post_details(accounts.account_details(name)['pinned'])
else:
pinned=False
return render_template('profile.html',
title=accounts.get_display_name(name)+"'s profile",
user=accounts.account_details(name),
logged_in=logged_in,
theme=accounts.get_theme(logged_in),
following=accounts.is_following(logged_in, name),
followers=accounts.get_followers(name),
posts=posts,
pinned=pinned)
@app.route('/logout')
def logout():
session.pop('username')
return redirect(url_for('login'))
@app.route('/newpost', methods=['POST'])
def new_post():
username = session['username']
timeline.post_status(username, request.form['status'])
return redirect(request.referrer)
@app.route('/timeline', methods=['GET'])
def timeline_view():
if 'username' in session.keys():
logged_in = accounts.get_display_name(session['username'])
else:
return redirect(url_for('login'))
posts = timeline.timeline_for_user(session['username'])
return render_template('timeline.html',
title="Timeline",
logged_in=logged_in,
posts=posts,
theme=accounts.get_theme(logged_in))
@app.route('/global', methods=['GET'])
def global_timeline():
if 'username' not in session.keys(): logged_in=False
else: logged_in = accounts.get_display_name(session['username'])
return render_template('global.html',
title="Global Timeline",
logged_in=logged_in if logged_in else "anonymous",
posts=timeline.global_timeline(),
theme=accounts.get_theme(logged_in))
@app.route('/settings', methods=['GET', 'POST'])
def user_settings():
if 'username' in session.keys():
logged_in = accounts.account_details(session['username'])['displayname']
account = accounts.account_details(session['username'])
else: redirect(url_for('login'))
if request.method == "GET":
return render_template('settings.html',
title="Settings",
logged_in=logged_in,
account=account,
theme=accounts.get_theme(session['username'].lower()))
elif request.method == "POST":
print(request.files)
print(request.form)
if 'username' not in session.keys():
return redirect(url_for('login'))
updated_profile = {
'bio': request.form['bio'],
'gender': request.form['gender'],
'location': request.form['location']
}
if 'profile_pic' in request.files.keys():
profile_pic = files.upload_file(request.files['profile_pic'])
if request.files['profile_pic'].content_type in ['image/jpg', 'image/jpeg', 'image/png']:
updated_profile['profile_pic'] = profile_pic
else:
if 'profile_pic' in accounts.account_details(session['username'].lower())['profile'].keys():
profile_pic = accounts.account_details(session['username'].lower())['profile']['profile_pic']
updated_profile['profile_pic'] = profile_pic
else:
if 'profile_pic' in accounts.account_details(session['username'].lower())['profile'].keys():
profile_pic = accounts.account_details(session['username'].lower())['profile']['profile_pic']
updated_profile['profile_pic'] = profile_pic
accounts.set_theme(session['username'].lower(), request.form['theme'])
if request.form['gender'] == "Non-Binary":
updated_profile['gender'] = request.form['gender-custom']
print(updated_profile)
username = session['username']
accounts.update_profile(username, updated_profile)
account = accounts.account_details(session['username'])
return render_template('settings.html',
title="Settings",
saved=True,
logged_in=logged_in,
account=account,
theme=accounts.get_theme(session['username'].lower()))
@app.route("/changepass", methods=['GET', 'POST'])
def changepass():
logged_in = session['username'] if ('username' in session.keys()) else False
if not logged_in: return redirect(url_for('login'))
if request.method == 'GET':
return render_template('changepass.html', logged_in=logged_in, title="Change Password")
elif request.method == 'POST':
if request.form['new'] != request.form['confirm']:
return render_template('changepass.html', logged_in=logged_in, title="Change Password",
error="Passwords do not match!")
if request.form['new'] == '':
return render_template('changepass.html', logged_in=logged_in, title="Change Password",
error="New password cannot be blank!")
if accounts.change_password(logged_in, request.form['current'], request.form['new']):
return render_template('changepass.html', logged_in=logged_in, title="Change Password",
error="Old password was incorrect!")
else:
return render_template('changepass.html', logged_in=logged_in, title="Change Password",
success="Password changed successfully!")
@app.route("/delete/<post_id>", methods=['GET'])
def delete_post(post_id):
if 'username' not in session.keys(): return redirect(url_for('login'))
if session['username'] == timeline.post_details(post_id)['poster'].lower():
timeline.delete_post(post_id)
return redirect(url_for('profile'))
else:
return "No", 403
@app.route("/reply/<post_id>", methods=['GET', "POST"])
def reply_to_post(post_id):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username'] if ('username' in session.keys()) else False
if request.method == "GET":
return render_template('reply.html',
title="Reply to " + timeline.post_details(post_id)['poster'],
logged_in=logged_in,
posts=timeline.get_full_replies(post_id)[:-1],
reply_to=timeline.post_details(post_id),
theme=accounts.get_theme(logged_in))
elif request.method == "POST":
timeline.post_status(logged_in, request.form['status'], replyTo=post_id)
return redirect(url_for('profile'))
@app.route("/follow/<user>", methods=["GET", "POST"])
def follow(user):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username']
if request.method == "POST":
accounts.follow(logged_in, user)
return redirect(str("/profile/" + user))
else:
pass
@app.route("/unfollow/<user>", methods=["GET", "POST"])
def unfollow(user):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username']
if request.method == "POST":
accounts.unfollow(logged_in, user)
return redirect(str("/profile/" + user))
else:
pass
@app.route("/view/<post_id>", methods=["GET"])
def view_thread(post_id):
logged_in = session['username'] if ('username' in session.keys()) else False
posts = timeline.get_full_replies(post_id)
return render_template('view.html',
title="View Post",
logged_in=logged_in,
posts=posts)
@app.route("/like/<post_id>", methods=["GET", "POST"])
def like_post(post_id):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username']
if request.method == "POST":
timeline.like_post(post_id, logged_in)
return redirect(request.referrer)
elif request.method == "GET":
pass
@app.route("/unlike/<post_id>", methods=["GET", "POST"])
def unlike_post(post_id):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username']
if request.method == "POST":
timeline.unlike_post(post_id, logged_in)
return redirect(request.referrer)
elif request.method == "GET":
pass
@app.route("/files/<oid>", methods=['GET'])
def get_file(oid):
fl = files.get_file(oid)
if not fl: return abort(404)
response = make_response(fl.read())
response.mimetype = fl.content_type
return response
@app.route("/mentions", methods=["GET"])
def mentions():
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username'].lower()
return render_template("mentions.html",
title="Mentions",
logged_in=logged_in,
theme=accounts.get_theme(session['username'].lower()),
posts=timeline.get_mentions(logged_in))
@app.route("/editpost/<post_id>", methods=["GET", "POST"])
def editpost(post_id):
if 'username' not in session.keys(): return redirect(url_for('login'))
logged_in = session['username']
post_obj = timeline.post_details(post_id)
print(post_obj)
if request.method == "GET":
if post_obj['poster'].lower() != logged_in:
return abort(403)
else:
return render_template('editpost.html', title="Edit Post", post_obj=post_obj)
elif request.method == "POST":
timeline.edit_status(post_obj['_id'], request.form['status'])
return redirect('/view/'+str(post_id))
@app.route("/messages", methods=["GET", "POST"])
def messages_blank():
logged_in = session['username'] if ('username' in session.keys()) else False
if 'username' not in session: return redirect(url_for('login'))
if request.method == "GET":
return render_template('messages.html', title="Messages", logged_in=logged_in, theme=accounts.get_theme(logged_in))
elif request.method == "POST":
return redirect('/messages/'+request.form['messageuser'])
@app.route("/messages/<user>", methods=["GET", "POST"])
def messaging(user):
logged_in = session['username'] if ('username' in session.keys()) else False
if 'username' not in session: return redirect(url_for('login'))
if request.method == "GET":
return render_template(
"messages.html",
title="Messages",
logged_in=logged_in,
messaging=accounts.get_display_name(user.lower()),
messages=messages.get_messages(logged_in, user.lower()),
theme=accounts.get_theme(logged_in)
)
elif request.method == "POST":
messages.send_message(
accounts.get_display_name(logged_in.lower()),
accounts.get_display_name(user.lower()),
request.form['message_content']
)
return redirect(request.referrer)
@app.route('/tag', methods=['POST'])
@app.route('/tag/<tagname>', methods=['GET'])
def findtag(tagname=None):
logged_in = session['username'] if ('username' in session.keys()) else False
if request.method == 'GET':
return render_template('timeline.html',
title=str("#" + tagname),
logged_in=logged_in,
posts=timeline.find_posts_by_hashtag(tagname),
theme=accounts.get_theme(logged_in))
elif request.method == 'POST':
return redirect('/tag/'+request.form['tagname'])
@app.route('/pin/<post_id>', methods=['GET'])
def pin(post_id):
if timeline.get_poster(post_id).lower() == session['username'].lower():
accounts.set_pinned(session['username'], post_id)
return redirect(request.referrer)
@app.route('/unpin/<post_id>', methods=['GET'])
def unpin(post_id):
if timeline.get_poster(post_id).lower() == session['username'].lower():
accounts.unset_pinned(session['username'], post_id)
return redirect(request.referrer)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080, debug=True)