Resource Examples ================= URL construction ^^^^^^^^^^^^^^^^ .. testcode:: basic_url from ripozo import ResourceBase class MyResource(ResourceBase): pks = ['id'] .. doctest:: basic_url >>> print(MyResource.base_url) /my_resource/ >>> resource = MyResource(properties={'id': 1}) >>> print(resource.url) /my_resource/1 URL construction 2 ^^^^^^^^^^^^^^^^^^ .. testcode:: url2 from ripozo import ResourceBase class MyResource(ResourceBase): namespace = '/api' pks = ['id'] resource_name = 'resource/' .. doctest:: url2 >>> print(MyResource.base_url) /api/resource/ >>> resource = MyResource(properties={'id': 1}) >>> print(resource.url) /api/resource/1 Minimal Request ^^^^^^^^^^^^^^^ .. testcode:: minimal from ripozo import RequestContainer, ResourceBase, apimethod class MyResource(ResourceBase): namespace = '/api' pks = ['id'] resource_name = 'resource' @apimethod(methods=['GET']) def hello_world(cls, request): id = request.url_params['id'] return cls(properties={'id': id, 'hello': 'world'}) .. doctest:: minimal >>> request = RequestContainer(url_params={'id': 2}) >>> resource = MyResource.hello_world(request) >>> print(resource.url) /api/resource/2 >>> resource.properties {'id': 2, 'hello': 'world'} Using Fields ^^^^^^^^^^^^ .. testcode:: fields from ripozo import apimethod, translate, fields, ResourceBase class MyResource(ResourceBase): namespace = '/api' pks = ['id'] resource_name = 'resource' @apimethod(methods=['GET']) @translate(fields=[fields.IntegerField('id', required=True)], validate=True) def hello_world(cls, request): id = request.url_params['id'] return cls(properties={'id': id, 'hello': 'world'}) .. doctest:: fields :options: IGNORE_EXCEPTION_DETAIL >>> from ripozo import RequestContainer >>> request = RequestContainer() >>> resource = MyResource.hello_world(request) Traceback (most recent call last): ... ValidationException: The field "id" is required and cannot be None Relationships ^^^^^^^^^^^^^ .. testcode:: relationship from ripozo import apimethod, translate, fields, ResourceBase, Relationship class MyResource(ResourceBase): namespace = '/api' pks = ['id'] resource_name = 'resource' _relationships = [ Relationship('related', relation='RelatedResource') ] @apimethod(methods=['GET']) @translate(fields=[fields.IntegerField('id', required=True)], validate=True) def hello_world(cls, request): id = request.url_params['id'] return cls(properties={'id': id, 'hello': 'world'}) class RelatedResource(ResourceBase): pks = ['pk'] .. doctest:: relationship >>> properties = dict(id=1, related=dict(pk=2)) >>> resource = MyResource(properties=properties) >>> resource.properties {'id': 1} >>> print(resource.related_resources[0].name) related >>> related_resource = resource.related_resources[0].resource >>> related_resource.properties {'pk': 2} >>> print(related_resource.url) /related_resource/2