64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
from __future__ import annotations
|
||
|
||
from datetime import datetime
|
||
|
||
from sqlalchemy import Boolean, DateTime, JSON, SmallInteger, String, func
|
||
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
||
from app.db.base import Base
|
||
|
||
|
||
class PushPreference(Base):
|
||
"""
|
||
用户推送偏好(以 client_user_id 为主键)。
|
||
"""
|
||
|
||
__tablename__ = "push_preferences"
|
||
|
||
client_user_id: Mapped[str] = mapped_column(
|
||
String(length=64),
|
||
primary_key=True,
|
||
comment="客户端用户标识(UUID)",
|
||
)
|
||
|
||
enabled: Mapped[bool] = mapped_column(
|
||
Boolean,
|
||
nullable=False,
|
||
server_default="0",
|
||
comment="是否开启每日提醒(enabled=false 或 times_per_day=0 均视为关闭)",
|
||
)
|
||
|
||
times_per_day: Mapped[int] = mapped_column(
|
||
SmallInteger,
|
||
nullable=False,
|
||
server_default="0",
|
||
comment="每天推送次数(0~5)",
|
||
)
|
||
|
||
timezone: Mapped[str | None] = mapped_column(
|
||
String(length=64),
|
||
nullable=True,
|
||
comment="IANA 时区(例如 Asia/Shanghai),来自客户端上报",
|
||
)
|
||
|
||
locale: Mapped[str | None] = mapped_column(
|
||
String(length=32),
|
||
nullable=True,
|
||
comment="客户端语言(例如 zh-CN/en/zh-TW),用于文案语言选择",
|
||
)
|
||
|
||
user_profile_json: Mapped[dict | None] = mapped_column(
|
||
JSON,
|
||
nullable=True,
|
||
comment="用户画像(V1.2;可选)。用于 Push 场景推荐文案生成。",
|
||
)
|
||
|
||
updated_at: Mapped[datetime] = mapped_column(
|
||
DateTime,
|
||
nullable=False,
|
||
server_default=func.now(),
|
||
server_onupdate=func.now(),
|
||
comment="更新时间",
|
||
)
|
||
|