archive.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from flask import Flask, Blueprint, render_template, abort, redirect, url_for, flash, current_app, request
  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. ArchiveApp.print_load_page_log("archive list")
  19. return render_template("archive/archive.html",
  20. archive_list=archive_list,
  21. form=CreateArchiveForm(),
  22. show_delete=current_user.check_role("DeleteBlog"))
  23. @archive.route("create", methods=["POST"])
  24. @login_required
  25. def create_archive_page():
  26. form = CreateArchiveForm()
  27. if form.validate_on_submit():
  28. if not current_user.check_role("WriteBlog"): # 检查相应的权限
  29. ArchiveApp.print_user_not_allow_opt_log("Create archive")
  30. abort(403)
  31. return
  32. if Archive(form.name.data, form.describe.data, None).create():
  33. ArchiveApp.print_sys_opt_success_log(f"Create archive {form.name.data}")
  34. flash(f"创建归档 {form.name.data} 成功")
  35. else:
  36. ArchiveApp.print_sys_opt_fail_log(f"Create archive {form.name.data}")
  37. flash(f"创建归档 {form.name.data} 失败")
  38. return redirect(url_for("archive.archive_page"))
  39. current_app.logger.warning("Create archive with error form.")
  40. abort(404)
  41. @archive.route("delete/<int:archive_id>")
  42. @login_required
  43. def delete_archive_page(archive_id: int):
  44. if not current_user.check_role("DeleteBlog"):
  45. ArchiveApp.print_user_not_allow_opt_log("Delete archive")
  46. abort(403)
  47. return
  48. if Archive(None, None, archive_id).delete():
  49. ArchiveApp.print_sys_opt_success_log(f"Delete archive {archive_id}")
  50. flash("归档删除成功")
  51. else:
  52. ArchiveApp.print_sys_opt_fail_log(f"Delete archive {archive_id}")
  53. flash("归档删除失败")
  54. return redirect(url_for("archive.archive_page"))
  55. @archive.context_processor
  56. def inject():
  57. return {"top_nav": ["", "active", "", "", "", ""]}
  58. class ArchiveApp(App):
  59. def __init__(self, import_name):
  60. super(ArchiveApp, self).__init__(import_name)
  61. global app
  62. app = self._app
  63. app.register_blueprint(archive, url_prefix="/archive")