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("/") 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)