You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by je...@apache.org on 2014/09/09 16:28:21 UTC

[01/18] git commit: [#7589] ticket:622 Tasks for indexing users

Repository: allura
Updated Branches:
  refs/heads/je/42cc_7656 [created] d7df14a09


[#7589] ticket:622 Tasks for indexing users


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

Branch: refs/heads/je/42cc_7656
Commit: 88a8e0142bdfabfecf79f39c0987344217d098d9
Parents: 9176543
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Aug 4 14:50:18 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:25:27 2014 +0300

----------------------------------------------------------------------
 Allura/allura/model/session.py     |  4 +++-
 Allura/allura/tasks/index_tasks.py | 12 ++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/88a8e014/Allura/allura/model/session.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/session.py b/Allura/allura/model/session.py
index 8e0f551..eb1f4ba 100644
--- a/Allura/allura/model/session.py
+++ b/Allura/allura/model/session.py
@@ -68,7 +68,9 @@ class IndexerSessionExtension(ManagedSessionExtension):
 
     TASKS = {
         'allura.model.project.Project': {'add': index_tasks.add_projects,
-                                         'del': index_tasks.del_projects}
+                                         'del': index_tasks.del_projects},
+        'allura.model.auth.User': {'add': index_tasks.add_users,
+                                   'del': index_tasks.del_users},
     }
 
     def _objects_by_types(self, obj_list):

http://git-wip-us.apache.org/repos/asf/allura/blob/88a8e014/Allura/allura/tasks/index_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/index_tasks.py b/Allura/allura/tasks/index_tasks.py
index 3f02cef..c9e853d 100644
--- a/Allura/allura/tasks/index_tasks.py
+++ b/Allura/allura/tasks/index_tasks.py
@@ -57,6 +57,18 @@ def del_projects(project_solr_ids):
 
 
 @task
+def add_users(user_ids):
+    from allura.model import User
+    users = User.query.find(dict(_id={'$in': user_ids})).all()
+    __add_objects(users)
+
+
+@task
+def del_users(user_solr_ids):
+    __del_objects(user_solr_ids)
+
+
+@task
 def add_artifacts(ref_ids, update_solr=True, update_refs=True, solr_hosts=None):
     '''
     Add the referenced artifacts to SOLR and shortlinks.


[04/18] git commit: [#7589] ticket:622 Add command to reindex all users

Posted by je...@apache.org.
[#7589] ticket:622 Add command to reindex all users


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

Branch: refs/heads/je/42cc_7656
Commit: d5d2b3f56e64476c5c33ad01127a9eeb988e6cb1
Parents: 7b61cd5
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Aug 4 17:16:51 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:25:28 2014 +0300

----------------------------------------------------------------------
 Allura/allura/scripts/reindex_users.py | 89 +++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d5d2b3f5/Allura/allura/scripts/reindex_users.py
----------------------------------------------------------------------
diff --git a/Allura/allura/scripts/reindex_users.py b/Allura/allura/scripts/reindex_users.py
new file mode 100644
index 0000000..8a0762b
--- /dev/null
+++ b/Allura/allura/scripts/reindex_users.py
@@ -0,0 +1,89 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+import argparse
+import logging
+
+from pymongo.errors import InvalidDocument
+
+from allura.scripts import ScriptTask
+from allura import model as M
+from allura.tasks.index_tasks import add_users
+from allura.lib.utils import chunked_find, chunked_list
+from allura.lib.exceptions import CompoundError
+
+
+log = logging.getLogger(__name__)
+
+
+class ReindexUsers(ScriptTask):
+
+    @classmethod
+    def execute(cls, options):
+        for chunk in chunked_find(M.User, {}):
+            user_ids = []
+            for u in chunk:
+                log.info('Reindex user %s', u.username)
+                if options.dry_run:
+                    continue
+                user_ids.append(u._id)
+            try:
+                for chunk in chunked_list(user_ids, options.max_chunk):
+                    if options.tasks:
+                        cls._post_add_users(chunk)
+                    else:
+                        add_users(chunk)
+            except CompoundError, err:
+                log.exception('Error indexing users:\n%r', err)
+                log.error('%s', err.format_error())
+            M.main_orm_session.flush()
+            M.main_orm_session.clear()
+        log.info('Reindex %s', 'queued' if options.tasks else 'done')
+
+    @classmethod
+    def _post_add_users(cls, chunk):
+        """
+        Post task, recursively splitting and re-posting if the resulting
+        mongo document is too large.
+        """
+        try:
+            add_users.post(chunk)
+        except InvalidDocument as e:
+            # there are many types of InvalidDocument, only recurse if its
+            # expected to help
+            if e.args[0].startswith('BSON document too large'):
+                cls._post_add_users(chunk[:len(chunk) // 2])
+                cls._post_add_users(chunk[len(chunk) // 2:])
+            else:
+                raise
+
+    @classmethod
+    def parser(cls):
+        parser = argparse.ArgumentParser(description='Reindex all users')
+        parser.add_argument('--dry-run', action='store_true', dest='dry_run',
+                            default=False, help='Log names of projects that would be reindexed, '
+                            'but do not perform the actual reindex.')
+        parser.add_argument('--tasks', action='store_true', dest='tasks',
+                            help='Run each individual index operation as a background task.')
+        parser.add_argument(
+            '--max-chunk', dest='max_chunk', type=int, default=100 * 1000,
+            help='Max number of artifacts to index in one Solr update command')
+        return parser
+
+
+if __name__ == '__main__':
+    ReindexUsers.main()


[02/18] git commit: [#7589] ticket:622 Make User indexable

Posted by je...@apache.org.
[#7589] ticket:622 Make User indexable


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

Branch: refs/heads/je/42cc_7656
Commit: 917654372e450f95005323dbc26bf33a265f7851
Parents: e790049
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Aug 4 14:16:46 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:25:27 2014 +0300

----------------------------------------------------------------------
 Allura/allura/lib/plugin.py |  8 ++++++++
 Allura/allura/model/auth.py | 38 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/91765437/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 7f34559..e5a1fc3 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -279,6 +279,10 @@ class AuthenticationProvider(object):
             return True
         return False
 
+    def index_user(self, user):
+        """Put here additional fields for user index in SOLR."""
+        return {}
+
 
 class LocalAuthenticationProvider(AuthenticationProvider):
 
@@ -370,6 +374,10 @@ class LocalAuthenticationProvider(AuthenticationProvider):
             d = datetime.utcfromtimestamp(calendar.timegm(d.utctimetuple()))
         return d
 
+    def index_user(self, user):
+        fields = super(LocalAuthenticationProvider, self).index_user(user)
+        return dict(user_registration_date_dt=self.user_registration_date(user), **fields)
+
 
 def ldap_conn(who=None, cred=None):
     '''

http://git-wip-us.apache.org/repos/asf/allura/blob/91765437/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index b7ea34b..fb59d0e 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -46,6 +46,7 @@ import allura.tasks.mail_tasks
 from allura.lib import helpers as h
 from allura.lib import plugin
 from allura.lib.decorators import memoize
+from allura.lib.search import SearchIndexable
 
 from .session import main_orm_session, main_doc_session
 from .session import project_orm_session
@@ -210,7 +211,7 @@ class FieldPropertyDisplayName(FieldProperty):
         return display_name
 
 
-class User(MappedClass, ActivityNode, ActivityObject):
+class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
     SALT_LEN = 8
 
     class __mongometa__:
@@ -219,6 +220,8 @@ class User(MappedClass, ActivityNode, ActivityObject):
         indexes = ['tool_data.sfx.userid', 'tool_data.AuthPasswordReset.hash']
         unique_indexes = ['username']
 
+    type_s = 'User'
+
     _id = FieldProperty(S.ObjectId)
     sfx_userid = FieldProperty(S.Deprecated)
     username = FieldProperty(str)
@@ -227,7 +230,7 @@ class User(MappedClass, ActivityNode, ActivityObject):
     last_password_updated = FieldProperty(datetime)
     projects = FieldProperty(S.Deprecated)
     # full mount point: prefs dict
-    tool_preferences = FieldProperty({str: {str: None}})
+    tool_preferences = FieldProperty(S.Deprecated)
     tool_data = FieldProperty({str: {str: None}})  # entry point: prefs dict
     disabled = FieldProperty(bool, if_missing=False)
 
@@ -280,6 +283,37 @@ class User(MappedClass, ActivityNode, ActivityObject):
         session_ip=str,
         session_ua=str))
 
+    def index(self):
+        provider = plugin.AuthenticationProvider.get(None)  # no need in request here
+        localization = '%s/%s' % (
+            self.get_pref('localization')['country'],
+            self.get_pref('localization')['city'])
+        fields = dict(
+            id=self.index_id(),
+            title='User %s' % self.username,
+            type_s=self.type_s,
+            username_s=self.username,
+            email_addresses=self.email_addresses,
+            last_password_updated_dt=self.last_password_updated,
+            disabled_b=self.disabled,
+            results_per_page_i=self.get_pref('results_per_page'),
+            email_address_s=self.get_pref('email_address'),
+            email_format_s=self.get_pref('email_format'),
+            disable_user_messages_b=self.get_pref('disable_user_messages'),
+            display_name_s=self.get_pref('display_name'),
+            sex_s=self.get_pref('sex'),
+            birthday_dt=self.get_pref('birthday'),
+            localization_s=localization,
+            timezone_s=self.get_pref('timezone'),
+            socialnetworks=self.get_pref('socialnetworks'),
+            telnumbers=self.get_pref('telnumbers'),
+            skypeaccount_s=self.get_pref('skypeaccount'),
+            webpages=self.get_pref('webpages'),
+            skills=self.get_skills(),
+            last_access=self.last_access,
+        )
+        return dict(provider.index_user(self), **fields)
+
     def track_login(self, req):
         user_ip = req.headers.get('X_FORWARDED_FOR', req.remote_addr)
         user_agent = req.headers.get('User-Agent')


[10/18] git commit: [#7656] ticket:648 Refactor controller & template to reuse as much as we can

Posted by je...@apache.org.
[#7656] ticket:648 Refactor controller & template to reuse as much as we can


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

Branch: refs/heads/je/42cc_7656
Commit: 3577c180445516e50b8530039c8574f4783d25a9
Parents: 7a6ccbd
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 14:09:55 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 14:09:55 2014 +0300

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py         | 74 ++++++++++++--------
 Allura/allura/templates/site_admin_search.html  | 49 +++++++++++++
 .../templates/site_admin_search_projects.html   | 74 --------------------
 .../site_admin_search_projects_results.html     | 27 +++++++
 .../templates/site_admin_search_users.html      | 25 -------
 .../site_admin_search_users_results.html        |  7 ++
 6 files changed, 126 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 5913411..b19b84b 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -290,41 +290,35 @@ class SiteAdminController(object):
             flash('Can not add comment "%s" for user %s' % (comment, user))
         redirect(request.referer)
 
-    @without_trailing_slash
-    @expose('jinja:allura:templates/site_admin_search_projects.html')
-    @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
-                              limit=validators.Int(if_invalid=None),
-                              page=validators.Int(if_empty=0, if_invalid=0)))
-    def search_projects(self, q=None, f=None, page=0, limit=None, **kw):
-        fields = [('shortname', 'shortname'), ('name', 'full name')]
-        fields.extend(aslist(tg.config.get('search.project.additional_fields'), ','))
-        c.search_form = W.admin_search_form(fields)
+    def _search(self, model, fields, add_fields, q=None, f=None, page=0, limit=None, **kw):
+        all_fields = fields + [(fld, fld) for fld in add_fields]
+        c.search_form = W.admin_search_form(all_fields)
         c.page_list = W.page_list
         c.page_size = W.page_size
         count = 0
-        projects = []
+        objects = []
         limit, page, start = g.handle_paging(limit, page, default=25)
         if q:
-            match = search.search_projects(q, f, rows=limit, start=start)
+            match = search.site_admin_search(model, q, f, rows=limit, start=start)
             if match:
                 count = match.hits
-                projects = match.docs
-                pids = [bson.ObjectId(p['id'].split('#')[1]) for p in projects]
-                mongo_projects = {}
-                for p in M.Project.query.find({'_id': {'$in': pids}}):
-                    mongo_projects[str(p._id)] = p
-
-                for i in range(len(projects)):
-                    p = projects[i]
-                    _id = p['id'].split('#')[1]
-                    p['project'] = mongo_projects.get(_id)
-                # Some projects can be deleted, but still have index in solr, should skip those
-                projects = [p for p in projects if p.get('project')]
-
-        def convert_fields(p):
+                objects = match.docs
+                ids = [bson.ObjectId(obj['id'].split('#')[1]) for obj in objects]
+                mongo_objects = {}
+                for obj in model.query.find({'_id': {'$in': ids}}):
+                    mongo_objects[str(obj._id)] = obj
+
+                for i in range(len(objects)):
+                    obj = objects[i]
+                    _id = obj['id'].split('#')[1]
+                    obj['object'] = mongo_objects.get(_id)
+                # Some objects can be deleted, but still have index in solr, should skip those
+                objects = [obj for obj in objects if obj.get('object')]
+
+        def convert_fields(obj):
             # throw the type away (e.g. '_s' from 'url_s')
             result = {}
-            for k,v in p.iteritems():
+            for k,v in obj.iteritems():
                 name = k.rsplit('_', 1)
                 if len(name) == 2:
                     name = name[0]
@@ -336,21 +330,39 @@ class SiteAdminController(object):
         return {
             'q': q,
             'f': f,
-            'projects': map(convert_fields, projects),
+            'objects': map(convert_fields, objects),
             'count': count,
             'page': page,
             'limit': limit,
-            'additional_fields': aslist(config.get('search.project.additional_fields'), ','),
-            'provider': ProjectRegistrationProvider.get(),
+            'fields': fields,
+            'additional_fields': add_fields,
+            'type_s': model.type_s,
         }
 
     @without_trailing_slash
-    @expose('jinja:allura:templates/site_admin_search_users.html')
+    @expose('jinja:allura:templates/site_admin_search.html')
+    @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
+                              limit=validators.Int(if_invalid=None),
+                              page=validators.Int(if_empty=0, if_invalid=0)))
+    def search_projects(self, q=None, f=None, page=0, limit=None, **kw):
+        fields = [('shortname', 'shortname'), ('name', 'full name')]
+        add_fields = aslist(tg.config.get('search.project.additional_fields'), ',')
+        r = self._search(M.Project, fields, add_fields, q, f, page, limit, **kw)
+        r['search_results_template'] = 'allura:templates/site_admin_search_projects_results.html'
+        r['provider'] = ProjectRegistrationProvider.get()
+        return r
+
+    @without_trailing_slash
+    @expose('jinja:allura:templates/site_admin_search.html')
     @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
                               limit=validators.Int(if_invalid=None),
                               page=validators.Int(if_empty=0, if_invalid=0)))
     def search_users(self, q=None, f=None, page=0, limit=None, **kw):
-        return {}
+        fields = []
+        add_fields = aslist(tg.config.get('search.user.additional_fields'), ',')
+        r = self._search(M.User, fields, add_fields, q, f, page, limit, **kw)
+        r['search_results_template'] = 'allura:templates/site_admin_search_users_results.html'
+        return r
 
 
 class TaskManagerController(object):

http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/Allura/allura/templates/site_admin_search.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search.html b/Allura/allura/templates/site_admin_search.html
new file mode 100644
index 0000000..685f65b
--- /dev/null
+++ b/Allura/allura/templates/site_admin_search.html
@@ -0,0 +1,49 @@
+{#-
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-#}
+{% extends 'allura:templates/site_admin.html' %}
+
+{% block title %}Search {{ type_s }}s{% endblock %}
+{% block header %}Search {{ type_s }}s{% endblock %}
+
+{% block content %}
+  <div class="grid-19">
+    {{ c.search_form.display(q=q, f=f) }}
+  </div>
+
+  {% if objects %}
+    <table>
+      {% include search_results_template %}
+    </table>
+  {% endif %}
+
+  <div class="grid-19">
+    {{c.page_list.display(limit=limit, page=page, count=count)}}
+    {{c.page_size.display(limit=limit, page=page, count=count)}}
+  </div>
+{% endblock %}
+
+{% block extra_css %}
+<style>
+  table { clear: both; }
+  table th {
+    text-align: left;
+    padding: 5px 10px;
+  }
+</style>
+{% endblock %}

http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/Allura/allura/templates/site_admin_search_projects.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_projects.html b/Allura/allura/templates/site_admin_search_projects.html
deleted file mode 100644
index a6e6b02..0000000
--- a/Allura/allura/templates/site_admin_search_projects.html
+++ /dev/null
@@ -1,74 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% extends 'allura:templates/site_admin.html' %}
-
-{% block title %}Search Projects{% endblock %}
-{% block header %}Search Projects{% endblock %}
-
-{% block content %}
-  <div class="grid-19">
-    {{ c.search_form.display(q=q, f=f) }}
-  </div>
-
-  {% if projects %}
-    <table>
-      <tr>
-        <th>Short name</th>
-        <th>Full name</th>
-        <th>Registered</th>
-        <th>Deleted?</th>
-        {% for field in additional_fields %}
-        <th>{{ field }}</th>
-        {% endfor %}
-        <th>Details</th>
-      </tr>
-    {% for p in projects %}
-      <tr>
-        <td><a href="{{ p['url'] }}">{{ p['shortname'] }}</a></td>
-        <td>{{ p['name'] }}</td>
-        <td>{{ h.ago_string(p['registration']) }}</td>
-        <td>{{ p['deleted'] }}</td>
-        {% for field in additional_fields %}
-        <td>{{ p[field] }}</td>
-        {% endfor %}
-        <td>
-          {% for url, label in provider.details_links(p['project']) %}
-            <a href="{{ url }}">{{ label }}</a><br>
-          {% endfor %}
-        </td>
-      </tr>
-    {% endfor %}
-    </table>
-  {% endif %}
-
-  <div class="grid-19">
-    {{c.page_list.display(limit=limit, page=page, count=count)}}
-    {{c.page_size.display(limit=limit, page=page, count=count)}}
-  </div>
-{% endblock %}
-
-{% block extra_css %}
-<style>
-  table { clear: both; }
-  table th {
-    text-align: left;
-    padding: 5px 10px;
-  }
-</style>
-{% endblock %}

http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/Allura/allura/templates/site_admin_search_projects_results.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_projects_results.html b/Allura/allura/templates/site_admin_search_projects_results.html
new file mode 100644
index 0000000..622e9a6
--- /dev/null
+++ b/Allura/allura/templates/site_admin_search_projects_results.html
@@ -0,0 +1,27 @@
+<tr>
+  <th>Short name</th>
+  <th>Full name</th>
+  <th>Registered</th>
+  <th>Deleted?</th>
+  {% for field in additional_fields %}
+  <th>{{ field }}</th>
+  {% endfor %}
+  <th>Details</th>
+</tr>
+
+{% for p in objects %}
+<tr>
+  <td><a href="{{ p['url'] }}">{{ p['shortname'] }}</a></td>
+  <td>{{ p['name'] }}</td>
+  <td>{{ h.ago_string(p['registration']) }}</td>
+  <td>{{ p['deleted'] }}</td>
+  {% for field in additional_fields %}
+  <td>{{ p[field] }}</td>
+  {% endfor %}
+  <td>
+    {% for url, label in provider.details_links(p['object']) %}
+      <a href="{{ url }}">{{ label }}</a><br>
+    {% endfor %}
+  </td>
+</tr>
+{% endfor %}

http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/Allura/allura/templates/site_admin_search_users.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_users.html b/Allura/allura/templates/site_admin_search_users.html
deleted file mode 100644
index ec18e90..0000000
--- a/Allura/allura/templates/site_admin_search_users.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% extends 'allura:templates/site_admin.html' %}
-
-{% block title %}Search Users{% endblock %}
-{% block header %}Search Users{% endblock %}
-
-{% block content %}
-{% endblock %}

http://git-wip-us.apache.org/repos/asf/allura/blob/3577c180/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
new file mode 100644
index 0000000..b73c5c4
--- /dev/null
+++ b/Allura/allura/templates/site_admin_search_users_results.html
@@ -0,0 +1,7 @@
+<tr>
+</tr>
+
+{% for user in objects %}
+<tr>
+</tr>
+{% endfor %}


[13/18] git commit: [#7656] ticket:648 Add default search fields for user & additional fields examples

Posted by je...@apache.org.
[#7656] ticket:648 Add default search fields for user & additional fields examples


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

Branch: refs/heads/je/42cc_7656
Commit: 78f3b8885cc640c56846c8345a0771db9db82c6b
Parents: 3d4b9a5
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 14:24:39 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 14:24:39 2014 +0300

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py | 2 +-
 Allura/development.ini                  | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/78f3b888/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index b19b84b..40c69f2 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -358,7 +358,7 @@ class SiteAdminController(object):
                               limit=validators.Int(if_invalid=None),
                               page=validators.Int(if_empty=0, if_invalid=0)))
     def search_users(self, q=None, f=None, page=0, limit=None, **kw):
-        fields = []
+        fields = [('username', 'username'), ('display_name', 'display name')]
         add_fields = aslist(tg.config.get('search.user.additional_fields'), ',')
         r = self._search(M.User, fields, add_fields, q, f, page, limit, **kw)
         r['search_results_template'] = 'allura:templates/site_admin_search_users_results.html'

http://git-wip-us.apache.org/repos/asf/allura/blob/78f3b888/Allura/development.ini
----------------------------------------------------------------------
diff --git a/Allura/development.ini b/Allura/development.ini
index 80275d5..ab0c114 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -120,9 +120,10 @@ user_prefs_storage.method = local
 user_prefs_storage.ldap.fields.display_name = cn
 
 
-# Additional fields for admin project search (/nf/admin/search_projects/)
+# Additional fields for admin project/user search
 # Note: whitespace after comma is important!
 # search.project.additional_fields = private, url, title
+# search.user.additional_fields = email_addresses
 
 # Set the locations of some static resources
 #  script_name is the path that is handled by the application


[11/18] git commit: [#7656] ticket:648 Get rid of specific search functions, which aren't used now

Posted by je...@apache.org.
[#7656] ticket:648 Get rid of specific search functions, which aren't used now


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

Branch: refs/heads/je/42cc_7656
Commit: 7330f8dc8b2344086c29daef9d04f4f030ba1b13
Parents: 3577c18
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 14:10:44 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 14:10:44 2014 +0300

----------------------------------------------------------------------
 Allura/allura/lib/search.py | 10 ----------
 1 file changed, 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/7330f8dc/Allura/allura/lib/search.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/search.py b/Allura/allura/lib/search.py
index f4f177a..1c3ba8a 100644
--- a/Allura/allura/lib/search.py
+++ b/Allura/allura/lib/search.py
@@ -180,8 +180,6 @@ def search_artifact(atype, q, history=False, rows=10, short_timeout=False, filte
 def site_admin_search(model, q, field, **kw):
     """Performs SOLR search for a given model.
 
-    Probably you should not use it directly. Use one of the specific functions below.
-
     Raises SearchError if SOLR returns an error.
     """
     # first, grab a object and get the fields that it indexes
@@ -198,14 +196,6 @@ def site_admin_search(model, q, field, **kw):
     fq = [u'type_s:%s' % model.type_s]
     return search(q, fq=fq, ignore_errors=False, **kw)
 
-def search_projects(q, field, **kw):
-    from allura.model import Project
-    return site_admin_search(Project, q, field, **kw)
-
-def search_users(q, field, **kw):
-    from allura.model import User
-    return site_admin_search(User, q, field, **kw)
-
 
 def search_app(q='', fq=None, app=True, **kw):
     """Helper for app/project search.


[12/18] git commit: [#7656] ticket:648 Change display name index type to allow not strict matches when searching

Posted by je...@apache.org.
[#7656] ticket:648 Change display name index type to allow not strict matches when searching


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

Branch: refs/heads/je/42cc_7656
Commit: 3d4b9a547e7af96d2eb3ffa7f877f4d2b4d16c96
Parents: 7330f8d
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 14:15:41 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 14:15:41 2014 +0300

----------------------------------------------------------------------
 Allura/allura/model/auth.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/3d4b9a54/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 43de922..16ee2e0 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -302,7 +302,7 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
             email_address_s=self.get_pref('email_address'),
             email_format_s=self.get_pref('email_format'),
             disable_user_messages_b=self.get_pref('disable_user_messages'),
-            display_name_s=self.get_pref('display_name'),
+            display_name_t=self.get_pref('display_name'),
             sex_s=self.get_pref('sex'),
             birthdate_dt=self.get_pref('birthdate'),
             localization_s=localization,


[17/18] git commit: [#7656] ticket:648 Add tests for user search

Posted by je...@apache.org.
[#7656] ticket:648 Add tests for user search


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

Branch: refs/heads/je/42cc_7656
Commit: 4f2e6d0aaa64945f05285a77a146173ce8f9ed21
Parents: 83d428f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 16:54:56 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 16:54:56 2014 +0300

----------------------------------------------------------------------
 .../allura/tests/functional/test_site_admin.py  | 58 +++++++++++++++++++-
 Allura/allura/tests/unit/test_solr.py           | 13 ++++-
 2 files changed, 68 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/4f2e6d0a/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 0bb63fe..26a6f8c 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -233,10 +233,11 @@ class TestProjectsSearch(TestController):
     def setUp(self):
         super(TestProjectsSearch, self).setUp()
         # Create project that matches TEST_HIT id
-        p = M.Project.query.get(_id=ObjectId('53ccf6e8100d2b0741746e9f'))
+        _id = ObjectId('53ccf6e8100d2b0741746e9f')
+        p = M.Project.query.get(_id=_id)
         if not p:
             M.Project(
-                _id=ObjectId('53ccf6e8100d2b0741746e9f'),
+                _id=_id,
                 neighborhood_id=M.Neighborhood.query.get(url_prefix='/u/')._id,
                 shortname='test-project',
             )
@@ -263,6 +264,59 @@ class TestProjectsSearch(TestController):
                            'private', 'url', 'Details'])
 
 
+class TestUsersSearch(TestController):
+
+    TEST_HIT = MagicMock(hits=1, docs=[{
+        '_version_': 1478773871277506560,
+        'disabled_b': False,
+        'display_name_t': 'Darth Vader',
+        'id': 'allura/model/auth/User#540efdf2100d2b1483155d39',
+        'last_access_login_date_dt': '2014-09-09T13:17:40.176Z',
+        'last_access_login_ip_s': '10.0.2.2',
+        'last_access_login_ua_t': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36',
+        'last_access_session_date_dt': '2014-09-09T13:17:40.33Z',
+        'last_access_session_ip_s': '10.0.2.2',
+        'last_access_session_ua_t': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36',
+        'last_password_updated_dt': '2014-09-09T13:17:38.857Z',
+        'localization_s': 'None/None',
+        'sex_s': 'Unknown',
+        'title': ['User darth'],
+        'type_s': 'User',
+        'url_s': '/u/darth/',
+        'user_registration_date_dt': '2014-09-09T13:17:38Z',
+        'username_s': 'darth'}])
+
+    def setUp(self):
+        super(TestUsersSearch, self).setUp()
+        # Create user that matches TEST_HIT id
+        _id = ObjectId('540efdf2100d2b1483155d39')
+        u = M.User.query.get(_id=_id)
+        if not u:
+            M.User(_id=_id, username='darth')
+            ThreadLocalORMSession().flush_all()
+
+    @patch('allura.controllers.site_admin.search')
+    def test_default_fields(self, search):
+        search.site_admin_search.return_value = self.TEST_HIT
+        r = self.app.get('/nf/admin/search_users?q=fake&f=username')
+        options = [o['value'] for o in r.html.findAll('option')]
+        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'])
+
+    @patch('allura.controllers.site_admin.search')
+    def test_additional_fields(self, search):
+        search.site_admin_search.return_value = self.TEST_HIT
+        with h.push_config(config, **{'search.user.additional_fields': 'email_addresses, url'}):
+            r = self.app.get('/nf/admin/search_users?q=fake&f=username')
+        options = [o['value'] for o in r.html.findAll('option')]
+        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?', 'email_addresses', 'url', 'Details'])
+
+
 @task
 def test_task(*args, **kw):
     """test_task doc string"""

http://git-wip-us.apache.org/repos/asf/allura/blob/4f2e6d0a/Allura/allura/tests/unit/test_solr.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/unit/test_solr.py b/Allura/allura/tests/unit/test_solr.py
index 8b237cc..dfe71c7 100644
--- a/Allura/allura/tests/unit/test_solr.py
+++ b/Allura/allura/tests/unit/test_solr.py
@@ -94,7 +94,7 @@ class TestSolr(unittest.TestCase):
     @mock.patch('allura.lib.search.search')
     def test_site_admin_search(self, search):
         from allura.lib.search import site_admin_search
-        from allura.model import Project
+        from allura.model import Project, User
         fq = ['type_s:Project']
         site_admin_search(Project, 'test', 'shortname', rows=25)
         search.assert_called_once_with(
@@ -105,6 +105,17 @@ class TestSolr(unittest.TestCase):
         search.assert_called_once_with(
             'shortname_s:test || shortname_s:test2', fq=fq, ignore_errors=False)
 
+        fq = ['type_s:User']
+        search.reset_mock()
+        site_admin_search(User, 'test-user', 'username', rows=25)
+        search.assert_called_once_with(
+            'username_s:"test-user"', fq=fq, ignore_errors=False, rows=25)
+
+        search.reset_mock()
+        site_admin_search(User, 'username:admin1 || username:root', '__custom__')
+        search.assert_called_once_with(
+            'username_s:admin1 || username_s:root', fq=fq, ignore_errors=False)
+
 
 class TestSearchIndexable(unittest.TestCase):
 


[15/18] git commit: [#7656] ticket:648 Format registration date

Posted by je...@apache.org.
[#7656] ticket:648 Format registration date


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

Branch: refs/heads/je/42cc_7656
Commit: e9839782fdc7aed3e250711918ead6853d4c54aa
Parents: db60583
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 16:18:48 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 16:18:48 2014 +0300

----------------------------------------------------------------------
 Allura/allura/templates/site_admin_search_users_results.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/e9839782/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 ce9a8d0..9e986ab 100644
--- a/Allura/allura/templates/site_admin_search_users_results.html
+++ b/Allura/allura/templates/site_admin_search_users_results.html
@@ -15,7 +15,7 @@
   <td><a href="{{ u['url'] }}">{{ u['username'] }}</a></td>
   <td>{{ u['display_name'] }}</td>
   <td>{{ u['object'].get_pref('email_address') }}</td>
-  <td>{{ provider.user_registration_date(u['object']) }}</td>
+  <td>{{ h.ago(provider.user_registration_date(u['object']).replace(tzinfo=None)) }}</td>
   <td>{{ u['disabled'] }}</td>
   {% for field in additional_fields %}
   <td>{{ u[field] }}</td>


[05/18] git commit: [#7589] ticket:622 Fix field types/appearance in the index

Posted by je...@apache.org.
[#7589] ticket:622 Fix field types/appearance in the index


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

Branch: refs/heads/je/42cc_7656
Commit: dd4752b1e7c0b524aea324476c6af9f0dd356a9e
Parents: 88a8e01
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Aug 4 15:19:22 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:25:28 2014 +0300

----------------------------------------------------------------------
 Allura/allura/model/auth.py | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/dd4752b1/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index fb59d0e..43de922 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -288,12 +288,14 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
         localization = '%s/%s' % (
             self.get_pref('localization')['country'],
             self.get_pref('localization')['city'])
+        socialnetworks = ' '.join(['%s: %s' % (n['socialnetwork'], n['accounturl'])
+                                   for n in self.get_pref('socialnetworks')])
         fields = dict(
             id=self.index_id(),
             title='User %s' % self.username,
             type_s=self.type_s,
             username_s=self.username,
-            email_addresses=self.email_addresses,
+            email_addresses_t=' '.join(self.email_addresses),
             last_password_updated_dt=self.last_password_updated,
             disabled_b=self.disabled,
             results_per_page_i=self.get_pref('results_per_page'),
@@ -302,15 +304,20 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
             disable_user_messages_b=self.get_pref('disable_user_messages'),
             display_name_s=self.get_pref('display_name'),
             sex_s=self.get_pref('sex'),
-            birthday_dt=self.get_pref('birthday'),
+            birthdate_dt=self.get_pref('birthdate'),
             localization_s=localization,
             timezone_s=self.get_pref('timezone'),
-            socialnetworks=self.get_pref('socialnetworks'),
-            telnumbers=self.get_pref('telnumbers'),
+            socialnetworks_t=socialnetworks,
+            telnumbers_t=' '.join(self.get_pref('telnumbers')),
             skypeaccount_s=self.get_pref('skypeaccount'),
-            webpages=self.get_pref('webpages'),
-            skills=self.get_skills(),
-            last_access=self.last_access,
+            webpages_t=' '.join(self.get_pref('webpages')),
+            skills_t=' '.join([s['skill'].fullpath for s in self.get_skills()]),
+            last_access_login_date_dt=self.last_access['login_date'],
+            last_access_login_ip_s=self.last_access['login_ip'],
+            last_access_login_ua_t=self.last_access['login_ua'],
+            last_access_session_date_dt=self.last_access['session_date'],
+            last_access_session_ip_s=self.last_access['session_ip'],
+            last_access_session_ua_t=self.last_access['session_ua'],
         )
         return dict(provider.index_user(self), **fields)
 


[06/18] git commit: [#7656] ticket:648 Add initial stubs for user search page

Posted by je...@apache.org.
[#7656] ticket:648 Add initial stubs for user search page


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

Branch: refs/heads/je/42cc_7656
Commit: 23dbb06d25742f28e606b8c116b5ecb3f85eddf3
Parents: d5d2b3f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 12:58:18 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:59:05 2014 +0300

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py         |  9 +++++++
 .../templates/site_admin_search_users.html      | 25 ++++++++++++++++++++
 2 files changed, 34 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/23dbb06d/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 4a96298..bf7076e 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -87,6 +87,7 @@ class SiteAdminController(object):
             SitemapEntry('Task Manager', base_url + 'task_manager?state=busy', ui_icon=g.icons['stats']),
             SitemapEntry('Users Audit Log', base_url + 'users', ui_icon=g.icons['admin']),
             SitemapEntry('Search Projects', base_url + 'search_projects', ui_icon=g.icons['search']),
+            SitemapEntry('Search Users', base_url + 'search_users', ui_icon=g.icons['search']),
         ]
         for ep_name in sorted(g.entry_points['site_admin']):
             g.entry_points['site_admin'][ep_name]().update_sidebar_menu(links)
@@ -341,6 +342,14 @@ class SiteAdminController(object):
             'provider': ProjectRegistrationProvider.get(),
         }
 
+    @without_trailing_slash
+    @expose('jinja:allura:templates/site_admin_search_users.html')
+    @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
+                              limit=validators.Int(if_invalid=None),
+                              page=validators.Int(if_empty=0, if_invalid=0)))
+    def search_users(self, q=None, f=None, page=0, limit=None, **kw):
+        return {}
+
 
 class TaskManagerController(object):
 

http://git-wip-us.apache.org/repos/asf/allura/blob/23dbb06d/Allura/allura/templates/site_admin_search_users.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_users.html b/Allura/allura/templates/site_admin_search_users.html
new file mode 100644
index 0000000..ec18e90
--- /dev/null
+++ b/Allura/allura/templates/site_admin_search_users.html
@@ -0,0 +1,25 @@
+{#-
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-#}
+{% extends 'allura:templates/site_admin.html' %}
+
+{% block title %}Search Users{% endblock %}
+{% block header %}Search Users{% endblock %}
+
+{% block content %}
+{% endblock %}


[07/18] git commit: [#7656] ticket:648 Refactor projects search form to something more generic

Posted by je...@apache.org.
[#7656] ticket:648 Refactor projects search form to something more generic


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

Branch: refs/heads/je/42cc_7656
Commit: 1f3b1a3f8036975706334a135be97b1bf52fd33e
Parents: 23dbb06
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 13:00:11 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 13:00:11 2014 +0300

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py              |  6 ++++--
 Allura/allura/lib/widgets/forms.py                   | 15 +++++++--------
 .../allura/templates/site_admin_search_projects.html |  2 +-
 3 files changed, 12 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/1f3b1a3f/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index bf7076e..5913411 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -54,7 +54,7 @@ class W:
     page_list = ffw.PageList()
     page_size = ffw.PageSize()
     audit = AuditLog()
-    search_projects_form = forms.SearchProjectsForm()
+    admin_search_form = forms.AdminSearchForm
 
 
 class SiteAdminController(object):
@@ -296,7 +296,9 @@ class SiteAdminController(object):
                               limit=validators.Int(if_invalid=None),
                               page=validators.Int(if_empty=0, if_invalid=0)))
     def search_projects(self, q=None, f=None, page=0, limit=None, **kw):
-        c.search_projects_form = W.search_projects_form
+        fields = [('shortname', 'shortname'), ('name', 'full name')]
+        fields.extend(aslist(tg.config.get('search.project.additional_fields'), ','))
+        c.search_form = W.admin_search_form(fields)
         c.page_list = W.page_list
         c.page_size = W.page_size
         count = 0

http://git-wip-us.apache.org/repos/asf/allura/blob/1f3b1a3f/Allura/allura/lib/widgets/forms.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index 794f926..0d25079 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -1081,21 +1081,20 @@ class AwardGrantForm(ForgeForm):
         ]
 
 
-class SearchProjectsForm(ForgeForm):
+class AdminSearchForm(ForgeForm):
     defaults = dict(
         ForgeForm.defaults,
         action='',
         method='get',
         submit_text=None)
 
+    def __init__(self, fields, *args, **kw):
+        super(AdminSearchForm, self).__init__(*args, **kw)
+        self._fields = fields
+
     @property
     def fields(self):
-        add_fields = aslist(tg.config.get('search.project.additional_fields'), ',')
-        search_fields = [
-            ew.Option(py_value='shortname', label='shortname'),
-            ew.Option(py_value='name', label='full name'),
-        ]
-        search_fields.extend([ew.Option(py_value=f, label=f) for f in add_fields])
+        search_fields = [ew.Option(py_value=v, label=l) for v, l in self._fields]
         search_fields.append(ew.Option(py_value='__custom__', label='custom query'))
         return [
             ew.RowField(fields=[
@@ -1114,7 +1113,7 @@ class SearchProjectsForm(ForgeForm):
             ])]
 
     def context_for(self, field):
-        ctx = super(SearchProjectsForm, self).context_for(field)
+        ctx = super(AdminSearchForm, self).context_for(field)
         if field.name is None and not ctx.get('value'):
             # RowField does not pass context down to the children :(
             render_ctx = ew_core.widget_context.render_context

http://git-wip-us.apache.org/repos/asf/allura/blob/1f3b1a3f/Allura/allura/templates/site_admin_search_projects.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_search_projects.html b/Allura/allura/templates/site_admin_search_projects.html
index 73f30eb..a6e6b02 100644
--- a/Allura/allura/templates/site_admin_search_projects.html
+++ b/Allura/allura/templates/site_admin_search_projects.html
@@ -23,7 +23,7 @@
 
 {% block content %}
   <div class="grid-19">
-    {{ c.search_projects_form.display(q=q, f=f) }}
+    {{ c.search_form.display(q=q, f=f) }}
   </div>
 
   {% if projects %}


[18/18] git commit: [#7656] ticket:648 Fix typo

Posted by je...@apache.org.
[#7656] ticket:648 Fix typo


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

Branch: refs/heads/je/42cc_7656
Commit: d7df14a09556d197f65435808f6270152db4ffd1
Parents: 4f2e6d0
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 16:57:58 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 16:57:58 2014 +0300

----------------------------------------------------------------------
 Allura/allura/lib/search.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d7df14a0/Allura/allura/lib/search.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/search.py b/Allura/allura/lib/search.py
index 1c3ba8a..525fab3 100644
--- a/Allura/allura/lib/search.py
+++ b/Allura/allura/lib/search.py
@@ -182,7 +182,7 @@ def site_admin_search(model, q, field, **kw):
 
     Raises SearchError if SOLR returns an error.
     """
-    # first, grab a object and get the fields that it indexes
+    # first, grab an object and get the fields that it indexes
     obj = model.query.find().first()
     if obj is None:
         return  # if there are no objects, we won't find anything


[09/18] git commit: [#7656] ticket:648 Move translate_query to SearchIndexable

Posted by je...@apache.org.
[#7656] ticket:648 Move translate_query to SearchIndexable


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

Branch: refs/heads/je/42cc_7656
Commit: 7a6ccbd90c66e734c4da7f978e8db72131b7ce1c
Parents: d0b3aa2
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 13:15:17 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 13:15:17 2014 +0300

----------------------------------------------------------------------
 Allura/allura/lib/search.py     | 18 ++++++++++++++++++
 Allura/allura/model/artifact.py | 18 ------------------
 Allura/allura/model/project.py  |  5 -----
 3 files changed, 18 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/7a6ccbd9/Allura/allura/lib/search.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/search.py b/Allura/allura/lib/search.py
index 49a3ad5..f4f177a 100644
--- a/Allura/allura/lib/search.py
+++ b/Allura/allura/lib/search.py
@@ -100,6 +100,24 @@ class SearchIndexable(object):
         doc['text'] = jinja2.Markup.escape(text).striptags()
         return doc
 
+    @classmethod
+    def translate_query(cls, q, fields):
+        """Return a translated Solr query (``q``), where generic field
+        identifiers are replaced by the 'strongly typed' versions defined in
+        ``fields``.
+
+        """
+        # Replace longest fields first to avoid problems when field names have
+        # the same suffixes, but different field types. E.g.:
+        # query 'shortname:test' with fields.keys() == ['name_t', 'shortname_s']
+        # will be translated to 'shortname_t:test', which makes no sense
+        fields = sorted(fields.keys(), key=len, reverse=True)
+        for f in fields:
+            if '_' in f:
+                base, typ = f.rsplit('_', 1)
+                q = q.replace(base + ':', f + ':')
+        return q
+
 
 class SearchError(SolrError):
     pass

http://git-wip-us.apache.org/repos/asf/allura/blob/7a6ccbd9/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 2639021..ccb6b42 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -130,24 +130,6 @@ class Artifact(MappedClass, SearchIndexable):
     def attachment_class(cls):
         raise NotImplementedError, 'attachment_class'
 
-    @classmethod
-    def translate_query(cls, q, fields):
-        """Return a translated Solr query (``q``), where generic field
-        identifiers are replaced by the 'strongly typed' versions defined in
-        ``fields``.
-
-        """
-        # Replace longest fields first to avoid problems when field names have
-        # the same suffixes, but different field types. E.g.:
-        # query 'shortname:test' with fields.keys() == ['name_t', 'shortname_s']
-        # will be translated to 'shortname_t:test', which makes no sense
-        fields = sorted(fields.keys(), key=len, reverse=True)
-        for f in fields:
-            if '_' in f:
-                base, typ = f.rsplit('_', 1)
-                q = q.replace(base + ':', f + ':')
-        return q
-
     @LazyProperty
     def ref(self):
         """Return :class:`allura.model.index.ArtifactReference` for this

http://git-wip-us.apache.org/repos/asf/allura/blob/7a6ccbd9/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index ff566c2..e0923a9 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -252,11 +252,6 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
     # transient properties
     notifications_disabled = False
 
-    @classmethod
-    def translate_query(cls, q, fields):
-        from .artifact import Artifact
-        return Artifact.translate_query(q, fields)
-
     @property
     def activity_name(self):
         return self.name


[14/18] git commit: [#7656] ticket:648 Display search results and small fixes

Posted by je...@apache.org.
[#7656] ticket:648 Display search results and small fixes


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

Branch: refs/heads/je/42cc_7656
Commit: db6058380150fd967bbb92e857eb936be99a9025
Parents: 78f3b88
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 15:59:14 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 15:59:14 2014 +0300

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py         |  3 ++-
 Allura/allura/lib/plugin.py                     | 10 ++++++++
 Allura/allura/model/auth.py                     |  3 ++-
 .../site_admin_search_users_results.html        | 24 +++++++++++++++++++-
 4 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/db605838/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 40c69f2..b6fecd7 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -34,7 +34,7 @@ from allura.app import SitemapEntry
 from allura.lib import helpers as h
 from allura.lib import validators as v
 from allura.lib.decorators import require_post
-from allura.lib.plugin import SiteAdminExtension, ProjectRegistrationProvider
+from allura.lib.plugin import SiteAdminExtension, ProjectRegistrationProvider, AuthenticationProvider
 from allura.lib import search
 from allura.lib.security import require_access
 from allura.lib.widgets import form_fields as ffw
@@ -362,6 +362,7 @@ class SiteAdminController(object):
         add_fields = aslist(tg.config.get('search.user.additional_fields'), ',')
         r = self._search(M.User, fields, add_fields, q, f, page, limit, **kw)
         r['search_results_template'] = 'allura:templates/site_admin_search_users_results.html'
+        r['provider'] = AuthenticationProvider.get(request)
         return r
 
 

http://git-wip-us.apache.org/repos/asf/allura/blob/db605838/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index e5a1fc3..17d28be 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -283,6 +283,16 @@ class AuthenticationProvider(object):
         """Put here additional fields for user index in SOLR."""
         return {}
 
+    def details_links(self, user):
+        '''Return list of pairs (url, label) with details
+        about the user.
+        Links will show up at admin user search page.
+        '''
+        return [
+           (user.url(), 'Public profile'),
+           ('/nf/admin/user/%s' % user.username, 'Details/Edit'),
+        ]
+
 
 class LocalAuthenticationProvider(AuthenticationProvider):
 

http://git-wip-us.apache.org/repos/asf/allura/blob/db605838/Allura/allura/model/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index 16ee2e0..77c42c7 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -293,6 +293,7 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
         fields = dict(
             id=self.index_id(),
             title='User %s' % self.username,
+            url_s=self.url(),
             type_s=self.type_s,
             username_s=self.username,
             email_addresses_t=' '.join(self.email_addresses),
@@ -311,7 +312,7 @@ class User(MappedClass, ActivityNode, ActivityObject, SearchIndexable):
             telnumbers_t=' '.join(self.get_pref('telnumbers')),
             skypeaccount_s=self.get_pref('skypeaccount'),
             webpages_t=' '.join(self.get_pref('webpages')),
-            skills_t=' '.join([s['skill'].fullpath for s in self.get_skills()]),
+            skills_t=' '.join([s['skill'].fullpath for s in self.get_skills() if s.get('skill')]),
             last_access_login_date_dt=self.last_access['login_date'],
             last_access_login_ip_s=self.last_access['login_ip'],
             last_access_login_ua_t=self.last_access['login_ua'],

http://git-wip-us.apache.org/repos/asf/allura/blob/db605838/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 b73c5c4..ce9a8d0 100644
--- a/Allura/allura/templates/site_admin_search_users_results.html
+++ b/Allura/allura/templates/site_admin_search_users_results.html
@@ -1,7 +1,29 @@
 <tr>
+  <th>Username</th>
+  <th>Display name</th>
+  <th>Email</th>
+  <th>Registered</th>
+  <th>Disabled?</th>
+  {% for field in additional_fields %}
+  <th>{{ field }}</th>
+  {% endfor %}
+  <th>Details</th>
 </tr>
 
-{% for user in objects %}
+{% for u in objects %}
 <tr>
+  <td><a href="{{ u['url'] }}">{{ u['username'] }}</a></td>
+  <td>{{ u['display_name'] }}</td>
+  <td>{{ u['object'].get_pref('email_address') }}</td>
+  <td>{{ provider.user_registration_date(u['object']) }}</td>
+  <td>{{ u['disabled'] }}</td>
+  {% for field in additional_fields %}
+  <td>{{ u[field] }}</td>
+  {% endfor %}
+  <td>
+    {% for url, label in provider.details_links(u['object']) %}
+      <a href="{{ url }}">{{ label }}</a><br>
+    {% endfor %}
+  </td>
 </tr>
 {% endfor %}


[03/18] git commit: [#7589] ticket:622 Test for User.index()

Posted by je...@apache.org.
[#7589] ticket:622 Test for User.index()


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

Branch: refs/heads/je/42cc_7656
Commit: 7b61cd5340fa466543a0ff2911cdea495becd841
Parents: dd4752b
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Aug 4 15:44:08 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 12:25:28 2014 +0300

----------------------------------------------------------------------
 Allura/allura/tests/model/test_auth.py | 36 +++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/7b61cd53/Allura/allura/tests/model/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_auth.py b/Allura/allura/tests/model/test_auth.py
index 9c5a74c..4660510 100644
--- a/Allura/allura/tests/model/test_auth.py
+++ b/Allura/allura/tests/model/test_auth.py
@@ -277,3 +277,39 @@ def test_user_track_active():
     c.user = M.User.by_username(c.user.username)
     assert_equal(c.user.last_access['session_ip'], 'new addr')
     assert_equal(c.user.last_access['session_ua'], 'new browser')
+
+
+@with_setup(setUp)
+def test_user_index():
+    c.user.email_addresses = ['email1', 'email2']
+    c.user.set_pref('email_address', 'email2')
+    idx = c.user.index()
+    assert_equal(idx['id'], c.user.index_id())
+    assert_equal(idx['title'], 'User test-admin')
+    assert_equal(idx['type_s'], 'User')
+    assert_equal(idx['username_s'], 'test-admin')
+    assert_equal(idx['email_addresses_t'], 'email1 email2')
+    assert_equal(idx['email_address_s'], 'email2')
+    assert_in('last_password_updated_dt', idx)
+    assert_equal(idx['disabled_b'], False)
+    assert_in('results_per_page_i', idx)
+    assert_in('email_format_s', idx)
+    assert_in('disable_user_messages_b', idx)
+    assert_equal(idx['display_name_s'], 'Test Admin')
+    assert_equal(idx['sex_s'], 'Unknown')
+    assert_in('birthdate_dt', idx)
+    assert_in('localization_s', idx)
+    assert_in('timezone_s', idx)
+    assert_in('socialnetworks_t', idx)
+    assert_in('telnumbers_t', idx)
+    assert_in('skypeaccount_s', idx)
+    assert_in('webpages_t', idx)
+    assert_in('skills_t', idx)
+    assert_in('last_access_login_date_dt', idx)
+    assert_in('last_access_login_ip_s', idx)
+    assert_in('last_access_login_ua_t', idx)
+    assert_in('last_access_session_date_dt', idx)
+    assert_in('last_access_session_ip_s', idx)
+    assert_in('last_access_session_ua_t', idx)
+    # provided bby auth provider
+    assert_in('user_registration_date_dt', idx)


[16/18] git commit: [#7656] ticket:648 Fix test failing due to refactoring

Posted by je...@apache.org.
[#7656] ticket:648 Fix test failing due to refactoring


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

Branch: refs/heads/je/42cc_7656
Commit: 83d428f80398459e77fd8500ac6842b1a5b05b27
Parents: e983978
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 16:29:25 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 16:29:25 2014 +0300

----------------------------------------------------------------------
 Allura/allura/tests/functional/test_site_admin.py | 4 ++--
 Allura/allura/tests/model/test_auth.py            | 2 +-
 Allura/allura/tests/unit/test_solr.py             | 9 +++++----
 3 files changed, 8 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/83d428f8/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 ab1ffc4..0bb63fe 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -244,7 +244,7 @@ class TestProjectsSearch(TestController):
 
     @patch('allura.controllers.site_admin.search')
     def test_default_fields(self, search):
-        search.search_projects.return_value = self.TEST_HIT
+        search.site_admin_search.return_value = self.TEST_HIT
         r = self.app.get('/nf/admin/search_projects?q=fake&f=shortname')
         options = [o['value'] for o in r.html.findAll('option')]
         assert_equal(options, ['shortname', 'name', '__custom__'])
@@ -253,7 +253,7 @@ class TestProjectsSearch(TestController):
 
     @patch('allura.controllers.site_admin.search')
     def test_additional_fields(self, search):
-        search.search_projects.return_value = self.TEST_HIT
+        search.site_admin_search.return_value = self.TEST_HIT
         with h.push_config(config, **{'search.project.additional_fields': 'private, url'}):
             r = self.app.get('/nf/admin/search_projects?q=fake&f=shortname')
         options = [o['value'] for o in r.html.findAll('option')]

http://git-wip-us.apache.org/repos/asf/allura/blob/83d428f8/Allura/allura/tests/model/test_auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_auth.py b/Allura/allura/tests/model/test_auth.py
index 4660510..75cf5a2 100644
--- a/Allura/allura/tests/model/test_auth.py
+++ b/Allura/allura/tests/model/test_auth.py
@@ -295,7 +295,7 @@ def test_user_index():
     assert_in('results_per_page_i', idx)
     assert_in('email_format_s', idx)
     assert_in('disable_user_messages_b', idx)
-    assert_equal(idx['display_name_s'], 'Test Admin')
+    assert_equal(idx['display_name_t'], 'Test Admin')
     assert_equal(idx['sex_s'], 'Unknown')
     assert_in('birthdate_dt', idx)
     assert_in('localization_s', idx)

http://git-wip-us.apache.org/repos/asf/allura/blob/83d428f8/Allura/allura/tests/unit/test_solr.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/unit/test_solr.py b/Allura/allura/tests/unit/test_solr.py
index 7e104d1..8b237cc 100644
--- a/Allura/allura/tests/unit/test_solr.py
+++ b/Allura/allura/tests/unit/test_solr.py
@@ -92,15 +92,16 @@ class TestSolr(unittest.TestCase):
         solr.query_server.search.assert_called_once_with('bar', kw='kw')
 
     @mock.patch('allura.lib.search.search')
-    def test_search_projects(self, search):
-        from allura.lib.search import search_projects
+    def test_site_admin_search(self, search):
+        from allura.lib.search import site_admin_search
+        from allura.model import Project
         fq = ['type_s:Project']
-        search_projects('test', 'shortname', rows=25)
+        site_admin_search(Project, 'test', 'shortname', rows=25)
         search.assert_called_once_with(
             'shortname_s:"test"', fq=fq, ignore_errors=False, rows=25)
 
         search.reset_mock()
-        search_projects('shortname:test || shortname:test2', '__custom__')
+        site_admin_search(Project, 'shortname:test || shortname:test2', '__custom__')
         search.assert_called_once_with(
             'shortname_s:test || shortname_s:test2', fq=fq, ignore_errors=False)
 


[08/18] git commit: [#7656] ticket:648 Refactor projects search fn to generic one and add fn for users

Posted by je...@apache.org.
[#7656] ticket:648 Refactor projects search fn to generic one and add fn for users


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

Branch: refs/heads/je/42cc_7656
Commit: d0b3aa2ea13a141760b9af91765eaf110af8d67a
Parents: 1f3b1a3
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Sep 9 13:08:44 2014 +0300
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Sep 9 13:08:44 2014 +0300

----------------------------------------------------------------------
 Allura/allura/lib/search.py | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d0b3aa2e/Allura/allura/lib/search.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/search.py b/Allura/allura/lib/search.py
index c0f45cc..49a3ad5 100644
--- a/Allura/allura/lib/search.py
+++ b/Allura/allura/lib/search.py
@@ -159,26 +159,35 @@ def search_artifact(atype, q, history=False, rows=10, short_timeout=False, filte
     return search(q, fq=fq, rows=rows, short_timeout=short_timeout, ignore_errors=False, **kw)
 
 
-def search_projects(q, field, **kw):
-    """Performs SOLR search for a project.
+def site_admin_search(model, q, field, **kw):
+    """Performs SOLR search for a given model.
+
+    Probably you should not use it directly. Use one of the specific functions below.
 
     Raises SearchError if SOLR returns an error.
     """
-    # first, grab a project and get the fields that it indexes
-    from allura.model import Project
-    p = Project.query.find().first()
-    if p is None:
-        return  # if there are no projects, we won't find anything
-    fields = p.index()
+    # first, grab a object and get the fields that it indexes
+    obj = model.query.find().first()
+    if obj is None:
+        return  # if there are no objects, we won't find anything
+    fields = obj.index()
     if field == '__custom__':
         # custom query -> query as is
-        q = p.translate_query(q, fields)
+        q = obj.translate_query(q, fields)
     else:
         # construct query for a specific selected field
-        q = p.translate_query(u'%s:"%s"' % (field, q), fields)
-    fq = [u'type_s:Project']
+        q = obj.translate_query(u'%s:"%s"' % (field, q), fields)
+    fq = [u'type_s:%s' % model.type_s]
     return search(q, fq=fq, ignore_errors=False, **kw)
 
+def search_projects(q, field, **kw):
+    from allura.model import Project
+    return site_admin_search(Project, q, field, **kw)
+
+def search_users(q, field, **kw):
+    from allura.model import User
+    return site_admin_search(User, q, field, **kw)
+
 
 def search_app(q='', fq=None, app=True, **kw):
     """Helper for app/project search.