From 0e7dd2dad31135e89a311d76f0b65353f9e7ce9d Mon Sep 17 00:00:00 2001 From: mprahl Date: Fri, 17 Nov 2017 12:39:43 -0500 Subject: [PATCH] Add a "short" query parameter to show less detail on the "module-builds" API --- module_build_service/models.py | 15 ++++++++++----- module_build_service/views.py | 22 ++++++++++++++++------ tests/test_views/test_views.py | 24 ++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/module_build_service/models.py b/module_build_service/models.py index f753f42b..c6438587 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -383,16 +383,21 @@ class ModuleBuild(MBSBase): return query.first() - def json(self): + def short_json(self): return { 'id': self.id, 'state': self.state, 'state_name': INVERSE_BUILD_STATES[self.state], - 'state_reason': self.state_reason, 'stream': self.stream, 'version': self.version, - 'owner': self.owner, 'name': self.name, + } + + def json(self): + json = self.short_json() + json.update({ + 'state_reason': self.state_reason, + 'owner': self.owner, 'rebuild_strategy': self.rebuild_strategy, 'scmurl': self.scmurl, 'time_submitted': _utc_datetime_to_iso(self.time_submitted), @@ -400,7 +405,8 @@ class ModuleBuild(MBSBase): 'time_completed': _utc_datetime_to_iso(self.time_completed), 'koji_tag': self.koji_tag, 'tasks': self.tasks(), - } + }) + return json def extended_json(self, show_state_url=False): """ @@ -414,7 +420,6 @@ class ModuleBuild(MBSBase): if show_state_url: state_url = get_url_for('module_build', id=self.id) json.update({ - # TODO, show their entire .json() ? 'component_builds': [build.id for build in self.component_builds], 'modulemd': self.modulemd, 'state_trace': [{'time': _utc_datetime_to_iso(record.state_time), diff --git a/module_build_service/views.py b/module_build_service/views.py index bab415ed..a0213dd6 100644 --- a/module_build_service/views.py +++ b/module_build_service/views.py @@ -93,6 +93,9 @@ class AbstractQueryableBuildAPI(MethodView): @cors_header() def get(self, id): verbose_flag = request.args.get('verbose', 'false').lower() + short_flag = request.args.get('short', 'false').lower() + json_func_kwargs = {} + json_func_name = 'json' if id is None: # Lists all tracked builds @@ -103,9 +106,13 @@ class AbstractQueryableBuildAPI(MethodView): } if verbose_flag == 'true' or verbose_flag == '1': - json_data['items'] = [item.extended_json(True) for item in p_query.items] - else: - json_data['items'] = [item.json() for item in p_query.items] + json_func_name = 'extended_json' + json_func_kwargs['show_state_url'] = True + elif short_flag == 'true' or short_flag == '1': + if hasattr(p_query.items[0], 'short_json'): + json_func_name = 'short_json' + json_data['items'] = [getattr(item, json_func_name)(**json_func_kwargs) + for item in p_query.items] return jsonify(json_data), 200 else: @@ -113,9 +120,12 @@ class AbstractQueryableBuildAPI(MethodView): instance = self.model.query.filter_by(id=id).first() if instance: if verbose_flag == 'true' or verbose_flag == '1': - return jsonify(instance.extended_json(True)), 200 - else: - return jsonify(instance.json()), 200 + json_func_name = 'extended_json' + json_func_kwargs['show_state_url'] = True + elif short_flag == 'true' or short_flag == '1': + if getattr(instance, 'short_json', None): + json_func_name = 'short_json' + return jsonify(getattr(instance, json_func_name)(**json_func_kwargs)), 200 else: raise NotFound('No such %s found.' % self.kind) diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 29b59240..e60c7dae 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -132,6 +132,7 @@ class TestViews(unittest.TestCase): self.assertEquals(data['id'], 1) self.assertEquals(data['name'], 'nginx') self.assertEquals(data['owner'], 'Moe Szyslak') + self.assertEquals(data['stream'], '1') self.assertEquals(data['state'], 3) self.assertEquals(data['state_reason'], None) self.assertDictEqual(data['tasks'], { @@ -154,6 +155,17 @@ class TestViews(unittest.TestCase): self.assertEquals(data['time_modified'], '2016-09-03T11:25:32Z') self.assertEquals(data['time_submitted'], '2016-09-03T11:23:20Z') self.assertEqual(data['rebuild_strategy'], 'changed-and-after') + self.assertEquals(data['version'], '2') + + def test_query_build_short(self): + rv = self.client.get('/module-build-service/1/module-builds/1?short=True') + data = json.loads(rv.data) + self.assertEquals(data['id'], 1) + self.assertEquals(data['name'], 'nginx') + self.assertEquals(data['state'], 3) + self.assertEquals(data['state_name'], 'done') + self.assertEquals(data['stream'], '1') + self.assertEquals(data['version'], '2') def test_query_build_with_verbose_mode(self): rv = self.client.get('/module-build-service/1/module-builds/1?verbose=true') @@ -309,6 +321,18 @@ class TestViews(unittest.TestCase): self.assertEquals(data['state_reason'], None) self.assertEquals(data['task_id'], 12312345) + def test_query_component_build_short(self): + rv = self.client.get('/module-build-service/1/component-builds/1?short=True') + data = json.loads(rv.data) + self.assertEquals(data['id'], 1) + self.assertEquals(data['format'], 'rpms') + self.assertEquals(data['module_build'], 1) + self.assertEquals(data['package'], 'nginx') + self.assertEquals(data['state'], 1) + self.assertEquals(data['state_name'], 'COMPLETE') + self.assertEquals(data['state_reason'], None) + self.assertEquals(data['task_id'], 12312345) + def test_query_component_build_verbose(self): rv = self.client.get('/module-build-service/1/component-builds/3?verbose=true') data = json.loads(rv.data)