Browse Source

Implement sort_by and order_by for memberlist. #175

sh4nks 9 years ago
parent
commit
c780061e4d
2 changed files with 30 additions and 7 deletions
  1. 18 2
      flaskbb/forum/views.py
  2. 12 5
      flaskbb/templates/forum/memberlist.html

+ 18 - 2
flaskbb/forum/views.py

@@ -11,6 +11,7 @@
 """
 import datetime
 
+from sqlalchemy import asc, desc
 from flask import Blueprint, redirect, url_for, current_app, request, flash
 from flask_login import login_required, current_user
 from flask_babelex import gettext as _
@@ -569,16 +570,31 @@ def who_is_online():
 @forum.route("/memberlist", methods=['GET', 'POST'])
 def memberlist():
     page = request.args.get('page', 1, type=int)
+    sort_by = request.args.get('sort_by', 'reg_date')
+    order_by = request.args.get('order_by', 'asc')
 
-    search_form = UserSearchForm()
+    sort_obj = None
+    order_func = None
+    if order_by == 'asc':
+        order_func = asc
+    else:
+        order_func = desc
 
+    if sort_by == 'reg_date':
+        sort_obj = User.id
+    elif sort_by == 'post_count':
+        sort_obj = User.post_count
+    else:
+        sort_obj = User.username
+
+    search_form = UserSearchForm()
     if search_form.validate():
         users = search_form.get_results().\
             paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
         return render_template("forum/memberlist.html", users=users,
                                search_form=search_form)
     else:
-        users = User.query.\
+        users = User.query.order_by(order_func(sort_obj)).\
             paginate(page, flaskbb_config['USERS_PER_PAGE'], False)
         return render_template("forum/memberlist.html", users=users,
                                search_form=search_form)

+ 12 - 5
flaskbb/templates/forum/memberlist.html

@@ -37,19 +37,26 @@
         </div>
         <div class="panel-body page-body">
             <div class="page-meta">
+                {% set order_by = 'desc' if request.args.get('order_by') == 'asc' else 'asc' %}
                 <div class="col-md-1 col-sm-1 col-xs-1 meta-item">#</div>
-                <div class="col-md-3 col-sm-3 col-xs-5 meta-item">{% trans %}Username{% endtrans %}</div>
-                <div class="col-md-2 col-sm-2 hidden-xs meta-item">{% trans %}Posts{% endtrans %}</div>
-                <div class="col-md-3 col-sm-3 hidden-xs meta-item">{% trans %}Date registered{% endtrans %}</div>
+                <div class="col-md-3 col-sm-3 col-xs-5 meta-item">
+                    <a href="{{ url_for('forum.memberlist') }}?sort_by=username&order_by={{ order_by }}">{% trans %}Username{% endtrans %}</a>
+                </div>
+                <div class="col-md-3 col-sm-3 hidden-xs meta-item">
+                    <a href="{{ url_for('forum.memberlist') }}?sort_by=reg_date&order_by={{ order_by }}">{% trans %}Date registered{% endtrans %}</a>
+                </div>
                 <div class="col-md-3 col-sm-3 col-xs-5 meta-item">{% trans %}Group{% endtrans %}</div>
+                <div class="col-md-2 col-sm-2 hidden-xs meta-item">
+                    <a href="{{ url_for('forum.memberlist') }}?sort_by=post_count&order_by={{ order_by }}">{% trans %}Posts{% endtrans %}</a>
+                </div>
             </div>
             {% for user in users.items %}
             <div class="row page-row hover clearfix">
                 <div class="col-md-1 col-sm-1 col-xs-1">{{ user.id }}</div>
                 <div class="col-md-3 col-sm-3 col-xs-5"><a href="{{ user.url }}">{{ user.username }}</a></div>
-                <div class="col-md-2 col-sm-2 hidden-xs">{{ user.post_count }}</div>
-                <div class="col-md-3 col-sm-3 hidden-xs">{{ user.date_joined|format_date('%b %d %Y') }}</div>
+                <div class="col-md-3 col-sm-3 hidden-xs">{{ user.date_joined|format_date('%b %d %Y, %I:%M %p') }}</div>
                 <div class="col-md-3 col-sm-3 col-xs-5">{{ user.primary_group.name }}</div>
+                <div class="col-md-2 col-sm-2 hidden-xs">{{ user.post_count }}</div>
             </div>
             {% endfor %}
         </div>