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