Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified blog_project/blog/blog.db
Binary file not shown.
8 changes: 5 additions & 3 deletions blog_project/blog/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ class LoginForm(FlaskForm):


class UpdateProfileForm(FlaskForm):
username = StringField('user name', validators=[DataRequired(), Length(min=4, max=25)])
username = StringField('user name', validators=[
DataRequired(), Length(min=4, max=25)])
password = PasswordField('password', validators=[DataRequired()])


class PostForm(FlaskForm):
title = StringField('title', validators=[DataRequired()])
content = TextAreaField('content', validators=[DataRequired()])
tags = StringField('tags', validators=[DataRequired()])


class SearchForm(FlaskForm):
query = StringField('Post Title', validators=[DataRequired()])
submit = SubmitField('Search')

submit = SubmitField('Search')
21 changes: 19 additions & 2 deletions blog_project/blog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ def load_user(user_id):
return User.query.get(int(user_id))


post_tags = db.Table('post_tags',
db.Column('post_id', db.Integer,
db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)


class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(30), unique=True, nullable=False)
Expand All @@ -25,6 +32,16 @@ class Post(db.Model):
date = db.Column(db.DateTime, nullable=False, default=datetime.now)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

tags = db.relationship('Tag', secondary=post_tags,
backref=db.backref('posts', lazy='dynamic'))

def __repr__(self):
return f'{self.__class__.__name__}({self.id}, {self.title})'


class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), unique=True, nullable=False)

def __repr__(self):
return f'{self.__class__.__name__}({self.id}, {self.title})'
return f'{self.__class__.__name__}({self.id}, {self.name})'
46 changes: 35 additions & 11 deletions blog_project/blog/routes.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from flask import render_template, redirect, url_for, flash, request, abort
from . import app, db, bcrypt
from .forms import RegistrationForm, LoginForm, UpdateProfileForm, PostForm , SearchForm
from .models import User, Post
from .forms import RegistrationForm, LoginForm, UpdateProfileForm, PostForm, SearchForm
from .models import User, Post, Tag
from flask_login import login_user, current_user, logout_user, login_required


Expand Down Expand Up @@ -78,6 +78,7 @@ def profile():

return render_template('profile.html', form=form)


@app.route('/post/new', methods=['GET', 'POST'])
@login_required
def new_post():
Expand All @@ -88,6 +89,12 @@ def new_post():
content=form.title.data,
author=current_user
)
tags_list = [tag.strip() for tag in form.tags.data.split(',')]
for tag_name in tags_list:
tag = Tag.query.filter_by(name=tag_name).first()
if not tag:
tag = Tag(name=tag_name)
post.tags.append(tag)
db.session.add(post)
db.session.commit()
flash('post created')
Expand All @@ -111,31 +118,48 @@ def delete(post_id):
@login_required
def update(post_id):
post = Post.query.get_or_404(post_id)

if post.author != current_user:
abort(403)

form = PostForm()

if form.validate_on_submit():
post.title = form.title.data
post.content = form.content.data
post.tags.clear()

tags_list = [tag.strip() for tag in form.tags.data.split(',')]
for tag_name in tags_list:
tag = Tag.query.filter_by(name=tag_name).first()
if not tag:
tag = Tag(name=tag_name)
post.tags.append(tag)
db.session.commit()
flash('post updated', 'success')
return redirect(url_for('detail', post_id=post.id))
elif request.method == 'GET':
form.title.data = post.title
form.content.data = post.content
form.tags.data = ','.join([tag.name for tag in post.tags])
return render_template('update.html', form=form)

@app.route('/post/search' , methods=['GET', 'POST'])

@app.route('/post/search', methods=['GET', 'POST'])
def search():
form = SearchForm()
form = SearchForm()
if form.validate_on_submit():
posts = Post.query.filter(Post.title.like(f"%{form.query.data}%")).all()
posts = Post.query.filter(
Post.title.like(f"%{form.query.data}%")).all()
if posts:
return render_template('search.html', posts=posts , form=form)
return render_template('search.html', posts=posts, form=form)
else:
flash('No such post has been found!','danger')
return render_template('search.html',form=form)
return render_template('search.html', form=form)
flash('No such post has been found!', 'danger')
return render_template('search.html', form=form)
return render_template('search.html', form=form)


@app.route('/tag/<string:tag_name>')
def tag_posts(tag_name):
tag = Tag.query.filter_by(name=tag_name).first_or_404()
return render_template('tag_posts.html', posts=tag.posts, tag_name=tag_name)
16 changes: 11 additions & 5 deletions blog_project/blog/templates/detail.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
{% extends 'base.html' %}

{% block content %}
<h3>{{ post.title }}</h3>
<small>{{ post.author.username }}</small>
<small>{{ post.date.strftime('%Y-%m-%d') }}</small>
<hr>
<p>{{ post.content|safe }}</p>
<h3>{{ post.title }}</h3>
<small>{{ post.author.username }}</small>
<small>{{ post.date.strftime('%Y-%m-%d') }}</small>
<div>
{% for tag in post.tags %}
<a href="{{ url_for('tag_posts', tag_name=tag.name) }}"><span class="badge badge-secondary">{{ tag.name
}}</span></a>
{% endfor %}
</div>
<hr>
<p>{{ post.content|safe }}</p>
{% endblock content %}
32 changes: 19 additions & 13 deletions blog_project/blog/templates/home.html
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
{% extends 'base.html' %}

{% block content %}
<h3>Home Page {{ current_user.username }}</h3>
<h3>Home Page {{ current_user.username }}</h3>

<div class="card">
{% for post in posts %}
<div class="card-body">
<h6>{{ post.title }}</h6>
<a href="{{ url_for('detail', post_id=post.id) }}" class="btn btn-info">Show</a>
{% if post.author == current_user %}
<a href="{{ url_for('delete', post_id=post.id) }}" class="btn btn-danger">Delete</a>
<a href="{{ url_for('update', post_id=post.id) }}" class="btn btn-primary">Update</a>
{% endif %}
</div>
{% endfor %}
<div class="card">
{% for post in posts %}
<div class="card-body">
<h6>{{ post.title }}</h6>
<div>
{% for tag in post.tags %}
<a href="{{ url_for('tag_posts', tag_name=tag.name) }}"><span class="badge badge-secondary">{{ tag.name
}}</span></a>
{% endfor %}
</div>
<a href="{{ url_for('detail', post_id=post.id) }}" class="btn btn-info">Show</a>
{% if post.author == current_user %}
<a href="{{ url_for('delete', post_id=post.id) }}" class="btn btn-danger">Delete</a>
<a href="{{ url_for('update', post_id=post.id) }}" class="btn btn-primary">Update</a>
{% endif %}
</div>
{% endblock %}
{% endfor %}
</div>
{% endblock %}
19 changes: 11 additions & 8 deletions blog_project/blog/templates/new_post.html
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
{% extends 'base.html' %}

{% block content %}
<form method="post">
{{ form.csrf_token }}
<form method="post">
{{ form.csrf_token }}

{{ form.title.label}}
{{ form.title}}
{{ form.title.label}}
{{ form.title}}

{{ form.content.label }}
{{ form.content }}
{{ form.content.label }}
{{ form.content }}

<input type="submit" value="Save">
</form>
{{form.tags.label}}
{{form.tags}}

<input type="submit" value="Save">
</form>
{% endblock content %}
18 changes: 18 additions & 0 deletions blog_project/blog/templates/tag_posts.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{% extends 'base.html' %}

{% block content %}
<h3>Posts tagged with "{{ tag_name }}"</h3>

<div class="card">
{% for post in posts %}
<div class="card-body">
<h6>{{ post.title }}</h6>
<a href="{{ url_for('detail', post_id=post.id) }}" class="btn btn-info">Show</a>
{% if post.author == current_user %}
<a href="{{ url_for('delete', post_id=post.id) }}" class="btn btn-danger">Delete</a>
<a href="{{ url_for('update', post_id=post.id) }}" class="btn btn-primary">Update</a>
{% endif %}
</div>
{% endfor %}
</div>
{% endblock %}
19 changes: 11 additions & 8 deletions blog_project/blog/templates/update.html
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
{% extends 'base.html' %}

{% block content %}
<form method="post">
{{ form.csrf_token }}
<form method="post">
{{ form.csrf_token }}

{{ form.title.label}}
{{ form.title}}
{{ form.title.label}}
{{ form.title}}

{{ form.content.label }}
{{ form.content }}
{{ form.content.label }}
{{ form.content }}

<input type="submit" value="Save">
</form>
{{form.tags.label}}
{{form.tags}}

<input type="submit" value="Save">
</form>
{% endblock content %}