From 35ad55b601430f15204f43bb4dca85d7a3b213ee Mon Sep 17 00:00:00 2001 From: Georgon Date: Mon, 20 Apr 2026 16:32:19 +0300 Subject: [PATCH 01/13] EventUser table --- calendar_backend/models/db.py | 31 ++++++++++++++ .../8006ac22acc4_add_eventuser_table.py | 41 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 migrations/versions/8006ac22acc4_add_eventuser_table.py diff --git a/calendar_backend/models/db.py b/calendar_backend/models/db.py index 47f4ceac..a3aa684b 100644 --- a/calendar_backend/models/db.py +++ b/calendar_backend/models/db.py @@ -14,6 +14,12 @@ from .base import ApproveStatuses, BaseDbModel +class EventUserStatus(str, Enum): + NO_STATUS: str = "no_status" + GOING: str = "going" + NOT_GOING: str = "not_going" + ATTENDED: str = "attended" + class Credentials(BaseDbModel): """User credentials""" @@ -143,6 +149,12 @@ class Event(BaseDbModel): back_populates="event", primaryjoin="and_(Event.id==CommentEvent.event_id, not_(CommentEvent.is_deleted), CommentEvent.approve_status=='APPROVED')", ) + user_event: Mapped[list[EventUser]] = relationship( + "EventUser", + back_populates="event", + order_by="EventUser.updated_at.desc()", + primaryjoin="and_(Event.id==EventUser.event_id, not_(EventUser.is_deleted))", + ) class EventsLecturers(BaseDbModel): @@ -211,3 +223,22 @@ class CommentEvent(BaseDbModel): foreign_keys="CommentEvent.event_id", primaryjoin="and_(Event.id==CommentEvent.event_id, not_(Event.is_deleted))", ) + +class EventUser(BaseDbModel): + id: Mapped[int] = mapped_column(Integer, primary_key=True) + event_id: Mapped[int] = mapped_column(Integer, ForeignKey("event.id"), nullable=False) + user_id: Mapped[int] = mapped_column(Integer, nullable=False) + status: Mapped[EventUserStatus] = mapped_column( + DbEnum(EventUserStatus, native_enum=False), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow + ) + is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) + + event: Mapped[Event] = relationship( + "Event", + foreign_keys="EventUser.event_id", + back_populates="user_event", + primaryjoin="and_(EventUser.event_id==Event.id, not_(Event.is_deleted))", + ) \ No newline at end of file diff --git a/migrations/versions/8006ac22acc4_add_eventuser_table.py b/migrations/versions/8006ac22acc4_add_eventuser_table.py new file mode 100644 index 00000000..c7242560 --- /dev/null +++ b/migrations/versions/8006ac22acc4_add_eventuser_table.py @@ -0,0 +1,41 @@ +"""add EventUser table + +Revision ID: 8006ac22acc4 +Revises: 55a049fde8f4 +Create Date: 2026-04-20 16:21:11.459713 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8006ac22acc4' +down_revision = '55a049fde8f4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('event_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('event_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('status', sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), nullable=False), + sa.Column('updated_at', sa.DateTime(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['event_id'], ['event.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey') + op.drop_column('event', 'group_id') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('event', sa.Column('group_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.create_foreign_key(op.f('lesson_group_id_fkey'), 'event', 'group', ['group_id'], ['id']) + op.drop_table('event_user') + # ### end Alembic commands ### From 397c1160be9cd6d8ce6232a66dc9e43ea1700ea4 Mon Sep 17 00:00:00 2001 From: Georgon Date: Mon, 20 Apr 2026 16:47:17 +0300 Subject: [PATCH 02/13] EventUser table with right format --- calendar_backend/__init__.py | 1 - calendar_backend/__main__.py | 1 - calendar_backend/methods/__init__.py | 1 - calendar_backend/methods/image.py | 1 - calendar_backend/methods/list_calendar.py | 1 - calendar_backend/methods/utils.py | 1 - calendar_backend/models/__init__.py | 1 - calendar_backend/models/db.py | 18 +++++------ calendar_backend/routes/__init__.py | 1 - calendar_backend/routes/base.py | 7 ++--- calendar_backend/routes/event/comment.py | 1 - .../routes/event/comment_review.py | 1 - calendar_backend/routes/event/event.py | 3 +- calendar_backend/routes/group/group.py | 1 - calendar_backend/routes/lecturer/comment.py | 1 - .../routes/lecturer/comment_review.py | 1 - calendar_backend/routes/lecturer/lecturer.py | 1 - calendar_backend/routes/lecturer/photo.py | 1 - .../routes/lecturer/photo_review.py | 1 - calendar_backend/routes/models/__init__.py | 1 - calendar_backend/routes/room/room.py | 1 - migrations/env.py | 1 - migrations/versions/0929a0a9586e_del_link.py | 1 - .../versions/3948c45f9977_building_url.py | 1 - ...049fde8f4_many_to_many_events_to_groups.py | 9 ++---- .../versions/63263ee9e08e_fix_photo_paths.py | 1 - .../versions/6d57978a236e_room_building.py | 1 - .../8006ac22acc4_add_eventuser_table.py | 30 ++++++++++++------- .../versions/8bae03e22feb_many_to_many.py | 1 - migrations/versions/93612883178c_init.py | 1 - .../versions/b0d96bbca3cd_add_review.py | 1 - ...359fe2d1e_photo_comment_is_deleted_flag.py | 1 - .../d6f98271bc6b_no_datatype_directions.py | 1 - .../versions/e111af54f4bb_refactoring.py | 1 - migrations/versions/fe04c8baa5ab_fix_sa20.py | 1 - tests/event/event.py | 1 - tests/group/group.py | 1 - tests/lecturer/lecturer.py | 1 - tests/lecturer/photos.py | 1 - tests/room/room.py | 1 - 40 files changed, 33 insertions(+), 69 deletions(-) diff --git a/calendar_backend/__init__.py b/calendar_backend/__init__.py index fa9c0989..ebcaeac8 100644 --- a/calendar_backend/__init__.py +++ b/calendar_backend/__init__.py @@ -1,4 +1,3 @@ import os - __version__ = os.getenv('APP_VERSION', 'dev') diff --git a/calendar_backend/__main__.py b/calendar_backend/__main__.py index b83b5c92..0e4f8fdd 100644 --- a/calendar_backend/__main__.py +++ b/calendar_backend/__main__.py @@ -4,7 +4,6 @@ from calendar_backend.routes import app - logging.basicConfig( filename=f'logger_{__name__}.log', level=logging.DEBUG, diff --git a/calendar_backend/methods/__init__.py b/calendar_backend/methods/__init__.py index e5f0de92..293232cf 100644 --- a/calendar_backend/methods/__init__.py +++ b/calendar_backend/methods/__init__.py @@ -1,4 +1,3 @@ from . import utils - __all__ = ("utils",) diff --git a/calendar_backend/methods/image.py b/calendar_backend/methods/image.py index d0e416e7..46dcece9 100644 --- a/calendar_backend/methods/image.py +++ b/calendar_backend/methods/image.py @@ -14,7 +14,6 @@ from calendar_backend.models.db import ApproveStatuses, Lecturer, Photo from calendar_backend.settings import get_settings - settings = get_settings() diff --git a/calendar_backend/methods/list_calendar.py b/calendar_backend/methods/list_calendar.py index e97b3c13..5bcd7660 100644 --- a/calendar_backend/methods/list_calendar.py +++ b/calendar_backend/methods/list_calendar.py @@ -16,7 +16,6 @@ from . import utils - settings = get_settings() logger = logging.getLogger(__name__) diff --git a/calendar_backend/methods/utils.py b/calendar_backend/methods/utils.py index 88766af1..094d1dee 100644 --- a/calendar_backend/methods/utils.py +++ b/calendar_backend/methods/utils.py @@ -3,7 +3,6 @@ from calendar_backend.models.db import Event, Group, Lecturer, Room from calendar_backend.settings import get_settings - settings = get_settings() diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 19f25799..3d6a470c 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -13,7 +13,6 @@ Room, ) - __all__ = [ "Credentials", "Group", diff --git a/calendar_backend/models/db.py b/calendar_backend/models/db.py index a3aa684b..c0428a71 100644 --- a/calendar_backend/models/db.py +++ b/calendar_backend/models/db.py @@ -15,10 +15,11 @@ class EventUserStatus(str, Enum): - NO_STATUS: str = "no_status" - GOING: str = "going" - NOT_GOING: str = "not_going" - ATTENDED: str = "attended" + NO_STATUS: str = "no_status" + GOING: str = "going" + NOT_GOING: str = "not_going" + ATTENDED: str = "attended" + class Credentials(BaseDbModel): """User credentials""" @@ -224,13 +225,12 @@ class CommentEvent(BaseDbModel): primaryjoin="and_(Event.id==CommentEvent.event_id, not_(Event.is_deleted))", ) + class EventUser(BaseDbModel): id: Mapped[int] = mapped_column(Integer, primary_key=True) event_id: Mapped[int] = mapped_column(Integer, ForeignKey("event.id"), nullable=False) user_id: Mapped[int] = mapped_column(Integer, nullable=False) - status: Mapped[EventUserStatus] = mapped_column( - DbEnum(EventUserStatus, native_enum=False), nullable=False - ) + status: Mapped[EventUserStatus] = mapped_column(DbEnum(EventUserStatus, native_enum=False), nullable=False) updated_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow ) @@ -238,7 +238,7 @@ class EventUser(BaseDbModel): event: Mapped[Event] = relationship( "Event", - foreign_keys="EventUser.event_id", + foreign_keys="EventUser.event_id", back_populates="user_event", primaryjoin="and_(EventUser.event_id==Event.id, not_(Event.is_deleted))", - ) \ No newline at end of file + ) diff --git a/calendar_backend/routes/__init__.py b/calendar_backend/routes/__init__.py index 5086daf1..7c8d47d2 100644 --- a/calendar_backend/routes/__init__.py +++ b/calendar_backend/routes/__init__.py @@ -1,4 +1,3 @@ from .base import app - __all__ = ["app"] diff --git a/calendar_backend/routes/base.py b/calendar_backend/routes/base.py index 5cdd7cdf..5ef1a837 100644 --- a/calendar_backend/routes/base.py +++ b/calendar_backend/routes/base.py @@ -28,13 +28,11 @@ from .lecturer.photo_review import router as lecturer_photo_review_router from .room.room import router as room_router - settings = get_settings() logger = logging.getLogger(__name__) app = FastAPI( title='Сервис расписания', - description=dedent( - """ + description=dedent(""" API для работы с календарем физфака. Пример работы на питоне(Создание Room): @@ -49,8 +47,7 @@ headers={"Authorization": f"ТокенАвторизацииТвойФФ"} ) ``` - """ - ), + """), version=__version__, # Настраиваем интернет документацию root_path=settings.ROOT_PATH if __version__ != 'dev' else '', diff --git a/calendar_backend/routes/event/comment.py b/calendar_backend/routes/event/comment.py index 38cc954b..afc57ca8 100644 --- a/calendar_backend/routes/event/comment.py +++ b/calendar_backend/routes/event/comment.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models.event import CommentEventGet, EventCommentPatch, EventCommentPost, EventComments from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment"]) diff --git a/calendar_backend/routes/event/comment_review.py b/calendar_backend/routes/event/comment_review.py index 5dd81536..14d41406 100644 --- a/calendar_backend/routes/event/comment_review.py +++ b/calendar_backend/routes/event/comment_review.py @@ -11,7 +11,6 @@ from calendar_backend.routes.models.event import CommentEventGet from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment Review"]) diff --git a/calendar_backend/routes/event/event.py b/calendar_backend/routes/event/event.py index 181cae1d..1173724b 100644 --- a/calendar_backend/routes/event/event.py +++ b/calendar_backend/routes/event/event.py @@ -1,5 +1,5 @@ import logging -from datetime import date, datetime, timedelta +from datetime import date, timedelta from typing import Literal from auth_lib.fastapi import UnionAuth @@ -22,7 +22,6 @@ ) from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/event", tags=["Event"]) diff --git a/calendar_backend/routes/group/group.py b/calendar_backend/routes/group/group.py index 7125c2a6..e8354f78 100644 --- a/calendar_backend/routes/group/group.py +++ b/calendar_backend/routes/group/group.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import GetListGroup, GroupGet, GroupPatch, GroupPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/group", tags=["Group"]) diff --git a/calendar_backend/routes/lecturer/comment.py b/calendar_backend/routes/lecturer/comment.py index a9cd9e9f..10246374 100644 --- a/calendar_backend/routes/lecturer/comment.py +++ b/calendar_backend/routes/lecturer/comment.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import CommentLecturer, LecturerCommentPatch, LecturerCommentPost, LecturerComments from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Comment"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/comment_review.py b/calendar_backend/routes/lecturer/comment_review.py index e9381548..a36b455c 100644 --- a/calendar_backend/routes/lecturer/comment_review.py +++ b/calendar_backend/routes/lecturer/comment_review.py @@ -10,7 +10,6 @@ from calendar_backend.models.db import CommentLecturer as DbCommentLecturer from calendar_backend.routes.models import CommentLecturer - router = APIRouter(prefix="/lecturer/{lecturer_id}/comment", tags=["Lecturer: Comment Review"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/lecturer.py b/calendar_backend/routes/lecturer/lecturer.py index 9320aab0..e03ac1d6 100644 --- a/calendar_backend/routes/lecturer/lecturer.py +++ b/calendar_backend/routes/lecturer/lecturer.py @@ -13,7 +13,6 @@ from calendar_backend.routes.models import GetListLecturer, LecturerGet, LecturerPatch, LecturerPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/lecturer", tags=["Lecturer"]) diff --git a/calendar_backend/routes/lecturer/photo.py b/calendar_backend/routes/lecturer/photo.py index aebb0392..eb625125 100644 --- a/calendar_backend/routes/lecturer/photo.py +++ b/calendar_backend/routes/lecturer/photo.py @@ -9,7 +9,6 @@ from calendar_backend.routes.models import LecturerPhotos, Photo from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Photo"]) diff --git a/calendar_backend/routes/lecturer/photo_review.py b/calendar_backend/routes/lecturer/photo_review.py index a856876e..ff3a5a56 100644 --- a/calendar_backend/routes/lecturer/photo_review.py +++ b/calendar_backend/routes/lecturer/photo_review.py @@ -11,7 +11,6 @@ from calendar_backend.routes.models import Action, Photo from calendar_backend.routes.models.base import Base as BaseSchema - router = APIRouter(prefix="/lecturer/photo/review", tags=["Lecturer: Photo Review"]) diff --git a/calendar_backend/routes/models/__init__.py b/calendar_backend/routes/models/__init__.py index bd80e638..1fa4ed69 100644 --- a/calendar_backend/routes/models/__init__.py +++ b/calendar_backend/routes/models/__init__.py @@ -15,7 +15,6 @@ ) from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost - __all__ = ( "CommentEventGet", "CommentLecturer", diff --git a/calendar_backend/routes/room/room.py b/calendar_backend/routes/room/room.py index 92191fcf..ea78d4c1 100644 --- a/calendar_backend/routes/room/room.py +++ b/calendar_backend/routes/room/room.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import GetListRoom, RoomGet, RoomPatch, RoomPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/room", tags=["Room"]) diff --git a/migrations/env.py b/migrations/env.py index 522e2171..32ec0f2a 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -6,7 +6,6 @@ from calendar_backend.models.base import DeclarativeBase from calendar_backend.settings import get_settings - # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config diff --git a/migrations/versions/0929a0a9586e_del_link.py b/migrations/versions/0929a0a9586e_del_link.py index cd5eec83..b60cdf60 100644 --- a/migrations/versions/0929a0a9586e_del_link.py +++ b/migrations/versions/0929a0a9586e_del_link.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '0929a0a9586e' down_revision = 'c66359fe2d1e' diff --git a/migrations/versions/3948c45f9977_building_url.py b/migrations/versions/3948c45f9977_building_url.py index 4ae8a80b..22f8ddd4 100644 --- a/migrations/versions/3948c45f9977_building_url.py +++ b/migrations/versions/3948c45f9977_building_url.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '3948c45f9977' down_revision = '63263ee9e08e' diff --git a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py index 9a9912ed..5436c78a 100644 --- a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py +++ b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '55a049fde8f4' down_revision = 'fe04c8baa5ab' @@ -45,9 +44,7 @@ def upgrade(): ), sa.PrimaryKeyConstraint('id'), ) - res = e.execute( - sa.text( - """ + res = e.execute(sa.text(""" with inner_q as ( select name, @@ -62,9 +59,7 @@ def upgrade(): ) select old_ids, group_ids from inner_q - """ - ) - ).all() + """)).all() to_delete, pairs = merge_groups(res) delete_old_events_query = ( diff --git a/migrations/versions/63263ee9e08e_fix_photo_paths.py b/migrations/versions/63263ee9e08e_fix_photo_paths.py index cb31fea1..9acc70ac 100644 --- a/migrations/versions/63263ee9e08e_fix_photo_paths.py +++ b/migrations/versions/63263ee9e08e_fix_photo_paths.py @@ -8,7 +8,6 @@ from alembic import op - # revision identifiers, used by Alembic. revision = '63263ee9e08e' down_revision = '6d57978a236e' diff --git a/migrations/versions/6d57978a236e_room_building.py b/migrations/versions/6d57978a236e_room_building.py index 05076119..301a6922 100644 --- a/migrations/versions/6d57978a236e_room_building.py +++ b/migrations/versions/6d57978a236e_room_building.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '6d57978a236e' down_revision = 'b0d96bbca3cd' diff --git a/migrations/versions/8006ac22acc4_add_eventuser_table.py b/migrations/versions/8006ac22acc4_add_eventuser_table.py index c7242560..71bc1c4f 100644 --- a/migrations/versions/8006ac22acc4_add_eventuser_table.py +++ b/migrations/versions/8006ac22acc4_add_eventuser_table.py @@ -5,9 +5,9 @@ Create Date: 2026-04-20 16:21:11.459713 """ -from alembic import op -import sqlalchemy as sa +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = '8006ac22acc4' @@ -18,15 +18,23 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('event_user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('event_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('status', sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), nullable=False), - sa.Column('updated_at', sa.DateTime(), nullable=False), - sa.Column('is_deleted', sa.Boolean(), nullable=False), - sa.ForeignKeyConstraint(['event_id'], ['event.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + 'event_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('event_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column( + 'status', + sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), + nullable=False, + ), + sa.Column('updated_at', sa.DateTime(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint( + ['event_id'], + ['event.id'], + ), + sa.PrimaryKeyConstraint('id'), ) op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey') op.drop_column('event', 'group_id') diff --git a/migrations/versions/8bae03e22feb_many_to_many.py b/migrations/versions/8bae03e22feb_many_to_many.py index f80130d3..de4f037b 100644 --- a/migrations/versions/8bae03e22feb_many_to_many.py +++ b/migrations/versions/8bae03e22feb_many_to_many.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '8bae03e22feb' down_revision = '93612883178c' diff --git a/migrations/versions/93612883178c_init.py b/migrations/versions/93612883178c_init.py index 060ffe30..d2f80195 100644 --- a/migrations/versions/93612883178c_init.py +++ b/migrations/versions/93612883178c_init.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '93612883178c' down_revision = None diff --git a/migrations/versions/b0d96bbca3cd_add_review.py b/migrations/versions/b0d96bbca3cd_add_review.py index a5f025ab..fabdcb75 100644 --- a/migrations/versions/b0d96bbca3cd_add_review.py +++ b/migrations/versions/b0d96bbca3cd_add_review.py @@ -1,7 +1,6 @@ import sqlalchemy as sa from alembic import op - revision = 'b0d96bbca3cd' down_revision = 'e111af54f4bb' branch_labels = None diff --git a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py index a86dce63..fc2a9aa5 100644 --- a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py +++ b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = 'c66359fe2d1e' down_revision = 'd6f98271bc6b' diff --git a/migrations/versions/d6f98271bc6b_no_datatype_directions.py b/migrations/versions/d6f98271bc6b_no_datatype_directions.py index cd26f282..132f4d9c 100644 --- a/migrations/versions/d6f98271bc6b_no_datatype_directions.py +++ b/migrations/versions/d6f98271bc6b_no_datatype_directions.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = 'd6f98271bc6b' down_revision = '8bae03e22feb' diff --git a/migrations/versions/e111af54f4bb_refactoring.py b/migrations/versions/e111af54f4bb_refactoring.py index c599837a..f805a236 100644 --- a/migrations/versions/e111af54f4bb_refactoring.py +++ b/migrations/versions/e111af54f4bb_refactoring.py @@ -8,7 +8,6 @@ from alembic import op - # revision identifiers, used by Alembic. revision = 'e111af54f4bb' down_revision = '0929a0a9586e' diff --git a/migrations/versions/fe04c8baa5ab_fix_sa20.py b/migrations/versions/fe04c8baa5ab_fix_sa20.py index 225879f7..6fd5ebc4 100644 --- a/migrations/versions/fe04c8baa5ab_fix_sa20.py +++ b/migrations/versions/fe04c8baa5ab_fix_sa20.py @@ -10,7 +10,6 @@ from alembic import op from sqlalchemy.dialects import postgresql - # revision identifiers, used by Alembic. revision = 'fe04c8baa5ab' down_revision = '3948c45f9977' diff --git a/tests/event/event.py b/tests/event/event.py index 84ef9b2b..1597da95 100644 --- a/tests/event/event.py +++ b/tests/event/event.py @@ -7,7 +7,6 @@ from calendar_backend.models import Event, Group, Lecturer, Room - RESOURCE = "/event/" diff --git a/tests/group/group.py b/tests/group/group.py index 42b4a995..646776bc 100644 --- a/tests/group/group.py +++ b/tests/group/group.py @@ -7,7 +7,6 @@ from calendar_backend.models import Group - RESOURCE = "/group/" diff --git a/tests/lecturer/lecturer.py b/tests/lecturer/lecturer.py index 631a012d..8becd768 100644 --- a/tests/lecturer/lecturer.py +++ b/tests/lecturer/lecturer.py @@ -6,7 +6,6 @@ from calendar_backend.models.db import Lecturer - RESOURCE = "/lecturer/" diff --git a/tests/lecturer/photos.py b/tests/lecturer/photos.py index e194de99..01b54ecf 100644 --- a/tests/lecturer/photos.py +++ b/tests/lecturer/photos.py @@ -8,7 +8,6 @@ from calendar_backend.models.db import Photo from calendar_backend.settings import get_settings - settings = get_settings() settings.STATIC_PATH = './static' diff --git a/tests/room/room.py b/tests/room/room.py index aef49872..43cec77a 100644 --- a/tests/room/room.py +++ b/tests/room/room.py @@ -7,7 +7,6 @@ from calendar_backend.models import Room - RESOURCE = "/room/" From c2723639909f43dfaf9119e505475aa9eafde499 Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:58:42 +0300 Subject: [PATCH 03/13] black format --- .github/workflows/checks.yml | 2 +- Makefile | 2 +- calendar_backend/__init__.py | 1 + calendar_backend/__main__.py | 1 + calendar_backend/methods/__init__.py | 1 + calendar_backend/methods/image.py | 1 + calendar_backend/methods/list_calendar.py | 1 + calendar_backend/methods/utils.py | 1 + calendar_backend/models/__init__.py | 1 + calendar_backend/routes/__init__.py | 1 + calendar_backend/routes/base.py | 7 +++++-- calendar_backend/routes/event/comment.py | 1 + calendar_backend/routes/event/comment_review.py | 1 + calendar_backend/routes/event/event.py | 1 + calendar_backend/routes/group/group.py | 1 + calendar_backend/routes/lecturer/comment.py | 1 + calendar_backend/routes/lecturer/comment_review.py | 1 + calendar_backend/routes/lecturer/lecturer.py | 1 + calendar_backend/routes/lecturer/photo.py | 1 + calendar_backend/routes/lecturer/photo_review.py | 1 + calendar_backend/routes/models/__init__.py | 1 + calendar_backend/routes/room/room.py | 1 + migrations/env.py | 1 + migrations/versions/0929a0a9586e_del_link.py | 1 + migrations/versions/3948c45f9977_building_url.py | 1 + .../55a049fde8f4_many_to_many_events_to_groups.py | 9 +++++++-- migrations/versions/63263ee9e08e_fix_photo_paths.py | 1 + migrations/versions/6d57978a236e_room_building.py | 1 + migrations/versions/8006ac22acc4_add_eventuser_table.py | 1 + migrations/versions/8bae03e22feb_many_to_many.py | 1 + migrations/versions/93612883178c_init.py | 1 + migrations/versions/b0d96bbca3cd_add_review.py | 1 + .../c66359fe2d1e_photo_comment_is_deleted_flag.py | 1 + .../versions/d6f98271bc6b_no_datatype_directions.py | 1 + migrations/versions/e111af54f4bb_refactoring.py | 1 + migrations/versions/fe04c8baa5ab_fix_sa20.py | 1 + requirements.dev.txt | 2 +- tests/event/event.py | 1 + tests/group/group.py | 1 + tests/lecturer/lecturer.py | 1 + tests/lecturer/photos.py | 1 + tests/room/room.py | 1 + 42 files changed, 52 insertions(+), 7 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 55606cb2..738261fe 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -69,7 +69,7 @@ jobs: - uses: isort/isort-action@master with: requirementsFiles: "requirements.txt requirements.dev.txt" - - uses: psf/black@stable + - uses: psf/black@23.11.0 - name: Comment if linting failed if: failure() uses: thollander/actions-comment-pull-request@v2 diff --git a/Makefile b/Makefile index d42b352d..81842c1c 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ run: source ./venv/bin/activate && uvicorn --reload --log-config logging_dev.conf calendar_backend.routes.base:app configure: venv - source ./venv/bin/activate && pip install -r requirements.dev.txt -r requirements.txt + source ./venv/bin/activate && pip install --force-reinstall -r requirements.dev.txt -r requirements.txt venv: python3.11 -m venv venv diff --git a/calendar_backend/__init__.py b/calendar_backend/__init__.py index ebcaeac8..fa9c0989 100644 --- a/calendar_backend/__init__.py +++ b/calendar_backend/__init__.py @@ -1,3 +1,4 @@ import os + __version__ = os.getenv('APP_VERSION', 'dev') diff --git a/calendar_backend/__main__.py b/calendar_backend/__main__.py index 0e4f8fdd..b83b5c92 100644 --- a/calendar_backend/__main__.py +++ b/calendar_backend/__main__.py @@ -4,6 +4,7 @@ from calendar_backend.routes import app + logging.basicConfig( filename=f'logger_{__name__}.log', level=logging.DEBUG, diff --git a/calendar_backend/methods/__init__.py b/calendar_backend/methods/__init__.py index 293232cf..e5f0de92 100644 --- a/calendar_backend/methods/__init__.py +++ b/calendar_backend/methods/__init__.py @@ -1,3 +1,4 @@ from . import utils + __all__ = ("utils",) diff --git a/calendar_backend/methods/image.py b/calendar_backend/methods/image.py index 46dcece9..d0e416e7 100644 --- a/calendar_backend/methods/image.py +++ b/calendar_backend/methods/image.py @@ -14,6 +14,7 @@ from calendar_backend.models.db import ApproveStatuses, Lecturer, Photo from calendar_backend.settings import get_settings + settings = get_settings() diff --git a/calendar_backend/methods/list_calendar.py b/calendar_backend/methods/list_calendar.py index 5bcd7660..e97b3c13 100644 --- a/calendar_backend/methods/list_calendar.py +++ b/calendar_backend/methods/list_calendar.py @@ -16,6 +16,7 @@ from . import utils + settings = get_settings() logger = logging.getLogger(__name__) diff --git a/calendar_backend/methods/utils.py b/calendar_backend/methods/utils.py index 094d1dee..88766af1 100644 --- a/calendar_backend/methods/utils.py +++ b/calendar_backend/methods/utils.py @@ -3,6 +3,7 @@ from calendar_backend.models.db import Event, Group, Lecturer, Room from calendar_backend.settings import get_settings + settings = get_settings() diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 3d6a470c..19f25799 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -13,6 +13,7 @@ Room, ) + __all__ = [ "Credentials", "Group", diff --git a/calendar_backend/routes/__init__.py b/calendar_backend/routes/__init__.py index 7c8d47d2..5086daf1 100644 --- a/calendar_backend/routes/__init__.py +++ b/calendar_backend/routes/__init__.py @@ -1,3 +1,4 @@ from .base import app + __all__ = ["app"] diff --git a/calendar_backend/routes/base.py b/calendar_backend/routes/base.py index 5ef1a837..5cdd7cdf 100644 --- a/calendar_backend/routes/base.py +++ b/calendar_backend/routes/base.py @@ -28,11 +28,13 @@ from .lecturer.photo_review import router as lecturer_photo_review_router from .room.room import router as room_router + settings = get_settings() logger = logging.getLogger(__name__) app = FastAPI( title='Сервис расписания', - description=dedent(""" + description=dedent( + """ API для работы с календарем физфака. Пример работы на питоне(Создание Room): @@ -47,7 +49,8 @@ headers={"Authorization": f"ТокенАвторизацииТвойФФ"} ) ``` - """), + """ + ), version=__version__, # Настраиваем интернет документацию root_path=settings.ROOT_PATH if __version__ != 'dev' else '', diff --git a/calendar_backend/routes/event/comment.py b/calendar_backend/routes/event/comment.py index afc57ca8..38cc954b 100644 --- a/calendar_backend/routes/event/comment.py +++ b/calendar_backend/routes/event/comment.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models.event import CommentEventGet, EventCommentPatch, EventCommentPost, EventComments from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment"]) diff --git a/calendar_backend/routes/event/comment_review.py b/calendar_backend/routes/event/comment_review.py index 14d41406..5dd81536 100644 --- a/calendar_backend/routes/event/comment_review.py +++ b/calendar_backend/routes/event/comment_review.py @@ -11,6 +11,7 @@ from calendar_backend.routes.models.event import CommentEventGet from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment Review"]) diff --git a/calendar_backend/routes/event/event.py b/calendar_backend/routes/event/event.py index 1173724b..1af85121 100644 --- a/calendar_backend/routes/event/event.py +++ b/calendar_backend/routes/event/event.py @@ -22,6 +22,7 @@ ) from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/event", tags=["Event"]) diff --git a/calendar_backend/routes/group/group.py b/calendar_backend/routes/group/group.py index e8354f78..7125c2a6 100644 --- a/calendar_backend/routes/group/group.py +++ b/calendar_backend/routes/group/group.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import GetListGroup, GroupGet, GroupPatch, GroupPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/group", tags=["Group"]) diff --git a/calendar_backend/routes/lecturer/comment.py b/calendar_backend/routes/lecturer/comment.py index 10246374..a9cd9e9f 100644 --- a/calendar_backend/routes/lecturer/comment.py +++ b/calendar_backend/routes/lecturer/comment.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import CommentLecturer, LecturerCommentPatch, LecturerCommentPost, LecturerComments from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Comment"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/comment_review.py b/calendar_backend/routes/lecturer/comment_review.py index a36b455c..e9381548 100644 --- a/calendar_backend/routes/lecturer/comment_review.py +++ b/calendar_backend/routes/lecturer/comment_review.py @@ -10,6 +10,7 @@ from calendar_backend.models.db import CommentLecturer as DbCommentLecturer from calendar_backend.routes.models import CommentLecturer + router = APIRouter(prefix="/lecturer/{lecturer_id}/comment", tags=["Lecturer: Comment Review"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/lecturer.py b/calendar_backend/routes/lecturer/lecturer.py index e03ac1d6..9320aab0 100644 --- a/calendar_backend/routes/lecturer/lecturer.py +++ b/calendar_backend/routes/lecturer/lecturer.py @@ -13,6 +13,7 @@ from calendar_backend.routes.models import GetListLecturer, LecturerGet, LecturerPatch, LecturerPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/lecturer", tags=["Lecturer"]) diff --git a/calendar_backend/routes/lecturer/photo.py b/calendar_backend/routes/lecturer/photo.py index eb625125..aebb0392 100644 --- a/calendar_backend/routes/lecturer/photo.py +++ b/calendar_backend/routes/lecturer/photo.py @@ -9,6 +9,7 @@ from calendar_backend.routes.models import LecturerPhotos, Photo from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Photo"]) diff --git a/calendar_backend/routes/lecturer/photo_review.py b/calendar_backend/routes/lecturer/photo_review.py index ff3a5a56..a856876e 100644 --- a/calendar_backend/routes/lecturer/photo_review.py +++ b/calendar_backend/routes/lecturer/photo_review.py @@ -11,6 +11,7 @@ from calendar_backend.routes.models import Action, Photo from calendar_backend.routes.models.base import Base as BaseSchema + router = APIRouter(prefix="/lecturer/photo/review", tags=["Lecturer: Photo Review"]) diff --git a/calendar_backend/routes/models/__init__.py b/calendar_backend/routes/models/__init__.py index 1fa4ed69..bd80e638 100644 --- a/calendar_backend/routes/models/__init__.py +++ b/calendar_backend/routes/models/__init__.py @@ -15,6 +15,7 @@ ) from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost + __all__ = ( "CommentEventGet", "CommentLecturer", diff --git a/calendar_backend/routes/room/room.py b/calendar_backend/routes/room/room.py index ea78d4c1..92191fcf 100644 --- a/calendar_backend/routes/room/room.py +++ b/calendar_backend/routes/room/room.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import GetListRoom, RoomGet, RoomPatch, RoomPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/room", tags=["Room"]) diff --git a/migrations/env.py b/migrations/env.py index 32ec0f2a..522e2171 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -6,6 +6,7 @@ from calendar_backend.models.base import DeclarativeBase from calendar_backend.settings import get_settings + # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config diff --git a/migrations/versions/0929a0a9586e_del_link.py b/migrations/versions/0929a0a9586e_del_link.py index b60cdf60..cd5eec83 100644 --- a/migrations/versions/0929a0a9586e_del_link.py +++ b/migrations/versions/0929a0a9586e_del_link.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '0929a0a9586e' down_revision = 'c66359fe2d1e' diff --git a/migrations/versions/3948c45f9977_building_url.py b/migrations/versions/3948c45f9977_building_url.py index 22f8ddd4..4ae8a80b 100644 --- a/migrations/versions/3948c45f9977_building_url.py +++ b/migrations/versions/3948c45f9977_building_url.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '3948c45f9977' down_revision = '63263ee9e08e' diff --git a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py index 5436c78a..9a9912ed 100644 --- a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py +++ b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '55a049fde8f4' down_revision = 'fe04c8baa5ab' @@ -44,7 +45,9 @@ def upgrade(): ), sa.PrimaryKeyConstraint('id'), ) - res = e.execute(sa.text(""" + res = e.execute( + sa.text( + """ with inner_q as ( select name, @@ -59,7 +62,9 @@ def upgrade(): ) select old_ids, group_ids from inner_q - """)).all() + """ + ) + ).all() to_delete, pairs = merge_groups(res) delete_old_events_query = ( diff --git a/migrations/versions/63263ee9e08e_fix_photo_paths.py b/migrations/versions/63263ee9e08e_fix_photo_paths.py index 9acc70ac..cb31fea1 100644 --- a/migrations/versions/63263ee9e08e_fix_photo_paths.py +++ b/migrations/versions/63263ee9e08e_fix_photo_paths.py @@ -8,6 +8,7 @@ from alembic import op + # revision identifiers, used by Alembic. revision = '63263ee9e08e' down_revision = '6d57978a236e' diff --git a/migrations/versions/6d57978a236e_room_building.py b/migrations/versions/6d57978a236e_room_building.py index 301a6922..05076119 100644 --- a/migrations/versions/6d57978a236e_room_building.py +++ b/migrations/versions/6d57978a236e_room_building.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '6d57978a236e' down_revision = 'b0d96bbca3cd' diff --git a/migrations/versions/8006ac22acc4_add_eventuser_table.py b/migrations/versions/8006ac22acc4_add_eventuser_table.py index 71bc1c4f..e6da5990 100644 --- a/migrations/versions/8006ac22acc4_add_eventuser_table.py +++ b/migrations/versions/8006ac22acc4_add_eventuser_table.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '8006ac22acc4' down_revision = '55a049fde8f4' diff --git a/migrations/versions/8bae03e22feb_many_to_many.py b/migrations/versions/8bae03e22feb_many_to_many.py index de4f037b..f80130d3 100644 --- a/migrations/versions/8bae03e22feb_many_to_many.py +++ b/migrations/versions/8bae03e22feb_many_to_many.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '8bae03e22feb' down_revision = '93612883178c' diff --git a/migrations/versions/93612883178c_init.py b/migrations/versions/93612883178c_init.py index d2f80195..060ffe30 100644 --- a/migrations/versions/93612883178c_init.py +++ b/migrations/versions/93612883178c_init.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '93612883178c' down_revision = None diff --git a/migrations/versions/b0d96bbca3cd_add_review.py b/migrations/versions/b0d96bbca3cd_add_review.py index fabdcb75..a5f025ab 100644 --- a/migrations/versions/b0d96bbca3cd_add_review.py +++ b/migrations/versions/b0d96bbca3cd_add_review.py @@ -1,6 +1,7 @@ import sqlalchemy as sa from alembic import op + revision = 'b0d96bbca3cd' down_revision = 'e111af54f4bb' branch_labels = None diff --git a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py index fc2a9aa5..a86dce63 100644 --- a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py +++ b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = 'c66359fe2d1e' down_revision = 'd6f98271bc6b' diff --git a/migrations/versions/d6f98271bc6b_no_datatype_directions.py b/migrations/versions/d6f98271bc6b_no_datatype_directions.py index 132f4d9c..cd26f282 100644 --- a/migrations/versions/d6f98271bc6b_no_datatype_directions.py +++ b/migrations/versions/d6f98271bc6b_no_datatype_directions.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = 'd6f98271bc6b' down_revision = '8bae03e22feb' diff --git a/migrations/versions/e111af54f4bb_refactoring.py b/migrations/versions/e111af54f4bb_refactoring.py index f805a236..c599837a 100644 --- a/migrations/versions/e111af54f4bb_refactoring.py +++ b/migrations/versions/e111af54f4bb_refactoring.py @@ -8,6 +8,7 @@ from alembic import op + # revision identifiers, used by Alembic. revision = 'e111af54f4bb' down_revision = '0929a0a9586e' diff --git a/migrations/versions/fe04c8baa5ab_fix_sa20.py b/migrations/versions/fe04c8baa5ab_fix_sa20.py index 6fd5ebc4..225879f7 100644 --- a/migrations/versions/fe04c8baa5ab_fix_sa20.py +++ b/migrations/versions/fe04c8baa5ab_fix_sa20.py @@ -10,6 +10,7 @@ from alembic import op from sqlalchemy.dialects import postgresql + # revision identifiers, used by Alembic. revision = 'fe04c8baa5ab' down_revision = '3948c45f9977' diff --git a/requirements.dev.txt b/requirements.dev.txt index 15533c0f..b36fa3d1 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -2,6 +2,6 @@ pytest pytest-cov requests pytest-mock -black +black==23.11.0 isort autoflake diff --git a/tests/event/event.py b/tests/event/event.py index 1597da95..84ef9b2b 100644 --- a/tests/event/event.py +++ b/tests/event/event.py @@ -7,6 +7,7 @@ from calendar_backend.models import Event, Group, Lecturer, Room + RESOURCE = "/event/" diff --git a/tests/group/group.py b/tests/group/group.py index 646776bc..42b4a995 100644 --- a/tests/group/group.py +++ b/tests/group/group.py @@ -7,6 +7,7 @@ from calendar_backend.models import Group + RESOURCE = "/group/" diff --git a/tests/lecturer/lecturer.py b/tests/lecturer/lecturer.py index 8becd768..631a012d 100644 --- a/tests/lecturer/lecturer.py +++ b/tests/lecturer/lecturer.py @@ -6,6 +6,7 @@ from calendar_backend.models.db import Lecturer + RESOURCE = "/lecturer/" diff --git a/tests/lecturer/photos.py b/tests/lecturer/photos.py index 01b54ecf..e194de99 100644 --- a/tests/lecturer/photos.py +++ b/tests/lecturer/photos.py @@ -8,6 +8,7 @@ from calendar_backend.models.db import Photo from calendar_backend.settings import get_settings + settings = get_settings() settings.STATIC_PATH = './static' diff --git a/tests/room/room.py b/tests/room/room.py index 43cec77a..aef49872 100644 --- a/tests/room/room.py +++ b/tests/room/room.py @@ -7,6 +7,7 @@ from calendar_backend.models import Room + RESOURCE = "/room/" From 52549357bd7775af4d8abe8071c016fbf279b4df Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:59:50 +0300 Subject: [PATCH 04/13] bug fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 81842c1c..d42b352d 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ run: source ./venv/bin/activate && uvicorn --reload --log-config logging_dev.conf calendar_backend.routes.base:app configure: venv - source ./venv/bin/activate && pip install --force-reinstall -r requirements.dev.txt -r requirements.txt + source ./venv/bin/activate && pip install -r requirements.dev.txt -r requirements.txt venv: python3.11 -m venv venv From f21e312f89a8f4d73d82fa21b318b26ad92d572a Mon Sep 17 00:00:00 2001 From: Georgon Date: Mon, 20 Apr 2026 17:33:14 +0300 Subject: [PATCH 05/13] EventUser init --- calendar_backend/models/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 3d6a470c..71871c3d 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -26,4 +26,5 @@ "EventsRooms", "ApproveStatuses", "EventsGroups", + "EventUser", ] From 7d4d2134891a3279b35320e15223cf605f5b02cf Mon Sep 17 00:00:00 2001 From: Georgon Date: Mon, 20 Apr 2026 17:58:07 +0300 Subject: [PATCH 06/13] EventUser fix --- calendar_backend/models/db.py | 13 ----- .../8006ac22acc4_add_eventuser_table.py | 50 ------------------- .../b060027b11b3_eventuser_building.py | 41 +++++++++++++++ 3 files changed, 41 insertions(+), 63 deletions(-) delete mode 100644 migrations/versions/8006ac22acc4_add_eventuser_table.py create mode 100644 migrations/versions/b060027b11b3_eventuser_building.py diff --git a/calendar_backend/models/db.py b/calendar_backend/models/db.py index c0428a71..62f8318c 100644 --- a/calendar_backend/models/db.py +++ b/calendar_backend/models/db.py @@ -150,12 +150,6 @@ class Event(BaseDbModel): back_populates="event", primaryjoin="and_(Event.id==CommentEvent.event_id, not_(CommentEvent.is_deleted), CommentEvent.approve_status=='APPROVED')", ) - user_event: Mapped[list[EventUser]] = relationship( - "EventUser", - back_populates="event", - order_by="EventUser.updated_at.desc()", - primaryjoin="and_(Event.id==EventUser.event_id, not_(EventUser.is_deleted))", - ) class EventsLecturers(BaseDbModel): @@ -235,10 +229,3 @@ class EventUser(BaseDbModel): DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow ) is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) - - event: Mapped[Event] = relationship( - "Event", - foreign_keys="EventUser.event_id", - back_populates="user_event", - primaryjoin="and_(EventUser.event_id==Event.id, not_(Event.is_deleted))", - ) diff --git a/migrations/versions/8006ac22acc4_add_eventuser_table.py b/migrations/versions/8006ac22acc4_add_eventuser_table.py deleted file mode 100644 index e6da5990..00000000 --- a/migrations/versions/8006ac22acc4_add_eventuser_table.py +++ /dev/null @@ -1,50 +0,0 @@ -"""add EventUser table - -Revision ID: 8006ac22acc4 -Revises: 55a049fde8f4 -Create Date: 2026-04-20 16:21:11.459713 - -""" - -import sqlalchemy as sa -from alembic import op - - -# revision identifiers, used by Alembic. -revision = '8006ac22acc4' -down_revision = '55a049fde8f4' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - 'event_user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('event_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column( - 'status', - sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), - nullable=False, - ), - sa.Column('updated_at', sa.DateTime(), nullable=False), - sa.Column('is_deleted', sa.Boolean(), nullable=False), - sa.ForeignKeyConstraint( - ['event_id'], - ['event.id'], - ), - sa.PrimaryKeyConstraint('id'), - ) - op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey') - op.drop_column('event', 'group_id') - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('event', sa.Column('group_id', sa.INTEGER(), autoincrement=False, nullable=True)) - op.create_foreign_key(op.f('lesson_group_id_fkey'), 'event', 'group', ['group_id'], ['id']) - op.drop_table('event_user') - # ### end Alembic commands ### diff --git a/migrations/versions/b060027b11b3_eventuser_building.py b/migrations/versions/b060027b11b3_eventuser_building.py new file mode 100644 index 00000000..94b70bd6 --- /dev/null +++ b/migrations/versions/b060027b11b3_eventuser_building.py @@ -0,0 +1,41 @@ +"""EventUser building + +Revision ID: b060027b11b3 +Revises: 55a049fde8f4 +Create Date: 2026-04-20 17:56:39.185374 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b060027b11b3' +down_revision = '55a049fde8f4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('event_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('event_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('status', sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), nullable=False), + sa.Column('updated_at', sa.DateTime(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['event_id'], ['event.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey') + op.drop_column('event', 'group_id') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('event', sa.Column('group_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.create_foreign_key(op.f('lesson_group_id_fkey'), 'event', 'group', ['group_id'], ['id']) + op.drop_table('event_user') + # ### end Alembic commands ### From 2254c3c12ab80cfd2226918990edbc0138f42fdb Mon Sep 17 00:00:00 2001 From: Georgon Date: Mon, 20 Apr 2026 18:00:58 +0300 Subject: [PATCH 07/13] EventUser fixed with format --- calendar_backend/__init__.py | 1 - calendar_backend/__main__.py | 1 - calendar_backend/methods/__init__.py | 1 - calendar_backend/methods/image.py | 1 - calendar_backend/methods/list_calendar.py | 1 - calendar_backend/methods/utils.py | 1 - calendar_backend/models/__init__.py | 1 - calendar_backend/routes/__init__.py | 1 - calendar_backend/routes/base.py | 7 ++--- calendar_backend/routes/event/comment.py | 1 - .../routes/event/comment_review.py | 1 - calendar_backend/routes/event/event.py | 1 - calendar_backend/routes/group/group.py | 1 - calendar_backend/routes/lecturer/comment.py | 1 - .../routes/lecturer/comment_review.py | 1 - calendar_backend/routes/lecturer/lecturer.py | 1 - calendar_backend/routes/lecturer/photo.py | 1 - .../routes/lecturer/photo_review.py | 1 - calendar_backend/routes/models/__init__.py | 1 - calendar_backend/routes/room/room.py | 1 - migrations/env.py | 1 - migrations/versions/0929a0a9586e_del_link.py | 1 - .../versions/3948c45f9977_building_url.py | 1 - ...049fde8f4_many_to_many_events_to_groups.py | 9 ++---- .../versions/63263ee9e08e_fix_photo_paths.py | 1 - .../versions/6d57978a236e_room_building.py | 1 - .../versions/8bae03e22feb_many_to_many.py | 1 - migrations/versions/93612883178c_init.py | 1 - .../b060027b11b3_eventuser_building.py | 30 ++++++++++++------- .../versions/b0d96bbca3cd_add_review.py | 1 - ...359fe2d1e_photo_comment_is_deleted_flag.py | 1 - .../d6f98271bc6b_no_datatype_directions.py | 1 - .../versions/e111af54f4bb_refactoring.py | 1 - migrations/versions/fe04c8baa5ab_fix_sa20.py | 1 - tests/event/event.py | 1 - tests/group/group.py | 1 - tests/lecturer/lecturer.py | 1 - tests/lecturer/photos.py | 1 - tests/room/room.py | 1 - 39 files changed, 23 insertions(+), 59 deletions(-) diff --git a/calendar_backend/__init__.py b/calendar_backend/__init__.py index fa9c0989..ebcaeac8 100644 --- a/calendar_backend/__init__.py +++ b/calendar_backend/__init__.py @@ -1,4 +1,3 @@ import os - __version__ = os.getenv('APP_VERSION', 'dev') diff --git a/calendar_backend/__main__.py b/calendar_backend/__main__.py index b83b5c92..0e4f8fdd 100644 --- a/calendar_backend/__main__.py +++ b/calendar_backend/__main__.py @@ -4,7 +4,6 @@ from calendar_backend.routes import app - logging.basicConfig( filename=f'logger_{__name__}.log', level=logging.DEBUG, diff --git a/calendar_backend/methods/__init__.py b/calendar_backend/methods/__init__.py index e5f0de92..293232cf 100644 --- a/calendar_backend/methods/__init__.py +++ b/calendar_backend/methods/__init__.py @@ -1,4 +1,3 @@ from . import utils - __all__ = ("utils",) diff --git a/calendar_backend/methods/image.py b/calendar_backend/methods/image.py index d0e416e7..46dcece9 100644 --- a/calendar_backend/methods/image.py +++ b/calendar_backend/methods/image.py @@ -14,7 +14,6 @@ from calendar_backend.models.db import ApproveStatuses, Lecturer, Photo from calendar_backend.settings import get_settings - settings = get_settings() diff --git a/calendar_backend/methods/list_calendar.py b/calendar_backend/methods/list_calendar.py index e97b3c13..5bcd7660 100644 --- a/calendar_backend/methods/list_calendar.py +++ b/calendar_backend/methods/list_calendar.py @@ -16,7 +16,6 @@ from . import utils - settings = get_settings() logger = logging.getLogger(__name__) diff --git a/calendar_backend/methods/utils.py b/calendar_backend/methods/utils.py index 88766af1..094d1dee 100644 --- a/calendar_backend/methods/utils.py +++ b/calendar_backend/methods/utils.py @@ -3,7 +3,6 @@ from calendar_backend.models.db import Event, Group, Lecturer, Room from calendar_backend.settings import get_settings - settings = get_settings() diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 43a817b2..71871c3d 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -13,7 +13,6 @@ Room, ) - __all__ = [ "Credentials", "Group", diff --git a/calendar_backend/routes/__init__.py b/calendar_backend/routes/__init__.py index 5086daf1..7c8d47d2 100644 --- a/calendar_backend/routes/__init__.py +++ b/calendar_backend/routes/__init__.py @@ -1,4 +1,3 @@ from .base import app - __all__ = ["app"] diff --git a/calendar_backend/routes/base.py b/calendar_backend/routes/base.py index 5cdd7cdf..5ef1a837 100644 --- a/calendar_backend/routes/base.py +++ b/calendar_backend/routes/base.py @@ -28,13 +28,11 @@ from .lecturer.photo_review import router as lecturer_photo_review_router from .room.room import router as room_router - settings = get_settings() logger = logging.getLogger(__name__) app = FastAPI( title='Сервис расписания', - description=dedent( - """ + description=dedent(""" API для работы с календарем физфака. Пример работы на питоне(Создание Room): @@ -49,8 +47,7 @@ headers={"Authorization": f"ТокенАвторизацииТвойФФ"} ) ``` - """ - ), + """), version=__version__, # Настраиваем интернет документацию root_path=settings.ROOT_PATH if __version__ != 'dev' else '', diff --git a/calendar_backend/routes/event/comment.py b/calendar_backend/routes/event/comment.py index 38cc954b..afc57ca8 100644 --- a/calendar_backend/routes/event/comment.py +++ b/calendar_backend/routes/event/comment.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models.event import CommentEventGet, EventCommentPatch, EventCommentPost, EventComments from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment"]) diff --git a/calendar_backend/routes/event/comment_review.py b/calendar_backend/routes/event/comment_review.py index 5dd81536..14d41406 100644 --- a/calendar_backend/routes/event/comment_review.py +++ b/calendar_backend/routes/event/comment_review.py @@ -11,7 +11,6 @@ from calendar_backend.routes.models.event import CommentEventGet from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment Review"]) diff --git a/calendar_backend/routes/event/event.py b/calendar_backend/routes/event/event.py index 1af85121..1173724b 100644 --- a/calendar_backend/routes/event/event.py +++ b/calendar_backend/routes/event/event.py @@ -22,7 +22,6 @@ ) from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/event", tags=["Event"]) diff --git a/calendar_backend/routes/group/group.py b/calendar_backend/routes/group/group.py index 7125c2a6..e8354f78 100644 --- a/calendar_backend/routes/group/group.py +++ b/calendar_backend/routes/group/group.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import GetListGroup, GroupGet, GroupPatch, GroupPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/group", tags=["Group"]) diff --git a/calendar_backend/routes/lecturer/comment.py b/calendar_backend/routes/lecturer/comment.py index a9cd9e9f..10246374 100644 --- a/calendar_backend/routes/lecturer/comment.py +++ b/calendar_backend/routes/lecturer/comment.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import CommentLecturer, LecturerCommentPatch, LecturerCommentPost, LecturerComments from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Comment"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/comment_review.py b/calendar_backend/routes/lecturer/comment_review.py index e9381548..a36b455c 100644 --- a/calendar_backend/routes/lecturer/comment_review.py +++ b/calendar_backend/routes/lecturer/comment_review.py @@ -10,7 +10,6 @@ from calendar_backend.models.db import CommentLecturer as DbCommentLecturer from calendar_backend.routes.models import CommentLecturer - router = APIRouter(prefix="/lecturer/{lecturer_id}/comment", tags=["Lecturer: Comment Review"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/lecturer.py b/calendar_backend/routes/lecturer/lecturer.py index 9320aab0..e03ac1d6 100644 --- a/calendar_backend/routes/lecturer/lecturer.py +++ b/calendar_backend/routes/lecturer/lecturer.py @@ -13,7 +13,6 @@ from calendar_backend.routes.models import GetListLecturer, LecturerGet, LecturerPatch, LecturerPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/lecturer", tags=["Lecturer"]) diff --git a/calendar_backend/routes/lecturer/photo.py b/calendar_backend/routes/lecturer/photo.py index aebb0392..eb625125 100644 --- a/calendar_backend/routes/lecturer/photo.py +++ b/calendar_backend/routes/lecturer/photo.py @@ -9,7 +9,6 @@ from calendar_backend.routes.models import LecturerPhotos, Photo from calendar_backend.settings import get_settings - settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Photo"]) diff --git a/calendar_backend/routes/lecturer/photo_review.py b/calendar_backend/routes/lecturer/photo_review.py index a856876e..ff3a5a56 100644 --- a/calendar_backend/routes/lecturer/photo_review.py +++ b/calendar_backend/routes/lecturer/photo_review.py @@ -11,7 +11,6 @@ from calendar_backend.routes.models import Action, Photo from calendar_backend.routes.models.base import Base as BaseSchema - router = APIRouter(prefix="/lecturer/photo/review", tags=["Lecturer: Photo Review"]) diff --git a/calendar_backend/routes/models/__init__.py b/calendar_backend/routes/models/__init__.py index bd80e638..1fa4ed69 100644 --- a/calendar_backend/routes/models/__init__.py +++ b/calendar_backend/routes/models/__init__.py @@ -15,7 +15,6 @@ ) from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost - __all__ = ( "CommentEventGet", "CommentLecturer", diff --git a/calendar_backend/routes/room/room.py b/calendar_backend/routes/room/room.py index 92191fcf..ea78d4c1 100644 --- a/calendar_backend/routes/room/room.py +++ b/calendar_backend/routes/room/room.py @@ -8,7 +8,6 @@ from calendar_backend.routes.models import GetListRoom, RoomGet, RoomPatch, RoomPost from calendar_backend.settings import get_settings - settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/room", tags=["Room"]) diff --git a/migrations/env.py b/migrations/env.py index 522e2171..32ec0f2a 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -6,7 +6,6 @@ from calendar_backend.models.base import DeclarativeBase from calendar_backend.settings import get_settings - # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config diff --git a/migrations/versions/0929a0a9586e_del_link.py b/migrations/versions/0929a0a9586e_del_link.py index cd5eec83..b60cdf60 100644 --- a/migrations/versions/0929a0a9586e_del_link.py +++ b/migrations/versions/0929a0a9586e_del_link.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '0929a0a9586e' down_revision = 'c66359fe2d1e' diff --git a/migrations/versions/3948c45f9977_building_url.py b/migrations/versions/3948c45f9977_building_url.py index 4ae8a80b..22f8ddd4 100644 --- a/migrations/versions/3948c45f9977_building_url.py +++ b/migrations/versions/3948c45f9977_building_url.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '3948c45f9977' down_revision = '63263ee9e08e' diff --git a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py index 9a9912ed..5436c78a 100644 --- a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py +++ b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '55a049fde8f4' down_revision = 'fe04c8baa5ab' @@ -45,9 +44,7 @@ def upgrade(): ), sa.PrimaryKeyConstraint('id'), ) - res = e.execute( - sa.text( - """ + res = e.execute(sa.text(""" with inner_q as ( select name, @@ -62,9 +59,7 @@ def upgrade(): ) select old_ids, group_ids from inner_q - """ - ) - ).all() + """)).all() to_delete, pairs = merge_groups(res) delete_old_events_query = ( diff --git a/migrations/versions/63263ee9e08e_fix_photo_paths.py b/migrations/versions/63263ee9e08e_fix_photo_paths.py index cb31fea1..9acc70ac 100644 --- a/migrations/versions/63263ee9e08e_fix_photo_paths.py +++ b/migrations/versions/63263ee9e08e_fix_photo_paths.py @@ -8,7 +8,6 @@ from alembic import op - # revision identifiers, used by Alembic. revision = '63263ee9e08e' down_revision = '6d57978a236e' diff --git a/migrations/versions/6d57978a236e_room_building.py b/migrations/versions/6d57978a236e_room_building.py index 05076119..301a6922 100644 --- a/migrations/versions/6d57978a236e_room_building.py +++ b/migrations/versions/6d57978a236e_room_building.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '6d57978a236e' down_revision = 'b0d96bbca3cd' diff --git a/migrations/versions/8bae03e22feb_many_to_many.py b/migrations/versions/8bae03e22feb_many_to_many.py index f80130d3..de4f037b 100644 --- a/migrations/versions/8bae03e22feb_many_to_many.py +++ b/migrations/versions/8bae03e22feb_many_to_many.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '8bae03e22feb' down_revision = '93612883178c' diff --git a/migrations/versions/93612883178c_init.py b/migrations/versions/93612883178c_init.py index 060ffe30..d2f80195 100644 --- a/migrations/versions/93612883178c_init.py +++ b/migrations/versions/93612883178c_init.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = '93612883178c' down_revision = None diff --git a/migrations/versions/b060027b11b3_eventuser_building.py b/migrations/versions/b060027b11b3_eventuser_building.py index 94b70bd6..f64a475c 100644 --- a/migrations/versions/b060027b11b3_eventuser_building.py +++ b/migrations/versions/b060027b11b3_eventuser_building.py @@ -5,9 +5,9 @@ Create Date: 2026-04-20 17:56:39.185374 """ -from alembic import op -import sqlalchemy as sa +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = 'b060027b11b3' @@ -18,15 +18,23 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table('event_user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('event_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('status', sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), nullable=False), - sa.Column('updated_at', sa.DateTime(), nullable=False), - sa.Column('is_deleted', sa.Boolean(), nullable=False), - sa.ForeignKeyConstraint(['event_id'], ['event.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + 'event_user', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('event_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column( + 'status', + sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False), + nullable=False, + ), + sa.Column('updated_at', sa.DateTime(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint( + ['event_id'], + ['event.id'], + ), + sa.PrimaryKeyConstraint('id'), ) op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey') op.drop_column('event', 'group_id') diff --git a/migrations/versions/b0d96bbca3cd_add_review.py b/migrations/versions/b0d96bbca3cd_add_review.py index a5f025ab..fabdcb75 100644 --- a/migrations/versions/b0d96bbca3cd_add_review.py +++ b/migrations/versions/b0d96bbca3cd_add_review.py @@ -1,7 +1,6 @@ import sqlalchemy as sa from alembic import op - revision = 'b0d96bbca3cd' down_revision = 'e111af54f4bb' branch_labels = None diff --git a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py index a86dce63..fc2a9aa5 100644 --- a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py +++ b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = 'c66359fe2d1e' down_revision = 'd6f98271bc6b' diff --git a/migrations/versions/d6f98271bc6b_no_datatype_directions.py b/migrations/versions/d6f98271bc6b_no_datatype_directions.py index cd26f282..132f4d9c 100644 --- a/migrations/versions/d6f98271bc6b_no_datatype_directions.py +++ b/migrations/versions/d6f98271bc6b_no_datatype_directions.py @@ -9,7 +9,6 @@ import sqlalchemy as sa from alembic import op - # revision identifiers, used by Alembic. revision = 'd6f98271bc6b' down_revision = '8bae03e22feb' diff --git a/migrations/versions/e111af54f4bb_refactoring.py b/migrations/versions/e111af54f4bb_refactoring.py index c599837a..f805a236 100644 --- a/migrations/versions/e111af54f4bb_refactoring.py +++ b/migrations/versions/e111af54f4bb_refactoring.py @@ -8,7 +8,6 @@ from alembic import op - # revision identifiers, used by Alembic. revision = 'e111af54f4bb' down_revision = '0929a0a9586e' diff --git a/migrations/versions/fe04c8baa5ab_fix_sa20.py b/migrations/versions/fe04c8baa5ab_fix_sa20.py index 225879f7..6fd5ebc4 100644 --- a/migrations/versions/fe04c8baa5ab_fix_sa20.py +++ b/migrations/versions/fe04c8baa5ab_fix_sa20.py @@ -10,7 +10,6 @@ from alembic import op from sqlalchemy.dialects import postgresql - # revision identifiers, used by Alembic. revision = 'fe04c8baa5ab' down_revision = '3948c45f9977' diff --git a/tests/event/event.py b/tests/event/event.py index 84ef9b2b..1597da95 100644 --- a/tests/event/event.py +++ b/tests/event/event.py @@ -7,7 +7,6 @@ from calendar_backend.models import Event, Group, Lecturer, Room - RESOURCE = "/event/" diff --git a/tests/group/group.py b/tests/group/group.py index 42b4a995..646776bc 100644 --- a/tests/group/group.py +++ b/tests/group/group.py @@ -7,7 +7,6 @@ from calendar_backend.models import Group - RESOURCE = "/group/" diff --git a/tests/lecturer/lecturer.py b/tests/lecturer/lecturer.py index 631a012d..8becd768 100644 --- a/tests/lecturer/lecturer.py +++ b/tests/lecturer/lecturer.py @@ -6,7 +6,6 @@ from calendar_backend.models.db import Lecturer - RESOURCE = "/lecturer/" diff --git a/tests/lecturer/photos.py b/tests/lecturer/photos.py index e194de99..01b54ecf 100644 --- a/tests/lecturer/photos.py +++ b/tests/lecturer/photos.py @@ -8,7 +8,6 @@ from calendar_backend.models.db import Photo from calendar_backend.settings import get_settings - settings = get_settings() settings.STATIC_PATH = './static' diff --git a/tests/room/room.py b/tests/room/room.py index aef49872..43cec77a 100644 --- a/tests/room/room.py +++ b/tests/room/room.py @@ -7,7 +7,6 @@ from calendar_backend.models import Room - RESOURCE = "/room/" From ad6c63b3c23e11a25f1fd7dc03e7b7fc0ab2915d Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:42:35 +0300 Subject: [PATCH 08/13] bug fix --- calendar_backend/__init__.py | 1 + calendar_backend/__main__.py | 1 + calendar_backend/methods/__init__.py | 1 + calendar_backend/methods/image.py | 1 + calendar_backend/methods/list_calendar.py | 1 + calendar_backend/methods/utils.py | 1 + calendar_backend/models/__init__.py | 1 + calendar_backend/routes/__init__.py | 1 + calendar_backend/routes/base.py | 7 +++++-- calendar_backend/routes/event/comment.py | 1 + calendar_backend/routes/event/comment_review.py | 1 + calendar_backend/routes/event/event.py | 1 + calendar_backend/routes/group/group.py | 1 + calendar_backend/routes/lecturer/comment.py | 1 + calendar_backend/routes/lecturer/comment_review.py | 1 + calendar_backend/routes/lecturer/lecturer.py | 1 + calendar_backend/routes/lecturer/photo.py | 1 + calendar_backend/routes/lecturer/photo_review.py | 1 + calendar_backend/routes/models/__init__.py | 1 + calendar_backend/routes/room/room.py | 1 + migrations/env.py | 1 + migrations/versions/0929a0a9586e_del_link.py | 1 + migrations/versions/3948c45f9977_building_url.py | 1 + .../55a049fde8f4_many_to_many_events_to_groups.py | 9 +++++++-- migrations/versions/63263ee9e08e_fix_photo_paths.py | 1 + migrations/versions/6d57978a236e_room_building.py | 1 + migrations/versions/8bae03e22feb_many_to_many.py | 1 + migrations/versions/93612883178c_init.py | 1 + migrations/versions/b060027b11b3_eventuser_building.py | 1 + migrations/versions/b0d96bbca3cd_add_review.py | 1 + .../c66359fe2d1e_photo_comment_is_deleted_flag.py | 1 + .../versions/d6f98271bc6b_no_datatype_directions.py | 1 + migrations/versions/e111af54f4bb_refactoring.py | 1 + migrations/versions/fe04c8baa5ab_fix_sa20.py | 1 + tests/event/event.py | 1 + tests/group/group.py | 1 + tests/lecturer/lecturer.py | 1 + tests/lecturer/photos.py | 1 + tests/room/room.py | 1 + 39 files changed, 49 insertions(+), 4 deletions(-) diff --git a/calendar_backend/__init__.py b/calendar_backend/__init__.py index ebcaeac8..fa9c0989 100644 --- a/calendar_backend/__init__.py +++ b/calendar_backend/__init__.py @@ -1,3 +1,4 @@ import os + __version__ = os.getenv('APP_VERSION', 'dev') diff --git a/calendar_backend/__main__.py b/calendar_backend/__main__.py index 0e4f8fdd..b83b5c92 100644 --- a/calendar_backend/__main__.py +++ b/calendar_backend/__main__.py @@ -4,6 +4,7 @@ from calendar_backend.routes import app + logging.basicConfig( filename=f'logger_{__name__}.log', level=logging.DEBUG, diff --git a/calendar_backend/methods/__init__.py b/calendar_backend/methods/__init__.py index 293232cf..e5f0de92 100644 --- a/calendar_backend/methods/__init__.py +++ b/calendar_backend/methods/__init__.py @@ -1,3 +1,4 @@ from . import utils + __all__ = ("utils",) diff --git a/calendar_backend/methods/image.py b/calendar_backend/methods/image.py index 46dcece9..d0e416e7 100644 --- a/calendar_backend/methods/image.py +++ b/calendar_backend/methods/image.py @@ -14,6 +14,7 @@ from calendar_backend.models.db import ApproveStatuses, Lecturer, Photo from calendar_backend.settings import get_settings + settings = get_settings() diff --git a/calendar_backend/methods/list_calendar.py b/calendar_backend/methods/list_calendar.py index 5bcd7660..e97b3c13 100644 --- a/calendar_backend/methods/list_calendar.py +++ b/calendar_backend/methods/list_calendar.py @@ -16,6 +16,7 @@ from . import utils + settings = get_settings() logger = logging.getLogger(__name__) diff --git a/calendar_backend/methods/utils.py b/calendar_backend/methods/utils.py index 094d1dee..88766af1 100644 --- a/calendar_backend/methods/utils.py +++ b/calendar_backend/methods/utils.py @@ -3,6 +3,7 @@ from calendar_backend.models.db import Event, Group, Lecturer, Room from calendar_backend.settings import get_settings + settings = get_settings() diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 71871c3d..43a817b2 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -13,6 +13,7 @@ Room, ) + __all__ = [ "Credentials", "Group", diff --git a/calendar_backend/routes/__init__.py b/calendar_backend/routes/__init__.py index 7c8d47d2..5086daf1 100644 --- a/calendar_backend/routes/__init__.py +++ b/calendar_backend/routes/__init__.py @@ -1,3 +1,4 @@ from .base import app + __all__ = ["app"] diff --git a/calendar_backend/routes/base.py b/calendar_backend/routes/base.py index 5ef1a837..5cdd7cdf 100644 --- a/calendar_backend/routes/base.py +++ b/calendar_backend/routes/base.py @@ -28,11 +28,13 @@ from .lecturer.photo_review import router as lecturer_photo_review_router from .room.room import router as room_router + settings = get_settings() logger = logging.getLogger(__name__) app = FastAPI( title='Сервис расписания', - description=dedent(""" + description=dedent( + """ API для работы с календарем физфака. Пример работы на питоне(Создание Room): @@ -47,7 +49,8 @@ headers={"Authorization": f"ТокенАвторизацииТвойФФ"} ) ``` - """), + """ + ), version=__version__, # Настраиваем интернет документацию root_path=settings.ROOT_PATH if __version__ != 'dev' else '', diff --git a/calendar_backend/routes/event/comment.py b/calendar_backend/routes/event/comment.py index afc57ca8..38cc954b 100644 --- a/calendar_backend/routes/event/comment.py +++ b/calendar_backend/routes/event/comment.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models.event import CommentEventGet, EventCommentPatch, EventCommentPost, EventComments from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment"]) diff --git a/calendar_backend/routes/event/comment_review.py b/calendar_backend/routes/event/comment_review.py index 14d41406..5dd81536 100644 --- a/calendar_backend/routes/event/comment_review.py +++ b/calendar_backend/routes/event/comment_review.py @@ -11,6 +11,7 @@ from calendar_backend.routes.models.event import CommentEventGet from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/event/{event_id}/comment", tags=["Event: Comment Review"]) diff --git a/calendar_backend/routes/event/event.py b/calendar_backend/routes/event/event.py index 1173724b..1af85121 100644 --- a/calendar_backend/routes/event/event.py +++ b/calendar_backend/routes/event/event.py @@ -22,6 +22,7 @@ ) from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/event", tags=["Event"]) diff --git a/calendar_backend/routes/group/group.py b/calendar_backend/routes/group/group.py index e8354f78..7125c2a6 100644 --- a/calendar_backend/routes/group/group.py +++ b/calendar_backend/routes/group/group.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import GetListGroup, GroupGet, GroupPatch, GroupPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/group", tags=["Group"]) diff --git a/calendar_backend/routes/lecturer/comment.py b/calendar_backend/routes/lecturer/comment.py index 10246374..a9cd9e9f 100644 --- a/calendar_backend/routes/lecturer/comment.py +++ b/calendar_backend/routes/lecturer/comment.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import CommentLecturer, LecturerCommentPatch, LecturerCommentPost, LecturerComments from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Comment"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/comment_review.py b/calendar_backend/routes/lecturer/comment_review.py index a36b455c..e9381548 100644 --- a/calendar_backend/routes/lecturer/comment_review.py +++ b/calendar_backend/routes/lecturer/comment_review.py @@ -10,6 +10,7 @@ from calendar_backend.models.db import CommentLecturer as DbCommentLecturer from calendar_backend.routes.models import CommentLecturer + router = APIRouter(prefix="/lecturer/{lecturer_id}/comment", tags=["Lecturer: Comment Review"], deprecated=True) diff --git a/calendar_backend/routes/lecturer/lecturer.py b/calendar_backend/routes/lecturer/lecturer.py index e03ac1d6..9320aab0 100644 --- a/calendar_backend/routes/lecturer/lecturer.py +++ b/calendar_backend/routes/lecturer/lecturer.py @@ -13,6 +13,7 @@ from calendar_backend.routes.models import GetListLecturer, LecturerGet, LecturerPatch, LecturerPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/lecturer", tags=["Lecturer"]) diff --git a/calendar_backend/routes/lecturer/photo.py b/calendar_backend/routes/lecturer/photo.py index eb625125..aebb0392 100644 --- a/calendar_backend/routes/lecturer/photo.py +++ b/calendar_backend/routes/lecturer/photo.py @@ -9,6 +9,7 @@ from calendar_backend.routes.models import LecturerPhotos, Photo from calendar_backend.settings import get_settings + settings = get_settings() router = APIRouter(prefix="/lecturer/{lecturer_id}", tags=["Lecturer: Photo"]) diff --git a/calendar_backend/routes/lecturer/photo_review.py b/calendar_backend/routes/lecturer/photo_review.py index ff3a5a56..a856876e 100644 --- a/calendar_backend/routes/lecturer/photo_review.py +++ b/calendar_backend/routes/lecturer/photo_review.py @@ -11,6 +11,7 @@ from calendar_backend.routes.models import Action, Photo from calendar_backend.routes.models.base import Base as BaseSchema + router = APIRouter(prefix="/lecturer/photo/review", tags=["Lecturer: Photo Review"]) diff --git a/calendar_backend/routes/models/__init__.py b/calendar_backend/routes/models/__init__.py index 1fa4ed69..bd80e638 100644 --- a/calendar_backend/routes/models/__init__.py +++ b/calendar_backend/routes/models/__init__.py @@ -15,6 +15,7 @@ ) from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost + __all__ = ( "CommentEventGet", "CommentLecturer", diff --git a/calendar_backend/routes/room/room.py b/calendar_backend/routes/room/room.py index ea78d4c1..92191fcf 100644 --- a/calendar_backend/routes/room/room.py +++ b/calendar_backend/routes/room/room.py @@ -8,6 +8,7 @@ from calendar_backend.routes.models import GetListRoom, RoomGet, RoomPatch, RoomPost from calendar_backend.settings import get_settings + settings = get_settings() logger = logging.getLogger(__name__) router = APIRouter(prefix="/room", tags=["Room"]) diff --git a/migrations/env.py b/migrations/env.py index 32ec0f2a..522e2171 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -6,6 +6,7 @@ from calendar_backend.models.base import DeclarativeBase from calendar_backend.settings import get_settings + # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config diff --git a/migrations/versions/0929a0a9586e_del_link.py b/migrations/versions/0929a0a9586e_del_link.py index b60cdf60..cd5eec83 100644 --- a/migrations/versions/0929a0a9586e_del_link.py +++ b/migrations/versions/0929a0a9586e_del_link.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '0929a0a9586e' down_revision = 'c66359fe2d1e' diff --git a/migrations/versions/3948c45f9977_building_url.py b/migrations/versions/3948c45f9977_building_url.py index 22f8ddd4..4ae8a80b 100644 --- a/migrations/versions/3948c45f9977_building_url.py +++ b/migrations/versions/3948c45f9977_building_url.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '3948c45f9977' down_revision = '63263ee9e08e' diff --git a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py index 5436c78a..9a9912ed 100644 --- a/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py +++ b/migrations/versions/55a049fde8f4_many_to_many_events_to_groups.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '55a049fde8f4' down_revision = 'fe04c8baa5ab' @@ -44,7 +45,9 @@ def upgrade(): ), sa.PrimaryKeyConstraint('id'), ) - res = e.execute(sa.text(""" + res = e.execute( + sa.text( + """ with inner_q as ( select name, @@ -59,7 +62,9 @@ def upgrade(): ) select old_ids, group_ids from inner_q - """)).all() + """ + ) + ).all() to_delete, pairs = merge_groups(res) delete_old_events_query = ( diff --git a/migrations/versions/63263ee9e08e_fix_photo_paths.py b/migrations/versions/63263ee9e08e_fix_photo_paths.py index 9acc70ac..cb31fea1 100644 --- a/migrations/versions/63263ee9e08e_fix_photo_paths.py +++ b/migrations/versions/63263ee9e08e_fix_photo_paths.py @@ -8,6 +8,7 @@ from alembic import op + # revision identifiers, used by Alembic. revision = '63263ee9e08e' down_revision = '6d57978a236e' diff --git a/migrations/versions/6d57978a236e_room_building.py b/migrations/versions/6d57978a236e_room_building.py index 301a6922..05076119 100644 --- a/migrations/versions/6d57978a236e_room_building.py +++ b/migrations/versions/6d57978a236e_room_building.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '6d57978a236e' down_revision = 'b0d96bbca3cd' diff --git a/migrations/versions/8bae03e22feb_many_to_many.py b/migrations/versions/8bae03e22feb_many_to_many.py index de4f037b..f80130d3 100644 --- a/migrations/versions/8bae03e22feb_many_to_many.py +++ b/migrations/versions/8bae03e22feb_many_to_many.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '8bae03e22feb' down_revision = '93612883178c' diff --git a/migrations/versions/93612883178c_init.py b/migrations/versions/93612883178c_init.py index d2f80195..060ffe30 100644 --- a/migrations/versions/93612883178c_init.py +++ b/migrations/versions/93612883178c_init.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = '93612883178c' down_revision = None diff --git a/migrations/versions/b060027b11b3_eventuser_building.py b/migrations/versions/b060027b11b3_eventuser_building.py index f64a475c..f013c1f3 100644 --- a/migrations/versions/b060027b11b3_eventuser_building.py +++ b/migrations/versions/b060027b11b3_eventuser_building.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = 'b060027b11b3' down_revision = '55a049fde8f4' diff --git a/migrations/versions/b0d96bbca3cd_add_review.py b/migrations/versions/b0d96bbca3cd_add_review.py index fabdcb75..a5f025ab 100644 --- a/migrations/versions/b0d96bbca3cd_add_review.py +++ b/migrations/versions/b0d96bbca3cd_add_review.py @@ -1,6 +1,7 @@ import sqlalchemy as sa from alembic import op + revision = 'b0d96bbca3cd' down_revision = 'e111af54f4bb' branch_labels = None diff --git a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py index fc2a9aa5..a86dce63 100644 --- a/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py +++ b/migrations/versions/c66359fe2d1e_photo_comment_is_deleted_flag.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = 'c66359fe2d1e' down_revision = 'd6f98271bc6b' diff --git a/migrations/versions/d6f98271bc6b_no_datatype_directions.py b/migrations/versions/d6f98271bc6b_no_datatype_directions.py index 132f4d9c..cd26f282 100644 --- a/migrations/versions/d6f98271bc6b_no_datatype_directions.py +++ b/migrations/versions/d6f98271bc6b_no_datatype_directions.py @@ -9,6 +9,7 @@ import sqlalchemy as sa from alembic import op + # revision identifiers, used by Alembic. revision = 'd6f98271bc6b' down_revision = '8bae03e22feb' diff --git a/migrations/versions/e111af54f4bb_refactoring.py b/migrations/versions/e111af54f4bb_refactoring.py index f805a236..c599837a 100644 --- a/migrations/versions/e111af54f4bb_refactoring.py +++ b/migrations/versions/e111af54f4bb_refactoring.py @@ -8,6 +8,7 @@ from alembic import op + # revision identifiers, used by Alembic. revision = 'e111af54f4bb' down_revision = '0929a0a9586e' diff --git a/migrations/versions/fe04c8baa5ab_fix_sa20.py b/migrations/versions/fe04c8baa5ab_fix_sa20.py index 6fd5ebc4..225879f7 100644 --- a/migrations/versions/fe04c8baa5ab_fix_sa20.py +++ b/migrations/versions/fe04c8baa5ab_fix_sa20.py @@ -10,6 +10,7 @@ from alembic import op from sqlalchemy.dialects import postgresql + # revision identifiers, used by Alembic. revision = 'fe04c8baa5ab' down_revision = '3948c45f9977' diff --git a/tests/event/event.py b/tests/event/event.py index 1597da95..84ef9b2b 100644 --- a/tests/event/event.py +++ b/tests/event/event.py @@ -7,6 +7,7 @@ from calendar_backend.models import Event, Group, Lecturer, Room + RESOURCE = "/event/" diff --git a/tests/group/group.py b/tests/group/group.py index 646776bc..42b4a995 100644 --- a/tests/group/group.py +++ b/tests/group/group.py @@ -7,6 +7,7 @@ from calendar_backend.models import Group + RESOURCE = "/group/" diff --git a/tests/lecturer/lecturer.py b/tests/lecturer/lecturer.py index 8becd768..631a012d 100644 --- a/tests/lecturer/lecturer.py +++ b/tests/lecturer/lecturer.py @@ -6,6 +6,7 @@ from calendar_backend.models.db import Lecturer + RESOURCE = "/lecturer/" diff --git a/tests/lecturer/photos.py b/tests/lecturer/photos.py index 01b54ecf..e194de99 100644 --- a/tests/lecturer/photos.py +++ b/tests/lecturer/photos.py @@ -8,6 +8,7 @@ from calendar_backend.models.db import Photo from calendar_backend.settings import get_settings + settings = get_settings() settings.STATIC_PATH = './static' diff --git a/tests/room/room.py b/tests/room/room.py index 43cec77a..aef49872 100644 --- a/tests/room/room.py +++ b/tests/room/room.py @@ -7,6 +7,7 @@ from calendar_backend.models import Room + RESOURCE = "/room/" From aa6f76ae55f760516b286cdd58bcbf922803179d Mon Sep 17 00:00:00 2001 From: Georgon Date: Thu, 23 Apr 2026 18:13:18 +0300 Subject: [PATCH 09/13] post event/{event_id}/visit/ --- calendar_backend/models/__init__.py | 3 + calendar_backend/routes/base.py | 2 + calendar_backend/routes/event/user_event.py | 80 +++++++++++++++++++++ calendar_backend/routes/models/__init__.py | 3 + calendar_backend/routes/models/visit.py | 16 +++++ 5 files changed, 104 insertions(+) create mode 100644 calendar_backend/routes/event/user_event.py create mode 100644 calendar_backend/routes/models/visit.py diff --git a/calendar_backend/models/__init__.py b/calendar_backend/models/__init__.py index 71871c3d..6016ed07 100644 --- a/calendar_backend/models/__init__.py +++ b/calendar_backend/models/__init__.py @@ -8,6 +8,8 @@ EventsGroups, EventsLecturers, EventsRooms, + EventUser, + EventUserStatus, Group, Lecturer, Room, @@ -27,4 +29,5 @@ "ApproveStatuses", "EventsGroups", "EventUser", + "EventUserStatus", ] diff --git a/calendar_backend/routes/base.py b/calendar_backend/routes/base.py index 5ef1a837..1b45c08b 100644 --- a/calendar_backend/routes/base.py +++ b/calendar_backend/routes/base.py @@ -20,6 +20,7 @@ from .event.comment import router as event_comment_router from .event.comment_review import router as event_comment_review_router from .event.event import router as event_router +from .event.user_event import router as user_event_router from .group.group import router as group_router from .lecturer.comment import router as lecturer_comment_router from .lecturer.comment_review import router as lecturer_comment_review_router @@ -125,3 +126,4 @@ async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) - app.include_router(event_router) app.include_router(event_comment_router) app.include_router(event_comment_review_router) +app.include_router(user_event_router) diff --git a/calendar_backend/routes/event/user_event.py b/calendar_backend/routes/event/user_event.py new file mode 100644 index 00000000..7707495b --- /dev/null +++ b/calendar_backend/routes/event/user_event.py @@ -0,0 +1,80 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from fastapi_sqlalchemy import db +from auth_lib.fastapi import UnionAuth + +from calendar_backend.exceptions import ObjectNotFound +from calendar_backend.models import Event, EventUser, EventUserStatus +from calendar_backend.routes.models.visit import VisitRequest, VisitResponse + +router = APIRouter(prefix="/event", tags=["Event: Visit"]) + + +# class VisitRequest(BaseModel): +# status: EventUserStatus + + +# class VisitResponse(BaseModel): +# id: int +# event_id: int +# user_id: int +# status: EventUserStatus +# updated_at: str # ISO format datetime + +# class Config: + # from_attributes = True + + +@router.post("/{event_id}/visit", response_model=VisitResponse) +async def set_event_visit_status( + event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) +) -> VisitResponse: + """ + Отметить посещение мероприятия для текущего пользователя. + """ + user_id = auth.get('id') + if user_id is None: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="User ID not found in authentication data", + ) + + try: + _ = Event.get(event_id, with_deleted=False, session=db.session) + except ObjectNotFound: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Event with id {event_id} not found", + ) + + # Поиск/создание записи о посещении + existing = ( + db.session.query(EventUser) + .filter( + EventUser.event_id == event_id, + EventUser.user_id == user_id, + EventUser.is_deleted == False, + ) + .first() + ) + + if existing: + existing.status = visit.status + db.session.flush() + result = existing + else: + result = EventUser.create( + session=db.session, + event_id=event_id, + user_id=user_id, + status=visit.status, + ) + + db.session.commit() + + return VisitResponse( + id=result.id, + event_id=result.event_id, + user_id=result.user_id, + status=result.status, + updated_at=result.updated_at.isoformat(), + ) diff --git a/calendar_backend/routes/models/__init__.py b/calendar_backend/routes/models/__init__.py index 1fa4ed69..444c1c96 100644 --- a/calendar_backend/routes/models/__init__.py +++ b/calendar_backend/routes/models/__init__.py @@ -14,6 +14,7 @@ Photo, ) from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost +from .visit import VisitRequest, VisitResponse __all__ = ( "CommentEventGet", @@ -45,4 +46,6 @@ "RoomEvents", "RoomPatch", "RoomPost", + "VisitRequest", + "VisitResponse", ) diff --git a/calendar_backend/routes/models/visit.py b/calendar_backend/routes/models/visit.py new file mode 100644 index 00000000..2ba27835 --- /dev/null +++ b/calendar_backend/routes/models/visit.py @@ -0,0 +1,16 @@ +from pydantic import BaseModel +from calendar_backend.models import EventUserStatus + + +class VisitRequest(BaseModel): + status: EventUserStatus + + +class VisitResponse(BaseModel): + id: int + event_id: int + user_id: int + status: EventUserStatus + updated_at: str # ISO-формат + + model_config = {"from_attributes": True} \ No newline at end of file From 6094ad4d165ddc13bb6be2233dfc7b8bd18411e0 Mon Sep 17 00:00:00 2001 From: Georgon Date: Thu, 23 Apr 2026 18:29:12 +0300 Subject: [PATCH 10/13] fixed user_event --- calendar_backend/routes/event/user_event.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/calendar_backend/routes/event/user_event.py b/calendar_backend/routes/event/user_event.py index 7707495b..340dfa4a 100644 --- a/calendar_backend/routes/event/user_event.py +++ b/calendar_backend/routes/event/user_event.py @@ -8,22 +8,6 @@ router = APIRouter(prefix="/event", tags=["Event: Visit"]) - -# class VisitRequest(BaseModel): -# status: EventUserStatus - - -# class VisitResponse(BaseModel): -# id: int -# event_id: int -# user_id: int -# status: EventUserStatus -# updated_at: str # ISO format datetime - -# class Config: - # from_attributes = True - - @router.post("/{event_id}/visit", response_model=VisitResponse) async def set_event_visit_status( event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) @@ -46,7 +30,6 @@ async def set_event_visit_status( detail=f"Event with id {event_id} not found", ) - # Поиск/создание записи о посещении existing = ( db.session.query(EventUser) .filter( From c0d45e94501cf6504ee021993aac2add9ece3cb0 Mon Sep 17 00:00:00 2001 From: Georgon Date: Thu, 23 Apr 2026 18:32:00 +0300 Subject: [PATCH 11/13] user_event formatted --- calendar_backend/routes/event/user_event.py | 8 +++++--- calendar_backend/routes/models/visit.py | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/calendar_backend/routes/event/user_event.py b/calendar_backend/routes/event/user_event.py index 340dfa4a..7c213e10 100644 --- a/calendar_backend/routes/event/user_event.py +++ b/calendar_backend/routes/event/user_event.py @@ -1,13 +1,15 @@ +from auth_lib.fastapi import UnionAuth from fastapi import APIRouter, Depends, HTTPException, status from fastapi_sqlalchemy import db -from auth_lib.fastapi import UnionAuth from calendar_backend.exceptions import ObjectNotFound -from calendar_backend.models import Event, EventUser, EventUserStatus +from calendar_backend.models import Event, EventUser from calendar_backend.routes.models.visit import VisitRequest, VisitResponse + router = APIRouter(prefix="/event", tags=["Event: Visit"]) + @router.post("/{event_id}/visit", response_model=VisitResponse) async def set_event_visit_status( event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) @@ -21,7 +23,7 @@ async def set_event_visit_status( status_code=status.HTTP_401_UNAUTHORIZED, detail="User ID not found in authentication data", ) - + try: _ = Event.get(event_id, with_deleted=False, session=db.session) except ObjectNotFound: diff --git a/calendar_backend/routes/models/visit.py b/calendar_backend/routes/models/visit.py index 2ba27835..a5783246 100644 --- a/calendar_backend/routes/models/visit.py +++ b/calendar_backend/routes/models/visit.py @@ -1,4 +1,5 @@ from pydantic import BaseModel + from calendar_backend.models import EventUserStatus @@ -12,5 +13,5 @@ class VisitResponse(BaseModel): user_id: int status: EventUserStatus updated_at: str # ISO-формат - - model_config = {"from_attributes": True} \ No newline at end of file + + model_config = {"from_attributes": True} From 08859e4fa2003fa03ccb0de2479e88ed382b9d8a Mon Sep 17 00:00:00 2001 From: Georgon Date: Sat, 25 Apr 2026 17:57:12 +0300 Subject: [PATCH 12/13] user_event fixed --- calendar_backend/routes/event/user_event.py | 44 ++++++--------------- calendar_backend/routes/models/visit.py | 4 +- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/calendar_backend/routes/event/user_event.py b/calendar_backend/routes/event/user_event.py index 7c213e10..3a100539 100644 --- a/calendar_backend/routes/event/user_event.py +++ b/calendar_backend/routes/event/user_event.py @@ -1,5 +1,5 @@ from auth_lib.fastapi import UnionAuth -from fastapi import APIRouter, Depends, HTTPException, status +from fastapi import APIRouter, Depends, HTTPException, status, Query from fastapi_sqlalchemy import db from calendar_backend.exceptions import ObjectNotFound @@ -12,54 +12,32 @@ @router.post("/{event_id}/visit", response_model=VisitResponse) async def set_event_visit_status( - event_id: int, visit: VisitRequest, auth: dict = Depends(UnionAuth(scopes=[])) -) -> VisitResponse: + event_id: int, + auth: dict = Depends(UnionAuth()), + visit: str = Query(enum=["no_status", "going", "not_going", "attended"], default="no_status"), +) -> VisitResponse: """ Отметить посещение мероприятия для текущего пользователя. """ user_id = auth.get('id') - if user_id is None: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="User ID not found in authentication data", - ) - try: - _ = Event.get(event_id, with_deleted=False, session=db.session) - except ObjectNotFound: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail=f"Event with id {event_id} not found", - ) + Event.get(event_id, with_deleted=False, session=db.session) existing = ( - db.session.query(EventUser) - .filter( - EventUser.event_id == event_id, - EventUser.user_id == user_id, - EventUser.is_deleted == False, - ) + EventUser.get_all(session=db.session) + .filter(EventUser.event_id == event_id, EventUser.user_id == user_id) .first() ) if existing: - existing.status = visit.status - db.session.flush() - result = existing + result = EventUser.update(existing.id, session=db.session, status=visit) else: result = EventUser.create( session=db.session, event_id=event_id, user_id=user_id, - status=visit.status, + status=visit, ) db.session.commit() - - return VisitResponse( - id=result.id, - event_id=result.event_id, - user_id=result.user_id, - status=result.status, - updated_at=result.updated_at.isoformat(), - ) + return VisitResponse.model_validate(result) \ No newline at end of file diff --git a/calendar_backend/routes/models/visit.py b/calendar_backend/routes/models/visit.py index a5783246..7f2757ce 100644 --- a/calendar_backend/routes/models/visit.py +++ b/calendar_backend/routes/models/visit.py @@ -1,5 +1,5 @@ from pydantic import BaseModel - +import datetime from calendar_backend.models import EventUserStatus @@ -12,6 +12,6 @@ class VisitResponse(BaseModel): event_id: int user_id: int status: EventUserStatus - updated_at: str # ISO-формат + updated_at: datetime.datetime model_config = {"from_attributes": True} From eb7ba9eead5b8a84b30ada525b9ea7b5392fbe33 Mon Sep 17 00:00:00 2001 From: Georgon Date: Sat, 25 Apr 2026 17:59:05 +0300 Subject: [PATCH 13/13] user_event formatted --- calendar_backend/routes/event/user_event.py | 11 +++++------ calendar_backend/routes/models/visit.py | 4 +++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/calendar_backend/routes/event/user_event.py b/calendar_backend/routes/event/user_event.py index 3a100539..b0b17fc3 100644 --- a/calendar_backend/routes/event/user_event.py +++ b/calendar_backend/routes/event/user_event.py @@ -1,10 +1,9 @@ from auth_lib.fastapi import UnionAuth -from fastapi import APIRouter, Depends, HTTPException, status, Query +from fastapi import APIRouter, Depends, Query from fastapi_sqlalchemy import db -from calendar_backend.exceptions import ObjectNotFound from calendar_backend.models import Event, EventUser -from calendar_backend.routes.models.visit import VisitRequest, VisitResponse +from calendar_backend.routes.models.visit import VisitResponse router = APIRouter(prefix="/event", tags=["Event: Visit"]) @@ -15,7 +14,7 @@ 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"), -) -> VisitResponse: +) -> VisitResponse: """ Отметить посещение мероприятия для текущего пользователя. """ @@ -30,7 +29,7 @@ async def set_event_visit_status( ) if existing: - result = EventUser.update(existing.id, session=db.session, status=visit) + result = EventUser.update(existing.id, session=db.session, status=visit) else: result = EventUser.create( session=db.session, @@ -40,4 +39,4 @@ async def set_event_visit_status( ) db.session.commit() - return VisitResponse.model_validate(result) \ No newline at end of file + return VisitResponse.model_validate(result) diff --git a/calendar_backend/routes/models/visit.py b/calendar_backend/routes/models/visit.py index 7f2757ce..6bd8f978 100644 --- a/calendar_backend/routes/models/visit.py +++ b/calendar_backend/routes/models/visit.py @@ -1,5 +1,7 @@ -from pydantic import BaseModel import datetime + +from pydantic import BaseModel + from calendar_backend.models import EventUserStatus