diff --git a/module_build_service/models.py b/module_build_service/models.py index ad63e475..40e5f55c 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -223,6 +223,8 @@ class ModuleBuild(RidaBase): return query.first() def json(self): + from module_build_service.views import api_definition + return { 'id': self.id, 'name': self.name, @@ -231,6 +233,8 @@ class ModuleBuild(RidaBase): 'state': self.state, 'state_name': INVERSE_BUILD_STATES[self.state], 'state_reason': self.state_reason, + 'state_url': '{}{}'.format(api_definition['module_build_query']['url'][0], + self.id), 'scmurl': self.scmurl, 'owner': self.owner, 'time_submitted': self.time_submitted, diff --git a/module_build_service/views.py b/module_build_service/views.py index 6b3a8342..cfc19760 100644 --- a/module_build_service/views.py +++ b/module_build_service/views.py @@ -44,6 +44,28 @@ from module_build_service.errors import ( ValidationError, Unauthorized, UnprocessableEntity, Conflict, NotFound) from multiprocessing.dummy import Pool as ThreadPool +api_definition = { + 'module_build_submit': { + 'url': '/module-build-service/1/module-builds/', + 'options': { + 'methods': ['POST'], + } + }, + 'module_build_list': { + 'url': '/module-build-service/1/module-builds/', + 'options': { + 'defaults': {'id': None}, + 'methods': ['GET'], + } + }, + 'module_build_query': { + 'url': ['/module-build-service/1/module-builds/', ''], + 'options': { + 'methods': ['GET'], + } + }, +} + class ModuleBuildAPI(MethodView): @@ -239,11 +261,7 @@ class ModuleBuildAPI(MethodView): def register_v1_api(): """ Registers version 1 of Rida API. """ module_view = ModuleBuildAPI.as_view('module_builds') - app.add_url_rule('/module-build-service/1/module-builds/', defaults={'id': None}, - view_func=module_view, methods=['GET']) - app.add_url_rule('/module-build-service/1/module-builds/', view_func=module_view, - methods=['POST']) - app.add_url_rule('/module-build-service/1/module-builds/', view_func=module_view, - methods=['GET']) + for val in api_definition.values(): + app.add_url_rule(''.join(val['url']), view_func=module_view, **val['options']) register_v1_api() diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 45788479..60932ece 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -193,6 +193,7 @@ class TestViews(unittest.TestCase): self.assertEquals(data['owner'], 'Homer J. Simpson') self.assertEquals(data['id'], 31) self.assertEquals(data['state_name'], 'wait') + self.assertEquals(data['state_url'], '/module-build-service/1/module-builds/31') @patch('module_build_service.auth.get_username', return_value='Homer J. Simpson') @patch('module_build_service.auth.assert_is_packager')