Files
gartenmanager/backend/app/models/user.py

72 lines
2.2 KiB
Python
Raw Normal View History

import enum
import uuid
from datetime import datetime, timezone
from sqlalchemy import Boolean, DateTime, Enum, ForeignKey, String, UniqueConstraint, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
class TenantRole(str, enum.Enum):
READ_ONLY = "READ_ONLY"
READ_WRITE = "READ_WRITE"
TENANT_ADMIN = "TENANT_ADMIN"
class User(Base):
__tablename__ = "users"
id: Mapped[uuid.UUID] = mapped_column(
primary_key=True, default=uuid.uuid4, index=True
)
email: Mapped[str] = mapped_column(
String(255), unique=True, nullable=False, index=True
)
hashed_password: Mapped[str] = mapped_column(String(255), nullable=False)
full_name: Mapped[str] = mapped_column(String(255), nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
is_superadmin: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
server_default=func.now(),
onupdate=lambda: datetime.now(timezone.utc),
nullable=False,
)
# Relationships
user_tenants: Mapped[list["UserTenant"]] = relationship(
"UserTenant", back_populates="user", cascade="all, delete-orphan"
)
class UserTenant(Base):
__tablename__ = "user_tenants"
__table_args__ = (UniqueConstraint("user_id", "tenant_id", name="uq_user_tenant"),)
user_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("users.id", ondelete="CASCADE"),
primary_key=True,
)
tenant_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("tenants.id", ondelete="CASCADE"),
primary_key=True,
)
role: Mapped[TenantRole] = mapped_column(
Enum(TenantRole, name="tenant_role"),
nullable=False,
default=TenantRole.READ_ONLY,
)
# Relationships
user: Mapped["User"] = relationship("User", back_populates="user_tenants")
tenant: Mapped["Tenant"] = relationship( # noqa: F821
"Tenant", back_populates="user_tenants"
)