Add additional ORM relations and thumbs in API responses

This commit is contained in:
Oliver Traber 2025-05-25 16:49:50 +00:00
parent 791a79249c
commit 4272f2878e
Signed by: Bluemedia
GPG key ID: C0674B105057136C
9 changed files with 37 additions and 6 deletions

View file

@ -25,3 +25,4 @@ class ChargePoint(Base):
connectors = relationship("Connector", cascade="delete, delete-orphan") connectors = relationship("Connector", cascade="delete, delete-orphan")
transactions = relationship("Transaction", cascade="delete, delete-orphan") transactions = relationship("Transaction", cascade="delete, delete-orphan")
variables = relationship("ChargepointVariable", cascade="delete, delete-orphan") variables = relationship("ChargepointVariable", cascade="delete, delete-orphan")
firmware_updates = relationship("FirmwareUpdate", cascade="delete, delete-orphan")

View file

@ -1,5 +1,6 @@
import uuid import uuid
from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String, Text, Uuid from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String, Text, Uuid
from sqlalchemy.orm import relationship
from app.database import Base from app.database import Base
from app.schemas.firmware_update import FirmwareUpdateStatus from app.schemas.firmware_update import FirmwareUpdateStatus
@ -20,3 +21,4 @@ class FirmwareUpdate(Base):
signature = Column(String, nullable=True) signature = Column(String, nullable=True)
chargepoint_id = Column(Uuid, ForeignKey("chargepoints.id"), index=True) chargepoint_id = Column(Uuid, ForeignKey("chargepoints.id"), index=True)
chargepoint = relationship("ChargePoint", back_populates="firmware_updates")

View file

@ -1,5 +1,6 @@
import uuid import uuid
from sqlalchemy import Uuid, Column, DateTime, Enum, Float, ForeignKey, String from sqlalchemy import Uuid, Column, DateTime, Enum, Float, ForeignKey, String
from sqlalchemy.orm import relationship
from app.database import Base from app.database import Base
from app.schemas.meter_value import Measurand, PhaseType from app.schemas.meter_value import Measurand, PhaseType
@ -15,3 +16,4 @@ class MeterValue(Base):
value = Column(Float) value = Column(Float)
transaction_id = Column(String, ForeignKey("transactions.id"), index=True) transaction_id = Column(String, ForeignKey("transactions.id"), index=True)
transaction = relationship("Transaction", back_populates="meter_values")

View file

@ -1,5 +1,6 @@
import uuid import uuid
from sqlalchemy import Column, DateTime, ForeignKey, String, Uuid from sqlalchemy import Column, DateTime, ForeignKey, String, Uuid
from sqlalchemy.orm import relationship
from app.database import Base from app.database import Base
@ -12,3 +13,4 @@ class Session(Base):
last_used = Column(DateTime(timezone=True)) last_used = Column(DateTime(timezone=True))
user_id = Column(Uuid, ForeignKey("users.id"), nullable=False, index=True) user_id = Column(Uuid, ForeignKey("users.id"), nullable=False, index=True)
user = relationship("User", back_populates="sessions")

View file

@ -1,4 +1,5 @@
from sqlalchemy import String, Uuid, Column, DateTime, Enum, Numeric, ForeignKey from sqlalchemy import String, Uuid, Column, DateTime, Enum, Numeric, ForeignKey
from sqlalchemy.orm import relationship
from app.schemas.transaction import TransactionEventTriggerReason, TransactionStatus from app.schemas.transaction import TransactionEventTriggerReason, TransactionStatus
from app.database import Base from app.database import Base
@ -16,4 +17,9 @@ class Transaction(Base):
price = Column(Numeric(10,2)) price = Column(Numeric(10,2))
user_id = Column(Uuid, ForeignKey("users.id"), nullable=True, index=True) user_id = Column(Uuid, ForeignKey("users.id"), nullable=True, index=True)
user = relationship("User", back_populates="transactions")
chargepoint_id = Column(Uuid, ForeignKey("chargepoints.id"), index=True) chargepoint_id = Column(Uuid, ForeignKey("chargepoints.id"), index=True)
chargepoint = relationship("ChargePoint", back_populates="transactions")
meter_values = relationship("MeterValue", cascade="delete, delete-orphan")

View file

@ -17,3 +17,4 @@ class User(Base):
id_tokens = relationship("IdToken", back_populates="owner", cascade="delete, delete-orphan") id_tokens = relationship("IdToken", back_populates="owner", cascade="delete, delete-orphan")
transactions = relationship("Transaction", cascade="delete, delete-orphan") transactions = relationship("Transaction", cascade="delete, delete-orphan")
sessions = relationship("Session", cascade="delete, delete-orphan")

View file

@ -36,6 +36,15 @@ class ChargePoint(ChargePointBase):
from_attributes = True from_attributes = True
json_encoders = {Decimal: decimal_encoder} json_encoders = {Decimal: decimal_encoder}
class ChargePointThumb(BaseModel):
id: UUID
identity: str
price: Decimal
class Config:
from_attributes = True
json_encoders = {Decimal: decimal_encoder}
class ChargePointPassword(BaseModel): class ChargePointPassword(BaseModel):
password: str password: str

View file

@ -1,10 +1,11 @@
import enum
from datetime import datetime from datetime import datetime
from decimal import Decimal from decimal import Decimal
import enum
from typing import Optional from typing import Optional
from uuid import UUID
from pydantic import BaseModel from pydantic import BaseModel
from app.schemas.chargepoint import ChargePointThumb
from app.schemas.user import UserThumb
from app.util.encoders import decimal_encoder from app.util.encoders import decimal_encoder
class TransactionStatus(enum.Enum): class TransactionStatus(enum.Enum):
@ -47,8 +48,8 @@ class Transaction(BaseModel):
meter_end: Optional[Decimal] = None meter_end: Optional[Decimal] = None
end_reason: Optional[TransactionEventTriggerReason] = None end_reason: Optional[TransactionEventTriggerReason] = None
price: Decimal price: Decimal
user_id: Optional[UUID] = None user: UserThumb
chargepoint_id: UUID chargepoint: ChargePointThumb
class Config: class Config:
from_attributes = True from_attributes = True

View file

@ -30,6 +30,13 @@ class User(UserBase):
class Config: class Config:
from_attributes = True from_attributes = True
class UserThumb(BaseModel):
id: UUID
friendly_name: str
class Config:
from_attributes = True
class PasswordUpdate(BaseModel): class PasswordUpdate(BaseModel):
old_password: str = Field(max_length=100) old_password: str = Field(max_length=100)
new_password: str = Field(max_length=100) new_password: str = Field(max_length=100)