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
 import logging
 
 
 from flask import current_app
 from flask import current_app
-
 from flask_babelplus import lazy_gettext as _
 from flask_babelplus import lazy_gettext as _
 from flask_wtf import FlaskForm
 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,
 from wtforms import (BooleanField, SelectMultipleField, StringField,
                      SubmitField, TextAreaField)
                      SubmitField, TextAreaField)
 from wtforms.validators import DataRequired, Length, Optional
 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__)
 logger = logging.getLogger(__name__)
 
 
 
 
 class PostForm(FlaskForm):
 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"))
     submit = SubmitField(_("Reply"))
 
 
     def save(self, user, topic):
     def save(self, user, topic):
         post = Post(content=self.content.data)
         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)
         return post.save(user=user, topic=topic)
 
 
 
 
@@ -40,27 +45,49 @@ class QuickreplyForm(PostForm):
 
 
 
 
 class ReplyForm(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):
     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:
         if self.track_topic.data:
             user.track_topic(topic)
             user.track_topic(topic)
         else:
         else:
             user.untrack_topic(topic)
             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):
 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"))
     submit = SubmitField(_("Post topic"))
 
 
@@ -72,8 +99,7 @@ class TopicForm(FlaskForm):
         else:
         else:
             user.untrack_topic(topic)
             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)
         return topic.save(user=user, forum=forum)
 
 
 
 
@@ -85,6 +111,10 @@ class EditTopicForm(TopicForm):
 
 
     submit = SubmitField(_("Save topic"))
     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):
     def populate_obj(self, *objs):
         """
         """
         Populates the attributes of the passed `obj`s with data from the
         Populates the attributes of the passed `obj`s with data from the
@@ -94,11 +124,36 @@ class EditTopicForm(TopicForm):
         for obj in objs:
         for obj in objs:
             super(EditTopicForm, self).populate_obj(obj)
             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):
 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"))
     submit = SubmitField(_("Report post"))
 
 
@@ -108,9 +163,9 @@ class ReportForm(FlaskForm):
 
 
 
 
 class UserSearchForm(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"))
     submit = SubmitField(_("Search"))
 
 
@@ -120,12 +175,20 @@ class UserSearchForm(FlaskForm):
 
 
 
 
 class SearchPageForm(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"))
     submit = SubmitField(_("Search"))
 
 
@@ -133,10 +196,10 @@ class SearchPageForm(FlaskForm):
         # Because the DB is not yet initialized when this form is loaded,
         # Because the DB is not yet initialized when this form is loaded,
         # the query objects cannot be instantiated in the class itself
         # the query objects cannot be instantiated in the class itself
         search_actions = {
         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
         query = self.search_query.data

+ 1 - 2
flaskbb/forum/models.py

@@ -8,8 +8,8 @@
     :copyright: (c) 2014 by the FlaskBB Team.
     :copyright: (c) 2014 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
     :license: BSD, see LICENSE for more details.
 """
 """
-from datetime import timedelta
 import logging
 import logging
+from datetime import timedelta
 
 
 from flask import abort, current_app, url_for
 from flask import abort, current_app, url_for
 from sqlalchemy.orm import aliased
 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)
                                    slugify, time_utcnow, topic_is_unread)
 from flaskbb.utils.settings import flaskbb_config
 from flaskbb.utils.settings import flaskbb_config
 
 
-
 logger = logging.getLogger(__name__)
 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 .locals import current_category, current_forum, current_topic
 from .utils import force_login_if_needed
 from .utils import force_login_if_needed
 
 
-
 impl = HookimplMarker("flaskbb")
 impl = HookimplMarker("flaskbb")
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
@@ -320,16 +319,8 @@ class EditTopic(MethodView):
 
 
         if form.validate_on_submit():
         if form.validate_on_submit():
             form.populate_obj(topic, post)
             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 redirect(url_for("forum.view_topic", topic_id=topic.id))
 
 
         return render_template(
         return render_template(
@@ -534,6 +525,7 @@ class NewPost(MethodView):
     def get(self, topic_id, slug=None, post_id=None):
     def get(self, topic_id, slug=None, post_id=None):
         topic = Topic.query.filter_by(id=topic_id).first_or_404()
         topic = Topic.query.filter_by(id=topic_id).first_or_404()
         form = self.form()
         form = self.form()
+        form.track_topic.data = current_user.is_tracking_topic(topic)
 
 
         if post_id is not None:
         if post_id is not None:
             post = Post.query.filter_by(id=post_id).first_or_404()
             post = Post.query.filter_by(id=post_id).first_or_404()
@@ -594,13 +586,7 @@ class EditPost(MethodView):
 
 
         if form.validate_on_submit():
         if form.validate_on_submit():
             form.populate_obj(post)
             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 redirect(url_for("forum.view_post", post_id=post.id))
 
 
         return render_template(
         return render_template(

+ 2 - 2
flaskbb/plugins/spec.py

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