from marshmallow import fields, Schema
from flask import request, Flask
from flask_restx import Api, Resource

from flask_accepts import accepts, responds


class WidgetSchema(Schema):
    id = fields.Integer()
    created_at = fields.DateTime()
    foo = fields.String()
    baz = fields.Integer()


def create_app():
    app = Flask(__name__)
    api = Api(app)

    @api.route("/widget")
    class WidgetResource(Resource):
        @accepts("WidgetCreate", schema=WidgetSchema(only=["foo", "baz"]), api=api)
        @responds(schema=WidgetSchema, api=api)
        def post(self):
            # save data to a new record, and return ID
            return request.parsed_obj

        @accepts(dict(name="id", type=int), schema=WidgetSchema, api=api)
        @responds(schema=WidgetSchema(exclude=["created_at"]), api=api)
        def patch(self):
            return request.parsed_obj

    return app


app = create_app()
if __name__ == "__main__":
    app.run(debug=True)