feat: 初始版本,圆角主题与首次管理员引导
This commit is contained in:
53
app/blueprints/posts.py
Normal file
53
app/blueprints/posts.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import os
|
||||
from datetime import datetime
|
||||
from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app
|
||||
from flask_login import login_required, current_user
|
||||
from werkzeug.utils import secure_filename
|
||||
from ..extensions import db
|
||||
from ..models import Post, PostImage, Visibility, ReviewStatus, Follow
|
||||
from ..services.images import save_image
|
||||
|
||||
bp = Blueprint("posts", __name__, url_prefix="/posts")
|
||||
|
||||
@bp.route("/create", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def create():
|
||||
if request.method == "POST":
|
||||
title = request.form.get("title")
|
||||
description = request.form.get("description")
|
||||
visibility = request.form.get("visibility", Visibility.private.value)
|
||||
files = request.files.getlist("images")
|
||||
if not title or not files:
|
||||
flash("请填写标题并上传图片")
|
||||
return redirect(url_for("posts.create"))
|
||||
post = Post(user_id=current_user.id, title=title, description=description, visibility=Visibility(visibility))
|
||||
if post.visibility == Visibility.public:
|
||||
post.status = ReviewStatus.pending
|
||||
else:
|
||||
post.status = ReviewStatus.approved
|
||||
post.published_at = datetime.utcnow()
|
||||
db.session.add(post)
|
||||
db.session.flush()
|
||||
upload_dir = os.path.join(current_app.config["UPLOAD_FOLDER"], "posts")
|
||||
for idx, f in enumerate(files):
|
||||
original, web, thumb, exif = save_image(f, upload_dir)
|
||||
img = PostImage(post_id=post.id, original_path=original, web_path=web, thumb_path=thumb, exif_json=exif, order_index=idx)
|
||||
db.session.add(img)
|
||||
db.session.commit()
|
||||
flash("作品已提交")
|
||||
return redirect(url_for("users.profile", user_id=current_user.id))
|
||||
return render_template("posts/create.html")
|
||||
|
||||
@bp.route("/<int:post_id>")
|
||||
def detail(post_id):
|
||||
post = Post.query.get_or_404(post_id)
|
||||
if post.visibility == Visibility.private and (not current_user.is_authenticated or current_user.id != post.user_id):
|
||||
return redirect(url_for("auth.login"))
|
||||
if post.visibility == Visibility.followers:
|
||||
if not current_user.is_authenticated:
|
||||
return redirect(url_for("auth.login"))
|
||||
if current_user.id != post.user_id:
|
||||
f = Follow.query.filter_by(follower_id=current_user.id, followee_id=post.user_id).first()
|
||||
if not f:
|
||||
return redirect(url_for("auth.login"))
|
||||
return render_template("posts/detail.html", post=post)
|
||||
Reference in New Issue
Block a user