diff --git a/ensysmod/core/file_upload.py b/ensysmod/core/file_upload.py index 6a06448..a758ddd 100644 --- a/ensysmod/core/file_upload.py +++ b/ensysmod/core/file_upload.py @@ -1,4 +1,5 @@ import json +from io import BytesIO from typing import Any from zipfile import ZipFile @@ -260,8 +261,8 @@ def process_excel_file( def read_excel_file(file: UploadFile | tuple[ZipFile, str]) -> tuple[str, pd.DataFrame]: if isinstance(file, UploadFile): file_path = file.filename if file.filename is not None else "" - content = file.file.read() - df: pd.DataFrame = pd.read_excel(content, engine="openpyxl") + with BytesIO(file.file.read()) as content: + df: pd.DataFrame = pd.read_excel(content, engine="openpyxl") elif isinstance(file, tuple): zip_archive, file_path = file with zip_archive.open(file_path) as content: diff --git a/ensysmod/core/fine_esm.py b/ensysmod/core/fine_esm.py index c501d64..5c13784 100644 --- a/ensysmod/core/fine_esm.py +++ b/ensysmod/core/fine_esm.py @@ -1,3 +1,4 @@ +from contextlib import chdir from pathlib import Path from tempfile import TemporaryDirectory from typing import Any @@ -28,7 +29,7 @@ EnergyStorage, EnergyTransmission, ) -from ensysmod.utils.utils import chdir, create_temp_file, df_or_s +from ensysmod.utils.utils import create_temp_file, df_or_s def generate_esm_from_model(db: Session, model: EnergyModel) -> EnergySystemModel: diff --git a/ensysmod/core/security.py b/ensysmod/core/security.py index b60310f..c09ad69 100644 --- a/ensysmod/core/security.py +++ b/ensysmod/core/security.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any from jose import jwt @@ -12,10 +12,10 @@ def create_access_token(subject: str | Any, expires_delta: timedelta | None = None) -> str: - if expires_delta: - expire = datetime.now(tz=timezone.utc) + expires_delta + if expires_delta is not None: + expire = datetime.now(tz=UTC) + expires_delta else: - expire = datetime.now(tz=timezone.utc) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + expire = datetime.now(tz=UTC) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) to_encode = {"exp": expire, "sub": str(subject)} return jwt.encode(to_encode, settings.SECRET_KEY, algorithm=ALGORITHM) diff --git a/ensysmod/crud/base_depends_excel.py b/ensysmod/crud/base_depends_excel.py index 5381b64..a98a9be 100644 --- a/ensysmod/crud/base_depends_excel.py +++ b/ensysmod/crud/base_depends_excel.py @@ -70,9 +70,9 @@ def get_dataframe(self, db: Session, *, component_id: int) -> pd.DataFrame: dataset_id = crud.energy_component.get(db, id=component_id).ref_dataset region_names = list(db.execute(select(Region.name).where(Region.ref_dataset == dataset_id)).scalars().all()) - dataframe = pd.DataFrame(0, index=region_names, columns=region_names) + dataframe = pd.DataFrame(0, index=region_names, columns=region_names, dtype=float) for d in data: - dataframe[d.region_to.name][d.region.name] = getattr(d, self.data_column) + dataframe.loc[d.region.name, d.region_to.name] = getattr(d, self.data_column) return dataframe # otherwise return dataframe with 1 row and regions as columns diff --git a/ensysmod/utils/utils.py b/ensysmod/utils/utils.py index 30dd13b..c3818a3 100644 --- a/ensysmod/utils/utils.py +++ b/ensysmod/utils/utils.py @@ -1,6 +1,4 @@ import os -from collections.abc import Generator -from contextlib import contextmanager from pathlib import Path from tempfile import mkstemp @@ -21,19 +19,6 @@ def remove_file(file_path: Path) -> None: file_path.unlink() -@contextmanager -def chdir(path: Path | str) -> Generator[None, None, None]: - # In Python 3.11 use contextlib.chdir(). - current_dir = Path.cwd() - try: - os.chdir(path) - yield - finally: - os.chdir(current_dir) - - def df_or_s(df: pd.DataFrame) -> pd.DataFrame | pd.Series: - # Convert a dataframe to a series if it has only one row. - if df.shape[0] == 1: - return df.squeeze(axis=0) - return df + """Convert a dataframe to a series if it has only one row.""" + return df.squeeze(axis=0) if df.shape[0] == 1 else df