Example #1
0
def serve(iuid):
    """Return dataset's information (metadata), update it, or delete it.
    The content of the dataset cannot be updated via this resource.
    """
    try:
        dataset = get_dataset(iuid)
    except ValueError as error:
        flask.abort(http.client.NOT_FOUND)

    if utils.http_GET():
        if not allow_view(dataset):
            flask.abort(http.client.FORBIDDEN)
        set_links(dataset)
        return utils.jsonify(dataset,
                             schema=flask.url_for("api_schema.dataset",
                                                  _external=True))

    elif utils.http_POST(csrf=False):
        if not allow_edit(dataset):
            flask.abort(http.client.FORBIDDEN)
        try:
            data = flask.request.get_json()
            with DatasetSaver(dataset) as saver:
                try:
                    saver.set_title(data["title"])
                except KeyError:
                    pass
                try:
                    saver.set_description(data["description"])
                except KeyError:
                    pass
                try:
                    saver.set_public(data["public"])
                except KeyError:
                    pass
                try:
                    saver.set_vega_lite_types(data["meta"])
                except KeyError:
                    pass
        except ValueError as error:
            return str(error), http.client.BAD_REQUEST
        dataset = saver.doc
        set_links(dataset)
        return utils.jsonify(dataset,
                             schema=flask.url_for("api_schema.dataset",
                                                  _external=True))

    elif utils.http_DELETE():
        if not possible_delete(dataset):
            flask.abort(http.client.FORBIDDEN)
        if not allow_delete(dataset):
            flask.abort(http.client.FORBIDDEN)
        flask.g.db.delete(dataset)
        for log in utils.get_logs(dataset["_id"], cleanup=False):
            flask.g.db.delete(log)
        return "", http.client.NO_CONTENT
Example #2
0
def serve(iuid):
    "Return graphic information, update it, or delete it."
    try:
        graphic = get_graphic(iuid)
    except ValueError as error:
        flask.abort(http.client.NOT_FOUND)

    if utils.http_GET():
        if not allow_view(graphic):
            flask.abort(http.client.FORBIDDEN)
        set_links(graphic)
        return utils.jsonify(graphic,
                             schema=flask.url_for("api_schema.graphic",
                                                  _external=True))

    elif utils.http_POST(csrf=False):
        if not allow_edit(graphic):
            flask.abort(http.client.FORBIDDEN)
        try:
            data = flask.request.get_json()
            with GraphicSaver(graphic) as saver:
                try:
                    saver.set_title(data["title"])
                except KeyError:
                    pass
                try:
                    saver.set_description(data["description"])
                except KeyError:
                    pass
                try:
                    saver.set_public(data["public"])
                except KeyError:
                    pass
                try:
                    saver.set_specification(data["specification"])
                except KeyError:
                    pass
        except ValueError as error:
            return str(error), http.client.BAD_REQUEST
        graphic = saver.doc
        set_links(graphic)
        return utils.jsonify(graphic,
                             schema=flask.url_for("api_schema.graphic",
                                                  _external=True))

    elif utils.http_DELETE():
        if not allow_delete(graphic):
            flask.abort(http.client.FORBIDDEN)
        flask.g.db.delete(graphic)
        for log in utils.get_logs(graphic["_id"], cleanup=False):
            flask.g.db.delete(log)
        return "", http.client.NO_CONTENT
Example #3
0
def create():
    "Create a graphic."
    if not flask.g.current_user:
        flask.abort(http.client.FORBIDDEN)
    data = flask.request.get_json()
    try:
        dataset = datagraphics.dataset.get_dataset(data.get("dataset"))
        if not datagraphics.dataset.allow_view(dataset):
            raise ValueError("View access to dataset not allowed.")
        with GraphicSaver() as saver:
            saver.set_title(data.get("title"))
            saver.set_description(data.get("description"))
            saver.set_public(data.get("public"))
            saver.set_dataset(dataset)
            saver.set_specification(data.get("specification"))
    except ValueError as error:
        return str(error), http.client.BAD_REQUEST
    graphic = saver.doc
    graphic["$id"] = flask.url_for("api_graphic.serve",
                                   iuid=graphic["_id"],
                                   _external=True)
    set_links(graphic)
    return utils.jsonify(graphic,
                         schema=flask.url_for("api_schema.graphic",
                                              _external=True))
Example #4
0
def all():
    "Map of all JSON schemas for DataGraphics."
    return utils.jsonify(
        {
            "title": "Map of available JSON schemas.",
            "schemas": {
                "root": {
                    "href": flask.url_for("api_schema.root", _external=True),
                    "title": api_root.schema["title"]
                },
                "about": {
                    "href": flask.url_for("api_schema.about", _external=True),
                    "title": api_about.schema["title"]
                },
                "dataset": {
                    "href": flask.url_for("api_schema.dataset",
                                          _external=True),
                    "title": api_dataset.schema["title"]
                },
                "datasets": {
                    "href": flask.url_for("api_schema.datasets",
                                          _external=True),
                    "title": api_datasets.schema["title"]
                },
                "graphic": {
                    "href": flask.url_for("api_schema.graphic",
                                          _external=True),
                    "title": api_graphic.schema["title"]
                },
                "graphics": {
                    "href": flask.url_for("api_schema.graphics",
                                          _external=True),
                    "title": api_graphics.schema["title"]
                },
                "user": {
                    "href": flask.url_for("api_schema.user", _external=True),
                    "title": api_user.schema["title"]
                },
                "users": {
                    "href": flask.url_for("api_schema.users", _external=True),
                    "title": api_users.schema["title"]
                },
                "schemas": {
                    "href": flask.url_for("api_schema.schemas",
                                          _external=True),
                    "title": schema["title"]
                },
                "logs": {
                    "href": flask.url_for("api_schema.logs", _external=True),
                    "title": logs_schema["title"]
                },
            }
        },
        schema=flask.url_for("api_schema.schemas", _external=True))
Example #5
0
def all():
    "Information about all users."
    if not flask.g.am_admin:
        flask.abort(http.client.FORBIDDEN)
    users = []
    for user in datagraphics.user.get_users():
        users.append({"href": flask.url_for("api_user.serve",
                                            username=user["username"],
                                            _external=True),
                      "username": user["username"]})
    return utils.jsonify({"users": users},
                         schema=flask.url_for("api_schema.users",
                                              _external=True))
Example #6
0
def public():
    "Get all public datasets."
    datasets = []
    for dataset in get_datasets_public(full=True):
        datasets.append({"href": flask.url_for("api_dataset.serve",
                                               iuid=dataset["_id"],
                                               _external=True),
                         "title": dataset["title"],
                         "owner": dataset["owner"],
                         "modified": dataset["modified"]})
    return utils.jsonify({"datasets": datasets},
                         schema=flask.url_for("api_schema.datasets",
                                              _external=True))
Example #7
0
def software():
    "API About: Information about the system software and versions."
    result = {
        "title":
        __doc__,
        "software": [{
            "name": s[0],
            "version": s[1],
            "href": s[2]
        } for s in datagraphics.about.get_software()]
    }
    return utils.jsonify(result,
                         schema=flask.url_for("api_schema.about",
                                              _external=True))
Example #8
0
def editor(username):
    "Get the datasets which the given user is editor of."
    if not datagraphics.user.am_admin_or_self(username=username):
        flask.abort(http.client.FORBIDDEN)
    datasets = []
    for iuid, title, modified in get_datasets_editor(username):
        datasets.append({"href": flask.url_for("api_dataset.serve",
                                               iuid=iuid,
                                               _external=True),
                         "title": title,
                         "modified": modified})
    return utils.jsonify({"datasets": datasets},
                         schema=flask.url_for("api_schema.datasets",
                                              _external=True))
Example #9
0
def serve(username):
    "Information about the given user."
    user = datagraphics.user.get_user(username=username)
    if not user:
        flask.abort(http.client.NOT_FOUND)
    # XXX Use 'allow' function
    if not datagraphics.user.am_admin_or_self(user):
        flask.abort(http.client.FORBIDDEN)
    user.pop("password", None)
    user.pop("apikey", None)
    set_links(user)
    return utils.jsonify(user,
                         schema=flask.url_for("api_schema.user",
                                              _external=True))
Example #10
0
def all():
    "Get all datasets."
    if not flask.g.am_admin:
        flask.abort(http.client.FORBIDDEN)
    datasets = []
    for iuid, title, owner, modified in get_datasets_all():
        datasets.append({"href": flask.url_for("api_dataset.serve",
                                               iuid=iuid,
                                               _external=True),
                         "title": title,
                         "owner": owner,
                         "modified": modified})
    return utils.jsonify({"datasets": datasets},
                         schema=flask.url_for("api_schema.datasets",
                                              _external=True))
Example #11
0
def user(username):
    if not datagraphics.user.am_admin_or_self(username=username):
        flask.abort(http.client.FORBIDDEN)
    graphics = []
    for iuid, title, modified in get_graphics_owner(username):
        graphics.append({
            "href":
            flask.url_for("api_graphic.serve", iuid=iuid, _external=True),
            "title":
            title,
            "modified":
            modified
        })
    return utils.jsonify({"graphics": graphics},
                         schema=flask.url_for("api_schema.graphics",
                                              _external=True))
Example #12
0
def logs(username):
    "Return all log entries for the given user."
    user = datagraphics.user.get_user(username=username)
    if not user:
        flask.abort(http.client.NOT_FOUND)
    # XXX Use 'allow' function
    if not datagraphics.user.am_admin_or_self(user):
        flask.abort(http.client.FORBIDDEN)
    entity = {"type": "user",
              "username": user["username"],
              "href": flask.url_for(".serve",
                                    username=user["username"],
                                    _external=True)}
    return utils.jsonify({"entity": entity,
                          "logs": utils.get_logs(user["_id"])},
                         schema=flask.url_for("api_schema.logs",_external=True))
Example #13
0
def root():
    "API Root; links to other resources."
    items = {
        "version": constants.VERSION,
        "title": __doc__,
        "schemas": {
            "href": flask.url_for("api_schema.all", _external=True)},
        "software": {
            "href": flask.url_for("api_about.software", _external=True)},
        "datasets": {
            "public": 
            {"count": count_datasets_public(),
             "href": flask.url_for("api_datasets.public", _external=True)}},
        "graphics": {
            "public": 
            {"count": count_graphics_public(),
             "href": flask.url_for("api_graphics.public", _external=True)}}
    }
    if flask.g.current_user:
        username = flask.g.current_user["username"]
        items["datasets"]["owner"] = {"count": count_datasets_owner(username),
                                      "href": flask.url_for("api_datasets.user",
                                                            username=username,
                                                            _external=True)}
        items["graphics"]["owner"] = {"count": count_graphics_owner(username),
                                      "href": flask.url_for("api_graphics.user",
                                                            username=username,
                                                            _external=True)}
        items["user"] = {
            "username": flask.g.current_user["username"],
            "href": flask.url_for("api_user.serve",
                                  username=flask.g.current_user["username"],
                                  _external=True)
        }
    if flask.g.am_admin:
        items["datasets"]["all"] = {"count": count_datasets_all(),
                                    "href": flask.url_for("api_datasets.all",
                                                          _external=True)}
        items["graphics"]["all"] = {"count": count_graphics_all(),
                                    "href": flask.url_for("api_graphics.all",
                                                          _external=True)}
        items["users"] = {
            "all": {"href": flask.url_for("api_users.all", _external=True)}
        }
    return utils.jsonify(items, 
                         schema=flask.url_for("api_schema.root",_external=True))
Example #14
0
def public():
    graphics = []
    for graphic in get_graphics_public(full=True):
        graphics.append({
            "href":
            flask.url_for("api_graphic.serve",
                          iuid=graphic["_id"],
                          _external=True),
            "title":
            graphic["title"],
            "owner":
            graphic["owner"],
            "modified":
            graphic["modified"]
        })
    return utils.jsonify({"graphics": graphics},
                         schema=flask.url_for("api_schema.graphics",
                                              _external=True))
Example #15
0
def all():
    if not flask.g.am_admin:
        flask.abort(http.client.FORBIDDEN)
    graphics = []
    for iuid, title, owner, modified in get_graphics_all():
        graphics.append({
            "href":
            flask.url_for("api_graphic.serve", iuid=iuid, _external=True),
            "title":
            title,
            "owner":
            owner,
            "modified":
            modified
        })
    return utils.jsonify({"graphics": graphics},
                         schema=flask.url_for("api_schema.graphics",
                                              _external=True))
Example #16
0
def logs(iuid):
    "Return all log entries for the given dataset."
    try:
        dataset = get_dataset(iuid)
    except ValueError as error:
        flask.abort(http.client.NOT_FOUND)
    if not allow_view(dataset):
        flask.abort(http.client.FORBIDDEN)
    entity = {
        "type": "dataset",
        "iuid": iuid,
        "href": flask.url_for("api_dataset.serve", iuid=iuid, _external=True)
    }
    return utils.jsonify(
        {
            "entity": entity,
            "logs": utils.get_logs(dataset["_id"])
        },
        schema=flask.url_for("api_schema.logs", _external=True))
Example #17
0
def create():
    "Create an empty dataset."
    if not flask.g.current_user:
        flask.abort(http.client.FORBIDDEN)
    data = flask.request.get_json()
    try:
        with DatasetSaver() as saver:
            saver.set_title(data.get("title"))
            saver.set_description(data.get("description"))
            saver.set_public(data.get("public"))
    except ValueError as error:
        return str(error), http.client.BAD_REQUEST
    dataset = saver.doc
    dataset["$id"] = flask.url_for("api_dataset.serve",
                                   iuid=dataset["_id"],
                                   _external=True)
    set_links(dataset)
    return utils.jsonify(dataset,
                         schema=flask.url_for("api_schema.dataset",
                                              _external=True))
Example #18
0
def users():
    "JSON schema for API Users resource."
    return utils.jsonify(api_users.schema, schema=constants.JSON_SCHEMA_URL)
Example #19
0
def dataset():
    "JSON schema for API Dataset resource."
    return utils.jsonify(api_dataset.schema, schema=constants.JSON_SCHEMA_URL)
Example #20
0
def about():
    "JSON schema for API About resource."
    return utils.jsonify(api_about.schema, schema=constants.JSON_SCHEMA_URL)
Example #21
0
def root():
    "JSON schema for API Root resource."
    return utils.jsonify(api_root.schema, schema=constants.JSON_SCHEMA_URL)
Example #22
0
def schemas():
    "JSON schema for API Schema resource."
    return utils.jsonify(schema, schema=constants.JSON_SCHEMA_URL)
Example #23
0
def logs():
    "JSON schema for API Logs resource."
    return utils.jsonify(logs_schema, schema=constants.JSON_SCHEMA_URL)
Example #24
0
def graphics():
    "JSON schema for API Graphics resource."
    return utils.jsonify(api_graphics.schema, schema=constants.JSON_SCHEMA_URL)