| Index: appengine/monorail/sitewide/projectsearch.py
|
| diff --git a/appengine/monorail/sitewide/projectsearch.py b/appengine/monorail/sitewide/projectsearch.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ef7b07072e51d10fd995269841c1f9daa600ada5
|
| --- /dev/null
|
| +++ b/appengine/monorail/sitewide/projectsearch.py
|
| @@ -0,0 +1,55 @@
|
| +# Copyright 2016 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is govered 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."""
|
| +
|
| +import logging
|
| +
|
| +from framework import framework_helpers
|
| +from framework import paginate
|
| +from framework import permissions
|
| +
|
| +
|
| +DEFAULT_RESULTS_PER_PAGE = 10
|
| +MAXIMUM_RESULT_PAGES_OFFERED = 10
|
| +
|
| +
|
| +class ProjectSearchPipeline(object):
|
| + """Manage the process of project search, filter, fetch, and pagination."""
|
| +
|
| + def __init__(self, mr, services, prof,
|
| + default_results_per_page=DEFAULT_RESULTS_PER_PAGE):
|
| +
|
| + self.mr = mr
|
| + self.services = services
|
| + self.profiler = prof
|
| + self.default_results_per_page = default_results_per_page
|
| + self.pagination = None
|
| + self.allowed_project_ids = None
|
| + self.visible_results = None
|
| +
|
| + def SearchForIDs(self):
|
| + """Get project IDs the user has permission to view."""
|
| + with self.profiler.Phase('getting user visible projects'):
|
| + self.allowed_project_ids = self.services.project.GetVisibleLiveProjects(
|
| + self.mr.cnxn, self.mr.auth.user_pb, self.mr.auth.effective_ids)
|
| + 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.
|
| + """
|
| + self.pagination = paginate.ArtifactPagination(
|
| + self.mr, self.allowed_project_ids, self.default_results_per_page,
|
| + list_page_url)
|
| + with self.profiler.Phase('getting projects on current pagination page'):
|
| + project_dict = self.services.project.GetProjects(
|
| + cnxn, self.pagination.visible_results)
|
| + self.visible_results = [
|
| + project_dict[pid] for pid in self.pagination.visible_results]
|
| + logging.info('visible_results is %r', self.visible_results)
|
|
|