From 98902776203e0bc97f6c57f4aba14085b2d3df62 Mon Sep 17 00:00:00 2001 From: mprahl Date: Fri, 17 Nov 2017 12:00:33 -0500 Subject: [PATCH] Make "state_url" optional in the "extended_json" function since creating an app context causes SQLAlchemy issues on the backend --- module_build_service/models.py | 27 +++++++++++++++++++++++---- module_build_service/views.py | 8 ++++---- tests/test_views/test_views.py | 1 + 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/module_build_service/models.py b/module_build_service/models.py index fbe1fe51..01075e76 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -399,8 +399,17 @@ class ModuleBuild(MBSBase): 'tasks': self.tasks(), } - def extended_json(self): + def extended_json(self, show_state_url=False): + """ + :kwarg show_state_url: this will determine if `get_url_for` should be run to determine + what the `state_url` is. This should be set to `False` when extended_json is called from + the backend because it forces an app context to be created, which causes issues with + SQLAlchemy sessions. + """ json = self.json() + state_url = None + 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], @@ -411,7 +420,7 @@ class ModuleBuild(MBSBase): 'reason': record.state_reason} for record in self.state_trace(self.id)], - 'state_url': get_url_for('module_build', id=self.id) + 'state_url': state_url }) return json @@ -553,15 +562,25 @@ class ComponentBuild(MBSBase): return retval - def extended_json(self): + def extended_json(self, show_state_url=False): + """ + :kwarg show_state_url: this will determine if `get_url_for` should be run to determine + what the `state_url` is. This should be set to `False` when extended_json is called from + the backend because it forces an app context to be created, which causes issues with + SQLAlchemy sessions. + """ json = self.json() + state_url = None + if show_state_url: + state_url = get_url_for('component_build', id=self.id) json.update({ 'state_trace': [{'time': _utc_datetime_to_iso(record.state_time), 'state': record.state, 'state_name': INVERSE_BUILD_STATES[record.state], 'reason': record.state_reason} for record - in self.state_trace(self.id)] + in self.state_trace(self.id)], + 'state_url': state_url }) return json diff --git a/module_build_service/views.py b/module_build_service/views.py index 3c0f2fb2..bab415ed 100644 --- a/module_build_service/views.py +++ b/module_build_service/views.py @@ -103,7 +103,7 @@ class AbstractQueryableBuildAPI(MethodView): } if verbose_flag == 'true' or verbose_flag == '1': - json_data['items'] = [item.extended_json() for item in p_query.items] + 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] @@ -113,7 +113,7 @@ 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()), 200 + return jsonify(instance.extended_json(True)), 200 else: return jsonify(instance.json()), 200 else: @@ -148,7 +148,7 @@ class ModuleBuildAPI(AbstractQueryableBuildAPI): handler.validate() module = handler.post() - return jsonify(module.extended_json()), 201 + return jsonify(module.extended_json(True)), 201 def patch(self, id): username, groups = module_build_service.auth.get_user(request) @@ -196,7 +196,7 @@ class ModuleBuildAPI(AbstractQueryableBuildAPI): db.session.add(module) db.session.commit() - return jsonify(module.extended_json()), 200 + return jsonify(module.extended_json(True)), 200 class AboutAPI(MethodView): diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 8bd1686e..29b59240 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -324,6 +324,7 @@ class TestViews(unittest.TestCase): self.assertTrue(data['state_trace'][0]['time'] is not None) self.assertEquals(data['state_trace'][0]['state'], 1) self.assertEquals(data['state_trace'][0]['state_name'], 'wait') + self.assertEquals(data['state_url'], '/module-build-service/1/component-builds/3') component_builds_filters = ['tagged', 'ref', 'format']