Skip to content

Commit 8f5f1db

Browse files
GeorgonpetrCher
andauthored
EventUser table (#124)
* EventUser table * EventUser table with right format * black format * bug fix * EventUser init * EventUser fix * EventUser fixed with format * bug fix * post event/{event_id}/visit/ * fixed user_event * user_event formatted * user_event fixed * user_event formatted * user_event fixed 2 * format * comment * format * comment 2 --------- Co-authored-by: petrCher <88943157+petrCher@users.noreply.github.com>
1 parent ec6e1ab commit 8f5f1db

10 files changed

Lines changed: 143 additions & 3 deletions

File tree

.github/workflows/checks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
- uses: isort/isort-action@master
7070
with:
7171
requirementsFiles: "requirements.txt requirements.dev.txt"
72-
- uses: psf/black@stable
72+
- uses: psf/black@23.11.0
7373
- name: Comment if linting failed
7474
if: failure()
7575
uses: thollander/actions-comment-pull-request@v2

calendar_backend/models/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
EventsGroups,
99
EventsLecturers,
1010
EventsRooms,
11+
EventUser,
12+
EventUserStatus,
1113
Group,
1214
Lecturer,
1315
Room,
@@ -27,4 +29,6 @@
2729
"EventsRooms",
2830
"ApproveStatuses",
2931
"EventsGroups",
32+
"EventUser",
33+
"EventUserStatus",
3034
]

calendar_backend/models/db.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
from .base import ApproveStatuses, BaseDbModel
1515

1616

17+
class EventUserStatus(str, Enum):
18+
NO_STATUS: str = "no_status"
19+
GOING: str = "going"
20+
NOT_GOING: str = "not_going"
21+
ATTENDED: str = "attended"
22+
23+
1724
class Credentials(BaseDbModel):
1825
"""User credentials"""
1926

@@ -211,3 +218,14 @@ class CommentEvent(BaseDbModel):
211218
foreign_keys="CommentEvent.event_id",
212219
primaryjoin="and_(Event.id==CommentEvent.event_id, not_(Event.is_deleted))",
213220
)
221+
222+
223+
class EventUser(BaseDbModel):
224+
id: Mapped[int] = mapped_column(Integer, primary_key=True)
225+
event_id: Mapped[int] = mapped_column(Integer, ForeignKey("event.id"), nullable=False)
226+
user_id: Mapped[int] = mapped_column(Integer, nullable=False)
227+
status: Mapped[EventUserStatus] = mapped_column(DbEnum(EventUserStatus, native_enum=False), nullable=False)
228+
updated_at: Mapped[datetime] = mapped_column(
229+
DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow
230+
)
231+
is_deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)

calendar_backend/routes/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .event.comment import router as event_comment_router
2121
from .event.comment_review import router as event_comment_review_router
2222
from .event.event import router as event_router
23+
from .event.user_event import router as user_event_router
2324
from .group.group import router as group_router
2425
from .lecturer.comment import router as lecturer_comment_router
2526
from .lecturer.comment_review import router as lecturer_comment_review_router
@@ -128,3 +129,4 @@ async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -
128129
app.include_router(event_router)
129130
app.include_router(event_comment_router)
130131
app.include_router(event_comment_review_router)
132+
app.include_router(user_event_router)

calendar_backend/routes/event/event.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from datetime import date, datetime, timedelta
2+
from datetime import date, timedelta
33
from typing import Literal
44

55
from auth_lib.fastapi import UnionAuth
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from auth_lib.fastapi import UnionAuth
2+
from fastapi import APIRouter, Depends, Query
3+
from fastapi_sqlalchemy import db
4+
5+
from calendar_backend.models import Event, EventUser
6+
from calendar_backend.routes.models.visit import VisitResponse
7+
8+
9+
router = APIRouter(prefix="/event", tags=["Event: Visit"])
10+
11+
12+
@router.post("/{event_id}/visit", response_model=VisitResponse)
13+
async def set_event_visit_status(
14+
event_id: int,
15+
auth: dict = Depends(UnionAuth()),
16+
visit: str = Query(enum=["no_status", "going", "not_going"], default="no_status"),
17+
) -> VisitResponse:
18+
"""
19+
Отметить статус посещения мероприятия для текущего пользователя.
20+
21+
Параметры:
22+
event_id - id события, которому будет присвоен статус,
23+
visit - доступные пользователю статусы для присвоения событию (по умолчанию no_status), где:
24+
no_status - событие без пользовательского решения,
25+
going - событие, на которое пользователь решил сходить,
26+
not_going - событие, на которое пользователь решил не ходить.
27+
28+
Ошибки:
29+
ObjectNotFound - нет события с таким event_id
30+
"""
31+
user_id = auth.get('id')
32+
33+
Event.get(event_id, session=db.session)
34+
35+
existing = (
36+
EventUser.get_all(session=db.session)
37+
.filter(EventUser.event_id == event_id, EventUser.user_id == user_id)
38+
.first()
39+
)
40+
41+
if existing:
42+
result = EventUser.update(existing.id, session=db.session, status=visit)
43+
else:
44+
result = EventUser.create(
45+
session=db.session,
46+
event_id=event_id,
47+
user_id=user_id,
48+
status=visit,
49+
)
50+
51+
return VisitResponse.model_validate(result)

calendar_backend/routes/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
Photo,
1515
)
1616
from .room import GetListRoom, RoomEvents, RoomPatch, RoomPost
17+
from .visit import VisitResponse
1718

1819

1920
__all__ = (
@@ -46,4 +47,5 @@
4647
"RoomEvents",
4748
"RoomPatch",
4849
"RoomPost",
50+
"VisitResponse",
4951
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import datetime
2+
3+
from calendar_backend.models import EventUserStatus
4+
5+
from .base import Base
6+
7+
8+
class VisitResponse(Base):
9+
id: int
10+
event_id: int
11+
user_id: int
12+
status: EventUserStatus
13+
updated_at: datetime.datetime
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""EventUser building
2+
3+
Revision ID: b060027b11b3
4+
Revises: 55a049fde8f4
5+
Create Date: 2026-04-20 17:56:39.185374
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
from alembic import op
11+
12+
13+
# revision identifiers, used by Alembic.
14+
revision = 'b060027b11b3'
15+
down_revision = '55a049fde8f4'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.create_table(
23+
'event_user',
24+
sa.Column('id', sa.Integer(), nullable=False),
25+
sa.Column('event_id', sa.Integer(), nullable=False),
26+
sa.Column('user_id', sa.Integer(), nullable=False),
27+
sa.Column(
28+
'status',
29+
sa.Enum('NO_STATUS', 'GOING', 'NOT_GOING', 'ATTENDED', name='eventuserstatus', native_enum=False),
30+
nullable=False,
31+
),
32+
sa.Column('updated_at', sa.DateTime(), nullable=False),
33+
sa.Column('is_deleted', sa.Boolean(), nullable=False),
34+
sa.ForeignKeyConstraint(
35+
['event_id'],
36+
['event.id'],
37+
),
38+
sa.PrimaryKeyConstraint('id'),
39+
)
40+
op.drop_constraint(op.f('lesson_group_id_fkey'), 'event', type_='foreignkey')
41+
op.drop_column('event', 'group_id')
42+
# ### end Alembic commands ###
43+
44+
45+
def downgrade():
46+
# ### commands auto generated by Alembic - please adjust! ###
47+
op.add_column('event', sa.Column('group_id', sa.INTEGER(), autoincrement=False, nullable=True))
48+
op.create_foreign_key(op.f('lesson_group_id_fkey'), 'event', 'group', ['group_id'], ['id'])
49+
op.drop_table('event_user')
50+
# ### end Alembic commands ###

requirements.dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ pytest
22
pytest-cov
33
requests
44
pytest-mock
5-
black
5+
black==23.11.0
66
isort
77
autoflake

0 commit comments

Comments
 (0)