You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2015/01/15 19:29:37 UTC

[1/4] allura git commit: [#7816] ticket:709 Manage user's pending status

Repository: allura
Updated Branches:
  refs/heads/master 80733fee3 -> 32ae5ff6f


[#7816] ticket:709 Manage user's pending status


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/ca260f34
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/ca260f34
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/ca260f34

Branch: refs/heads/master
Commit: ca260f340d956c9106ac5c9e96ff2db31e545205
Parents: 80733fe
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Jan 12 15:32:00 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Wed Jan 14 10:52:26 2015 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py         |  7 +-
 Allura/allura/lib/plugin.py                     | 12 +++
 .../templates/site_admin_user_details.html      |  5 +-
 .../allura/tests/functional/test_site_admin.py  | 91 ++++++++++++++++++++
 4 files changed, 112 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ca260f34/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 5b84267..043678a 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -521,12 +521,17 @@ class AdminUserDetailsController(object):
         user = M.User.by_username(username)
         if not user or user.is_anonymous():
             raise HTTPNotFound()
-        if status == 'enable' and user.disabled:
+        if status == 'enable' and (user.disabled or user.pending):
+            AuthenticationProvider.get(request).activate_user(user)
             AuthenticationProvider.get(request).enable_user(user)
             flash('User enabled')
         elif status == 'disable' and not user.disabled:
             AuthenticationProvider.get(request).disable_user(user)
             flash('User disabled')
+        elif status == 'pending':
+            AuthenticationProvider.get(request).deactivate_user(user)
+            AuthenticationProvider.get(request).enable_user(user)
+            flash('Set user status to pending')
         redirect(request.referer)
 
     @expose()

http://git-wip-us.apache.org/repos/asf/allura/blob/ca260f34/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index e761ef3..5cf1905 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -197,6 +197,10 @@ class AuthenticationProvider(object):
         '''Activate user after registration'''
         raise NotImplementedError, 'activate_user'
 
+    def deactivate_user(self, user):
+        '''Deactivate user (== registation not confirmed)'''
+        raise NotImplementedError, 'deactivate_user'
+
     def by_username(self, username):
         '''
         Find a user by username.
@@ -366,6 +370,11 @@ class LocalAuthenticationProvider(AuthenticationProvider):
         session(user).flush(user)
         h.auditlog_user('Account activated', user=user)
 
+    def deactivate_user(self, user):
+        user.pending = True
+        session(user).flush(user)
+        h.auditlog_user('Account deactivated', user=user)
+
     def validate_password(self, user, password):
         return self._validate_password(user, password)
 
@@ -624,6 +633,9 @@ class LdapAuthenticationProvider(AuthenticationProvider):
     def activate_user(self, user):
         return LocalAuthenticationProvider(None).activate_user(user)
 
+    def deactivate_user(self, user):
+        return LocalAuthenticationProvider(None).deactivate_user(user)
+
     def get_last_password_updated(self, user):
         return LocalAuthenticationProvider(None).get_last_password_updated(user)
 

http://git-wip-us.apache.org/repos/asf/allura/blob/ca260f34/Allura/allura/templates/site_admin_user_details.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_user_details.html b/Allura/allura/templates/site_admin_user_details.html
index 8f18d7e..f5a8d2d 100644
--- a/Allura/allura/templates/site_admin_user_details.html
+++ b/Allura/allura/templates/site_admin_user_details.html
@@ -42,8 +42,9 @@
         <div class="grid-6">
         <form action='/nf/admin/user/set_status' method="POST">
           <div class='grid-6'>
-            <label><input type="radio" name="status" value="enable"{% if not user.disabled %} checked="checked"{% endif %}>Enabled</label><br>
-            <label><input type="radio" name="status" value="disable"{% if user.disabled %} checked="checked"{% endif %}>Disabled</label>
+            <label><input type="radio" name="status" value="enable"{% if not user.disabled and not user.pending %} checked="checked"{% endif %}>Enabled</label><br>
+            <label><input type="radio" name="status" value="disable"{% if user.disabled %} checked="checked"{% endif %}>Disabled</label><br>
+            <label><input type="radio" name="status" value="pending"{% if user.pending and not user.disabled %} checked="checked"{% endif %}>Pending</label>
           </div>
           <input type='hidden' name='username' value='{{ user.username }}'>
           {{lib.csrf_token()}}

http://git-wip-us.apache.org/repos/asf/allura/blob/ca260f34/Allura/allura/tests/functional/test_site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_site_admin.py b/Allura/allura/tests/functional/test_site_admin.py
index 197d058..6c327c7 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -347,7 +347,9 @@ class TestUserDetails(TestController):
         assert_in(u'Comment by test-admin: I was hêre!', r)
 
     def test_disable_user(self):
+        # user was not pending
         assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
         r = self.app.get('/nf/admin/user/test-user-3')
         form = r.forms[0]
         assert_equal(form['username'].value, 'test-user-3')
@@ -356,12 +358,66 @@ class TestUserDetails(TestController):
         r = form.submit()
         assert_in(u'User disabled', self.webflash(r))
         assert_equal(M.User.by_username('test-user-3').disabled, True)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+
+        # user was pending
+        user = M.User.by_username('test-user-3')
+        user.disabled = False
+        user.pending = True
+        ThreadLocalORMSession.flush_all()
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
+        r = self.app.get('/nf/admin/user/test-user-3')
+        form = r.forms[0]
+        assert_equal(form['username'].value, 'test-user-3')
+        assert_equal(form['status'].value, 'pending')
+        form['status'].value = 'disable'
+        r = form.submit()
+        assert_in(u'User disabled', self.webflash(r))
+        assert_equal(M.User.by_username('test-user-3').disabled, True)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
 
     def test_enable_user(self):
+        # user was not pending
+        user = M.User.by_username('test-user-3')
+        user.disabled = True
+        ThreadLocalORMSession.flush_all()
+        assert_equal(M.User.by_username('test-user-3').disabled, True)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+        r = self.app.get('/nf/admin/user/test-user-3')
+        form = r.forms[0]
+        assert_equal(form['username'].value, 'test-user-3')
+        assert_equal(form['status'].value, 'disable')
+        form['status'].value = 'enable'
+        r = form.submit()
+        assert_in(u'User enabled', self.webflash(r))
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+
+        # user was pending
+        user = M.User.by_username('test-user-3')
+        user.disabled = False
+        user.pending = True
+        ThreadLocalORMSession.flush_all()
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
+        r = self.app.get('/nf/admin/user/test-user-3')
+        form = r.forms[0]
+        assert_equal(form['username'].value, 'test-user-3')
+        assert_equal(form['status'].value, 'pending')
+        form['status'].value = 'enable'
+        r = form.submit()
+        assert_in(u'User enabled', self.webflash(r))
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+
+        # user was pending and disabled
         user = M.User.by_username('test-user-3')
         user.disabled = True
+        user.pending = True
         ThreadLocalORMSession.flush_all()
         assert_equal(M.User.by_username('test-user-3').disabled, True)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
         r = self.app.get('/nf/admin/user/test-user-3')
         form = r.forms[0]
         assert_equal(form['username'].value, 'test-user-3')
@@ -370,6 +426,41 @@ class TestUserDetails(TestController):
         r = form.submit()
         assert_in(u'User enabled', self.webflash(r))
         assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+
+    def test_set_pending(self):
+        # user was disabled
+        user = M.User.by_username('test-user-3')
+        user.disabled = True
+        ThreadLocalORMSession.flush_all()
+        assert_equal(M.User.by_username('test-user-3').disabled, True)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+        r = self.app.get('/nf/admin/user/test-user-3')
+        form = r.forms[0]
+        assert_equal(form['username'].value, 'test-user-3')
+        assert_equal(form['status'].value, 'disable')
+        form['status'].value = 'pending'
+        r = form.submit()
+        assert_in(u'Set user status to pending', self.webflash(r))
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
+
+        # user was enabled
+        user = M.User.by_username('test-user-3')
+        user.pending = False
+        user.disabled = False
+        ThreadLocalORMSession.flush_all()
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, False)
+        r = self.app.get('/nf/admin/user/test-user-3')
+        form = r.forms[0]
+        assert_equal(form['username'].value, 'test-user-3')
+        assert_equal(form['status'].value, 'enable')
+        form['status'].value = 'pending'
+        r = form.submit()
+        assert_in(u'Set user status to pending', self.webflash(r))
+        assert_equal(M.User.by_username('test-user-3').disabled, False)
+        assert_equal(M.User.by_username('test-user-3').pending, True)
 
     def test_emails(self):
         # add test@example.com


[2/4] allura git commit: [#7816] ticket:713 Add status to admin user search & refactoring

Posted by br...@apache.org.
[#7816] ticket:713 Add status to admin user search & refactoring


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/24ddf594
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/24ddf594
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/24ddf594

Branch: refs/heads/master
Commit: 24ddf594ada7323dc84483a6ff5aa3eee8124438
Parents: ca260f3
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Jan 14 11:25:39 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Wed Jan 14 11:25:39 2015 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py         |  2 ++
 Allura/allura/lib/helpers.py                    | 21 ++++++++++++++++++++
 .../site_admin_search_users_results.html        |  4 ++--
 .../templates/site_admin_user_details.html      |  6 +++---
 4 files changed, 28 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/24ddf594/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 043678a..d284113 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -325,6 +325,7 @@ class SiteAdminController(object):
         fields = [('username', 'username'), ('display_name', 'display name')]
         add_fields = aslist(tg.config.get('search.user.additional_search_fields'), ',')
         r = self._search(M.User, fields, add_fields, q, f, page, limit, **kw)
+        r['objects'] = [dict(u, status=h.get_user_status(u)) for u in r['objects']]
         r['search_results_template'] = 'allura:templates/site_admin_search_users_results.html'
         r['additional_display_fields'] = \
             aslist(tg.config.get('search.user.additional_display_fields'), ',')
@@ -471,6 +472,7 @@ class AdminUserDetailsController(object):
         audit_log = self._audit_log(user, limit, page)
         info = {
             'user': user,
+            'status': h.get_user_status(user),
             'projects': projects,
             'audit_log': audit_log,
         }

http://git-wip-us.apache.org/repos/asf/allura/blob/24ddf594/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 3b6a1d5..ad238e3 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -1209,3 +1209,24 @@ def auditlog_user(message, *args, **kwargs):
         message = 'Done by user: {}\n'.format(c.user.username) + message
     return M.AuditLog.log_user(message, *args, **kwargs)
 
+
+def get_user_status(user):
+    '''
+    Get user status based on disabled and pending attrs
+
+    :param user: a dict or :class:`allura.model.auth.User`
+    '''
+    from allura import model as M
+    if isinstance(user, M.User):
+        disabled = user.disabled
+        pending = user.pending
+    else:
+        disabled = user['disabled']
+        pending = user['pending']
+
+    if not disabled and not pending:
+        return 'enabled'
+    elif disabled:
+        return 'disabled'
+    elif pending:
+        return 'pending'

http://git-wip-us.apache.org/repos/asf/allura/blob/24ddf594/Allura/allura/templates/site_admin_search_users_results.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_users_results.html b/Allura/allura/templates/site_admin_search_users_results.html
index c718b02..bbb0693 100644
--- a/Allura/allura/templates/site_admin_search_users_results.html
+++ b/Allura/allura/templates/site_admin_search_users_results.html
@@ -21,7 +21,7 @@
   <th>Display name</th>
   <th>Email</th>
   <th>Registered</th>
-  <th>Disabled?</th>
+  <th>Status</th>
   {% for field in additional_display_fields %}
   <th>{{ field }}</th>
   {% endfor %}
@@ -34,7 +34,7 @@
   <td>{{ u['display_name'] }}</td>
   <td>{{ u['object'].get_pref('email_address') }}</td>
   <td>{{ h.ago(provider.user_registration_date(u['object']).replace(tzinfo=None)) }}</td>
-  <td>{{ u['disabled'] }}</td>
+  <td>{{ u['status'] }}</td>
   {% for field in additional_display_fields %}
   <td>{{ u[field] }}</td>
   {% endfor %}

http://git-wip-us.apache.org/repos/asf/allura/blob/24ddf594/Allura/allura/templates/site_admin_user_details.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_user_details.html b/Allura/allura/templates/site_admin_user_details.html
index f5a8d2d..1288ecb 100644
--- a/Allura/allura/templates/site_admin_user_details.html
+++ b/Allura/allura/templates/site_admin_user_details.html
@@ -42,9 +42,9 @@
         <div class="grid-6">
         <form action='/nf/admin/user/set_status' method="POST">
           <div class='grid-6'>
-            <label><input type="radio" name="status" value="enable"{% if not user.disabled and not user.pending %} checked="checked"{% endif %}>Enabled</label><br>
-            <label><input type="radio" name="status" value="disable"{% if user.disabled %} checked="checked"{% endif %}>Disabled</label><br>
-            <label><input type="radio" name="status" value="pending"{% if user.pending and not user.disabled %} checked="checked"{% endif %}>Pending</label>
+            <label><input type="radio" name="status" value="enable"{% if status == 'enabled' %} checked="checked"{% endif %}>Enabled</label><br>
+            <label><input type="radio" name="status" value="disable"{% if status == 'disabled' %} checked="checked"{% endif %}>Disabled</label><br>
+            <label><input type="radio" name="status" value="pending"{% if status == 'pending' %} checked="checked"{% endif %}>Pending</label>
           </div>
           <input type='hidden' name='username' value='{{ user.username }}'>
           {{lib.csrf_token()}}


[4/4] allura git commit: [#7816] use User object for status checks (solr record could be old one before pending status introduced)

Posted by br...@apache.org.
[#7816] use User object for status checks (solr record could be old one before pending status introduced)


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/32ae5ff6
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/32ae5ff6
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/32ae5ff6

Branch: refs/heads/master
Commit: 32ae5ff6f1d9462ab5f8152f3feb914ff6fd7037
Parents: 4a5275c
Author: Dave Brondsema <db...@slashdotmedia.com>
Authored: Wed Jan 14 17:02:52 2015 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Wed Jan 14 17:02:52 2015 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py |  2 +-
 Allura/allura/lib/helpers.py            | 11 +++--------
 Allura/allura/tests/test_helpers.py     | 12 +++++-------
 3 files changed, 9 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/32ae5ff6/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index d284113..f150370 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -325,7 +325,7 @@ class SiteAdminController(object):
         fields = [('username', 'username'), ('display_name', 'display name')]
         add_fields = aslist(tg.config.get('search.user.additional_search_fields'), ',')
         r = self._search(M.User, fields, add_fields, q, f, page, limit, **kw)
-        r['objects'] = [dict(u, status=h.get_user_status(u)) for u in r['objects']]
+        r['objects'] = [dict(u, status=h.get_user_status(u['object'])) for u in r['objects']]
         r['search_results_template'] = 'allura:templates/site_admin_search_users_results.html'
         r['additional_display_fields'] = \
             aslist(tg.config.get('search.user.additional_display_fields'), ',')

http://git-wip-us.apache.org/repos/asf/allura/blob/32ae5ff6/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index ad238e3..3cd14fb 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -1214,15 +1214,10 @@ def get_user_status(user):
     '''
     Get user status based on disabled and pending attrs
 
-    :param user: a dict or :class:`allura.model.auth.User`
+    :param user: a :class:`allura.model.auth.User`
     '''
-    from allura import model as M
-    if isinstance(user, M.User):
-        disabled = user.disabled
-        pending = user.pending
-    else:
-        disabled = user['disabled']
-        pending = user['pending']
+    disabled = user.disabled
+    pending = user.pending
 
     if not disabled and not pending:
         return 'enabled'

http://git-wip-us.apache.org/repos/asf/allura/blob/32ae5ff6/Allura/allura/tests/test_helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index 780f21c..49032eb 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -551,16 +551,14 @@ class TestIterEntryPoints(TestCase):
                                 list, h.iter_entry_points('allura'))
 
 def test_get_user_status():
-    user = {'pending': False, 'disabled': False}
+    user = M.User.by_username('test-admin')
     assert_equals(h.get_user_status(user), 'enabled')
 
-    user = {'pending': True, 'disabled': True}
-    assert_equals(h.get_user_status(user), 'disabled')
-    user = {'pending': False, 'disabled': True}
+    user = Mock(disabled=True, pending=False)
     assert_equals(h.get_user_status(user), 'disabled')
 
-    user = {'pending': True, 'disabled': False}
+    user = Mock(disabled=False, pending=True)
     assert_equals(h.get_user_status(user), 'pending')
 
-    user = M.User.by_username('test-admin')
-    assert_equals(h.get_user_status(user), 'enabled')
+    user = Mock(disabled=True, pending=True)  # not an expected combination
+    assert_equals(h.get_user_status(user), 'disabled')


[3/4] allura git commit: [#7816] ticket:713 Fix/add tests

Posted by br...@apache.org.
[#7816] ticket:713 Fix/add tests


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/4a5275c7
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/4a5275c7
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/4a5275c7

Branch: refs/heads/master
Commit: 4a5275c7957212f94d25715a7a50dbb4141f8ba0
Parents: 24ddf59
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Jan 14 11:46:25 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Wed Jan 14 11:46:25 2015 +0000

----------------------------------------------------------------------
 Allura/allura/tests/functional/test_site_admin.py |  5 +++--
 Allura/allura/tests/test_helpers.py               | 15 +++++++++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/4a5275c7/Allura/allura/tests/functional/test_site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_site_admin.py b/Allura/allura/tests/functional/test_site_admin.py
index 6c327c7..be89354 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -229,6 +229,7 @@ class TestUsersSearch(TestController):
     TEST_HIT = MagicMock(hits=1, docs=[{
         '_version_': 1478773871277506560,
         'disabled_b': False,
+        'pending_b': False,
         'display_name_t': 'Darth Vader',
         'id': 'allura/model/auth/User#540efdf2100d2b1483155d39',
         'last_access_login_date_dt': '2014-09-09T13:17:40.176Z',
@@ -263,7 +264,7 @@ class TestUsersSearch(TestController):
         assert_equal(options, ['username', 'display_name', '__custom__'])
         ths = [th.text for th in r.html.findAll('th')]
         assert_equal(ths, ['Username', 'Display name', 'Email', 'Registered',
-                           'Disabled?', 'Details'])
+                           'Status', 'Details'])
 
     @patch('allura.controllers.site_admin.search')
     def test_additional_fields(self, search):
@@ -275,7 +276,7 @@ class TestUsersSearch(TestController):
         assert_equal(options, ['username', 'display_name', 'email_addresses', 'url', '__custom__'])
         ths = [th.text for th in r.html.findAll('th')]
         assert_equal(ths, ['Username', 'Display name', 'Email', 'Registered',
-                           'Disabled?', 'url', 'Details'])
+                           'Status', 'url', 'Details'])
 
 
 class TestUserDetails(TestController):

http://git-wip-us.apache.org/repos/asf/allura/blob/4a5275c7/Allura/allura/tests/test_helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_helpers.py b/Allura/allura/tests/test_helpers.py
index 4cced7e..780f21c 100644
--- a/Allura/allura/tests/test_helpers.py
+++ b/Allura/allura/tests/test_helpers.py
@@ -549,3 +549,18 @@ class TestIterEntryPoints(TestCase):
                                 'Ambiguous \[allura\] entry points detected. '
                                 'Multiple entry points with name "myapp".',
                                 list, h.iter_entry_points('allura'))
+
+def test_get_user_status():
+    user = {'pending': False, 'disabled': False}
+    assert_equals(h.get_user_status(user), 'enabled')
+
+    user = {'pending': True, 'disabled': True}
+    assert_equals(h.get_user_status(user), 'disabled')
+    user = {'pending': False, 'disabled': True}
+    assert_equals(h.get_user_status(user), 'disabled')
+
+    user = {'pending': True, 'disabled': False}
+    assert_equals(h.get_user_status(user), 'pending')
+
+    user = M.User.by_username('test-admin')
+    assert_equals(h.get_user_status(user), 'enabled')