Conversation
|
💩 Code linting failed, use |
Coverage Report
Summary
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
💩 Code linting failed, use |
|
https://github.com/profcomff/rental-api/blob/main/rental_backend/models/__init__.py#L5 |
|
💩 Code linting failed, use |
|
💩 Code linting failed, use |
|
💩 Code linting failed, use |
|
Добавил новый файл routes/event/user_event.py, где реализована ручка post event/{event_id}/visit/. Логика ручки:
Также в прошлый раз забыл добавить в calendar_backend/models/init.py класс EventUserStatus. |
|
💩 Code linting failed, use |
|
Closes #119 |
|
|
||
| @router.post("/{event_id}/visit", response_model=VisitResponse) | ||
| async def set_event_visit_status( | ||
| event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) |
| """ | ||
| Отметить посещение мероприятия для текущего пользователя. | ||
| """ | ||
| user_id = auth.get('id') |
| event_id: int | ||
| user_id: int | ||
| status: EventUserStatus | ||
| updated_at: str # ISO-формат |
There was a problem hiding this comment.
поменять на datetime
аналогично ренталу
|
|
||
| if existing: | ||
| existing.status = visit.status | ||
| db.session.flush() |
There was a problem hiding this comment.
работа с бд в отдельном классе BaseDbModel
| try: | ||
| _ = Event.get(event_id, with_deleted=False, session=db.session) | ||
| except ObjectNotFound: | ||
| raise HTTPException( |
There was a problem hiding this comment.
у нас есть прям отдельный класс для ошибки ObjectNotFound, импортирую его из exceptions и используй его
| ) | ||
|
|
||
| try: | ||
| _ = Event.get(event_id, with_deleted=False, session=db.session) |
There was a problem hiding this comment.
необязательно делать присвоение пустой переменной, можно просто сделать ивент.гет
There was a problem hiding this comment.
и кстати посмотри, если не ошибаюсь то сам нет запрос от класса при отсутствии соответствующей переданной переменной сам вызовет 404 ошибку, так что запрос на ошибку ниже вероятно лишний
| ) | ||
|
|
||
| existing = ( | ||
| db.session.query(EventUser) |
|
|
||
| db.session.commit() | ||
|
|
||
| return VisitResponse( |
There was a problem hiding this comment.
лучше делать VisitResponce.model_validate() реализацию можно посмотреть буквально почти во всех ручках рентала или рейтинга
|
|
||
| @router.post("/{event_id}/visit", response_model=VisitResponse) | ||
| async def set_event_visit_status( | ||
| event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) |
There was a problem hiding this comment.
https://github.com/profcomff/rating-api/blob/main/rating_api/routes/comment.py#L205-L208
вот как список реализовать
|
💩 Code linting failed, use |
| async def set_event_visit_status( | ||
| event_id: int, | ||
| auth: dict = Depends(UnionAuth()), | ||
| visit: str = Query(enum=["no_status", "going", "not_going", "attended"], default="no_status"), |
There was a problem hiding this comment.
чисто из логики, attended надо убрать, так как пользователь не должен иметь возможность поставить инфу что посещена пара, нелогично
| """ | ||
| user_id = auth.get('id') | ||
|
|
||
| Event.get(event_id, with_deleted=False, session=db.session) |
There was a problem hiding this comment.
with_deleted=False необязательно прописывать, по умолчанию false
| status=visit, | ||
| ) | ||
|
|
||
| db.session.commit() |
| status: EventUserStatus | ||
|
|
||
|
|
||
| class VisitResponse(BaseModel): |
There was a problem hiding this comment.
наследованные брать от класса Base из соседнего файла Base, там уже прописано model_config = {"from_attributes": True}
| from calendar_backend.models import EventUserStatus | ||
|
|
||
|
|
||
| class VisitRequest(BaseModel): |
| status: EventUserStatus | ||
| updated_at: datetime.datetime | ||
|
|
||
| model_config = {"from_attributes": True} |
Добавил новый класс (таблицу) EventUser для задания событий у пользователя. Каждое событие может обладать следующими статусами:
NO_STATUS (автоматические статус для всех событий),
GOING - статус события, на которое пользователь идет,
NOT_GOING - статус события, на которое пользователь не идет,
ATTENDED - статус события, которое пользователь отметил как GOING и время конца события уже прошло.
Для всех типов статусов также организован класс EventUserStatus.
Создан новый файл миграции. Все проверил, табличка создается.
Closes #121