8000 Adding Editor in Progress · code93/trantor-bootcamp@78b9e7f · GitHub
[go: up one dir, main page]

Skip to content

Commit 78b9e7f

Browse files
committed
Adding Editor in Progress
Portfolio and Blog Posts editor for Users.
1 parent 5818457 commit 78b9e7f

File tree

11 files changed

+197
-1
lines changed

11 files changed

+197
-1
lines changed
312 Bytes
Binary file not shown.
555 Bytes
Binary file not shown.

Project/Website/app.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010

11+
1112
app = Flask(__name__)
1213
app.debug = True
1314

@@ -22,7 +23,8 @@
2223
login.login_view = 'login'
2324

2425
socketio = SocketIO(app)
25-
26+
27+
2628
@app.before_first_request
2729
def create_all():
2830
db.create_all()
@@ -31,6 +33,11 @@ def create_all():
3133
@login_required
3234
def blog():
3335
return render_template('dashboard.html')
36+
37+
@app.route('/profile')
38+
@login_required
39+
def profile():
40+
return render_template('profile.html')
3441

3542

3643
@app.route('/login', methods = ['POST', 'GET'])
@@ -119,3 +126,8 @@ def handle_my_custom_event(json, methods=['GET', 'POST']):
119126

120127

121128

129+
@app.route('/create_post')
130+
@login_required
131+
def create_post():
132+
render_template("create_post.html")
133+

Project/Website/data.db

4 KB
Binary file not shown.

Project/Website/forms.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from typing import Text
2+
from flask_wtf import FlaskForm
3+
from wtforms import StringField,SubmitField,TextAreaField
4+
from wtforms.validators import DataRequired
5+
6+
class BlogPostForm(FlaskForm):
7+
title = StringField('Title', validators=[DataRequired()])
8+
text = TextAreaField('Text', validators=[DataRequired()])
9+
submit = SubmitField("Post")

Project/Website/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from flask_sqlalchemy import SQLAlchemy
22
from flask_login import UserMixin
3+
from sqlalchemy.orm import backref
34
from werkzeug.security import generate_password_hash, check_password_hash
45
from flask_login import LoginManager
6+
from datetime import datetime
57

68
login = LoginManager()
79
db = SQLAlchemy()
@@ -13,13 +15,28 @@ class UserModel(UserMixin, db.Model):
1315
email = db.Column(db.String(80), unique=True)
1416
username = db.Column(db.String(100))
1517
password_hash = db.Column(db.String())
18+
19+
posts = db.relationship('BlogPost',backref='author',lazy=True)
1620

1721
def set_password(self,password):
1822
self.password_hash = generate_password_hash(password)
1923

2024
def check_password(self,password):
2125
return check_password_hash(self.password_hash,password)
2226

27+
28+
class BlogPost(db.Model):
29+
30+
users = db.relationship(UserModel)
31+
32+
id = db.Column(db.Integer,primary_key=True)
33+
user_id = db.Column(db.Integer,db.ForeignKey('users.id'),nullable=False)
34+
35+
date = db.Column(db.DateTime,nullable=False, default=datetime.utcnow)
36+
title = db.Column(db.String(140), nullable=False)
37+
text = db.Column(db.Text,nullable=False)
38+
39+
2340

2441
@login.user_loader
2542
def load_user(id):
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{% extends "layout.html" %}
2+
{% block content %}
3+
<div class="jumbotron">
4+
<h1>{{post.title}}</h1>
5+
<h2>Written by:{{post.author.username}}</h2>
6+
<h3>Published: {{post.date.strftime('%B %d, %Y')}}</h3>
7+
<p>{{post.text}}</p>
8+
9+
{% if post.author == current_user %}
10+
<div>
11+
<a href="{{url_for('blog_posts.update',blog_post_id=post.id)}}">Update</a>
12+
<button type="button" class="btn btn-danger" data-toggle='modal' data-target="#del_modal">Delete</button>
13+
</div>
14+
{% endif %}
15+
16+
</div>
17+
18+
<div class="modal" tabindex="-1" role="dialog" id="del_modal">
19+
<div class="modal-dialog">
20+
<div class="modal-content">
21+
<div class="modal-header">
22+
<h5 class="modal-title">Delete Post?</h5>
23+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
24+
</div>
25+
<div class="modal-body">
26+
<p>Are you sure you want to delete the post?</p>
27+
</div>
28+
<div class="modal-footer">
29+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
30+
<form action="{{url_for('blog_posts.delete_post', blog_post_id=post.id)}}" method="post">
31+
<input class="btn btn-danger" type="submit" name="" value="Delete">
32+
</form>
33+
</div>
34+
</div>
35+
</div>
36+
</div>
37+
38+
39+
{% endblock %}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{% extends "layout.html" %}
2+
{% block content %}
3+
<div class="container">
4+
<form class="form-group" method="POST">
5+
{{form.hidden_tag()}}
6+
7+
<div class="form-group">
8+
{{form.title.label(class="form-control-label")}}
9+
{{form.title(class="form-control form-control-lg")}}
10+
11+
</div>
12+
13+
<div class="form-group">
14+
{{form.text.label(class="form-control-label")}}
15+
{{form.text(class="form-control form-control-lg")}}
16+
17+
</div>
18+
19+
<div class="form-group">
20+
[{form.submit(class="btn btn-outline-info")}]
21+
</div>
22+
23+
</form>
24+
</div>
25+
26+
{% endblock %}

Project/Website/templates/layout.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
{% block phone %}{% endblock %}
4141
{% block computer %}{% endblock %}
4242
{% block coffee %}{% endblock %}
43+
{% block content %}{% endblock %}
4344
</body>
4445

4546
<nav class="navbar navbar-inverse navbar-fixed-bottom">
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{% extends "layout.html" %}
2+
{% block profile %}
3+
4+
5+
<h1 class="title">
6+
Welcome, Anthony!
7+
</h1>
8+
9+
10+
{% endblock %}

Project/Website/views.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from os import abort
2+
from flask import render_template,url_for,flash,request,redirect,Blueprint
3+
from flask_login import current_user,login_required
4+
from models import BlogPost, UserModel,db
5+
from forms import BlogPostForm
6+
7+
blog_posts = Blueprint('blog', __name__)
8+
9+
@blog_posts.route('create', methods=['GET','POST'])
10+
@login_required
11+
def create_post():
12+
form = BlogPostForm()
13+
14+
if form.validate_on_submit():
15+
16+
blog_post = BlogPost(title=form.title.data,
17+
text=form.text.data,
18+
user_id=current_user.id
19+
)
20+
db.session.add(blog_post)
21+
db.session.commit()
22+
flash('Blog Post Created')
23+
return redirect(url_for('dashboard'))
24+
25+
return render_template('create_post.html', form=form)
26+
27+
28+
@blog_posts.route('/<int:blog_post_id>')
29+
def blog_post(blog_post_id):
30+
blog_post = BlogPost.query.get_or_404(blog_post_id)
31+
return render_template('blog_post.html', title=blog_post.title,
32+
date=blog_post.date, post=blog_post
33+
)
34+
35+
@blog_post.route('/<int:blog_post_id/update', methods=['GET','POST'])
36+
@login_required
37+
def update(blog_post_id):
38+
blog_post = BlogPost.query.get_or_404(blog_post_id)
39+
if blog_post.author != current_user:
40+
abort(403)
41+
form = BlogPostForm()
42+
43+
if form.validate_on_submit():
44+
45+
blog_post.title = form.title.data
46+
blog_post.text=form.text.data
47+
48+
db.session.commit()
49+
flash('Blog Post Updated')
50+
return redirect(url_for('blog_posts.blog_post', blog_post_id = blog_post.id))
51+
52+
53+
elif request.method == 'GET':
54+
form.title.data = blog_post.title
55+
form.text.data = blog_post.text
56+
57+
return render_template('create_post.html', title='Updating',form=form)
58+
59+
60+
@blog_post.route('/<int:blog_post_id/update', methods=['GET','POST'])
61+
@login_required
62+
def update(blog_post_id):
63+
blog_post = BlogPost.query.get_or_404(blog_post_id)
64+
if blog_post.author != current_user:
65+
abort(403)
66+
form = BlogPostForm()
67+
68+
if form.validate_on_submit():
69+
70+
blog_post.title = form.title.data
71+
blog_post.text=form.text.data
72+
73+
db.session.commit()
74+
flash('Blog Post Updated')
75+
return redirect(url_for('blog_posts.blog_post', blog_post_id = blog_post.id))
76+
77+
78+
elif request.method == 'GET':
79+
form.title.data = blog_post.title
80+
form.text.data = blog_post.text
81+
82+
return render_template('create_post.html', title='Updating',form=form)

0 commit comments

Comments
 (0)
0