Source code for buildingmotif.api.views.library

from typing import Dict, List

import flask
from flask import Blueprint, current_app, jsonify
from flask_api import status
from rdflib import URIRef
from sqlalchemy.orm.exc import NoResultFound

from buildingmotif.api.serializers.library import serialize
from buildingmotif.dataclasses.shape_collection import ShapeCollection

blueprint = Blueprint("libraries", __name__)

get_shape_query = """
    PREFIX sh: <http://www.w3.org/ns/shacl#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
    SELECT ?shape ?label ?desc
    WHERE {
        ?shape a sh:NodeShape ;
            sh:targetClass|sh:targetSubjectOf|sh:targetObjectsOf|sh:targetNode ?target .
        OPTIONAL { ?shape rdfs:label ?label }
        OPTIONAL { ?shape skos:description ?desc }
    }
"""


[docs]@blueprint.route("", methods=(["GET"])) def get_all_libraries() -> flask.Response: """Get all libraries. :return: all libraries :rtype: flask.Response """ db_libs = current_app.building_motif.table_connection.get_all_db_libraries() return jsonify(serialize(db_libs)), status.HTTP_200_OK
[docs]@blueprint.route("/shapes", methods=(["GET"])) def get_all_shapes() -> flask.Response: """Get all shapes. :return: all shapes :rtype: flask.Response """ definition_types = [ URIRef("https://nrel.gov/BuildingMOTIF#Sequence_Of_Operations"), URIRef("https://nrel.gov/BuildingMOTIF#Analytics_Application"), URIRef("https://nrel.gov/BuildingMOTIF#System_Specification"), ] results: Dict[URIRef, List[Dict]] = {dt: [] for dt in definition_types} db_libs = current_app.building_motif.table_connection.get_all_db_libraries() for db_lib in db_libs: shape_collection = ShapeCollection.load(db_lib.shape_collection.id) for dt in definition_types: results[dt] += [ { "shape_uri": str(shape), "label": label, "library_name": db_lib.name, "shape_collection_id": shape_collection.id, } for (shape, label) in shape_collection.get_shapes_of_definition_type( dt, include_labels=True ) ] return jsonify(results), status.HTTP_200_OK
[docs]@blueprint.route("/<library_id>", methods=(["GET"])) def get_library(library_id: int) -> flask.Response: """Get library by id. :param library_id: library id :type library_id: int :return: requested library :rtype: flask.Response """ try: db_lib = current_app.building_motif.table_connection.get_db_library(library_id) except NoResultFound: return { "message": f"No library with id {library_id}" }, status.HTTP_404_NOT_FOUND return jsonify(serialize(db_lib)), status.HTTP_200_OK