Coverage for app / backend / src / couchers / models / admin.py: 100%

37 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-02-21 18:14 +0000

1import enum 

2from datetime import datetime 

3from typing import TYPE_CHECKING 

4 

5from sqlalchemy import BigInteger, DateTime, Enum, ForeignKey, Index, String, UniqueConstraint, func 

6from sqlalchemy.orm import Mapped, mapped_column, relationship 

7 

8from couchers.models.base import Base 

9 

10if TYPE_CHECKING: 

11 from couchers.models.users import User 

12 

13 

14class AdminActionLevel(enum.Enum): 

15 debug = enum.auto() 

16 normal = enum.auto() 

17 high = enum.auto() 

18 

19 

20class AdminAction(Base, kw_only=True): 

21 __tablename__ = "admin_actions" 

22 

23 id: Mapped[int] = mapped_column(BigInteger, primary_key=True, init=False) 

24 created: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), init=False) 

25 

26 admin_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) 

27 target_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) 

28 

29 action_type: Mapped[str] = mapped_column(String) 

30 level: Mapped[AdminActionLevel] = mapped_column(Enum(AdminActionLevel), server_default="normal") 

31 

32 note: Mapped[str | None] = mapped_column(String, default=None) 

33 tag: Mapped[str | None] = mapped_column(String, default=None) 

34 

35 admin_user: Mapped[User] = relationship(init=False, foreign_keys="AdminAction.admin_user_id") 

36 target_user: Mapped[User] = relationship(init=False, foreign_keys="AdminAction.target_user_id") 

37 

38 __table_args__ = (Index("ix_admin_actions_target_created", target_user_id, created),) 

39 

40 

41class AdminTag(Base, kw_only=True): 

42 __tablename__ = "admin_tags" 

43 

44 id: Mapped[int] = mapped_column(BigInteger, primary_key=True, init=False) 

45 tag: Mapped[str] = mapped_column(String, unique=True) 

46 created: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), init=False) 

47 

48 

49class UserAdminTag(Base, kw_only=True): 

50 __tablename__ = "user_admin_tags" 

51 

52 id: Mapped[int] = mapped_column(BigInteger, primary_key=True, init=False) 

53 user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True) 

54 admin_tag_id: Mapped[int] = mapped_column(ForeignKey("admin_tags.id"), index=True) 

55 created: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), init=False) 

56 

57 user: Mapped[User] = relationship(init=False, foreign_keys="UserAdminTag.user_id") 

58 admin_tag: Mapped[AdminTag] = relationship(init=False) 

59 

60 __table_args__ = (UniqueConstraint("user_id", "admin_tag_id"),)