From 7b7a5a28cd85ffcf93d46293b365caae1bf7501f Mon Sep 17 00:00:00 2001 From: rifcrat Date: Wed, 8 Jul 2026 01:32:34 +0300 Subject: [PATCH 1/3] added patch archive handler --- modal_backend/routes/notes.py | 14 ++++++++++++++ modal_backend/schemas/models.py | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/modal_backend/routes/notes.py b/modal_backend/routes/notes.py index 2b04efb..faba646 100644 --- a/modal_backend/routes/notes.py +++ b/modal_backend/routes/notes.py @@ -16,6 +16,7 @@ NoteInfoPost, NoteRatingGet, NoteRatingPost, + NoteStatus, NoteTextGet, NoteTextPost, NotificationGet, @@ -185,3 +186,16 @@ async def create_note_images( session=db.session, type_id=5, **note.model_dump(), admin_id=user.get("id"), status=ModalStatus.ACTIVE ) return NoteImageGet.model_validate(new_note) + + +@note.patch("/{id}/archive", response_model=NoteStatus) +async def update_note_status(id: int, user=Depends(UnionAuth(scopes=["modal.note.patch"]))) -> NoteStatus: + """ + Архивирует модалку + + Права: `["modal.note.patch"]` + + Исключение **ObjectNotFound**, если `id` не найден + """ + note = await NoteService.archive_note(db, id) + return NoteStatus.model_validate(note) diff --git a/modal_backend/schemas/models.py b/modal_backend/schemas/models.py index f10bfaa..2127bf4 100644 --- a/modal_backend/schemas/models.py +++ b/modal_backend/schemas/models.py @@ -119,3 +119,8 @@ class GroupGet(Base): class GroupPost(Base): group_id: int name: str + + +class NoteStatus(Base): + id: int + status: ModalStatus From f6e99988a31434d92ee2210a6fcadd527cb95030 Mon Sep 17 00:00:00 2001 From: rifcrat Date: Sat, 11 Jul 2026 00:26:14 +0300 Subject: [PATCH 2/3] fixes --- modal_backend/routes/notes.py | 7 +++++-- modal_backend/utils/services.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/modal_backend/routes/notes.py b/modal_backend/routes/notes.py index faba646..2e2d2ee 100644 --- a/modal_backend/routes/notes.py +++ b/modal_backend/routes/notes.py @@ -196,6 +196,9 @@ async def update_note_status(id: int, user=Depends(UnionAuth(scopes=["modal.note Права: `["modal.note.patch"]` Исключение **ObjectNotFound**, если `id` не найден + + Исключение **AlreadyExists**, если модалка уже архивирована """ - note = await NoteService.archive_note(db, id) - return NoteStatus.model_validate(note) + Note.get(session=db.session, id=id) + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ARCHIVED) + return NoteStatus.model_validate(updated_note) diff --git a/modal_backend/utils/services.py b/modal_backend/utils/services.py index 82eeeec..a81834f 100644 --- a/modal_backend/utils/services.py +++ b/modal_backend/utils/services.py @@ -41,6 +41,22 @@ async def get_notes_by_filters( return notes +<<<<<<< HEAD +======= + @staticmethod + def validate_note_by_type(note: dict, db: Session): + type_id = note.type_id + note_type = NoteType.query(session=db.session).filter(NoteType.type_id == type_id).one_or_none() + if note_type is None: + raise ObjectNotFound(NoteType, type_id) + + @classmethod + async def create_note(cls, db: Session, note: NotificationPost, admin_id: int) -> Note: + cls.validate_note_by_type(note, db) + new_note = Note.create(session=db.session, **note, admin_id=admin_id, status=ModalStatus.ACTIVE) + return new_note + +>>>>>>> 68f174a (fixes) class NoteTypeService: """ From 7aa6d8ac6749ae12187068703167807bf86dfe09 Mon Sep 17 00:00:00 2001 From: rifcrat Date: Tue, 14 Jul 2026 19:36:34 +0300 Subject: [PATCH 3/3] remake status update handler --- modal_backend/routes/notes.py | 10 ++++----- modal_backend/utils/services.py | 38 +++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/modal_backend/routes/notes.py b/modal_backend/routes/notes.py index 2e2d2ee..b7793bf 100644 --- a/modal_backend/routes/notes.py +++ b/modal_backend/routes/notes.py @@ -188,17 +188,17 @@ async def create_note_images( return NoteImageGet.model_validate(new_note) -@note.patch("/{id}/archive", response_model=NoteStatus) +@note.patch("/{id}/status", response_model=NoteStatus) async def update_note_status(id: int, user=Depends(UnionAuth(scopes=["modal.note.patch"]))) -> NoteStatus: """ - Архивирует модалку + Архивирует модалку, если она активна + + Возвращает модалку в активное состояние, если она в архиве Права: `["modal.note.patch"]` Исключение **ObjectNotFound**, если `id` не найден - Исключение **AlreadyExists**, если модалка уже архивирована """ - Note.get(session=db.session, id=id) - updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ARCHIVED) + updated_note = await NoteService.update_status(db, id=id) return NoteStatus.model_validate(updated_note) diff --git a/modal_backend/utils/services.py b/modal_backend/utils/services.py index a81834f..8717068 100644 --- a/modal_backend/utils/services.py +++ b/modal_backend/utils/services.py @@ -1,7 +1,9 @@ +from datetime import datetime + from requests import Session -from modal_backend.exceptions import AlreadyExists, ObjectNotFound -from modal_backend.models.db import Group, Note, NoteType, Service +from modal_backend.exceptions import AlreadyExists, ForbiddenAction, ObjectNotFound +from modal_backend.models.db import Group, ModalStatus, Note, NoteType, Service from modal_backend.schemas.base import StatusResponseModel from modal_backend.schemas.models import GroupPost, NoteTypePost, ServicePost @@ -41,22 +43,26 @@ async def get_notes_by_filters( return notes -<<<<<<< HEAD -======= - @staticmethod - def validate_note_by_type(note: dict, db: Session): - type_id = note.type_id - note_type = NoteType.query(session=db.session).filter(NoteType.type_id == type_id).one_or_none() - if note_type is None: - raise ObjectNotFound(NoteType, type_id) - @classmethod - async def create_note(cls, db: Session, note: NotificationPost, admin_id: int) -> Note: - cls.validate_note_by_type(note, db) - new_note = Note.create(session=db.session, **note, admin_id=admin_id, status=ModalStatus.ACTIVE) - return new_note + async def update_status(cls, db: Session, id: int) -> Note: + note = Note.get(session=db.session, id=id) + group_ids = note.group_ids + for group_id in group_ids: + Group.get(session=db.session, id=group_id) + service_ids = note.service_ids + for service_id in service_ids: + Service.get(session=db.session, id=service_id) + end_ts = note.end_ts + time = datetime.utcnow() + if note.is_always == False and time >= end_ts: + raise ForbiddenAction(Note) + else: + if note.status == ModalStatus.ACTIVE: + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ARCHIVED) + else: + updated_note = Note.update(id=id, session=db.session, status=ModalStatus.ACTIVE) + return updated_note ->>>>>>> 68f174a (fixes) class NoteTypeService: """