From fedd84b94f227597eb8a69ef237584d3d916c84c Mon Sep 17 00:00:00 2001 From: Dan Allan Date: Tue, 2 Apr 2024 11:32:29 -0400 Subject: [PATCH] Consistently implement from_orm --- tiled/server/schemas.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/tiled/server/schemas.py b/tiled/server/schemas.py index 848f97059..25be5d531 100644 --- a/tiled/server/schemas.py +++ b/tiled/server/schemas.py @@ -313,6 +313,10 @@ class Identity(pydantic.BaseModel): provider: Annotated[str, StringConstraints(max_length=255)] latest_login: Optional[datetime] = None + @classmethod + def from_orm(cls, orm): + return cls(id=orm.id, provider=orm.provider, latest_login=orm.latest_login) + class Role(pydantic.BaseModel): model_config = pydantic.ConfigDict(from_attributes=True) @@ -320,6 +324,10 @@ class Role(pydantic.BaseModel): scopes: List[str] # principals + @classmethod + def from_orm(cls, orm): + return cls(name=orm.name, scopes=orm.scopes) + class APIKey(pydantic.BaseModel): model_config = pydantic.ConfigDict(from_attributes=True) @@ -329,6 +337,16 @@ class APIKey(pydantic.BaseModel): scopes: List[str] latest_activity: Optional[datetime] = None + @classmethod + def from_orm(cls, orm): + return cls( + first_eight=orm.first_eight, + expiration_time=orm.expiration_time, + note=orm.note, + scopes=orm.scopes, + latest_activity=orm.latest_activity, + ) + class APIKeyWithSecret(APIKey): secret: str # hex-encoded bytes @@ -361,6 +379,12 @@ class Session(pydantic.BaseModel): expiration_time: datetime revoked: bool + @classmethod + def from_orm(cls, orm): + return cls( + uuid=orm.uuid, expiration_time=orm.expiration_time, revoked=orm.revoked + ) + class Principal(pydantic.BaseModel): "Represents a User or Service" @@ -377,9 +401,15 @@ class Principal(pydantic.BaseModel): @classmethod def from_orm(cls, orm, latest_activity=None): - instance = super().from_orm(orm) - instance.latest_activity = latest_activity - return instance + return cls( + uuid=orm.uuid, + type=orm.type, + identities=[Identity.from_orm(id_) for id_ in orm.identities], + roles=[Role.from_orm(id_) for id_ in orm.roles], + api_keys=[APIKey.from_orm(api_key) for api_key in orm.api_keys], + sessions=[Session.from_orm(session) for session in orm.sessions], + latest_activity=latest_activity, + ) class APIKeyRequestParams(pydantic.BaseModel):