diff --git a/app/api/v1/endpoints/events.py b/app/api/v1/endpoints/events.py index 535f48e..afbd651 100644 --- a/app/api/v1/endpoints/events.py +++ b/app/api/v1/endpoints/events.py @@ -3,7 +3,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Body from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.crud.event import event -from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail +from app.schemas.event import EventList, EventDetail, EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto from app.util.httpResponse import BaseResponse import datetime @@ -73,23 +73,23 @@ async def get_event_detail( # raise HTTPException(status_code=404, detail="事件不存在") # return EventDetail.model_validate(event_obj) -# @router.put("/events/{event_id}", response_model=EventDetail) -# async def update_event( -# event_id: str, -# event_in: EventUpdate, -# db: AsyncSession = Depends(get_db) -# ): -# """ -# 更新事件信息 -# """ -# event_obj = await event.update_event( -# db, -# event_id=event_id, -# obj_in=event_in -# ) -# if not event_obj: -# raise HTTPException(status_code=404, detail="事件不存在") -# return EventDetail.model_validate(event_obj) +@router.put("/events/{event_id}", response_model=BaseResponse) +async def update_event( + event_id: str, + event_in: EditTemperatureDto, + db: AsyncSession = Depends(get_db) +): + """ + 更新事件信息 + """ + event_obj = await event.update_event( + db, + event_id=event_id, + obj_in=event_in + ) + if not event_obj: + raise BaseResponse(code=404, msg="事件不存在") + return BaseResponse(code=200, msg="success") @router.delete("/events/{event_id}", response_model=BaseResponse[EventDetail]) async def delete_event( diff --git a/app/crud/event.py b/app/crud/event.py index 2ce7c7a..e6f4372 100644 --- a/app/crud/event.py +++ b/app/crud/event.py @@ -1,10 +1,12 @@ from typing import List, Optional, Dict, Any -from sqlalchemy import select, and_, or_ +from sqlalchemy import select, and_, or_, update from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.crud.base import CRUDBase from app.models.models import Event, Image, Temperature -from app.schemas.event import EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail +from app.schemas.event import EventUpdate, EventQuery, BackStageEvent, BackStageEventDto, BackStageEventDetail, EditTemperatureDto + +from pydantic import VERSION as PYDANTIC_VERSION class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]): async def get_by_id(self, db: AsyncSession, *, event_id: str) -> Optional[Event]: @@ -48,13 +50,13 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]): conditions = [] - if query.eventId is not None: + if query.eventId is not None and len(query.eventId) > 0: conditions.append(Event.eventId==query.eventId) - if query.number is not None: + if query.number is not None and len(query.number) > 0: conditions.append(Event.number == query.number) - if query.name is not None: + if query.name is not None and len(query.name) > 0: conditions.append(Event.name == query.name) - if query.status is not None: + if query.status is not None and len(query.status) > 0: conditions.append(Temperature.status == query.status) if query.start_time is not None: conditions.append(Temperature.createTime >= query.start_time) @@ -126,21 +128,49 @@ class CRUDEvent(CRUDBase[Event, EventUpdate, EventUpdate]): db: AsyncSession, *, event_id: str, - obj_in: EventUpdate + obj_in: EditTemperatureDto ) -> Optional[Event]: """更新事件信息""" - event = await self.get_by_id(db, event_id=event_id) - if not event: - return None + + dict_values = dict() + + if PYDANTIC_VERSION.startswith("2."): + field_names = list(EditTemperatureDto.model_fields.keys()) + else: + field_names = list(EditTemperatureDto.__fields__.keys()) + + for key in field_names: - update_data = obj_in.model_dump() - for field, value in update_data.items(): - setattr(event, field, value) + value = getattr(obj_in, key) + if value is not None: + dict_values[key] = value + + # if obj_in.status is not None: + try: + update_stmt = ( + update(Temperature).where(Temperature.eventId == event_id).values(**dict_values) + ) - # db.add(event) - await db.commit() - await db.refresh(event) - return event + await db.execute(update_stmt) + await db.commit() + + return True + except: + return False + + + # event = await self.get_by_id(db, event_id=event_id) + # if not event: + # return None + + # update_data = obj_in.model_dump() + # for field, value in update_data.items(): + # setattr(event, field, value) + + # # db.add(event) + # await db.commit() + # await db.refresh(event) + # return event async def delete_event( self, diff --git a/app/schemas/event.py b/app/schemas/event.py index 1becc80..77e26b4 100644 --- a/app/schemas/event.py +++ b/app/schemas/event.py @@ -127,6 +127,11 @@ class BackStageEventDto(BaseModel): skip: int = 0 limit: int = 100 +class EditTemperatureDto(BaseModel): + + status: Optional[str] = None + temperature: Optional[str] = None + # 后台查看事件详情 class BackStageEventDetail(BaseModel): eventId:str = None