From 3d3fa629b3e7afba67553d25c186852d411437be Mon Sep 17 00:00:00 2001 From: grillazz Date: Sat, 10 Apr 2021 19:20:17 +0200 Subject: [PATCH] move update t0 base class --- the_app/api/stuff.py | 10 +++++----- the_app/models/base.py | 6 +++++- the_app/models/stuff.py | 16 ++++++++-------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/the_app/api/stuff.py b/the_app/api/stuff.py index d9c8d7c..0043a13 100644 --- a/the_app/api/stuff.py +++ b/the_app/api/stuff.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, status +from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from the_app.database import get_db @@ -32,10 +32,10 @@ async def delete_stuff(name: str, db_session: AsyncSession = Depends(get_db)): @router.patch("/", response_model=StuffResponse) async def update_stuff( - stuff: StuffSchema, + payload: StuffSchema, name: str, db_session: AsyncSession = Depends(get_db), ): - stuff_instance = await Stuff.find(db_session, name) - stuff_instance = await stuff_instance.update(db_session, stuff) - return stuff_instance + stuff = await Stuff.find(db_session, name) + await stuff.update(db_session, **payload.dict()) + return stuff diff --git a/the_app/models/base.py b/the_app/models/base.py index 64f4f9e..83bd875 100644 --- a/the_app/models/base.py +++ b/the_app/models/base.py @@ -1,7 +1,6 @@ from typing import Any from fastapi import HTTPException, status -from icecream import ic from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.declarative import as_declarative, declared_attr @@ -30,3 +29,8 @@ class Base: return True except SQLAlchemyError as ex: raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=repr(ex)) + + async def update(self, db_session: AsyncSession, **kwargs): + for k, v in kwargs.items(): + setattr(self, k, v) + await self.save(db_session) diff --git a/the_app/models/stuff.py b/the_app/models/stuff.py index 5b801d6..b7ec3a7 100644 --- a/the_app/models/stuff.py +++ b/the_app/models/stuff.py @@ -1,11 +1,11 @@ import uuid +from fastapi import HTTPException, status from sqlalchemy import Column, String, select from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.ext.asyncio import AsyncSession from the_app.models.base import Base -from the_app.schemas.stuff import StuffSchema class Stuff(Base): @@ -18,14 +18,14 @@ class Stuff(Base): self.name = name self.description = description - async def update(self, db_session: AsyncSession, schema: StuffSchema): - self.name = schema.name - self.description = schema.description - await self.save(db_session) - return self - @classmethod async def find(cls, db_session: AsyncSession, name: str): stmt = select(cls).where(cls.name == name) result = await db_session.execute(stmt) - return result.scalars().first() + if instance := result.scalars().first() is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail={"Record not found": f"There is no record for requested name value : {name}"}, + ) + else: + return instance