From 5aef7fed983795d27cf18b3435d8293132549de2 Mon Sep 17 00:00:00 2001 From: Matt Prahl Date: Thu, 22 Sep 2016 13:25:44 +0200 Subject: [PATCH 1/2] Fix whitespace, indentation --- rida/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rida/views.py b/rida/views.py index 14a71038..fa446ab2 100644 --- a/rida/views.py +++ b/rida/views.py @@ -63,7 +63,7 @@ class SubmitBuild(View): raise ValidationError('Missing scmurl') url = r["scmurl"] - if not any(url.startswith(prefix) for prefix in conf.scmurls): + if not any(url.startswith(prefix) for prefix in conf.scmurls): raise Unauthorized("The submitted scmurl is not allowed") yaml = "" @@ -149,7 +149,7 @@ class SubmitBuild(View): db.session.add(module) db.session.commit() logging.info("%s submitted build of %s-%s-%s", username, mmd.name, - mmd.version, mmd.release) + mmd.version, mmd.release) return jsonify(module.json()), 201 class QueryBuilds(View): From 4f629fe64c1846d4b1f0905acec5461d3f5321da Mon Sep 17 00:00:00 2001 From: Matt Prahl Date: Wed, 21 Sep 2016 11:12:55 -0400 Subject: [PATCH 2/2] Use view type better suited for a REST API MethodView maps to REST APIs intuitively, the method names on the class are the same as the handled HTTP methods (just lowercase). --- rida/views.py | 90 ++++++++++++++++++++++----------------------------- 1 file changed, 38 insertions(+), 52 deletions(-) diff --git a/rida/views.py b/rida/views.py index fa446ab2..dab7ab90 100644 --- a/rida/views.py +++ b/rida/views.py @@ -28,7 +28,7 @@ This is the implementation of the orchestrator's public RESTful API. """ from flask import request, jsonify -from flask.views import View +from flask.views import MethodView import json import logging import modulemd @@ -44,10 +44,37 @@ from rida.utils import pagination_metadata, filter_module_builds from rida.errors import ( ValidationError, Unauthorized, UnprocessableEntity, Conflict, NotFound) -class SubmitBuild(View): - """Handles new module build submissions.""" - def dispatch_request(self): +class ModuleBuildAPI(MethodView): + + def get(self, id): + if id is None: + # Lists all tracked module builds + p_query = filter_module_builds(request) + + json_data = { + 'meta': pagination_metadata(p_query) + } + + verbose_flag = request.args.get('verbose', 'false') + + if verbose_flag.lower() == 'true' or verbose_flag == '1': + json_data['items'] = [item.api_json() for item in p_query.items] + else: + json_data['items'] = [{'id': item.id, 'state': item.state} for + item in p_query.items] + + return jsonify(json_data), 200 + else: + # Lists details for the specified module builds + module = models.ModuleBuild.query.filter_by(id=id).first() + + if module: + return jsonify(module.api_json()), 200 + else: + raise NotFound('No such module found.') + + def post(self): username = rida.auth.get_username(request.environ) rida.auth.assert_is_packager(username, fas_kwargs=dict( base_url=conf.fas_url, @@ -152,56 +179,15 @@ class SubmitBuild(View): mmd.version, mmd.release) return jsonify(module.json()), 201 -class QueryBuilds(View): - """Lists all tracked module builds.""" - - def dispatch_builds_request(self): - """Lists all tracked module builds.""" - p_query = filter_module_builds(request) - - json_data = { - 'meta': pagination_metadata(p_query) - } - - verbose_flag = request.args.get('verbose', 'false') - - if verbose_flag.lower() == 'true' or verbose_flag == '1': - json_data['items'] = [item.api_json() for item in p_query.items] - else: - json_data['items'] = [{'id': item.id, 'state': item.state} for item in p_query.items] - - return jsonify(json_data), 200 - - def dispatch_build_request(self, id): - """Lists details for the specified module builds.""" - - module = models.ModuleBuild.query.filter_by(id=id).first() - - if module: - return jsonify(module.api_json()), 200 - else: - raise NotFound('No such module found.') - - def dispatch_request(self, id): - if id is None: - return self.dispatch_builds_request() - else: - return self.dispatch_build_request(id) def register_v1_api(): """ Registers version 1 of Rida API. """ - - query_builds = QueryBuilds.as_view("query-builds") - module_builds = SubmitBuild.as_view("module-builds") - - app.add_url_rule('/rida/1/module-builds/', - view_func=module_builds, - methods=['POST']) - app.add_url_rule('/rida/1/module-builds/', - defaults={'id': None}, view_func=query_builds, - methods=['GET']) - app.add_url_rule('/rida/1/module-builds/', - view_func=query_builds, - methods=['GET']) + module_view = ModuleBuildAPI.as_view('module_builds') + app.add_url_rule('/rida/1/module-builds/', defaults={'id': None}, + view_func=module_view, methods=['GET']) + app.add_url_rule('/rida/1/module-builds/', view_func=module_view, + methods=['POST']) + app.add_url_rule('/rida/1/module-builds/', view_func=module_view, + methods=['GET']) register_v1_api()