def test_create_resource(self): resource = create_resource(MyModel, self.session_handler) req = RequestContainer(body_args=dict(value='blah')) resp = resource.create(req) self.assertEqual(resp.properties['value'], 'blah') id_ = resp.properties['id'] session = self.session_handler.get_session() resp = session.query(MyModel).get(id_) self.assertIsNotNone(resp) self.assertEqual(resp.value, 'blah') retrieved = resource.retrieve( RequestContainer(url_params=dict(id=id_))) self.assertEqual(retrieved.properties['value'], 'blah') retrieved_list = resource.retrieve_list(RequestContainer()) self.assertEqual(len(retrieved_list.related_resources), 1) relatec = retrieved_list.related_resources[0].resource self.assertEqual(len(relatec), 1) updated = resource.update( RequestContainer(url_params=dict(id=id_), body_args=dict(value='new'))) self.assertEqual(updated.properties['value'], 'new') session = self.session_handler.get_session() model = session.query(MyModel).get(id_) self.assertEqual(model.value, 'new') deleted = resource.delete(RequestContainer(url_params=dict(id=id_))) session = self.session_handler.get_session() model = session.query(MyModel).get(id_) self.assertIsNone(model)
def create_app(database_uri): """ Creates a new flask app that exposes the database provided as a ReSTful Application :param str|unicode|sqlalchemy.engine.url.URL database_uri: The database URI in a manner that SQLAlchemy can understand :return: A flask app that exposes a database as a ReSTful API that can be accessed using either the Hal or SIREN protocol :rtype: Flask """ # Create the flask application app = Flask(__name__) # Setup SQLAlchemy to reflect the database engine = create_engine(database_uri) base = automap_base() base.prepare(engine, reflect=True) # Create the ripozo dispatcher and register the response formats dispatcher = FlaskDispatcher(app) dispatcher.register_adapters(adapters.HalAdapter, adapters.SirenAdapter) session_handler = ScopedSessionHandler(engine) # Create and register resources from the sqlalchemy models # We need to pass ``append_slash=True`` due to a quirk in how flask handles routing resources = [create_resource(model, session_handler, append_slash=True) for model in base.classes] dispatcher.register_resources(*resources) return app
def test_create_resource(self): resource = create_resource(MyModel, self.session_handler) req = RequestContainer(body_args=dict(value='blah')) resp = resource.create(req) self.assertEqual(resp.properties['value'], 'blah') id_ = resp.properties['id'] session = self.session_handler.get_session() resp = session.query(MyModel).get(id_) self.assertIsNotNone(resp) self.assertEqual(resp.value, 'blah') retrieved = resource.retrieve(RequestContainer(url_params=dict(id=id_))) self.assertEqual(retrieved.properties['value'], 'blah') retrieved_list = resource.retrieve_list(RequestContainer()) self.assertEqual(len(retrieved_list.related_resources), 1) relatec = retrieved_list.related_resources[0].resource self.assertEqual(len(relatec), 1) updated = resource.update(RequestContainer(url_params=dict(id=id_), body_args=dict(value='new'))) self.assertEqual(updated.properties['value'], 'new') session = self.session_handler.get_session() model = session.query(MyModel).get(id_) self.assertEqual(model.value, 'new') deleted = resource.delete(RequestContainer(url_params=dict(id=id_))) session = self.session_handler.get_session() model = session.query(MyModel).get(id_) self.assertIsNone(model)
class CreateCommentMixin(object): @translate(fields=[IntegerField('id', required=True)], validate=True) @apimethod(route='/create_comment/', methods=['POST']) def create_comment(cls, request): args = request.body_args args['post_id'] = request.get('id') request.body_args = args CommentResource.create(request) return cls.retrieve(request) PostResource = create_resource(Post, session_handler, resource_bases=( restmixins.CRUDL, CreateCommentMixin, ), relationships=(ListRelationship( 'comments', relation='Comment'), )) CommentResource = create_resource(Comment, session_handler, resource_bases=(restmixins.CRUDL, ), relationships=(Relationship( 'post', property_map=dict(post_id='id'), relation='Post'), )) dispatcher = FlaskDispatcher(app, url_prefix='/api') dispatcher.register_resources(PostResource, CommentResource) dispatcher.register_adapters(adapters.SirenAdapter, adapters.HalAdapter)
session_handler = ScopedSessionHandler(engine) class CreateCommentMixin(object): @translate(fields=[IntegerField('id', required=True)], validate=True) @apimethod(route='/create_comment/', methods=['POST']) def create_comment(cls, request): args = request.body_args args['post_id'] = request.get('id') request.body_args = args CommentResource.create(request) return cls.retrieve(request) PostResource = create_resource( Post, session_handler, resource_bases=(restmixins.CRUDL, CreateCommentMixin,), relationships=(ListRelationship('comments', relation='Comment'),) ) CommentResource = create_resource( Comment, session_handler, resource_bases=(restmixins.CRUDL,), relationships=(Relationship('post', property_map=dict(post_id='id'), relation='Post'),) ) dispatcher = FlaskDispatcher(app, url_prefix='/api') dispatcher.register_resources(PostResource, CommentResource) dispatcher.register_adapters(adapters.SirenAdapter, adapters.HalAdapter) def main(): app.run(debug=True)