From b70e39acfaf1e8c31982d91282fa039a57e096f5 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 27 Mar 2022 11:02:58 -0500 Subject: [PATCH] Complete feed view, post view, and post form --- forms.py | 21 +++++++++++++++++- routes.py | 14 ++++++++++-- static/styles.css | 34 +++++++++++++++++++++++++++++ static/styles.css.map | 2 +- static/styles.scss | 40 +++++++++++++++++++++++++++++++++++ templates/pages/feed.html | 26 +++++++++++++++++++++++ templates/pages/new_post.html | 5 +++++ templates/pages/post.html | 20 ++++++++++++++++++ 8 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 templates/pages/new_post.html create mode 100644 templates/pages/post.html diff --git a/forms.py b/forms.py index 6867c83..b1307fe 100644 --- a/forms.py +++ b/forms.py @@ -2,7 +2,7 @@ from flask import Blueprint, flash, redirect, request, url_for from flask_login import current_user, login_required from .create_app import db -from .models import User +from .models import User, Post, Comment blueprint = Blueprint('forms', __name__) @@ -22,3 +22,22 @@ def edit_profile_post(username): flash('Successfully updated profile.') return redirect(url_for('main.edit_user', username=username)) + + +@blueprint.route('/feed/new', methods=['POST']) +@login_required +def new_post(): + post_text = request.form.get('text') + + if len(post_text) < 15: + flash('Must have at least 15 characters of text.') + return redirect(url_for('forms.new_post')) + elif len(post_text) > 1000: + flash('Cannot have more than 1000 characters of text.') + return redirect(url_for('forms.new_post')) + + post = Post(author=current_user.id, text=post_text) + db.session.add(post) + db.session.commit() + + return redirect(url_for('main.view_post', post_id=post.id)) diff --git a/routes.py b/routes.py index 86154dd..69ad0e4 100644 --- a/routes.py +++ b/routes.py @@ -1,7 +1,7 @@ from flask import Blueprint, redirect, render_template, url_for from flask_login import current_user, login_required -from .models import User +from .models import User, Post, Comment blueprint = Blueprint('main', __name__) @@ -24,7 +24,17 @@ def browse(): @blueprint.route('/feed') def feed(): - return render_template('pages/feed.html') + posts = Post.query.all() + authors = [User.query.get_or_404(post.author) for post in posts] + return render_template('pages/feed.html', posts_and_authors=zip(posts, authors)) + + +@blueprint.route('/feed/') +def view_post(post_id: int): + post = Post.query.get_or_404(post_id) + comments = post.comments + comment_authors = [User.query.get_or_404(comment.author) for comment in comments] + return render_template('pages/post.html', post=post, author=User.query.get_or_404(post.author), comments_and_authors=zip(comments, comment_authors)) @blueprint.route('/messages') diff --git a/static/styles.css b/static/styles.css index 58db4f0..5dfabec 100644 --- a/static/styles.css +++ b/static/styles.css @@ -234,4 +234,38 @@ form button { margin: 0.5em 0; } +.post-box { + border: 1px solid grey; + border-radius: 3px; + padding: 1.5em; + padding-bottom: 0.8em; + margin: 0.45em; +} +.post-box .post-author { + margin-top: 1em; + font-size: 0.8em; + border-bottom: 1px solid grey; + padding-bottom: 0.8em; +} +.post-box .post-author.no-border { + border: none; + padding-bottom: 0; +} +.post-box .post-comments { + padding-left: 2em; + font-size: 0.8em; +} +.post-box .post-comments .post-comment { + width: fit-content; + margin: 0.4em; + padding: 0.3em; + border: 1px solid rgba(128, 128, 128, 0.51); + border-radius: 3px; +} +.post-box .post-comments .post-comment .comment-author { + font-size: 0.9em; + vertical-align: center; + text-decoration: none; +} + /*# sourceMappingURL=styles.css.map */ diff --git a/static/styles.css.map b/static/styles.css.map index 887d3ef..07315a0 100644 --- a/static/styles.css.map +++ b/static/styles.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["styles.scss"],"names":[],"mappings":"AAAA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EAOE;;AALA;EAEE;;;AAON;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;;AAMR;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAIA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAMF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;;AAMR;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE","file":"styles.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["styles.scss"],"names":[],"mappings":"AAAA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EAOE;;AALA;EAEE;;;AAON;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;;AAMR;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAIA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAMF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;EACA;;;AAMR;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA","file":"styles.css"} \ No newline at end of file diff --git a/static/styles.scss b/static/styles.scss index aeb493c..1da6bb0 100644 --- a/static/styles.scss +++ b/static/styles.scss @@ -272,3 +272,43 @@ form { margin: 0.5em 0; } } + +.post-box { + border: 1px solid grey; + border-radius: 3px; + padding: 1.5em; + padding-bottom: 0.8em; + margin: 0.45em; + + .post-author { + margin-top: 1em; + font-size: 0.8em; + border-bottom: 1px solid grey; + padding-bottom: 0.8em; + + &.no-border { + border: none; + padding-bottom: 0; + } + } + + .post-comments { + padding-left: 2em; + font-size: 0.8em; + + .post-comment { + width: fit-content; + margin: 0.4em; + padding: 0.3em; + border: 1px solid rgba(128, 128, 128, 0.51); + border-radius: 3px; + + .comment-author { + //margin-left: 1em; + font-size: 0.9em; + vertical-align: center; + text-decoration: none; + } + } + } +} diff --git a/templates/pages/feed.html b/templates/pages/feed.html index 86d9f80..8cb7e9f 100644 --- a/templates/pages/feed.html +++ b/templates/pages/feed.html @@ -1,5 +1,31 @@ {% extends 'layouts/index.html' %} {% block content %} + {% if current_user.is_authenticated %} +
+ + +
+ {% with messages = get_flashed_messages() %} + {% if messages %} +
+ {{ messages[0] }} +
+ {% endif %} + {% endwith %} + {% endif %} + + {% for post, author in posts_and_authors %} +
+ {{ post.text }} + +
+ {% endfor %} {% endblock content %} diff --git a/templates/pages/new_post.html b/templates/pages/new_post.html new file mode 100644 index 0000000..62a1d1f --- /dev/null +++ b/templates/pages/new_post.html @@ -0,0 +1,5 @@ +{% extends 'layouts/index.html' %} + +{% block content %} + +{% endblock %} diff --git a/templates/pages/post.html b/templates/pages/post.html new file mode 100644 index 0000000..f60bb34 --- /dev/null +++ b/templates/pages/post.html @@ -0,0 +1,20 @@ +{% extends 'layouts/index.html' %} +{% block content %} +
+ {{ post.text }} +
+ +
+ {% for comment, author in comments_and_authors %} +
+ + "{{ comment.text }}"{{ author.name }} +
+ {% endfor %} +
+
+{% endblock %}