Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/sitewide/projectsearch.py b/sitewide/projectsearch.py
new file mode 100644
index 0000000..8ef5fee
--- /dev/null
+++ b/sitewide/projectsearch.py
@@ -0,0 +1,63 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://developers.google.com/open-source/licenses/bsd
+
+"""Helper functions and classes used when searching for projects."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import logging
+
+from businesslogic import work_env
+from framework import framework_helpers
+from framework import paginate
+from framework import permissions
+
+
+DEFAULT_RESULTS_PER_PAGE = 100
+
+
+class ProjectSearchPipeline(object):
+  """Manage the process of project search, filter, fetch, and pagination."""
+
+  def __init__(self, mr, services,
+               default_results_per_page=DEFAULT_RESULTS_PER_PAGE):
+
+    self.mr = mr
+    self.services = services
+    self.default_results_per_page = default_results_per_page
+    self.pagination = None
+    self.allowed_project_ids = None
+    self.visible_results = None
+
+  def SearchForIDs(self, domain=None):
+    """Get project IDs the user has permission to view."""
+    with work_env.WorkEnv(self.mr, self.services) as we:
+      self.allowed_project_ids = we.ListProjects(domain=domain)
+      logging.info('allowed_project_ids is %r', self.allowed_project_ids)
+
+  def GetProjectsAndPaginate(self, cnxn, list_page_url):
+    """Paginate the filtered list of project names and retrieve Project PBs.
+
+    Args:
+      cnxn: connection to SQL database.
+      list_page_url: string page URL for prev and next links.
+    """
+    with self.mr.profiler.Phase('getting all projects'):
+      project_dict = self.services.project.GetProjects(
+          cnxn, self.allowed_project_ids)
+      project_list = sorted(
+          project_dict.values(),
+          key=lambda p: p.project_name)
+      logging.info('project_list is %r', project_list)
+
+    url_params = [(name, self.mr.GetParam(name)) for name in
+                  framework_helpers.RECOGNIZED_PARAMS]
+    self.pagination = paginate.ArtifactPagination(
+        project_list,
+        self.mr.GetPositiveIntParam('num', self.default_results_per_page),
+        self.mr.GetPositiveIntParam('start'), self.mr.project_name,
+        list_page_url, url_params=url_params)
+    self.visible_results = self.pagination.visible_results