From a154cc4f89bbb3f74658e45d9305d0129de78897 Mon Sep 17 00:00:00 2001 From: Nikita Konovalov Date: Tue, 17 Jun 2014 15:36:57 +0400 Subject: [PATCH] Allow GET for Projects by name Both id and name values can be used to get a single Project. The following requests will return the same result GET /api/v1/projects/1 GET /api/v1/projects/Test-Project Note: GET /api/v1/projects?name=Test-Project will return a list of projects filtered with LIKE clause. Change-Id: Ib9058ddb1b3c6e30a2328ac5028e38f055debf02 --- storyboard/api/v1/projects.py | 46 ++++++++++++++++++++++++++++++++--- storyboard/db/api/projects.py | 5 ++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/storyboard/api/v1/projects.py b/storyboard/api/v1/projects.py index e608f828..ca62bedf 100644 --- a/storyboard/api/v1/projects.py +++ b/storyboard/api/v1/projects.py @@ -14,6 +14,8 @@ # limitations under the License. from oslo.config import cfg +from pecan.decorators import expose +from pecan import request from pecan import response from pecan import rest from pecan.secure import secure @@ -64,8 +66,8 @@ class ProjectsController(rest.RestController): """ @secure(checks.guest) - @wsme_pecan.wsexpose(Project, unicode) - def get_one(self, project_id): + @wsme_pecan.wsexpose(Project, int) + def get_one_by_id(self, project_id): """Retrieve information about the given project. :param project_id: project ID. @@ -76,7 +78,23 @@ class ProjectsController(rest.RestController): if project: return Project.from_db_model(project) else: - raise ClientSideError("Project %s not found" % id, + raise ClientSideError("Project %s not found" % project_id, + status_code=404) + + @secure(checks.guest) + @wsme_pecan.wsexpose(Project, unicode) + def get_one_by_name(self, project_name): + """Retrieve information about the given project. + + :param name: project name. + """ + + project = projects_api.project_get_by_name(project_name) + + if project: + return Project.from_db_model(project) + else: + raise ClientSideError("Project %s not found" % project_name, status_code=404) @secure(checks.guest) @@ -144,3 +162,25 @@ class ProjectsController(rest.RestController): else: raise ClientSideError("Project %s not found" % id, status_code=404) + + def _is_int(self, s): + try: + int(s) + return True + except ValueError: + return False + + @expose() + def _route(self, args): + if request.method == 'GET' and len(args) == 1: + # It's a request by a name or id + something = args[0] + if self._is_int(something): + # Get by id + return self.get_one_by_id, args + else: + # Get by name + return self.get_one_by_name, args + + # Use default routing for all other requests + return super(ProjectsController, self)._route(args) diff --git a/storyboard/db/api/projects.py b/storyboard/db/api/projects.py index 6c7b0e33..3dd3441b 100644 --- a/storyboard/db/api/projects.py +++ b/storyboard/db/api/projects.py @@ -21,6 +21,11 @@ def project_get(project_id): return api_base.entity_get(models.Project, project_id) +def project_get_by_name(name): + query = api_base.model_query(models.Project, api_base.get_session()) + return query.filter_by(name=name).first() + + def project_get_all(marker=None, limit=None, sort_field=None, sort_dir=None, **kwargs): return api_base.entity_get_all(models.Project,