[docs]@blueprint.route("/create",methods=["GET","POST"])@login_required@authorization_requireddefcreate()->str|Response:"""Create a post. The decorator will ensure that the user is logged in to visit this view, otherwise they will be redirected the login page. The create view works the same as the auth register view. The posted data is validated and either the form is displayed (and the post is added to the database) or an error is shown. :return: Rendered create template on GET or failed POST. Response object redirect to index view on successful POST. """form=PostForm()ifform.validate_on_submit():# noinspection PyArgumentListpost=Post(title=form.title.data,body=form.body.data,user_id=current_user.id)db.session.add(post)db.session.commit()returnredirect(url_for("index"))returnrender_template("post/create.html",form=form)
[docs]@blueprint.route("/<int:id>",methods=["GET","POST"])defread(id:int)->str|Response:"""Render post page for selected post ID. :param id: ID of post to display full page on. :return: Rendered post template. """revision=request.args.get("revision",-1,type=int)post=Post.get_post(id,revision,checkauthor=False)returnrender_template("post/read.html",post=post,revision=revision)
[docs]@sitemap.register_generatordefsitemap_read()->(t.Generator[tuple[str,dict[str,t.Any],datetime,str,float],None,None]):"""Generate post URLs for sitemap. :return: Generator yielding data for sitemap. """posts=Post.query.all()forpostinposts:yield("post.read",{"id":post.id},datetime.now(),current_app.config["SITEMAP_CHANGEFREQ"],0.7,)
[docs]@blueprint.route("/<int:id>/update",methods=["GET","POST"])@login_required@authorization_requireddefupdate(id:int)->str|Response:"""Update post that corresponds to the provided post ID. :param id: The post's ID. :return: Rendered update template on GET or failed POST. Response object redirect to index view on successful update POST. """revision=request.args.get("revision",-1,type=int)post=Post.get_post(id,revision)form=PostForm(title=post.title,body=post.body)ifform.validate_on_submit():post.title=form.title.datapost.body=form.body.datapost.edited=datetime.utcnow()db.session.commit()returnredirect(url_for("index"))returnrender_template("post/update.html",post=post,form=form)
[docs]@blueprint.route("/<int:id>/delete",methods=["POST"])@login_required@authorization_requireddefdelete(id:int)->Response:"""Delete post by post's ID. The "delete" view does not have its own template. Since there is no template it will only handle the ``POST`` method and then redirect to the index view. :param id: The post's ID. :return: Response object redirect to index view. """post=Post.get_post(id)db.session.delete(post)db.session.commit()returnredirect(url_for("index"))