diff --git a/src/india_api/internal/inputs/indiadb/client.py b/src/india_api/internal/inputs/indiadb/client.py index ab4b102..2d9e8f1 100644 --- a/src/india_api/internal/inputs/indiadb/client.py +++ b/src/india_api/internal/inputs/indiadb/client.py @@ -1,10 +1,12 @@ """India DB client that conforms to the DatabaseInterface.""" +import os import datetime as dt import pandas as pd import logging from typing import Optional from fastapi import HTTPException from uuid import UUID +import sentry_sdk from pvsite_datamodel import DatabaseConnection from pvsite_datamodel.read import ( @@ -370,6 +372,31 @@ def post_site_generation( ) generation_values_df = pd.DataFrame(generations) + capacity_factor = float(os.getenv("ERROR_GENERATION_CAPACITY_FACTOR", 1.1)) + site = get_site_by_uuid(session=session, site_uuid=site_uuid) + site_capacity_kw = site.capacity_kw + exceeded_capacity = generation_values_df[ + generation_values_df["power_kw"] > site_capacity_kw * capacity_factor + ] + if len(exceeded_capacity) > 0: + # alert Sentry and return 422 validation error + sentry_sdk.capture_message( + f"Error processing generation values. " + f"One (or more) values are larger than {capacity_factor} " + f"times the site capacity of {site_capacity_kw} kWp. " + # f"User: {auth['https://openclimatefix.org/email']}" + f"Site: {site_uuid}" + ) + raise HTTPException( + status_code=422, + detail=( + f"Error processing generation values. " + f"One (or more) values are larger than {capacity_factor} " + f"times the site capacity of {site_capacity_kw} kWp. " + "Please adjust this generation value, the site capacity, " + "or contact quartz.support@openclimatefix.org." + ), + ) insert_generation_values(session, generation_values_df) session.commit() diff --git a/src/india_api/internal/inputs/indiadb/test_indiadb.py b/src/india_api/internal/inputs/indiadb/test_indiadb.py index 7c8e28b..385a34c 100644 --- a/src/india_api/internal/inputs/indiadb/test_indiadb.py +++ b/src/india_api/internal/inputs/indiadb/test_indiadb.py @@ -1,4 +1,5 @@ import logging +from fastapi import HTTPException import pytest from india_api.internal import PredictedPower, ActualPower @@ -105,3 +106,14 @@ def test_post_site_generation(self, client, sites) -> None: generation=[ActualPower(Time=1, PowerKW=1)], email="test@test.com", ) + + def test_post_site_generation_exceding_max_capacity(self, client, sites): + try: + client.post_site_generation( + site_uuid=sites[0].site_uuid, + generation=[ActualPower(Time=1, PowerKW=1000)], + email="test@test.com", + ) + except HTTPException as e: + assert e.status_code == 422 + assert "generation values" in str(e.detail) \ No newline at end of file