forms.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.forum.forms
  4. ~~~~~~~~~~~~~~~~~~~
  5. It provides the forms that are needed for the forum views.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import logging
  10. from flask_wtf import FlaskForm
  11. from wtforms import (TextAreaField, StringField, SelectMultipleField,
  12. BooleanField, SubmitField)
  13. from wtforms.validators import DataRequired, Optional, Length
  14. from flask import current_app
  15. from flask_babelplus import lazy_gettext as _
  16. from flaskbb.forum.models import Topic, Post, Report, Forum
  17. from flaskbb.user.models import User
  18. logger = logging.getLogger(__name__)
  19. class QuickreplyForm(FlaskForm):
  20. content = TextAreaField(_("Quick reply"), validators=[
  21. DataRequired(message=_("You cannot post a reply without content."))])
  22. submit = SubmitField(_("Reply"))
  23. def save(self, user, topic):
  24. post = Post(content=self.content.data)
  25. return post.save(user=user, topic=topic)
  26. class ReplyForm(FlaskForm):
  27. content = TextAreaField(_("Content"), validators=[
  28. DataRequired(message=_("You cannot post a reply without content."))])
  29. track_topic = BooleanField(_("Track this topic"), default=False,
  30. validators=[Optional()])
  31. submit = SubmitField(_("Reply"))
  32. preview = SubmitField(_("Preview"))
  33. def save(self, user, topic):
  34. post = Post(content=self.content.data)
  35. if self.track_topic.data:
  36. user.track_topic(topic)
  37. current_app.pluggy.hook.flaskbb_form_new_post_save(form=self)
  38. return post.save(user=user, topic=topic)
  39. class NewTopicForm(ReplyForm):
  40. title = StringField(_("Topic title"), validators=[
  41. DataRequired(message=_("Please choose a title for your topic."))])
  42. content = TextAreaField(_("Content"), validators=[
  43. DataRequired(message=_("You cannot post a reply without content."))])
  44. track_topic = BooleanField(_("Track this topic"), default=False,
  45. validators=[Optional()])
  46. submit = SubmitField(_("Post Topic"))
  47. preview = SubmitField(_("Preview"))
  48. def save(self, user, forum):
  49. topic = Topic(title=self.title.data)
  50. post = Post(content=self.content.data)
  51. if self.track_topic.data:
  52. user.track_topic(topic)
  53. current_app.pluggy.hook.flaskbb_form_new_topic_save(form=self,
  54. topic=topic)
  55. return topic.save(user=user, forum=forum, post=post)
  56. class ReportForm(FlaskForm):
  57. reason = TextAreaField(_("Reason"), validators=[
  58. DataRequired(message=_("What is the reason for reporting this post?"))
  59. ])
  60. submit = SubmitField(_("Report post"))
  61. def save(self, user, post):
  62. report = Report(reason=self.reason.data)
  63. return report.save(post=post, user=user)
  64. class UserSearchForm(FlaskForm):
  65. search_query = StringField(_("Search"), validators=[
  66. DataRequired(), Length(min=3, max=50)
  67. ])
  68. submit = SubmitField(_("Search"))
  69. def get_results(self):
  70. query = self.search_query.data
  71. return User.query.whooshee_search(query)
  72. class SearchPageForm(FlaskForm):
  73. search_query = StringField(_("Criteria"), validators=[
  74. DataRequired(), Length(min=3, max=50)])
  75. search_types = SelectMultipleField(_("Content"), validators=[
  76. DataRequired()], choices=[('post', _('Post')), ('topic', _('Topic')),
  77. ('forum', _('Forum')), ('user', _('Users'))])
  78. submit = SubmitField(_("Search"))
  79. def get_results(self):
  80. # Because the DB is not yet initialized when this form is loaded,
  81. # the query objects cannot be instantiated in the class itself
  82. search_actions = {
  83. 'post': Post.query.whooshee_search,
  84. 'topic': Topic.query.whooshee_search,
  85. 'forum': Forum.query.whooshee_search,
  86. 'user': User.query.whooshee_search
  87. }
  88. query = self.search_query.data
  89. types = self.search_types.data
  90. results = {}
  91. for search_type in search_actions.keys():
  92. if search_type in types:
  93. results[search_type] = search_actions[search_type](query)
  94. return results