forked from Rockachopa/Timmy-time-dashboard
* polish: streamline nav, extract inline styles, improve tablet UX - Restructure desktop nav from 8+ flat links + overflow dropdown into 5 grouped dropdowns (Core, Agents, Intel, System, More) matching the mobile menu structure to reduce decision fatigue - Extract all inline styles from mission_control.html and base.html notification elements into mission-control.css with semantic classes - Replace JS-built innerHTML with secure DOM construction in notification loader and chat history - Add CONNECTING state to connection indicator (amber) instead of showing OFFLINE before WebSocket connects - Add tablet breakpoint (1024px) with larger touch targets for Apple Pencil / stylus use and safe-area padding for iPad toolbar - Add active-link highlighting in desktop dropdown menus - Rename "Mission Control" page title to "System Overview" to disambiguate from the chat home page - Add "Home — Timmy Time" page title to index.html https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h * fix(security): move auth-gate credentials to environment variables Hardcoded username, password, and HMAC secret in auth-gate.py replaced with os.environ lookups. Startup now refuses to run if any variable is unset. Added AUTH_GATE_SECRET/USER/PASS to .env.example. https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h * refactor(tooling): migrate from black+isort+bandit to ruff Replace three separate linting/formatting tools with a single ruff invocation. Updates tox.ini (lint, format, pre-push, pre-commit envs), .pre-commit-config.yaml, and CI workflow. Fixes all ruff errors including unused imports, missing raise-from, and undefined names. Ruff config maps existing bandit skips to equivalent S-rules. https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h --------- Co-authored-by: Claude <noreply@anthropic.com>
63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
from datetime import date, datetime
|
|
from enum import StrEnum
|
|
|
|
from sqlalchemy import JSON, Boolean, Column, Date, DateTime, Index, Integer, String
|
|
from sqlalchemy import Enum as SQLEnum
|
|
|
|
from .database import Base # Assuming a shared Base in models/database.py
|
|
|
|
|
|
class TaskState(StrEnum):
|
|
LATER = "LATER"
|
|
NEXT = "NEXT"
|
|
NOW = "NOW"
|
|
DONE = "DONE"
|
|
DEFERRED = "DEFERRED" # Task pushed to tomorrow
|
|
|
|
|
|
class TaskCertainty(StrEnum):
|
|
FUZZY = "FUZZY" # An intention without a time
|
|
SOFT = "SOFT" # A flexible task with a time
|
|
HARD = "HARD" # A fixed meeting/appointment
|
|
|
|
|
|
class Task(Base):
|
|
__tablename__ = "tasks"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
title = Column(String(255), nullable=False)
|
|
description = Column(String(1000), nullable=True)
|
|
|
|
state = Column(SQLEnum(TaskState), default=TaskState.LATER, nullable=False, index=True)
|
|
certainty = Column(SQLEnum(TaskCertainty), default=TaskCertainty.SOFT, nullable=False)
|
|
is_mit = Column(Boolean, default=False, nullable=False) # 1-3 per day
|
|
|
|
sort_order = Column(Integer, default=0, nullable=False)
|
|
|
|
# Time tracking
|
|
started_at = Column(DateTime, nullable=True)
|
|
completed_at = Column(DateTime, nullable=True)
|
|
deferred_at = Column(DateTime, nullable=True)
|
|
|
|
# Timestamps
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
|
|
|
|
__table_args__ = (Index("ix_task_state_order", "state", "sort_order"),)
|
|
|
|
|
|
class JournalEntry(Base):
|
|
__tablename__ = "journal_entries"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
entry_date = Column(Date, unique=True, nullable=False, index=True, default=date.today)
|
|
|
|
# Relationships to the 1-3 MITs for the day
|
|
mit_task_ids = Column(JSON, nullable=True)
|
|
|
|
evening_reflection = Column(String(2000), nullable=True)
|
|
gratitude = Column(String(500), nullable=True)
|
|
energy_level = Column(Integer, nullable=True) # User-reported, 1-10
|
|
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|