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
« 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
5from sqlalchemy import BigInteger, DateTime, Enum, ForeignKey, Index, String, UniqueConstraint, func
6from sqlalchemy.orm import Mapped, mapped_column, relationship
8from couchers.models.base import Base
10if TYPE_CHECKING:
11 from couchers.models.users import User
14class AdminActionLevel(enum.Enum):
15 debug = enum.auto()
16 normal = enum.auto()
17 high = enum.auto()
20class AdminAction(Base, kw_only=True):
21 __tablename__ = "admin_actions"
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)
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)
29 action_type: Mapped[str] = mapped_column(String)
30 level: Mapped[AdminActionLevel] = mapped_column(Enum(AdminActionLevel), server_default="normal")
32 note: Mapped[str | None] = mapped_column(String, default=None)
33 tag: Mapped[str | None] = mapped_column(String, default=None)
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")
38 __table_args__ = (Index("ix_admin_actions_target_created", target_user_id, created),)
41class AdminTag(Base, kw_only=True):
42 __tablename__ = "admin_tags"
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)
49class UserAdminTag(Base, kw_only=True):
50 __tablename__ = "user_admin_tags"
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)
57 user: Mapped[User] = relationship(init=False, foreign_keys="UserAdminTag.user_id")
58 admin_tag: Mapped[AdminTag] = relationship(init=False)
60 __table_args__ = (UniqueConstraint("user_id", "admin_tag_id"),)