From d4e444e3e711ec8a640809648dd3fa37cbc44d2d Mon Sep 17 00:00:00 2001 From: guille Date: Mon, 23 Jan 2023 12:29:41 -0500 Subject: [PATCH] Initial simplification --- README.md | 4 +- bootstrap.py | 63 +++++++-------- gamification.py | 62 --------------- hub_api/docs/openapi-specs.yml | 4 +- hub_api/docs/uptime.yml | 0 hub_api/helpers/session_helper.py | 1 + hub_api/lca.py | 128 ------------------------------ hub_api/uptime.py | 4 +- 8 files changed, 38 insertions(+), 228 deletions(-) delete mode 100644 gamification.py create mode 100644 hub_api/docs/uptime.yml delete mode 100644 hub_api/lca.py diff --git a/README.md b/README.md index 455fb7a..6a11b12 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ -# Gamification Service +# CERC API + +Services diff --git a/bootstrap.py b/bootstrap.py index 0f195b6..3a0361a 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -5,37 +5,28 @@ Copyright © 2021 Project Author name guillermo.gutierrezmorote@concordia.ca Project Collaborator name peteryefi@gmail.com """ +import datetime + import flask import yaml +from flasgger import LazyJSONEncoder, Swagger +from flask import Response, jsonify from flask_restful import Api -from hub_api.city_info import CityInfo, City -from hub_api.geometry import Geometry -from hub_api.greenery_catalog import GreeneryCatalogEntries -from hub_api.greenery_catalog import GreeneryCatalogEntry -from hub_api.greenery_catalog import GreeneryCatalogNames -from hub_api.construction_catalog import ConstructionCatalogEntries -from hub_api.construction_catalog import ConstructionCatalogEntry -from hub_api.construction_catalog import ConstructionCatalogNames -from hub_api.usage_catalog import UsageCatalogEntries -from hub_api.usage_catalog import UsageCatalogEntry -from hub_api.usage_catalog import UsageCatalogNames -from hub_api.heat_pump import HeatPump -from hub_api.lca import MaterialLCACatalog -from hub_api.lca import MaterialLCACalculations -from hub_api.construction import Construction -from hub_api.usage import Usage -from hub_api.energy_demand import EnergyDemand +from flask_swagger import swagger + +import hub_api.helpers.session_helper as sh +from hub_api.construction_catalog import ConstructionCatalogEntry, ConstructionCatalogEntries, ConstructionCatalogNames +from hub_api.greenery_catalog import GreeneryCatalogEntry, GreeneryCatalogEntries, GreeneryCatalogNames from hub_api.session import SessionStart, SessionEnd, KeepSessionAlive from hub_api.uptime import Uptime -from hub_api.greenery import Greenery +from hub_api.usage_catalog import UsageCatalogEntry, UsageCatalogEntries, UsageCatalogNames from hub_api.user import User, UserLogin -from flasgger import LazyJSONEncoder, Swagger -app = flask.Flask('gamification') -app.json_encoder = LazyJSONEncoder +sh.begin_time = datetime.datetime.now() +app = flask.Flask('cerc_api') +app.json_provider_class = LazyJSONEncoder api = Api(app) - with open("hub_api/docs/openapi-specs.yml", "r") as stream: swagger_config = { "headers": [], @@ -52,33 +43,37 @@ with open("hub_api/docs/openapi-specs.yml", "r") as stream: "openapi": "3.0.0" } try: - Swagger(app, template=yaml.safe_load(stream), config=swagger_config) + sh.swagger_data = Swagger(app, template=yaml.safe_load(stream), config=swagger_config) except yaml.YAMLError as exc: print(exc) api.add_resource(Uptime, '/v1.4/uptime') -api.add_resource(Geometry, '/v1.4/geometry') + +# Catalogs. api.add_resource(GreeneryCatalogEntry, '/v1.4/greenery-catalog/entry') api.add_resource(GreeneryCatalogEntries, '/v1.4/greenery-catalog/entries') api.add_resource(GreeneryCatalogNames, '/v1.4/greenery-catalog/names') api.add_resource(ConstructionCatalogEntry, '/v1.4/construction-catalog/entry') api.add_resource(ConstructionCatalogEntries, '/v1.4/construction-catalog/entries') api.add_resource(ConstructionCatalogNames, '/v1.4/construction-catalog/names') -api.add_resource(Construction, '/v1.4/construction/') api.add_resource(UsageCatalogEntry, '/v1.4/usage-catalog/entry') api.add_resource(UsageCatalogEntries, '/v1.4/usage-catalog/entries') api.add_resource(UsageCatalogNames, '/v1.4/usage-catalog/names') -api.add_resource(Usage, '/v1.4/usage') -api.add_resource(EnergyDemand, '/v1.4/energy-demand/') -# api.add_resource(LCA, '/v1.4/lca') -api.add_resource(MaterialLCACatalog, '/v1.4/material_lca_catalog/entries/') -api.add_resource(MaterialLCACalculations, '/v1.4/material_lca_catalog/calculations/') -api.add_resource(HeatPump, '/v1.4/heat-pump/') + +# Session api.add_resource(User, '/v1.4/user') api.add_resource(UserLogin, '/v1.4/user/login') api.add_resource(SessionStart, '/v1.4/session/start') api.add_resource(SessionEnd, '/v1.4/session/end') api.add_resource(KeepSessionAlive, '/v1.4/session/keep_alive') -api.add_resource(CityInfo, '/v1.4/city/') -api.add_resource(City, '/v1.4/city') -api.add_resource(Greenery, '/v1.4/greenery') + +@app.route("/v1.4/spec") +def spec(): + + return jsonify(sh.swagger_data.config) + +@app.route("/") +def home(): + return Response(headers={'Access-Control-Allow-Origin': '*'}) + +app.run(port=15789, host="0.0.0.0", debug=True) diff --git a/gamification.py b/gamification.py deleted file mode 100644 index 211fa75..0000000 --- a/gamification.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Main -SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2021 Project Author name guillermo.gutierrezmorote@concordia.ca -Project Collaborator name peteryefi@gmail.com -""" - -from catalog_factories.construction_catalog_factory import ConstructionCatalogFactory -from catalog_factories.greenery_catalog_factory import GreeneryCatalogFactory -from catalog_factories.usage_catalog_factory import UsageCatalogFactory -from imports.construction_factory import ConstructionFactory -from imports.geometry_factory import GeometryFactory -from imports.life_cycle_assessment_factory import LifeCycleAssessment -# from imports.schedules_factory import SchedulesFactory -from imports.usage_factory import UsageFactory -from imports.weather_factory import WeatherFactory -from flask import Response -import hub_api.helpers.session_helper as sh -import datetime -from pathlib import Path -from bootstrap import app - -sh.begin_time = datetime.datetime.now() -# initialize catalogs -sh.greenery_catalog = GreeneryCatalogFactory('nrel').catalog -sh.construction_catalog = ConstructionCatalogFactory('nrel').catalog -sh.usage_catalog = UsageCatalogFactory('comnet').catalog - -# Enrich the city -data_path = (Path(__file__).parent / 'data').resolve() -rihno_path = (Path(data_path / 'dompark.3dm')).resolve() -city = GeometryFactory('rhino', rihno_path).city - -for building in city.buildings: - # Rihno files have no information about the function or the year of construction - building.year_of_construction = 1995 - building.function = 'industry' - building.human_readable_name = "Dompark" - -ConstructionFactory('nrel', city).enrich() -UsageFactory('comnet', city).enrich() -# SchedulesFactory('comnet', city).enrich() -LifeCycleAssessment('material', city).enrich() -LifeCycleAssessment('machine', city).enrich() -LifeCycleAssessment('fuel', city).enrich() -LifeCycleAssessment('vehicle', city).enrich() - -montreal_weather_file = (Path(__file__).parent / './data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw').resolve() -city.climate_file = (data_path / f'{city.climate_reference_city}.cli').resolve() -WeatherFactory('epw', city, file_name=montreal_weather_file).enrich() - -# Rihno files have no information about the building location -city.name = 'Montreal' -city.climate_reference_city = 'Montreal' - - -@app.route("/") -def home(): - return Response(headers={'Access-Control-Allow-Origin': '*'}) - - -app.run(port=15789, host="0.0.0.0", debug=False) diff --git a/hub_api/docs/openapi-specs.yml b/hub_api/docs/openapi-specs.yml index 0eed27a..b467622 100644 --- a/hub_api/docs/openapi-specs.yml +++ b/hub_api/docs/openapi-specs.yml @@ -1,6 +1,6 @@ info: - title: Gamification Swagger - OpenAPI 3.0 - description: NextGen Cities Institute Gamification API + title: CERC API Swagger - OpenAPI 3.0 + description: NextGen Cities Institute API termsOfService: http://swagger.io/terms/ contact: email: peteryefi@gmail.com diff --git a/hub_api/docs/uptime.yml b/hub_api/docs/uptime.yml new file mode 100644 index 0000000..e69de29 diff --git a/hub_api/helpers/session_helper.py b/hub_api/helpers/session_helper.py index 0ebec49..578f7c7 100644 --- a/hub_api/helpers/session_helper.py +++ b/hub_api/helpers/session_helper.py @@ -8,6 +8,7 @@ import datetime sessions = [] begin_time = None +swagger_data = None city = None greenery_catalog = None construction_catalog = None diff --git a/hub_api/lca.py b/hub_api/lca.py deleted file mode 100644 index b4e516a..0000000 --- a/hub_api/lca.py +++ /dev/null @@ -1,128 +0,0 @@ -""" -LCA -SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2021 Project Author name Atiya -Code contributors: Peter Yefi peteryefi@gmail.com -""" -import json -from flask import Response -from flask_restful import Resource -from lca_calculations import LcaCalculations -from itertools import groupby -from operator import itemgetter -from hub_api.helpers.auth import role_required -from hub_api.config import Config -from persistence.models import UserRoles - - - -class MaterialLCACatalog(Resource, Config): - def __init__(self): - super().__init__() - - @staticmethod - def get_lca_value(city, nrel_id = None): - nrel_material = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "14", "15", "16", "18", "20", "21", - "22", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114"] - lca_material = ["12", "32", "21", "25", "11", "20", "40", "27", "29", "28", "19", "40", "41", "25", "32", "32", "32", "21", "41", - "21", "11", "33", "28", "11", "40", "1", "28", "41", "0", "0", "0", "0", "0", ] - keys = ['nrel_material_id', 'lca_material_id'] - material_mapping = [dict(zip(keys, i)) for i in zip(nrel_material, lca_material)] - - if nrel_id is None: - materials_lca = {"material_lca_catalog": []} - for mat in material_mapping: - - if mat["nrel_material_id"] not in ("110", "111", "112", "113", "114"): - for material in city.lca_materials: - if(int(mat["lca_material_id"]) == material.id): - material_lca_catalog = {} - material_lca_catalog['nrel_material_id'] = mat["nrel_material_id"] - material_lca_catalog['embodied_carbon'] = material.embodied_carbon - mat_end_of_life = LcaCalculations(city).end_life_carbon(material.type) - material_lca_catalog['end_of_life_carbon'] = mat_end_of_life - materials_lca["material_lca_catalog"].append(material_lca_catalog) - - else: - material_lca_catalog = {} - material_lca_catalog['nrel_material_id'] = mat["nrel_material_id"] - material_lca_catalog['embodied_carbon'] = 0.0 - material_lca_catalog['end_of_life_carbon'] = 0.0 - materials_lca["material_lca_catalog"].append(material_lca_catalog) - - return materials_lca - - else: - for mat in material_mapping: - if mat["nrel_material_id"] == str(nrel_id): - for material in city.lca_materials: - if (material.id == int(mat["lca_material_id"])): - return material.embodied_carbon, material.id, material.type, material.name, material.density - # return material.embodied_carbon - - @role_required([UserRoles.Admin.value, UserRoles.Hub_Reader.value]) - def get(self, city_id): - city = self.get_city(city_id) - try: - return Response(json.dumps(self.get_lca_value(city)), status=200) - except ValueError: - response = {'err_msg': f'No Catalog Available'} - return Response(json.dumps(response), status=400) - - -class MaterialLCACalculations(Resource, Config): - """ - LCA class - """ - def __init__(self): - super().__init__() - - @role_required([UserRoles.Admin.value, UserRoles.Hub_Reader.value]) - def get(self, city_id): - """ - Auto-method for processing the lca request - :return: lca demand - """ - city = self.get_city(city_id) - - materials_lca = {'Wall': [], 'Ground': [], 'Roof': []} - for building in city.buildings: - for internal_zone in building.internal_zones: - for thermal_zone in internal_zone.thermal_zones: - for thermal_boundary in thermal_zone.thermal_boundaries: - for i, layer in enumerate(thermal_boundary.layers): - material_layers_lca = {} - if layer.material.no_mass == False: - embodied_carbon, mat_id, mat_type, mat_name, mat_density = MaterialLCACatalog.get_lca_value(city, layer.material.id) - material_layers_lca['layer_name'] = f'Layer {i+1}' - material_layers_lca['nrel_material_id'] = layer.material.id - material_layers_lca['lca_material_id'] = mat_id - material_layers_lca['embodied_carbon'] = (layer.thickness * thermal_boundary.opaque_area) * mat_density * embodied_carbon - mat_end_of_life = LcaCalculations(city).end_life_carbon(mat_type) - material_end_of_life = mat_end_of_life * (layer.thickness * thermal_boundary.opaque_area) * mat_density - material_layers_lca['end_of_life_per_layer'] = material_end_of_life - materials_lca[thermal_boundary.type].append(material_layers_lca) - else: - material_layers_lca['layer_name'] = f'Layer {i+1}' - material_layers_lca['nrel_material_id'] = layer.material.id - material_layers_lca['lca_material_id'] = mat_id - material_layers_lca['embodied_carbon'] = (layer.thickness * thermal_boundary.opaque_area) * mat_density * embodied_carbon - material_layers_lca['end_of_life_per_layer'] = 0.0 - materials_lca[thermal_boundary.type].append(material_layers_lca) - - materials_embodied_carbon = {'Wall': [], 'Ground': [], 'Roof': []} - for key, value in materials_lca.items(): - boundary_layers = sorted(value, key=itemgetter('layer_name')) - for b_layer, layer_properties in groupby(boundary_layers, key=itemgetter('layer_name')): - sum_embodied = 0.0 - sum_end_of_life = 0.0 - total_embodied_carbon = {} - for k in layer_properties: - sum_embodied += k["embodied_carbon"] - sum_end_of_life += k["end_of_life_per_layer"] - total_embodied_carbon['layer_name'] = b_layer - total_embodied_carbon['embodied_carbon'] = sum_embodied - total_embodied_carbon['end_of_life_carbon'] = sum_end_of_life - materials_embodied_carbon[key].append(total_embodied_carbon) - - return Response(json.dumps(materials_embodied_carbon), status=200) diff --git a/hub_api/uptime.py b/hub_api/uptime.py index 746012f..52fb302 100644 --- a/hub_api/uptime.py +++ b/hub_api/uptime.py @@ -6,12 +6,14 @@ Copyright © 2022 Project Author name guillermo.gutierrezmorote@concordia.ca import datetime import json + +from flasgger import swag_from from flask import Response from flask_restful import Resource import hub_api.helpers.session_helper as sh - +@swag_from('docs/uptime.yml') class Uptime(Resource): def __init__(self): pass