119 lines
4.1 KiB
Python
119 lines
4.1 KiB
Python
from flask import Flask, render_template, redirect, request, session, url_for
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_admin import Admin
|
|
from flask_admin.contrib.sqla import ModelView
|
|
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
|
|
|
|
app = Flask(__name__)
|
|
app.secret_key = 'bebra'
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Picture_Puzzle_web.db'
|
|
app.config['SECURITY_PASSWORD_SALT'] = app.config['SECRET_KEY']
|
|
db = SQLAlchemy(app)
|
|
|
|
# Define models for Flask-Security
|
|
roles_users = db.Table('roles_users',
|
|
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
|
|
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
|
|
)
|
|
|
|
class Role(db.Model, RoleMixin):
|
|
id = db.Column(db.Integer(), primary_key=True)
|
|
name = db.Column(db.String(80), unique=True)
|
|
|
|
class User(db.Model, UserMixin):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(255), unique=True)
|
|
email = db.Column(db.String(255), unique=True)
|
|
password = db.Column(db.String(255))
|
|
active = db.Column(db.Boolean())
|
|
roles = db.relationship('Role', secondary=roles_users,
|
|
backref=db.backref('users', lazy='dynamic'))
|
|
|
|
class Post(db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
date_created = db.Column(db.String(100), unique=False, nullable=False)
|
|
alias = db.Column(db.String(100), unique=True, nullable=False)
|
|
title = db.Column(db.String(100), nullable=False)
|
|
image = db.Column(db.String(100), nullable=False)
|
|
|
|
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
|
|
security = Security(app, user_datastore)
|
|
|
|
admin = Admin(app, name='Admin Panel', template_mode='bootstrap3')
|
|
admin.add_view(ModelView(User, db.session))
|
|
admin.add_view(ModelView(Role, db.session))
|
|
|
|
def create_tables():
|
|
with app.app_context():
|
|
db.create_all()
|
|
|
|
def register_admin_views():
|
|
admin = Admin(app, name='Admin Panel', template_mode='bootstrap3')
|
|
admin.add_view(ModelView(User, db.session))
|
|
admin.add_view(ModelView(Post, db.session))
|
|
|
|
@app.route("/")
|
|
def index():
|
|
latest_posts = Post.query.all()
|
|
return render_template("index.html", latest_posts=latest_posts)
|
|
|
|
@app.route("/posts")
|
|
def all_posts():
|
|
all_posts = Post.query.all()
|
|
return render_template("posts.html", posts=all_posts)
|
|
|
|
@app.route("/about")
|
|
def about():
|
|
return render_template("about.html")
|
|
|
|
@app.route("/posts/<alias>")
|
|
def post(alias):
|
|
post_info = Post.query.filter_by(alias=alias).first()
|
|
if post_info:
|
|
return render_template(f"{alias}.html", post_info=post_info)
|
|
else:
|
|
return "Post not found", 404
|
|
|
|
@app.route("/login", methods=["GET", "POST"])
|
|
def login():
|
|
if request.method == "POST":
|
|
username = request.form["username"]
|
|
password = request.form["password"]
|
|
user = User.query.filter_by(username=username, password=password).first()
|
|
if user:
|
|
session["username"] = username
|
|
return redirect(url_for("index"))
|
|
return render_template("auth/login.html")
|
|
|
|
@app.route("/logout")
|
|
def logout():
|
|
session.pop("username", None)
|
|
return redirect(url_for("index"))
|
|
|
|
@app.route("/register", methods=["GET", "POST"])
|
|
def register():
|
|
if request.method == "POST":
|
|
username = request.form["username"]
|
|
email = request.form["email"]
|
|
password = request.form["password"]
|
|
|
|
existing_user = User.query.filter_by(email=email).first()
|
|
if existing_user:
|
|
error_msg = "Email already exists"
|
|
return render_template("auth/register.html", error_msg=error_msg)
|
|
|
|
existing_username = User.query.filter_by(username=username).first()
|
|
if existing_username:
|
|
error_msg = "Username already exists"
|
|
return render_template("auth/register.html", error_msg=error_msg)
|
|
|
|
new_user = User(username=username, email=email, password=password)
|
|
db.session.add(new_user)
|
|
db.session.commit()
|
|
return redirect(url_for("login"))
|
|
|
|
return render_template("auth/register.html")
|
|
|
|
if __name__ == '__main__':
|
|
register_admin_views()
|
|
app.run(debug=True) |