1
0

archive.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from flask import Flask, Blueprint, render_template, abort, redirect, url_for, flash
  2. from typing import Optional
  3. from flask_login import login_required, current_user
  4. from flask_wtf import FlaskForm
  5. from wtforms import StringField, SubmitField
  6. from wtforms.validators import DataRequired, Length
  7. from view.base import App
  8. from core.archive import Archive
  9. archive = Blueprint("archive", __name__)
  10. app: Optional[Flask] = None
  11. class CreateArchiveForm(FlaskForm):
  12. name = StringField("名字", validators=[DataRequired(), Length(1, 10)])
  13. describe = StringField("描述", validators=[DataRequired(), Length(1, 30)])
  14. submit = SubmitField("创建归档")
  15. @archive.route('/')
  16. def archive_page():
  17. archive_list = Archive.get_archive_list()
  18. return render_template("archive/archive.html",
  19. archive_list=archive_list,
  20. form=CreateArchiveForm(),
  21. show_delete=current_user.check_role("DeleteBlog"))
  22. @archive.route("create", methods=["POST"])
  23. @login_required
  24. def create_archive_page():
  25. form = CreateArchiveForm()
  26. if form.validate_on_submit():
  27. if not current_user.check_role("WriteBlog"): # 检查相应的权限
  28. abort(403)
  29. return
  30. if Archive(form.name.data, form.describe.data, None).create():
  31. flash(f"创建归档 {form.name.data} 成功")
  32. else:
  33. flash(f"创建归档 {form.name.data} 失败")
  34. return redirect(url_for("archive.archive_page"))
  35. abort(404)
  36. @archive.route("delete/<int:archive_id>")
  37. @login_required
  38. def delete_archive_page(archive_id: int):
  39. if not current_user.check_role("DeleteBlog"):
  40. abort(403)
  41. return
  42. if Archive(None, None, archive_id).delete():
  43. flash("归档删除成功")
  44. else:
  45. flash("归档删除失败")
  46. return redirect(url_for("archive.archive_page"))
  47. @archive.context_processor
  48. def inject():
  49. return {"top_nav": ["", "active", "", "", "", ""]}
  50. class ArchiveApp(App):
  51. def __init__(self, import_name):
  52. super(ArchiveApp, self).__init__(import_name)
  53. global app
  54. app = self._app
  55. app.register_blueprint(archive, url_prefix="/archive")