Files
leocrm/app/models/user_preference.py
Agent Zero e17b9c9e56
Check Cross-Plugin Imports / check (push) Has been cancelled
Phase 2: Visibility Filter & Owner ID
- Add OwnedMixin to 15 models (contact_folder, user_preference, workspace,
  mcp_server_config, agent_definition, automation_definition, report_template,
  report_instance, entity_link, comm_conversation, proactive_suggestion,
  ai_agent, ai_chat_session, tag, share_link)
- Migration 0102: Add owner_id column to 15 tables with backfill from user_id
- Fix EntityPermission Registry: remove notification, add entity_attachment,
  entity_history, subtask, calendar, folder; fix wrong class names
  (DmsFile→File, CalendarEvent→CalendarEntry, Mailbox→MailAccount)
- Add apply_visibility_filter to list endpoints in tags, tasks, mcp_client,
  automation, report_generator, ai_assistant routes
- Add owner_id to create handlers for all new OwnedMixin models
- Patch tasks/services.py and automation/services.py list methods with
  user_id and is_system_admin parameters
2026-08-04 00:03:29 +02:00

50 lines
1.5 KiB
Python

"""User Preference model — per-user UI settings stored as key/value JSONB, tenant-scoped."""
from __future__ import annotations
import uuid
from typing import Any
from sqlalchemy import ForeignKey, Index, String, UniqueConstraint
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.dialects.postgresql import UUID as PGUUID
from sqlalchemy.orm import Mapped, mapped_column
from app.core.db import Base, TenantMixin
from app.models.owned_mixin import OwnedMixin
class UserPreference(Base, TenantMixin, OwnedMixin):
"""Per-user preference entry — stores a single UI preference as JSONB value.
Keys are arbitrary strings (e.g. 'sidebar_collapsed', 'theme', 'active_tab').
Values are JSONB to support complex preference structures.
"""
__tablename__ = "user_preferences"
__table_args__ = (
UniqueConstraint(
"tenant_id",
"user_id",
"key",
name="uq_user_prefs_tenant_user_key",
),
Index(
"ix_user_prefs_tenant_user",
"tenant_id",
"user_id",
),
)
id: Mapped[uuid.UUID] = mapped_column(
PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4
)
user_id: Mapped[uuid.UUID] = mapped_column(
PGUUID(as_uuid=True),
ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
key: Mapped[str] = mapped_column(String(100), nullable=False)
value: Mapped[Any] = mapped_column(JSONB, nullable=False, default=dict)