Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add edit_site method #180

Merged
merged 3 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 40 additions & 18 deletions pv_site_api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
from fastapi.openapi.utils import get_openapi
from fastapi.responses import FileResponse, Response
from pvlib import irradiance, location, pvsystem
from pvsite_datamodel.pydantic_models import GenerationSum
from pvsite_datamodel.pydantic_models import GenerationSum, PVSiteEditMetadata
from pvsite_datamodel.read.status import get_latest_status
from pvsite_datamodel.read.user import get_user_by_email
from pvsite_datamodel.write.generation import insert_generation_values
from pvsite_datamodel.write.user_and_site import create_site, delete_site
from pvsite_datamodel.write.user_and_site import create_site, delete_site, edit_site
from sqlalchemy.orm import Session

import pv_site_api
Expand Down Expand Up @@ -273,22 +273,44 @@ def post_pv_actual(
session.commit()


# Comment this out, until we have security on this
# # put_site_info: client can update a site
# @app.put("/sites/{site_uuid}")
# def put_site_info(site_info: PVSiteMetadata):
# """
# ### This route allows a user to update site information for a single site.
#
# """
#
# if is_fake():
# print(f"Successfully updated {site_info.model_dump()} for site {site_info.client_site_name
# }")
# print("Not doing anything with it (yet!)")
# return
#
# raise Exception(NotImplemented)
# put_site_info: client can update a site
@app.put("/sites/{site_uuid}")
def put_site_info(
site_uuid: str,
site_info: PVSiteEditMetadata,
session: Session = Depends(get_session),
auth: dict = Depends(auth),
) -> PVSiteMetadata:
"""
### This route allows a user to update site information for a single site.

#### Parameters
- **site_uuid**: The site uuid, for example '8d39a579-8bed-490e-800e-1395a8eb6535'
- **site_info**: The site informations to update.
You can update one or more fields at a time. For example :
{"orientation": 170, "tilt": 35, "module_capacity_kw": 5}
"""

if is_fake():
print(f"Successfully updated {site_info.model_dump()} for site {site_uuid}")
print("Not doing anything with it (yet!)")
site = make_fake_site().site_list[0]
return site

site_exists = does_site_exist(session, site_uuid)

if not site_exists:
raise HTTPException(status_code=404, detail=f"Site with {site_uuid=} does not exist")

# make sure user has access to this site
check_user_has_access_to_site(session=session, auth=auth, site_uuid=site_uuid)

# update site informations
site, message = edit_site(session=session, site_uuid=site_uuid, site_info=site_info)

logger.debug(message)

return site_to_pydantic(site)


@app.post("/sites", status_code=201, response_model=PVSiteMetadata, tags=["Sites"])
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ sentry-sdk = "^1.16.0"
pvlib = "^0.9.5"
structlog = "^22.3.0"
pyjwt = {extras = ["crypto"], version = "^2.6.0"}
pvsite-datamodel = "1.0.19"
geopandas = "^0.14.2"
psutil = "^6.0.0"
pvsite-datamodel = "^1.0.30"

[tool.poetry.group.dev.dependencies]
isort = "^5.12.0"
Expand Down
11 changes: 11 additions & 0 deletions tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import json
from datetime import datetime, timezone

from pvsite_datamodel.pydantic_models import PVSiteEditMetadata

from pv_site_api import __version__
from pv_site_api.pydantic_models import MultiplePVActual, PVActualValue, PVSiteAPIStatus

Expand Down Expand Up @@ -53,3 +55,12 @@ def test_delete_site(client, fake):

assert response.json()["message"] == "Site deleted successfully"
assert response.status_code == 200


def test_put_site_info(client, fake):
info_to_edit = PVSiteEditMetadata(orientation=25)

obj = json.loads(info_to_edit.model_dump_json())

response = client.put("/sites/fff-fff-fff", json=obj)
assert response.status_code == 200
66 changes: 32 additions & 34 deletions tests/test_sites.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,37 +107,35 @@ def test_put_site(db_session, client):
assert sites[1].ml_id == 2


# Comment this out, until we have security on this
# def test_put_site_and_update(db_session):
# pv_site = PVSiteMetadata(
# site_uuid=str(uuid4()),
# client_uuid="eeee-eeee",
# client_site_id="the site id used by the user",
# client_site_name="the site name",
# region="the site's region",
# dno="the site's dno",
# gsp="the site's gsp",
# orientation=180,
# tilt=90,
# latitude=50,
# longitude=0,
# installed_capacity_kw=1,
# created_utc=datetime.now(timezone.utc).isoformat(),
# )
#
# pv_site_dict = json.loads(pv_site.json())
#
# response = client.post(f"sites/", json=pv_site_dict)
# assert response.status_code == 200, response.text
#
# pv_site.orientation = 100
# pv_site_dict = json.loads(pv_site.json())
#
# response = client.put(f"sites/{pv_site.site_uuid}", json=pv_site_dict)
# assert response.status_code == 200, response.text
#
# sites = db_session.query(SiteSQL).all()
# assert len(sites) == 1
# assert sites[0].site_uuid == pv_site.site_uuid
# assert sites[0].orientation == pv_site.orientation
#
def test_put_site_and_update(db_session, client):
pv_site = PVSiteInputMetadata(
client_name="test_client",
client_site_id=1,
client_site_name="the site name",
region="the site's region",
dno="the site's dno",
gsp="the site's gsp",
orientation=180,
tilt=90,
latitude=50,
longitude=0,
inverter_capacity_kw=1,
module_capacity_kw=1.2,
created_utc=datetime.now(timezone.utc).isoformat(),
)

pv_site_dict = json.loads(pv_site.model_dump_json())

response = client.post("sites/", json=pv_site_dict)
assert response.status_code == 201, response.text

pv_site_put = response.json()
site_uuid = pv_site_put["site_uuid"]

response = client.put(f"sites/{site_uuid}", json={"orientation": 120})
assert response.status_code == 200, response.text

sites = db_session.query(SiteSQL).all()
assert len(sites) == 1
assert sites[0].orientation == 120
assert sites[0].tilt == 90