""" Greenery SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2022 Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ import json from flask import Response, request from flask_restful import Resource from city_model_structure.greenery.vegetation import Vegetation from city_model_structure.greenery.soil import Soil from city_model_structure.greenery.plant import Plant import helpers.constants as cte from hub_api.helpers.session_helper import refresh_session class Greenery(Resource): def __init__(self): pass @staticmethod def put(): session = refresh_session(request) if session is None: return Response(json.dumps({'error': 'invalid session'}), status=401) headers = session.headers city = session.city try: session.greenery_percentage = request.json['greenery_percentage'] if session.greenery_percentage == 0: response = {'result': 'succeed'} return Response(json.dumps(response), headers=headers) building_names = request.json['building_names'] vegetation_requested = request.json['vegetation'] vegetation_name = vegetation_requested['vegetation_name'] soil_thickness = vegetation_requested['soil_thickness'] soil_name = vegetation_requested['soil_name'] roughness = vegetation_requested['soil_roughness'] dry_conductivity = vegetation_requested['dry_soil_conductivity'] dry_density = vegetation_requested['dry_soil_density'] dry_specific_heat = vegetation_requested['dry_soil_specific_heat'] thermal_absorptance = vegetation_requested['soil_thermal_absorptance'] solar_absorptance = vegetation_requested['soil_solar_absorptance'] visible_absorptance = vegetation_requested['soil_visible_absorptance'] saturation_volumetric_moisture_content = vegetation_requested['soil_saturation_volumetric_moisture_content'] residual_volumetric_moisture_content = vegetation_requested['soil_residual_volumetric_moisture_content'] soil = Soil(soil_name, roughness, dry_conductivity, dry_density, dry_specific_heat, thermal_absorptance, solar_absorptance, visible_absorptance, saturation_volumetric_moisture_content, residual_volumetric_moisture_content) soil.initial_volumetric_moisture_content = '0.1' plant_percentages = vegetation_requested['plant_percentages'] plants = [] for plant_percentage in plant_percentages: plant_name = plant_percentage['plant_name'] height = plant_percentage['plant_height'] leaf_area_index = plant_percentage['plant_leaf_area_index'] leaf_reflectivity = plant_percentage['plant_leaf_reflectivity'] leaf_emissivity = plant_percentage['plant_leaf_emissivity'] minimal_stomatal_resistance = plant_percentage['plant_minimal_stomatal_resistance'] co2_sequestration = plant_percentage['plant_co2_sequestration'] grows_on_soils = plant_percentage['plant_grows_on'] plant = Plant(plant_name, height, leaf_area_index, leaf_reflectivity, leaf_emissivity, minimal_stomatal_resistance, co2_sequestration, grows_on_soils) plant.percentage = plant_percentage['plant_percentage'] plants.append(plant) vegetation = Vegetation(vegetation_name, soil, soil_thickness, plants) for building_name in building_names: for building in city.buildings: if building.human_readable_name != building_name: continue for internal_zone in building.internal_zones: for thermal_zone in internal_zone.thermal_zones: for thermal_boundary in thermal_zone.thermal_boundaries: if thermal_boundary.type == cte.ROOF: thermal_boundary.vegetation = vegetation response = {'result': 'succeed'} except KeyError as ex: response = {'error': f'Mandatory parameter {ex} is missing'} return Response(json.dumps(response), headers=headers, status=400) return Response(json.dumps(response), headers=headers)