1
0

comment.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from flask import Blueprint, render_template, request, abort, flash, redirect, url_for
  2. from flask_wtf import FlaskForm
  3. from wtforms import TextAreaField, StringField, SelectMultipleField, SubmitField, ValidationError
  4. from wtforms.validators import DataRequired, Length
  5. from flask_login import current_user, login_required
  6. from .db import db, Comment, Archive, User, Role
  7. from .login import role_required
  8. from .logger import Logger
  9. comment = Blueprint("comment", __name__)
  10. class WriteCommentForm(FlaskForm):
  11. title = StringField("标题", description="讨论标题", validators=[Length(0, 20, message="标题长度1-20个字符")])
  12. content = TextAreaField("内容", validators=[DataRequired(message="必须输入内容")])
  13. archive = SelectMultipleField("归档", coerce=int)
  14. submit = SubmitField("提交")
  15. def __init__(self, **kwargs):
  16. super().__init__(**kwargs)
  17. archive = Archive.query.all()
  18. self.archive_res = []
  19. self.archive_choices = []
  20. for i in archive:
  21. self.archive_res.append(i.id)
  22. self.archive_choices.append((i.id, f"{i.name} ({i.comment_count})"))
  23. self.archive.choices = self.archive_choices
  24. def validate_archive(self, field):
  25. for i in field.data:
  26. if i not in self.archive_res:
  27. raise ValidationError("错误的归档被指定")
  28. @comment.route("/")
  29. @role_required(Role.CHECK_COMMENT, "check comment")
  30. def comment_page():
  31. comment_id = request.args.get("comment", None, type=int)
  32. if not comment_id:
  33. return abort(404)
  34. cm: Comment = Comment.query.filter_by(id=comment_id).first()
  35. if cm:
  36. Logger.print_load_page_log(f"comment {comment_id} page")
  37. return render_template("comment/comment.html",
  38. comment=cm,
  39. comment_son=cm.son)
  40. return abort(404)
  41. @comment.route("/all")
  42. @role_required(Role.CHECK_COMMENT, "list all comment")
  43. def list_all_page():
  44. page = request.args.get("page", 1, type=int)
  45. archive_id = request.args.get("archive", None, type=int)
  46. if not archive_id:
  47. pagination = (Comment.query
  48. .filter(Comment.title != None).filter(Comment.father_id == None)
  49. .order_by(Comment.create_time.desc(), Comment.title.desc())
  50. .paginate(page=page, per_page=8, error_out=False))
  51. Logger.print_load_page_log("list all comment")
  52. return render_template("comment/list.html",
  53. page=page,
  54. archive=archive_id,
  55. items=pagination.items,
  56. pagination=pagination,
  57. archive_name="全部讨论",
  58. archive_describe="罗列了本站所有的讨论",
  59. title="主页")
  60. else:
  61. archive = Archive.query.filter_by(id=archive_id).first()
  62. if not archive:
  63. return abort(404)
  64. pagination = (archive.comment
  65. .filter(Comment.title != None).filter(Comment.father_id == None)
  66. .order_by(Comment.create_time.desc(), Comment.title.asc())
  67. .paginate(page=page, per_page=8, error_out=False))
  68. Logger.print_load_page_log(f"list comment of archive {archive_id}")
  69. return render_template("comment/list.html",
  70. page=page,
  71. archive=archive_id,
  72. items=pagination.items,
  73. pagination=pagination,
  74. archive_name=archive.name,
  75. archive_describe=archive.describe,
  76. title=archive.name)
  77. @comment.route("/user")
  78. @role_required(Role.CHECK_COMMENT, "list user comment")
  79. def user_page():
  80. page = request.args.get("page", 1, type=int)
  81. user_id = request.args.get("user", None, type=int)
  82. if not user_id:
  83. return abort(404)
  84. user: User = User.query.filter_by(id=user_id).first()
  85. if not user:
  86. return abort(404)
  87. pagination = (user.comment
  88. .order_by(Comment.create_time.desc(), Comment.title.asc())
  89. .paginate(page=page, per_page=8, error_out=False))
  90. Logger.print_load_page_log(f"list comment of user {user_id}")
  91. return render_template("comment/user.html",
  92. page=page,
  93. user=user,
  94. items=pagination.items,
  95. pagination=pagination,
  96. title=user.email)
  97. @comment.route("/create", methods=["GET", "POST"])
  98. @login_required
  99. @role_required(Role.CREATE_COMMENT, "create comment")
  100. def create_page():
  101. father_id = request.args.get("father", None, type=int)
  102. if father_id:
  103. father = Comment.query.filter_by(id=father_id).first()
  104. if not father:
  105. return abort(404)
  106. else:
  107. father = None
  108. form = WriteCommentForm()
  109. if form.validate_on_submit():
  110. title = form.title.data if len(form.title.data) > 0 else None
  111. archive_list = []
  112. for i in form.archive.data:
  113. archive = Archive.query.filter_by(id=i).first()
  114. if not archive:
  115. return abort(404)
  116. archive_list.append(archive)
  117. cm = Comment(title=title, content=form.content.data, father=father, archive=archive_list, auth=current_user)
  118. db.session.add(cm)
  119. db.session.commit()
  120. flash("讨论发表成功")
  121. Logger.print_user_opt_success_log(f"create comment {cm.id}")
  122. return redirect(url_for("comment.comment_page", comment=cm.id))
  123. Logger.print_load_page_log("create comment page")
  124. return render_template("comment/create.html", form=form, father=father)