57 lines
2.7 KiB
Python
57 lines
2.7 KiB
Python
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy import DateTime, ForeignKey, Integer, JSON, String, Text, UniqueConstraint
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from .database import Base
|
|
|
|
|
|
def utc_now() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
class RawEvent(Base):
|
|
__tablename__ = "raw_events"
|
|
__table_args__ = (UniqueConstraint("source", "device_id", "external_id", name="uq_raw_event"),)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
source: Mapped[str] = mapped_column(String(32), index=True)
|
|
device_id: Mapped[str] = mapped_column(String(128), index=True)
|
|
external_id: Mapped[str] = mapped_column(String(128))
|
|
project_slug: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True)
|
|
occurred_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, index=True)
|
|
payload: Mapped[dict] = mapped_column(JSON)
|
|
received_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now)
|
|
|
|
|
|
class TimeEntry(Base):
|
|
__tablename__ = "time_entries"
|
|
__table_args__ = (UniqueConstraint("source", "device_id", "external_id", name="uq_time_entry"),)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
source: Mapped[str] = mapped_column(String(32), index=True)
|
|
device_id: Mapped[str] = mapped_column(String(128), default="server", index=True)
|
|
external_id: Mapped[str] = mapped_column(String(128))
|
|
kind: Mapped[str] = mapped_column(String(32), default="tracked", index=True)
|
|
status: Mapped[str] = mapped_column(String(32), default="accepted", index=True)
|
|
start_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
|
|
end_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
|
|
duration_seconds: Mapped[int] = mapped_column(Integer)
|
|
task: Mapped[str] = mapped_column(String(512), default="")
|
|
project_slug: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True)
|
|
notes: Mapped[str] = mapped_column(Text, default="")
|
|
raw_event_id: Mapped[int | None] = mapped_column(ForeignKey("raw_events.id"), nullable=True)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now)
|
|
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now, onupdate=utc_now)
|
|
|
|
|
|
class CallImport(Base):
|
|
__tablename__ = "call_imports"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
filename: Mapped[str] = mapped_column(String(512))
|
|
stored_path: Mapped[str] = mapped_column(String(1024))
|
|
extraction_status: Mapped[str] = mapped_column(String(32), default="uploaded")
|
|
extracted_text: Mapped[str] = mapped_column(Text, default="")
|
|
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now)
|