Browse Source

functional search on the admin/users page

Casper Van Gheluwe 11 years ago
parent
commit
1b16137676
4 changed files with 55 additions and 32 deletions
  1. 11 4
      flaskbb/admin/views.py
  2. 15 16
      flaskbb/forum/forms.py
  3. 2 2
      flaskbb/forum/views.py
  4. 27 10
      flaskbb/templates/admin/users.html

+ 11 - 4
flaskbb/admin/views.py

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

+ 15 - 16
flaskbb/forum/forms.py

@@ -59,30 +59,29 @@ class ReportForm(Form):
 
 
 class SearchForm(Form):
-    search_types = SelectMultipleField("Search Types", validators=[
-        Required("Please insert at least one search type")], choices=[
-        ('user', 'User'), ('post', 'Post'), ('topic', 'Topic'), ('forum', 'Forum'), ('category', 'Category')
-    ])
-    search_query = TextField("Search Query", validators=[
-        Required(message="Please insert a search query")
-    ])
 
-    def fetch_types(self):
-        return self.search_types.data
+    def __init__(self, search_types=list()):
+        super(SearchForm, self).__init__()
+        self.search_types = search_types
+
+    search_query = TextField("Search Query")
+
+    def get_types(self):
+        return self.search_types
 
-    def fetch_results(self):
+    def get_results(self):
         results = {}
-        types = self.fetch_types()
+        types = self.get_types()
         query = self.search_query.data
         for type in types:
             if type == 'user':
-                results['user'] = User.query.whoosh_search(query).all()
+                results['user'] = User.query.whoosh_search(query)
             elif type == 'post':
-                results['post'] = Post.query.whoosh_search(query).all()
+                results['post'] = Post.query.whoosh_search(query)
             elif type == 'topic':
-                results['topic'] = Topic.query.whoosh_search(query).all()
+                results['topic'] = Topic.query.whoosh_search(query)
             elif type == 'forum':
-                results['forum'] = Forum.query.whoosh_search(query).all()
+                results['forum'] = Forum.query.whoosh_search(query)
             elif type == 'category':
-                results['category'] = Category.query.whoosh_search(query).all()
+                results['category'] = Category.query.whoosh_search(query)
         return results

+ 2 - 2
flaskbb/forum/views.py

@@ -512,8 +512,8 @@ def search_forum():
 
     form = SearchForm()
     if form.validate_on_submit():
-        result_type = form.fetch_types()
-        result_list = form.fetch_results()
+        result_type = form.get_types()
+        result_list = form.get_results()
         print(result_list)
         return render_template("forum/search_result.html",
                                results=result_list)

+ 27 - 10
flaskbb/templates/admin/users.html

@@ -1,6 +1,7 @@
 {% extends theme("admin/admin_layout.html") %}
 {% block admin_content %}
 {% from theme('macros.html') import render_pagination %}
+{% from theme("macros.html") import render_field, inline_field %}
 
 <legend>Manage Users | <a href="{{ url_for('admin.add_user') }}">Add User</a></legend>
 
@@ -8,6 +9,14 @@
     {{ render_pagination(users, url_for('admin.users')) }}
 </div>
 
+<div style="padding-bottom: 10px">
+    <form class="form" role="form" method="post">
+        {{ search_form.hidden_tag() }}
+        {{ inline_field(search_form.search_query, div_class="col-sm-12", rows=12) }}
+        <button type="submit" class="btn btn-primary">Search</button>
+    </form>
+</div>
+
 <table class="table table-bordered">
     <thead>
         <tr>
@@ -20,19 +29,27 @@
         </tr>
     </thead>
     <tbody>
-        {% for user in users.items %}
+        {% if not users.items %}
         <tr>
-            <td>{{ user.id }}</td>
-            <td><a href="{{ url_for('user.profile', username=user.username) }}">{{ user.username }}</a></td>
-            <td>{{ user.post_count }}</td>
-            <td>{{ user.date_joined|format_date('%b %d %Y') }}</td>
-            <td>{{ user.primary_group.name }}</td>
-            <td>
-                <a href="{{ url_for('admin.edit_user', user_id = user.id) }}">Edit</a> |
-                <a href="{{ url_for('admin.delete_user', user_id = user.id) }}">Delete</a>
+            <td colspan="6">
+                No users found matching your search query
             </td>
         </tr>
-        {% endfor %}
+        {% else %}
+            {% for user in users.items %}
+            <tr>
+                <td>{{ user.id }}</td>
+                <td><a href="{{ url_for('user.profile', username=user.username) }}">{{ user.username }}</a></td>
+                <td>{{ user.post_count }}</td>
+                <td>{{ user.date_joined|format_date('%b %d %Y') }}</td>
+                <td>{{ user.primary_group.name }}</td>
+                <td>
+                    <a href="{{ url_for('admin.edit_user', user_id = user.id) }}">Edit</a> |
+                    <a href="{{ url_for('admin.delete_user', user_id = user.id) }}">Delete</a>
+                </td>
+            </tr>
+            {% endfor %}
+        {% endif %}
     </tbody>
 </table>
 {% endblock %}