Files
Q-A_test/apps/secretary-api/app/db/models.py
T
SDI 12e4f17b62
CI / typecheck (push) Successful in 1m8s
CI / format (push) Failing after 1m6s
CI / lint (push) Failing after 49s
CI / test (push) Failing after 1m8s
first commit
2026-07-15 18:05:12 +09:00

204 lines
12 KiB
Python

from __future__ import annotations
from datetime import datetime
from sqlalchemy import JSON, BigInteger, Boolean, ForeignKey, String, Text, TIMESTAMP, text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
class Workspace(Base):
__tablename__ = "workspaces"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
workspace_type: Mapped[str] = mapped_column(String(20))
software_app_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
service_type_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
workspace_code: Mapped[str] = mapped_column(String(50), unique=True)
workspace_name: Mapped[str] = mapped_column(String(100))
is_active: Mapped[bool] = mapped_column(Boolean, server_default=text("1"))
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
tickets: Mapped[list[SupportTicket]] = relationship(back_populates="workspace")
approval_policies: Mapped[list[WorkspaceApprovalPolicy]] = relationship(back_populates="workspace")
attachments: Mapped[list[Attachment]] = relationship(back_populates="workspace")
class SupportTicket(Base):
__tablename__ = "support_tickets"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id"))
requester_id: Mapped[str] = mapped_column(String(100))
requester_tenant_id: Mapped[str] = mapped_column(String(100))
requester_contact: Mapped[str | None] = mapped_column(String(100), nullable=True)
ticket_type: Mapped[str] = mapped_column(String(30))
source_system: Mapped[str] = mapped_column(String(30), server_default=text("'ABC'"))
title: Mapped[str] = mapped_column(String(255))
description: Mapped[str] = mapped_column(Text)
category_code: Mapped[str | None] = mapped_column(String(20), nullable=True)
status_code: Mapped[str] = mapped_column(String(20))
approval_status: Mapped[str] = mapped_column(String(20), server_default=text("'NOT_REQUIRED'"))
sync_status: Mapped[str] = mapped_column(String(20), server_default=text("'PENDING'"))
issue_link_status: Mapped[str] = mapped_column(String(20), server_default=text("'NOT_REQUIRED'"))
is_secret: Mapped[bool] = mapped_column(Boolean, server_default=text("0"))
requires_approval: Mapped[bool] = mapped_column(Boolean, server_default=text("0"))
current_assignee_id: Mapped[str | None] = mapped_column(String(100), nullable=True)
current_assignee_tenant_id: Mapped[str | None] = mapped_column(String(100), nullable=True)
requested_start_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
requested_end_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
priority: Mapped[str] = mapped_column(String(20), server_default=text("'NORMAL'"))
extra_fields: Mapped[dict[str, str] | None] = mapped_column(JSON, nullable=True)
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
updated_at: Mapped[datetime] = mapped_column(
TIMESTAMP,
server_default=text("CURRENT_TIMESTAMP"),
server_onupdate=text("CURRENT_TIMESTAMP"),
)
workspace: Mapped[Workspace] = relationship(back_populates="tickets")
feedback_mapping: Mapped[ABCFeedbackMapping | None] = relationship(back_populates="ticket", uselist=False)
approvals: Mapped[list[RequestApproval]] = relationship(back_populates="ticket")
comments: Mapped[list[TicketComment]] = relationship(back_populates="ticket")
attachments: Mapped[list[Attachment]] = relationship(back_populates="ticket")
class ABCFeedbackMapping(Base):
__tablename__ = "abc_feedback_mappings"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
ticket_id: Mapped[int] = mapped_column(ForeignKey("support_tickets.id"), unique=True)
workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id"))
abc_channel_id: Mapped[str] = mapped_column(String(100))
abc_feedback_id: Mapped[str] = mapped_column(String(100), unique=True)
abc_feedback_url: Mapped[str | None] = mapped_column(Text, nullable=True)
sync_status: Mapped[str] = mapped_column(String(20), server_default=text("'SYNCED'"))
last_synced_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
ticket: Mapped[SupportTicket] = relationship(back_populates="feedback_mapping")
class RequestApproval(Base):
__tablename__ = "request_approvals"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
ticket_id: Mapped[int] = mapped_column(ForeignKey("support_tickets.id"))
workflow_policy_id: Mapped[int | None] = mapped_column(ForeignKey("workspace_approval_policies.id"), nullable=True)
workflow_step_id: Mapped[int | None] = mapped_column(ForeignKey("workspace_approval_steps.id"), nullable=True)
step_order: Mapped[int | None] = mapped_column(nullable=True)
approver_id: Mapped[str] = mapped_column(String(100))
approver_tenant_id: Mapped[str] = mapped_column(String(100))
approval_status: Mapped[str] = mapped_column(String(20))
comment: Mapped[str | None] = mapped_column(Text, nullable=True)
approved_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
ticket: Mapped[SupportTicket] = relationship(back_populates="approvals")
workflow_policy: Mapped[WorkspaceApprovalPolicy | None] = relationship(back_populates="approval_history")
workflow_step: Mapped[WorkspaceApprovalStep | None] = relationship(back_populates="approval_history")
class WorkspaceApprovalPolicy(Base):
__tablename__ = "workspace_approval_policies"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id"))
request_category_code: Mapped[str | None] = mapped_column(String(50), nullable=True)
ticket_type: Mapped[str | None] = mapped_column(String(30), nullable=True)
rule_name: Mapped[str] = mapped_column(String(100))
description: Mapped[str | None] = mapped_column(Text, nullable=True)
conditions: Mapped[dict[str, str] | None] = mapped_column(JSON, nullable=True)
is_active: Mapped[bool] = mapped_column(Boolean, server_default=text("1"))
version: Mapped[int] = mapped_column(server_default=text("1"))
created_by: Mapped[str | None] = mapped_column(String(100), nullable=True)
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
updated_at: Mapped[datetime] = mapped_column(
TIMESTAMP,
server_default=text("CURRENT_TIMESTAMP"),
server_onupdate=text("CURRENT_TIMESTAMP"),
)
workspace: Mapped[Workspace] = relationship(back_populates="approval_policies")
steps: Mapped[list[WorkspaceApprovalStep]] = relationship(back_populates="policy")
approval_history: Mapped[list[RequestApproval]] = relationship(back_populates="workflow_policy")
class WorkspaceApprovalStep(Base):
__tablename__ = "workspace_approval_steps"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
policy_id: Mapped[int] = mapped_column(ForeignKey("workspace_approval_policies.id"))
step_order: Mapped[int] = mapped_column()
approver_type: Mapped[str] = mapped_column(String(30))
approver_key: Mapped[str] = mapped_column(String(100))
approver_name: Mapped[str | None] = mapped_column(String(100), nullable=True)
approval_mode: Mapped[str] = mapped_column(String(20), server_default=text("'ALL'"))
is_required: Mapped[bool] = mapped_column(Boolean, server_default=text("1"))
sla_hours: Mapped[int | None] = mapped_column(nullable=True)
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
policy: Mapped[WorkspaceApprovalPolicy] = relationship(back_populates="steps")
approval_history: Mapped[list[RequestApproval]] = relationship(back_populates="workflow_step")
class TicketComment(Base):
__tablename__ = "ticket_comments"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
ticket_id: Mapped[int] = mapped_column(ForeignKey("support_tickets.id"))
parent_comment_id: Mapped[int | None] = mapped_column(ForeignKey("ticket_comments.id"), nullable=True)
author_id: Mapped[str] = mapped_column(String(100))
author_tenant_id: Mapped[str] = mapped_column(String(100))
author_name: Mapped[str | None] = mapped_column(String(100), nullable=True)
comment_type: Mapped[str] = mapped_column(String(20), server_default=text("'COMMENT'"))
content: Mapped[str] = mapped_column(Text)
is_internal: Mapped[bool] = mapped_column(Boolean, server_default=text("0"))
abc_comment_id: Mapped[str | None] = mapped_column(String(100), nullable=True)
sync_status: Mapped[str] = mapped_column(String(20), server_default=text("'PENDING'"))
edited_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
updated_at: Mapped[datetime] = mapped_column(
TIMESTAMP,
server_default=text("CURRENT_TIMESTAMP"),
server_onupdate=text("CURRENT_TIMESTAMP"),
)
deleted_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
ticket: Mapped[SupportTicket] = relationship(back_populates="comments")
parent_comment: Mapped[TicketComment | None] = relationship(remote_side=[id])
attachments: Mapped[list[Attachment]] = relationship(back_populates="comment")
class Attachment(Base):
__tablename__ = "attachments"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
ticket_id: Mapped[int] = mapped_column(ForeignKey("support_tickets.id"))
comment_id: Mapped[int | None] = mapped_column(ForeignKey("ticket_comments.id"), nullable=True)
workspace_id: Mapped[int] = mapped_column(ForeignKey("workspaces.id"))
uploader_id: Mapped[str] = mapped_column(String(100))
uploader_tenant_id: Mapped[str] = mapped_column(String(100))
original_file_name: Mapped[str] = mapped_column(String(255))
stored_file_name: Mapped[str | None] = mapped_column(String(255), nullable=True)
storage_provider: Mapped[str] = mapped_column(String(30), server_default=text("'LOCAL'"))
storage_bucket: Mapped[str | None] = mapped_column(String(255), nullable=True)
storage_key: Mapped[str] = mapped_column(String(500))
mime_type: Mapped[str | None] = mapped_column(String(100), nullable=True)
file_extension: Mapped[str | None] = mapped_column(String(20), nullable=True)
file_size: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
checksum_sha256: Mapped[str | None] = mapped_column(String(64), nullable=True)
abc_attachment_id: Mapped[str | None] = mapped_column(String(100), nullable=True)
attachment_status: Mapped[str] = mapped_column(String(20), server_default=text("'ACTIVE'"))
created_at: Mapped[datetime] = mapped_column(TIMESTAMP, server_default=text("CURRENT_TIMESTAMP"))
updated_at: Mapped[datetime] = mapped_column(
TIMESTAMP,
server_default=text("CURRENT_TIMESTAMP"),
server_onupdate=text("CURRENT_TIMESTAMP"),
)
deleted_at: Mapped[datetime | None] = mapped_column(TIMESTAMP, nullable=True)
ticket: Mapped[SupportTicket] = relationship(back_populates="attachments")
comment: Mapped[TicketComment | None] = relationship(back_populates="attachments")
workspace: Mapped[Workspace] = relationship(back_populates="attachments")