Peter Justin 6 years ago
parent
commit
0821aff863
4 changed files with 104 additions and 56 deletions
  1. 98 35
      flaskbb/forum/forms.py
  2. 1 2
      flaskbb/forum/models.py
  3. 3 17
      flaskbb/forum/views.py
  4. 2 2
      flaskbb/plugins/spec.py

+ 98 - 35
flaskbb/forum/forms.py

@@ -11,27 +11,32 @@
 import logging
 
 from flask import current_app
-
 from flask_babelplus import lazy_gettext as _
 from flask_wtf import FlaskForm
-from flaskbb.forum.models import Forum, Post, Report, Topic
-from flaskbb.user.models import User
 from wtforms import (BooleanField, SelectMultipleField, StringField,
                      SubmitField, TextAreaField)
 from wtforms.validators import DataRequired, Length, Optional
 
+from flaskbb.forum.models import Forum, Post, Report, Topic
+from flaskbb.user.models import User
+from flaskbb.utils.helpers import time_utcnow
+
 logger = logging.getLogger(__name__)
 
 
 class PostForm(FlaskForm):
-    content = TextAreaField(_("Content"), validators=[
-        DataRequired(message=_("You cannot post a reply without content."))])
+    content = TextAreaField(
+        _("Content"),
+        validators=[
+            DataRequired(message=_("You cannot post a reply without content."))
+        ],
+    )
 
     submit = SubmitField(_("Reply"))
 
     def save(self, user, topic):
         post = Post(content=self.content.data)
-        current_app.pluggy.hook.flaskbb_form_new_post_save(form=self)
+        current_app.pluggy.hook.flaskbb_form_post_save(form=self)
         return post.save(user=user, topic=topic)
 
 
@@ -40,27 +45,49 @@ class QuickreplyForm(PostForm):
 
 
 class ReplyForm(PostForm):
-    track_topic = BooleanField(_("Track this topic"), default=False,
-                               validators=[Optional()])
+    track_topic = BooleanField(
+        _("Track this topic"), default=False, validators=[Optional()]
+    )
+
+    def __init__(self, *args, **kwargs):
+        self.post = kwargs.get("obj", None)
+        PostForm.__init__(self, *args, **kwargs)
 
     def save(self, user, topic):
+        # new post
+        if self.post is None:
+            self.post = Post(content=self.content.data)
+        else:
+            self.post.date_modified = time_utcnow()
+            self.post.modified_by = user.username
+
         if self.track_topic.data:
             user.track_topic(topic)
         else:
             user.untrack_topic(topic)
 
-        return super(ReplyForm, self).save(user, topic)
+        current_app.pluggy.hook.flaskbb_form_post_save(form=self)
+        return self.post.save(user=user, topic=topic)
 
 
 class TopicForm(FlaskForm):
-    title = StringField(_("Topic title"), validators=[
-        DataRequired(message=_("Please choose a title for your topic."))])
-
-    content = TextAreaField(_("Content"), validators=[
-        DataRequired(message=_("You cannot post a reply without content."))])
-
-    track_topic = BooleanField(_("Track this topic"), default=False,
-                               validators=[Optional()])
+    title = StringField(
+        _("Topic title"),
+        validators=[
+            DataRequired(message=_("Please choose a title for your topic."))
+        ],
+    )
+
+    content = TextAreaField(
+        _("Content"),
+        validators=[
+            DataRequired(message=_("You cannot post a reply without content."))
+        ],
+    )
+
+    track_topic = BooleanField(
+        _("Track this topic"), default=False, validators=[Optional()]
+    )
 
     submit = SubmitField(_("Post topic"))
 
@@ -72,8 +99,7 @@ class TopicForm(FlaskForm):
         else:
             user.untrack_topic(topic)
 
-        current_app.pluggy.hook.flaskbb_form_new_topic_save(form=self,
-                                                            topic=topic)
+        current_app.pluggy.hook.flaskbb_form_topic_save(form=self, topic=topic)
         return topic.save(user=user, forum=forum)
 
 
@@ -85,6 +111,10 @@ class EditTopicForm(TopicForm):
 
     submit = SubmitField(_("Save topic"))
 
+    def __init__(self, *args, **kwargs):
+        self.topic = kwargs.get("obj").topic
+        TopicForm.__init__(self, *args, **kwargs)
+
     def populate_obj(self, *objs):
         """
         Populates the attributes of the passed `obj`s with data from the
@@ -94,11 +124,36 @@ class EditTopicForm(TopicForm):
         for obj in objs:
             super(EditTopicForm, self).populate_obj(obj)
 
+    def save(self, user, forum):
+        if self.track_topic.data:
+            user.track_topic(self.topic)
+        else:
+            user.untrack_topic(self.topic)
+
+        if (
+            self.topic.last_post_id == forum.last_post_id
+            and self.title.data != forum.last_post_title
+        ):
+            forum.last_post_title = self.title.data
+
+        self.topic.first_post.date_modified = time_utcnow()
+        self.topic.first_post.modified_by = user.username
+
+        current_app.pluggy.hook.flaskbb_form_topic_save(
+            form=self, topic=self.topic
+        )
+        return self.topic.save(user=user, forum=forum)
+
 
 class ReportForm(FlaskForm):
-    reason = TextAreaField(_("Reason"), validators=[
-        DataRequired(message=_("What is the reason for reporting this post?"))
-    ])
+    reason = TextAreaField(
+        _("Reason"),
+        validators=[
+            DataRequired(
+                message=_("What is the reason for reporting this post?")
+            )
+        ],
+    )
 
     submit = SubmitField(_("Report post"))
 
@@ -108,9 +163,9 @@ class ReportForm(FlaskForm):
 
 
 class UserSearchForm(FlaskForm):
-    search_query = StringField(_("Search"), validators=[
-        DataRequired(), Length(min=3, max=50)
-    ])
+    search_query = StringField(
+        _("Search"), validators=[DataRequired(), Length(min=3, max=50)]
+    )
 
     submit = SubmitField(_("Search"))
 
@@ -120,12 +175,20 @@ class UserSearchForm(FlaskForm):
 
 
 class SearchPageForm(FlaskForm):
-    search_query = StringField(_("Criteria"), validators=[
-        DataRequired(), Length(min=3, max=50)])
-
-    search_types = SelectMultipleField(_("Content"), validators=[
-        DataRequired()], choices=[('post', _('Post')), ('topic', _('Topic')),
-                                  ('forum', _('Forum')), ('user', _('Users'))])
+    search_query = StringField(
+        _("Criteria"), validators=[DataRequired(), Length(min=3, max=50)]
+    )
+
+    search_types = SelectMultipleField(
+        _("Content"),
+        validators=[DataRequired()],
+        choices=[
+            ("post", _("Post")),
+            ("topic", _("Topic")),
+            ("forum", _("Forum")),
+            ("user", _("Users")),
+        ],
+    )
 
     submit = SubmitField(_("Search"))
 
@@ -133,10 +196,10 @@ class SearchPageForm(FlaskForm):
         # Because the DB is not yet initialized when this form is loaded,
         # the query objects cannot be instantiated in the class itself
         search_actions = {
-            'post': Post.query.whooshee_search,
-            'topic': Topic.query.whooshee_search,
-            'forum': Forum.query.whooshee_search,
-            'user': User.query.whooshee_search
+            "post": Post.query.whooshee_search,
+            "topic": Topic.query.whooshee_search,
+            "forum": Forum.query.whooshee_search,
+            "user": User.query.whooshee_search,
         }
 
         query = self.search_query.data

+ 1 - 2
flaskbb/forum/models.py

@@ -8,8 +8,8 @@
     :copyright: (c) 2014 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
 """
-from datetime import timedelta
 import logging
+from datetime import timedelta
 
 from flask import abort, current_app, url_for
 from sqlalchemy.orm import aliased
@@ -21,7 +21,6 @@ from flaskbb.utils.helpers import (get_categories_and_forums, get_forums,
                                    slugify, time_utcnow, topic_is_unread)
 from flaskbb.utils.settings import flaskbb_config
 
-
 logger = logging.getLogger(__name__)
 
 

+ 3 - 17
flaskbb/forum/views.py

@@ -42,7 +42,6 @@ from flaskbb.utils.settings import flaskbb_config
 from .locals import current_category, current_forum, current_topic
 from .utils import force_login_if_needed
 
-
 impl = HookimplMarker("flaskbb")
 
 logger = logging.getLogger(__name__)
@@ -320,16 +319,8 @@ class EditTopic(MethodView):
 
         if form.validate_on_submit():
             form.populate_obj(topic, post)
-            post.date_modified = time_utcnow()
-            post.modified_by = real(current_user).username
-
-            if form.track_topic.data:
-                current_user.track_topic(topic)
-            else:
-                current_user.untrack_topic(topic)
+            topic = form.save(real(current_user), topic.forum)
 
-            post.save()
-            topic.save()
             return redirect(url_for("forum.view_topic", topic_id=topic.id))
 
         return render_template(
@@ -534,6 +525,7 @@ class NewPost(MethodView):
     def get(self, topic_id, slug=None, post_id=None):
         topic = Topic.query.filter_by(id=topic_id).first_or_404()
         form = self.form()
+        form.track_topic.data = current_user.is_tracking_topic(topic)
 
         if post_id is not None:
             post = Post.query.filter_by(id=post_id).first_or_404()
@@ -594,13 +586,7 @@ class EditPost(MethodView):
 
         if form.validate_on_submit():
             form.populate_obj(post)
-            post.date_modified = time_utcnow()
-            post.modified_by = real(current_user).username
-
-            if not form.track_topic.data and current_user.is_tracking_topic(post.topic):
-                current_user.untrack_topic(post.topic)
-
-            post.save()
+            post = form.save(real(current_user), post.topic)
             return redirect(url_for("forum.view_post", post_id=post.id))
 
         return render_template(

+ 2 - 2
flaskbb/plugins/spec.py

@@ -502,7 +502,7 @@ def flaskbb_form_new_post(form):
 
 
 @spec
-def flaskbb_form_new_post_save(form):
+def flaskbb_form_post_save(form):
     """Hook for modifying the :class:`~flaskbb.forum.forms.ReplyForm`.
 
     This hook is called while populating the post object with
@@ -523,7 +523,7 @@ def flaskbb_form_new_topic(form):
 
 
 @spec
-def flaskbb_form_new_topic_save(form, topic):
+def flaskbb_form_topic_save(form, topic):
     """Hook for modifying the :class:`~flaskbb.forum.forms.NewTopicForm`.
 
     This hook is called while populating the topic object with