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
3 changes: 3 additions & 0 deletions blog_project/blog/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(30)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
# db.create_all()
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
Expand Down
104 changes: 51 additions & 53 deletions blog_project/blog/forms.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,51 @@
from flask_wtf import FlaskForm
from wtforms import (
StringField,
PasswordField,
BooleanField,
SubmitField,
TextAreaField
)
from wtforms.validators import (
DataRequired,
Length,
Email,
EqualTo,
ValidationError
)

from .models import User


class RegistrationForm(FlaskForm):
username = StringField('user name', validators=[
DataRequired(), Length(min=4, max=25)])
email = StringField('user email', validators=[DataRequired(), Email()])
password = PasswordField('password', validators=[DataRequired()])
confirm_password = PasswordField('confirm password', validators=[
DataRequired(), EqualTo('password', message='confirm password error')])
submit = SubmitField('Register')

def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('this user already exist')


class LoginForm(FlaskForm):
email = StringField('user email', validators=[DataRequired(), Email()])
password = PasswordField('password', validators=[DataRequired()])
remember = BooleanField('remember me')


class UpdateProfileForm(FlaskForm):
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()])

class SearchForm(FlaskForm):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that you have removed some features such as the search feature

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

from blog import db, login_manager
from datetime import datetime
from flask_login import UserMixin


@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))


class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(30), unique=True, nullable=False)
email = db.Column(db.String(60), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
categories = db.relationship('Category', backref='author', lazy=True)


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


class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
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)

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

class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.String(30), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

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

class PostCategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)

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

db.create_all()
db.session.commit()
23 changes: 22 additions & 1 deletion blog_project/blog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class User(db.Model, UserMixin):
email = db.Column(db.String(60), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
categories = db.relationship('Category', backref='author', lazy=True)


def __repr__(self):
return f'{self.__class__.__name__}({self.id}, {self.username})'
Expand All @@ -27,4 +29,23 @@ class Post(db.Model):
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

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

class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.String(30), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

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

class PostCategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)

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

db.create_all()
db.session.commit()
85 changes: 76 additions & 9 deletions blog_project/blog/routes.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,38 @@
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 , CategoryForm, SearchForm
from .models import User, Post, Category, PostCategory
from flask_login import login_user, current_user, logout_user, login_required

from pprint import pprint

@app.route('/')
def home():
posts = Post.query.all()
return render_template('home.html', posts=posts)
categories = Category.query.all()
return render_template('home.html', posts=posts, categories=categories)


@app.route('/post/<int:post_id>')
def detail(post_id):
print(post_id)
post = Post.query.get_or_404(post_id)
return render_template('detail.html', post=post)

postCategory = PostCategory.query.filter_by(post_id=post_id).all()
pprint(postCategory)
categories = []
for category in postCategory:
print('here......')
print(category.id)
category_name = Category.query.get(category.category_id)
print(category_name)
categories.append(category_name)
print(categories)
return render_template('detail.html', post=post, categories=categories)


@app.route('/category/<int:category_id>')
def detail_category(category_id):
category = Category.query.get_or_404(category_id)
return render_template('detail_category.html', category=category)

@app.route('/register', methods=['GET', 'POST'])
def register():
Expand Down Expand Up @@ -82,18 +99,48 @@ def profile():
@login_required
def new_post():
form = PostForm()
print('Im here')

if form.validate_on_submit():
post = Post(
title=form.title.data,
content=form.title.data,
content=form.content.data,
author=current_user
)
# print(form.category.data)
db.session.add(post)
db.session.commit()
flash('post created')
print('Commited to db')
print(form.category.data)
print('>>>>>>>>>>>>>>>>>>>>.')
createPostCategory(form.title.data,form.category.data)
flash('post created')
return redirect(url_for('profile'))
else:
print('Did not validate')
return render_template('new_post.html', form=form)

# Create a new category
@app.route('/category/create', methods=['GET', 'POST'])
@login_required
def new_category():
form = CategoryForm()
if form.validate_on_submit():
category = Category(
category=form.category.data,
author=current_user
)
print(form.category.data)
print(current_user)
db.session.add(category)
db.session.commit()
db.session.close()
flash('category created')
return redirect(url_for('profile'))
return render_template('new_category.html', form=form)




@app.route('/post/<int:post_id>/delete')
@login_required
Expand Down Expand Up @@ -138,4 +185,24 @@ def search():
else:
flash('No such post has been found!','danger')
return render_template('search.html',form=form)
return render_template('search.html', form=form)
return render_template('search.html', form=form)

def getPostId(title):
posts = Post.query.filter(Post.title.like(f"%{title}%")).all()
pprint(posts)
post_id = posts[0].id
return post_id

def createPostCategory(title, category_ids):
post_id = getPostId(title)
for id in category_ids:
postCategory = PostCategory(
category_id=id,
post_id=post_id
)
db.session.add(postCategory)
db.session.commit()

def getAllCategories():
categories = Category.query.all()

9 changes: 8 additions & 1 deletion blog_project/blog/templates/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,12 @@ <h3>{{ post.title }}</h3>
<small>{{ post.author.username }}</small>
<small>{{ post.date.strftime('%Y-%m-%d') }}</small>
<hr>
<p>{{ post.content|safe }}</p>
<p>{{ post.content }}</p>

{% if categories %}
<h4>Category</h4>
{% for category in categories %}
<p>{{ category.category }}</p>
{% endfor %}
{% endif %}
{% endblock content %}
7 changes: 7 additions & 0 deletions blog_project/blog/templates/detail_category.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% extends 'base.html' %}
<h2>Category</h2>
{% block content %}
<h3>{{ category.category }}</h3>
<small>{{ category.author.username }}</small>
<hr>
{% endblock content %}
13 changes: 13 additions & 0 deletions blog_project/blog/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
{% block content %}
<h3>Home Page {{ current_user.username }}</h3>

<h4>Post</h4>
<div class="card">
{% for post in posts %}
<div class="card-body">
Expand All @@ -15,4 +16,16 @@ <h6>{{ post.title }}</h6>
</div>
{% endfor %}
</div>


<h4>Category</h4>

<div class="card">
{% for category in categories %}
<div class="card-body">
<h6>{{ category.category }}</h6>
<a href="{{ url_for('detail_category', category_id=category.id) }}" class="btn btn-info">Show</a>
</div>
{% endfor %}
</div>
{% endblock %}
1 change: 1 addition & 0 deletions blog_project/blog/templates/inc/navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
{% if current_user.is_authenticated %}
<a class="nav-item nav-link active" href="{{ url_for('profile') }}">Profile</a>
<a class="nav-item nav-link active" href="{{ url_for('logout') }}">Logout</a>
<a class="nav-item nav-link active" href="{{ url_for('new_category') }}">Category</a>
{% else %}
<a class="nav-item nav-link active" href="{{ url_for('login') }}">Login</a>
<a class="nav-item nav-link active" href="{{ url_for('register') }}">Register</a>
Expand Down
12 changes: 12 additions & 0 deletions blog_project/blog/templates/new_category.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% extends 'base.html' %}

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

{{ form.category.label}}
{{ form.category}}

<input type="submit" value="Save">
</form>
{% endblock content %}
6 changes: 5 additions & 1 deletion blog_project/blog/templates/new_post.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
{{ form.content.label }}
{{ form.content }}

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


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