Browse Source

Make topic title editable

Peter Justin 6 years ago
parent
commit
8ed9c63577

+ 0 - 6
flaskbb/forum/forms.py

@@ -58,12 +58,6 @@ class NewTopicForm(ReplyForm):
     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"))
 
     def save(self, user, forum):

+ 65 - 2
flaskbb/forum/views.py

@@ -263,7 +263,10 @@ class NewTopic(MethodView):
     def get(self, forum_id, slug=None):
         forum_instance = Forum.query.filter_by(id=forum_id).first_or_404()
         return render_template(
-            "forum/new_topic.html", forum=forum_instance, form=self.form()
+            "forum/new_topic.html",
+            forum=forum_instance,
+            form=self.form(),
+            edit_mode=False,
         )
 
     def post(self, forum_id, slug=None):
@@ -274,7 +277,10 @@ class NewTopic(MethodView):
             return redirect(url_for("forum.view_topic", topic_id=topic.id))
 
         return render_template(
-            "forum/new_topic.html", forum=forum_instance, form=form
+            "forum/new_topic.html",
+            forum=forum_instance,
+            form=form,
+            edit_mode=False,
         )
 
     def form(self):
@@ -282,6 +288,51 @@ class NewTopic(MethodView):
         return NewTopicForm()
 
 
+class EditTopic(MethodView):
+    decorators = [
+        login_required,
+        allows.requires(
+            CanAccessForum(),
+            CanPostTopic,
+            on_fail=FlashAndRedirect(
+                message=_("You are not allowed to edit that topic"),
+                level="warning",
+                endpoint=lambda *a, **k: current_forum.url,
+            ),
+        ),
+    ]
+
+    def get(self, topic_id, slug=None):
+        topic = Topic.query.filter_by(id=topic_id).first_or_404()
+        form = self.form(obj=topic.first_post, title=topic.title)
+
+        return render_template(
+            "forum/new_topic.html", forum=topic.forum, form=form, edit_mode=True
+        )
+
+    def post(self, topic_id, slug=None):
+        topic = Topic.query.filter_by(id=topic_id).first_or_404()
+        post = topic.first_post
+        form = self.form(obj=post, title=topic.title)
+
+        if form.validate_on_submit():
+            form.populate_obj(topic)
+            form.populate_obj(post)
+            post.date_modified = time_utcnow()
+            post.modified_by = real(current_user).username
+            post.save()
+            topic.save()
+            return redirect(url_for("forum.view_topic", topic_id=topic.id))
+
+        return render_template(
+            "forum/new_topic.html", forum=topic.forum, form=form, edit_mode=True
+        )
+
+    def form(self, **kwargs):
+        current_app.pluggy.hook.flaskbb_form_new_topic(form=NewTopicForm)
+        return NewTopicForm(**kwargs)
+
+
 class ManageForum(MethodView):
     decorators = [
         login_required,
@@ -518,6 +569,10 @@ class EditPost(MethodView):
 
     def get(self, post_id):
         post = Post.query.filter_by(id=post_id).first_or_404()
+
+        if post.topic.first_post_id == post.id:
+            return redirect(url_for("forum.edit_topic", topic_id=post.topic_id))
+
         form = self.form(obj=post)
 
         return render_template(
@@ -1094,6 +1149,14 @@ def flaskbb_load_blueprints(app):
     )
     register_view(
         forum,
+        routes=[
+            "/topic/<int:topic_id>/edit",
+            "/topic/<int:topic_id>-<slug>/edit",
+        ],
+        view_func=EditTopic.as_view("edit_topic"),
+    )
+    register_view(
+        forum,
         routes=["/memberlist"],
         view_func=MemberList.as_view("memberlist")
     )

+ 0 - 4
flaskbb/templates/forum/new_post.html

@@ -32,10 +32,6 @@
             <div class="panel-body page-body">
                 <div class="col-md-12 col-sm-12 col-xs-12">
 
-                    {% if form.title %}
-                        {{ render_field(form.title, div_class="col-md-12 col-sm-12 col-xs-12") }}
-                    {% endif %}
-
                     <div class="form-group">
                         <div class="col-md-12 col-sm-12 col-xs-12">
 

+ 9 - 4
flaskbb/templates/forum/new_topic.html

@@ -1,4 +1,10 @@
-{% set page_title = _("New Topic") %}
+{% if edit_mode %}
+    {% set title = _("Edit Topic") %}
+{% else %}
+    {% set title = _("New Topic") %}
+{% endif %}
+
+{% set page_title = title %}
 {% set active_forum_nav=True %}
 
 {% extends theme("layout.html") %}
@@ -10,7 +16,7 @@
     <ol class="breadcrumb flaskbb-breadcrumb">
         <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
         <li><a href="{{ forum.url }}">{{ forum.title }}</a></li>
-        <li class="active">{% trans %}New Topic{% endtrans %}</li>
+        <li class="active">{{ title }}</li>
     </ol>
 
 
@@ -18,11 +24,10 @@
         {{ form.hidden_tag() }}
         <div class="panel page-panel">
             <div class="panel-heading page-head">
-                {% trans %}New Topic{% endtrans %}
+                {{ title }}
             </div>
 
             <div class="panel-body page-body">
-                {{ form.hidden_tag() }}
                 <div class="col-md-12 col-sm-12 col-xs-12">
 
                     {{ render_field(form.title, div_class="col-md-12 col-sm-12 col-xs-12") }}

+ 10 - 4
flaskbb/templates/forum/topic.html

@@ -114,16 +114,22 @@
                             {{ run_hook("flaskbb_tpl_post_menu_before", post=post) }}
 
                             {% if current_user|post_reply(topic) %}
-                            <!-- Quick quote -->
+                                <!-- Quick quote -->
                                 <a href="#" class="btn btn-icon icon-reply quote-btn" data-post-id="{{ post.id }}" data-toggle="tooltip" data-placement="top" title="{% trans %}Quote this post{% endtrans %}"></a>
-                            <!-- Full quote/reply -->
+                                <!-- Full quote/reply -->
                                 <a href="{{ url_for('forum.reply_post', topic_id=topic.id, post_id=post.id) }}" class="btn btn-icon icon-replyall" data-toggle="tooltip" data-placement="top" title="{% trans %}Full Reply{% endtrans %}"></a>
                             {% endif %}
 
                             {% if current_user|edit_post(post) %}
-                            <!-- Edit Post -->
-                            <a href="{{ url_for('forum.edit_post', post_id=post.id) }}" class="btn btn-icon icon-edit" data-toggle="tooltip" data-placement="top" title="{% trans %}Edit this post{% endtrans %}"></a>
+                                {% if topic.first_post_id == post.id %}
+                                <!-- Edit Topic -->
+                                <a href="{{ url_for('forum.edit_topic', topic_id=topic.id) }}" class="btn btn-icon icon-edit" data-toggle="tooltip" data-placement="top" title="{% trans %}Edit this topic{% endtrans %}"></a>
+                                {% else %}
+                                <!-- Edit Post -->
+                                <a href="{{ url_for('forum.edit_post', post_id=post.id) }}" class="btn btn-icon icon-edit" data-toggle="tooltip" data-placement="top" title="{% trans %}Edit this post{% endtrans %}"></a>
+                                {% endif %}
                             {% endif %}
+
                             {% if topic.first_post_id == post.id %}
                                 {% if current_user|delete_topic(topic) %}
                                 <form class="inline-form" method="post" action="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}">