Example #1
0
    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)
Example #2
0
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
Example #3
0
    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)
Example #4
0
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)
Example #5
0
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)