Skip to content

Commit

Permalink
feat: allow to hide "music_room", "sports" and "moodle"
Browse files Browse the repository at this point in the history
  • Loading branch information
dantetemplar committed Feb 13, 2024
1 parent 2a5f0b6 commit cdb5a4b
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""music room sports moodle hidden
Revision ID: 6f44af938cdf
Revises: cba1388a6e8f
Create Date: 2024-02-13 05:37:56.186458
"""
# ruff: noqa: E501
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = "6f44af938cdf"
down_revision: Union[str, None] = "cba1388a6e8f"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column(
"users", sa.Column("music_room_hidden", sa.Boolean(), server_default=sa.text("false"), nullable=False)
)
op.add_column("users", sa.Column("sports_hidden", sa.Boolean(), server_default=sa.text("false"), nullable=False))
op.add_column("users", sa.Column("moodle_hidden", sa.Boolean(), server_default=sa.text("false"), nullable=False))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("users", "moodle_hidden")
op.drop_column("users", "sports_hidden")
op.drop_column("users", "music_room_hidden")
# ### end Alembic commands ###
21 changes: 16 additions & 5 deletions src/api/users/routes.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Literal

from fastapi import HTTPException
from pydantic import BaseModel
from sqlalchemy.exc import IntegrityError
Expand Down Expand Up @@ -57,10 +59,7 @@ async def delete_favorite(
return updated_user


@router.post(
"/me/favorites/hide",
responses={200: {"description": "Favorite hidden"}},
)
@router.post("/me/favorites/hide", responses={200: {"description": "Favorite hidden"}})
async def hide_favorite(
user_id: CURRENT_USER_ID_DEPENDENCY,
group_id: int,
Expand All @@ -74,7 +73,19 @@ async def hide_favorite(
if await event_group_repository.read(group_id) is None:
raise UserNotFoundException()
user_repository = Shared.f(SqlUserRepository)
updated_user = await user_repository.set_hidden(user_id=user_id, group_id=group_id, hide=hide)
updated_user = await user_repository.set_hidden_event_group(user_id=user_id, group_id=group_id, hide=hide)
return updated_user


@router.post("/me/{target}/hide", responses={200: {"description": "Target hidden"}})
async def hide_music_room(
user_id: CURRENT_USER_ID_DEPENDENCY, target: Literal["music-room", "sports", "moodle"], hide: bool = True
) -> ViewUser:
"""
Hide music room from current user
"""
user_repository = Shared.f(SqlUserRepository)
updated_user = await user_repository.set_hidden(user_id=user_id, target=target, hide=hide)
return updated_user


Expand Down
24 changes: 22 additions & 2 deletions src/repositories/users/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import random
import string
from typing import Literal

from sqlalchemy import select, delete
from sqlalchemy import select, delete, update
from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
Expand Down Expand Up @@ -154,7 +155,7 @@ async def remove_favorite(self, user_id: int, favorite_id: int) -> ViewUser:
await session.commit()
return ViewUser.model_validate(user)

async def set_hidden(self, user_id: int, group_id: int, hide: bool = True) -> "ViewUser":
async def set_hidden_event_group(self, user_id: int, group_id: int, hide: bool = True) -> "ViewUser":
async with self._create_session() as session:
# find favorite where user_id and group_id
q = (
Expand All @@ -175,6 +176,25 @@ async def set_hidden(self, user_id: int, group_id: int, hide: bool = True) -> "V
await session.commit()
return ViewUser.model_validate(user)

async def set_hidden(self, user_id: int, target: Literal["music-room", "sports", "moodle"], hide: bool = True):
async with self._create_session() as session:
q = (
update(User)
.where(User.id == user_id)
.values(
{
"music_room_hidden": hide if target == "music-room" else User.music_room_hidden,
"sports_hidden": hide if target == "sports" else User.sports_hidden,
"moodle_hidden": hide if target == "moodle" else User.moodle_hidden,
}
)
.returning(User)
.options(*_get_options)
)
user = await session.scalar(q)
await session.commit()
return ViewUser.model_validate(user)

async def link_calendar(self, user_id: int, calendar: "LinkedCalendarCreate") -> "LinkedCalendarView":
async with self._create_session() as session:
q = (
Expand Down
3 changes: 3 additions & 0 deletions src/schemas/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ class ViewUser(BaseModel):
name: Optional[str] = None
favorites_association: list["UserXFavoriteGroupView"] = Field(default_factory=list)
linked_calendars: dict[str, "LinkedCalendarView"] = Field(default_factory=dict)
music_room_hidden: bool
sports_hidden: bool
moodle_hidden: bool

@field_validator("favorites_association", mode="before")
def groups_to_list(cls, v):
Expand Down
6 changes: 5 additions & 1 deletion src/storages/sql/models/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import TYPE_CHECKING

from sqlalchemy import ForeignKey
from sqlalchemy import ForeignKey, false
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relationship, mapped_column, Mapped

Expand Down Expand Up @@ -44,6 +44,10 @@ class User(Base, IdMixin):
passive_deletes=True,
)

music_room_hidden: Mapped[bool] = mapped_column(nullable=False, default=False, server_default=false())
sports_hidden: Mapped[bool] = mapped_column(nullable=False, default=False, server_default=false())
moodle_hidden: Mapped[bool] = mapped_column(nullable=False, default=False, server_default=false())


class UserScheduleKeys(Base, IdMixin):
__tablename__ = "user_schedule_keys"
Expand Down
2 changes: 1 addition & 1 deletion tests/repositories/test_integrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ async def test_set_hidden(event_group_repository, user_repository):
assert user_x_group.event_group.id == event_group.id
assert user_x_group.hidden is False

await user_repository.set_hidden(user.id, event_group.id, True)
await user_repository.set_hidden_event_group(user.id, event_group.id, True)
updated_user = await user_repository.read(user.id)
user_x_group = updated_user.favorites_association[0]
assert user_x_group.hidden is True
Expand Down

1 comment on commit cdb5a4b

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
src
   config_schema.py741086%83–86, 90–97, 101–103
   constants.py880%2–37
   exceptions.py39390%1–126
   utils.py71710%1–116
src/api
   __main__.py770%1–12
   app.py29290%1–70
   dependencies.py31310%1–62
   routers.py880%1–10
src/api/auth
   __init__.py880%1–12
   common.py28280%1–50
   dependencies.py19190%1–47
   dev.py26260%1–36
   innopolis.py65650%1–106
   jwt.py52520%1–82
src/api/event_groups
   __init__.py550%1–9
   routes.py78780%1–221
src/api/ics
   __init__.py440%1–8
   routes.py1461460%1–319
src/api/root
   __init__.py440%1–8
   routes.py13130%1–31
src/api/tags
   __init__.py550%1–9
   routes.py12120%1–25
src/api/users
   __init__.py660%1–18
   routes.py73730%1–168
src/repositories
   crud.py94940%1–187
   ownership.py13130%1–29
src/repositories/event_groups
   __init__.py220%1–3
   repository.py64640%1–122
src/repositories/events
   __init__.py220%1–3
   repository.py49490%1–86
src/repositories/predefined
   __init__.py220%1–3
   repository.py1551550%1–219
src/repositories/tags
   __init__.py220%1–3
   repository.py75750%1–128
src/repositories/users
   __init__.py220%1–3
   repository.py1401400%1–258
src/schemas
   __init__.py770%2–27
   event_groups.py46460%1–92
   events.py70700%1–105
   linked.py27270%1–47
   ownership.py15150%1–23
   tags.py38380%1–54
   users.py38380%1–72
src/storages/sql
   __init__.py220%1–3
   storage.py21210%1–31
src/storages/sql/models
   __init__.py880%1–11
   __mixin__.py44440%1–86
   base.py440%1–7
   event_groups.py21210%1–52
   events.py26260%1–78
   linked.py15150%1–33
   tags.py13130%1–24
   users.py24240%1–57
TOTAL183617664% 

Tests Skipped Failures Errors Time
1 0 💤 0 ❌ 1 🔥 0.788s ⏱️

Please sign in to comment.