Browse Source

many improvements

Casper Van Gheluwe 11 years ago
parent
commit
d53d4d2c53

+ 3 - 3
flaskbb/admin/views.py

@@ -16,7 +16,7 @@ from flask import (Blueprint, current_app, request, redirect, url_for, flash,
 from flask.ext.login import current_user
 from flask.ext.login import current_user
 
 
 from flaskbb import __version__ as flaskbb_version
 from flaskbb import __version__ as flaskbb_version
-from flaskbb.forum.forms import SearchForm
+from flaskbb.forum.forms import UserSearchForm
 from flaskbb.utils.helpers import render_template
 from flaskbb.utils.helpers import render_template
 from flaskbb.utils.decorators import admin_required
 from flaskbb.utils.decorators import admin_required
 from flaskbb.extensions import db
 from flaskbb.extensions import db
@@ -50,10 +50,10 @@ def overview():
 @admin_required
 @admin_required
 def users():
 def users():
     page = request.args.get("page", 1, type=int)
     page = request.args.get("page", 1, type=int)
-    search_form = SearchForm(search_types=['user'])
+    search_form = UserSearchForm()
 
 
     if search_form.validate():
     if search_form.validate():
-        users = search_form.get_results()['user'].paginate(page, current_app.config['USERS_PER_PAGE'], False)
+        users = search_form.get_results().paginate(page, current_app.config['USERS_PER_PAGE'], False)
         return render_template("admin/users.html", users=users, search_form=search_form)
         return render_template("admin/users.html", users=users, search_form=search_form)
     else:
     else:
         users = User.query. \
         users = User.query. \

+ 26 - 21
flaskbb/forum/forms.py

@@ -58,30 +58,35 @@ class ReportForm(Form):
         return report.save(user, post)
         return report.save(user, post)
 
 
 
 
-class SearchForm(Form):
-
-    def __init__(self, search_types=list()):
-        super(SearchForm, self).__init__()
-        self.search_types = search_types
-
+class UserSearchForm(Form):
     search_query = TextField("Search", validators=[Optional(), Length(min=3, max=50)])
     search_query = TextField("Search", validators=[Optional(), Length(min=3, max=50)])
 
 
-    def get_types(self):
-        return self.search_types
+    def get_results(self):
+        query = self.search_query.data
+        return User.query.whoosh_search(query)
+
+class SearchPageForm(Form):
+    search_query = TextField("Search", validators=[Required(), Length(min=3, max=50)])
+    search_types = SelectMultipleField("Content", validators=[Required()], choices=[
+        ('post', 'Post'), ('topic', 'Topic'), ('forum', 'Forum'), ('category', 'Category'), ('user', 'Users')])
 
 
     def get_results(self):
     def get_results(self):
-        results = {}
-        types = self.get_types()
+        # 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.whoosh_search,
+            'topic': Topic.query.whoosh_search,
+            'forum': Forum.query.whoosh_search,
+            'category': Category.query.whoosh_search,
+            'user': User.query.whoosh_search
+        }
+
         query = self.search_query.data
         query = self.search_query.data
-        for type in types:
-            if type == 'user':
-                results['user'] = User.query.whoosh_search(query)
-            elif type == 'post':
-                results['post'] = Post.query.whoosh_search(query)
-            elif type == 'topic':
-                results['topic'] = Topic.query.whoosh_search(query)
-            elif type == 'forum':
-                results['forum'] = Forum.query.whoosh_search(query)
-            elif type == 'category':
-                results['category'] = Category.query.whoosh_search(query)
+        types = self.search_types.data
+        results = {}
+
+        for type in search_actions.keys():
+            if type in types:
+                results[type] = search_actions[type](query)
+
         return results
         return results

+ 16 - 4
flaskbb/forum/views.py

@@ -25,7 +25,7 @@ from flaskbb.utils.permissions import (can_post_reply, can_post_topic,
 from flaskbb.forum.models import (Category, Forum, Topic, Post, ForumsRead,
 from flaskbb.forum.models import (Category, Forum, Topic, Post, ForumsRead,
                                   TopicsRead)
                                   TopicsRead)
 from flaskbb.forum.forms import (QuickreplyForm, ReplyForm, NewTopicForm,
 from flaskbb.forum.forms import (QuickreplyForm, ReplyForm, NewTopicForm,
-                                 ReportForm, SearchForm)
+                                 ReportForm, UserSearchForm, SearchPageForm)
 from flaskbb.utils.helpers import get_forums
 from flaskbb.utils.helpers import get_forums
 from flaskbb.user.models import User
 from flaskbb.user.models import User
 
 
@@ -464,10 +464,10 @@ def who_is_online():
 def memberlist():
 def memberlist():
     page = request.args.get('page', 1, type=int)
     page = request.args.get('page', 1, type=int)
 
 
-    search_form = SearchForm(search_types=['user'])
+    search_form = UserSearchForm()
 
 
     if search_form.validate():
     if search_form.validate():
-        users = search_form.get_results()['user'].paginate(page, current_app.config['USERS_PER_PAGE'], False)
+        users = search_form.get_results().paginate(page, current_app.config['USERS_PER_PAGE'], False)
         return render_template("forum/memberlist.html", users=users, search_form=search_form)
         return render_template("forum/memberlist.html", users=users, search_form=search_form)
     else:
     else:
         users = User.query. \
         users = User.query. \
@@ -504,4 +504,16 @@ def untrack_topic(topic_id, slug=None):
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
     topic = Topic.query.filter_by(id=topic_id).first_or_404()
     current_user.untrack_topic(topic)
     current_user.untrack_topic(topic)
     current_user.save()
     current_user.save()
-    return redirect(topic.url)
+    return redirect(topic.url)
+
+
+@forum.route("/search", methods=['GET', 'POST'])
+def search():
+    form = SearchPageForm()
+
+    if form.validate_on_submit():
+        result = form.get_results()
+        return render_template('forum/search_result.html', form=form, result=results)
+
+    return render_template('forum/search_form.html', form=form)
+

+ 23 - 0
flaskbb/templates/forum/search_form.html

@@ -0,0 +1,23 @@
+{% set page_title = "Search" %}
+
+{% extends theme("layout.html") %}
+
+{% block navigation %}
+{% endblock %}
+
+{% block content %}
+    {% from theme("macros.html") import render_field %}
+
+    <form class="form" role="form" method="post">
+        {{ form.hidden_tag() }}
+        <h3>Search</h3>
+        <div class="row">
+            {{ render_field(form.search_types) }}
+        </div>
+        <div class="row">
+            {{ render_field(form.search_query) }}
+        </div>
+
+        <button type="submit" class="btn btn-success">Search</button>
+    </form>
+{% endblock %}

+ 1 - 5
flaskbb/templates/layout.html

@@ -46,6 +46,7 @@
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
                         </ul>
                         </ul>
 
 
                     {% if current_user and current_user.is_authenticated() %}
                     {% if current_user and current_user.is_authenticated() %}
@@ -93,11 +94,6 @@
                             </ul>
                             </ul>
                         </div>
                         </div>
                     {% endif %}
                     {% endif %}
-                        <form class="navbar-form navbar-right" role="search">
-                            <div class="form-group">
-                                <input type="text" class="form-control" placeholder="Search">
-                            </div>
-                        </form>
                     </div><!-- nav-collapse -->
                     </div><!-- nav-collapse -->
                 </div><!-- container -->
                 </div><!-- container -->
             </nav> <!-- navbar navbar-inverse -->
             </nav> <!-- navbar navbar-inverse -->

+ 1 - 5
flaskbb/themes/bootstrap2/templates/layout.html

@@ -47,6 +47,7 @@
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
                         </ul>
                         </ul>
 
 
                     {% if current_user and current_user.is_authenticated() %}
                     {% if current_user and current_user.is_authenticated() %}
@@ -94,11 +95,6 @@
                             </ul>
                             </ul>
                         </div>
                         </div>
                     {% endif %}
                     {% endif %}
-                        <form class="navbar-form navbar-right" role="search">
-                            <div class="form-group">
-                                <input type="text" class="form-control" placeholder="Search">
-                            </div>
-                        </form>
                     </div><!-- nav-collapse -->
                     </div><!-- nav-collapse -->
                 </div><!-- container -->
                 </div><!-- container -->
             </nav> <!-- navbar navbar-inverse -->
             </nav> <!-- navbar navbar-inverse -->

+ 1 - 5
flaskbb/themes/bootstrap3/templates/layout.html

@@ -46,6 +46,7 @@
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
                             {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
                         </ul>
                         </ul>
 
 
                     {% if current_user and current_user.is_authenticated() %}
                     {% if current_user and current_user.is_authenticated() %}
@@ -93,11 +94,6 @@
                             </ul>
                             </ul>
                         </div>
                         </div>
                     {% endif %}
                     {% endif %}
-                        <form class="navbar-form navbar-right" role="search">
-                            <div class="form-group">
-                                <input type="text" class="form-control" placeholder="Search">
-                            </div>
-                        </form>
                     </div><!-- nav-collapse -->
                     </div><!-- nav-collapse -->
                 </div><!-- container -->
                 </div><!-- container -->
             </nav> <!-- navbar navbar-inverse -->
             </nav> <!-- navbar navbar-inverse -->