From b0fe8621c87b3f5a79f17e3455bed5634479dce5 Mon Sep 17 00:00:00 2001 From: SecretlyTaco Date: Wed, 28 Feb 2018 01:11:08 +0000 Subject: [PATCH 1/5] Added code to read files from gridfs system --- Tweeder.py | 13 +++++++++++-- backend/files.py | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 backend/files.py diff --git a/Tweeder.py b/Tweeder.py index 28b3606..08d810c 100644 --- a/Tweeder.py +++ b/Tweeder.py @@ -1,5 +1,5 @@ -from flask import Flask, render_template, request, redirect, url_for, session -from backend import accounts, timeline +from flask import Flask, render_template, request, redirect, url_for, session, make_response, abort +from backend import accounts, timeline, files app = Flask(__name__) app.secret_key = "eVZ4EmVK70iETb03KqDAXV5sBHb3T73t" @@ -216,5 +216,14 @@ def unlike_post(post_id): elif request.method == "GET": pass + +@app.route("/files/", 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 + if __name__ == '__main__': app.run(host="127.0.0.1", debug=True) diff --git a/backend/files.py b/backend/files.py new file mode 100644 index 0000000..219ee5a --- /dev/null +++ b/backend/files.py @@ -0,0 +1,17 @@ +from pymongo import MongoClient +from bson.objectid import ObjectId +import gridfs +from gridfs.errors import NoFile + +client = MongoClient() +db = client.tweeder +files_db = gridfs.GridFS(client.tweeder_files) +accounts_db = db.accounts + + +def get_file(oid): + try: + files_db.get(ObjectId(oid)) + except NoFile: + return False + From 34eda46c87820897977c8007c4dd94fa3f5c19f8 Mon Sep 17 00:00:00 2001 From: SecretlyTaco Date: Wed, 28 Feb 2018 10:02:05 +0000 Subject: [PATCH 2/5] Added functional file upload form, as well as a /files/ view to get files --- Tweeder.py | 8 +++++++- backend/files.py | 10 ++++++++-- templates/settings.html | 4 +++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Tweeder.py b/Tweeder.py index 08d810c..27f7579 100644 --- a/Tweeder.py +++ b/Tweeder.py @@ -127,6 +127,8 @@ def user_settings(): else: return redirect(url_for('login')) elif request.method == "POST": + print(request.files) + print(request.form) if 'username' not in session.keys(): return redirect(url_for('login')) profile = { @@ -134,6 +136,9 @@ def user_settings(): 'gender': request.form['gender'], 'location': request.form['location'] } + if 'profile-pic' in request.files.keys(): + profile_pic = files.upload_file(request.files['profile-pic']) + profile['profile-pic'] = profile_pic accounts.set_theme(session['username'].lower(), request.form['theme']) username = session['username'] accounts.update_profile(username, profile) @@ -220,10 +225,11 @@ def unlike_post(post_id): @app.route("/files/", methods=['GET']) def get_file(oid): fl = files.get_file(oid) - if not fl: return abort(404) + if not fl: return "File not found" response = make_response(fl.read()) response.mimetype = fl.content_type return response + if __name__ == '__main__': app.run(host="127.0.0.1", debug=True) diff --git a/backend/files.py b/backend/files.py index 219ee5a..1caa360 100644 --- a/backend/files.py +++ b/backend/files.py @@ -1,7 +1,8 @@ from pymongo import MongoClient from bson.objectid import ObjectId -import gridfs from gridfs.errors import NoFile +from werkzeug.utils import secure_filename +import gridfs client = MongoClient() db = client.tweeder @@ -11,7 +12,12 @@ accounts_db = db.accounts def get_file(oid): try: - files_db.get(ObjectId(oid)) + return files_db.get(ObjectId(oid)) except NoFile: return False + +def upload_file(file_to_upload): + filename = secure_filename(file_to_upload.filename) + obj = files_db.put(file_to_upload, content_type=file_to_upload.content_type, filename=filename) + return obj diff --git a/templates/settings.html b/templates/settings.html index da4ac77..275509d 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -3,8 +3,10 @@ {% block content %}

Settings for {{ logged_in }}


-
+
+

Profile Picture

+

Profile Fields

From 863eb395b33301bb68e0b749ea518d71a55a4764 Mon Sep 17 00:00:00 2001 From: SecretlyTaco Date: Wed, 28 Feb 2018 10:28:33 +0000 Subject: [PATCH 3/5] Show profile picture on profiles, renamed var to use _ instead of - for compatibility --- Tweeder.py | 4 ++-- templates/profile.html | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Tweeder.py b/Tweeder.py index 27f7579..0d53139 100644 --- a/Tweeder.py +++ b/Tweeder.py @@ -137,8 +137,8 @@ def user_settings(): 'location': request.form['location'] } if 'profile-pic' in request.files.keys(): - profile_pic = files.upload_file(request.files['profile-pic']) - profile['profile-pic'] = profile_pic + profile_pic = files.upload_file(request.files['profile_pic']) + profile['profile_pic'] = profile_pic accounts.set_theme(session['username'].lower(), request.form['theme']) username = session['username'] accounts.update_profile(username, profile) diff --git a/templates/profile.html b/templates/profile.html index 278ee17..1febb76 100644 --- a/templates/profile.html +++ b/templates/profile.html @@ -3,6 +3,9 @@ {% block content %}
+ {% if user.profile.profile_pic %} + + {% endif %}

{% if user.verified %} {% endif %}{{ user.displayname }} on Tweeder

{% if user.profile.bio %} @@ -11,6 +14,7 @@ Tweeder user since 1984 {% endif %}

+
From ea2f3f84e565e4afe38c89876a1a58acda2e8e28 Mon Sep 17 00:00:00 2001 From: SecretlyTaco Date: Wed, 28 Feb 2018 22:16:51 +0000 Subject: [PATCH 4/5] Added check for empty files --- backend/files.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/files.py b/backend/files.py index 1caa360..2eded9d 100644 --- a/backend/files.py +++ b/backend/files.py @@ -18,6 +18,8 @@ def get_file(oid): def upload_file(file_to_upload): + if file_to_upload.filename == '': + return False filename = secure_filename(file_to_upload.filename) obj = files_db.put(file_to_upload, content_type=file_to_upload.content_type, filename=filename) return obj From 33ebdcaceb15228be1ecaba7579942aa927ed5d5 Mon Sep 17 00:00:00 2001 From: SecretlyTaco Date: Wed, 28 Feb 2018 22:17:19 +0000 Subject: [PATCH 5/5] Now shows profile picture on profile page, and doesn't overwrite with nothing if you don't send in a file when saving settings --- Tweeder.py | 17 +++++++++++------ templates/profile.html | 2 +- templates/settings.html | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Tweeder.py b/Tweeder.py index 0d53139..159abb0 100644 --- a/Tweeder.py +++ b/Tweeder.py @@ -131,17 +131,22 @@ def user_settings(): print(request.form) if 'username' not in session.keys(): return redirect(url_for('login')) - profile = { + 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']) - profile['profile_pic'] = profile_pic + if 'profile_pic' in request.files.keys(): + if request.files['profile_pic'].filename == '': + if accounts.account_details(session['username'].lower())['profile']['profile_pic']: + profile_pic = accounts.account_details(session['username'].lower())['profile']['profile_pic'] + updated_profile['profile_pic'] = profile_pic + else: + profile_pic = files.upload_file(request.files['profile_pic']) + updated_profile['profile_pic'] = profile_pic accounts.set_theme(session['username'].lower(), request.form['theme']) username = session['username'] - accounts.update_profile(username, profile) + accounts.update_profile(username, updated_profile) return redirect(request.referrer) @@ -225,7 +230,7 @@ def unlike_post(post_id): @app.route("/files/", methods=['GET']) def get_file(oid): fl = files.get_file(oid) - if not fl: return "File not found" + if not fl: return abort(404) response = make_response(fl.read()) response.mimetype = fl.content_type return response diff --git a/templates/profile.html b/templates/profile.html index 1febb76..2f30c0e 100644 --- a/templates/profile.html +++ b/templates/profile.html @@ -4,7 +4,7 @@
{% if user.profile.profile_pic %} - + {% endif %}

{% if user.verified %} {% endif %}{{ user.displayname }} on Tweeder

diff --git a/templates/settings.html b/templates/settings.html index 275509d..eb8c8e0 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -6,7 +6,7 @@

Profile Picture

- +

Profile Fields