Files
time_track_server/app/models.py
T

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)