Files
CIAgent/apps/api/app/models/enums.py
T
sakshamandClaude Sonnet 5 4ee38b6241 Add DB viewer access logging, account deletion, and forced password change
Logs a distinct db_viewer_accessed event (not just the earlier
session_created "requested" event) when an admin's browser actually
completes the hand-off into Adminer. Adds a password-confirmed
account-deletion box to Settings, relying on the existing ON DELETE
CASCADE foreign keys to clean up everything the account owns. Adds an
admin-only "require password change" flag that get_current_user
enforces server-side (403 on everything except /auth/me,
/auth/change-password, /auth/logout) - meant for handing a demo
account to someone with a known sample password.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-05 23:41:21 -04:00

182 lines
4.7 KiB
Python

"""Shared string enums for ORM models. Mirrored in apps/web/lib/types.ts and
packages/shared/src/index.ts - keep those in sync by hand when changing this."""
from __future__ import annotations
from enum import StrEnum
class CompanyStatus(StrEnum):
ACTIVE = "active"
PAUSED = "paused"
class MonitoringFrequency(StrEnum):
HOURLY = "hourly"
EVERY_6_HOURS = "every_6_hours"
EVERY_12_HOURS = "every_12_hours"
DAILY = "daily"
EVERY_2_DAYS = "every_2_days"
WEEKLY = "weekly"
EVERY_2_WEEKS = "every_2_weeks"
MONTHLY = "monthly"
CUSTOM = "custom"
# Minimum minutes represented by each non-custom frequency, used both to
# compute next_run and to enforce MINIMUM_MONITORING_INTERVAL_MINUTES.
FREQUENCY_MINUTES: dict[MonitoringFrequency, int] = {
MonitoringFrequency.HOURLY: 60,
MonitoringFrequency.EVERY_6_HOURS: 6 * 60,
MonitoringFrequency.EVERY_12_HOURS: 12 * 60,
MonitoringFrequency.DAILY: 24 * 60,
MonitoringFrequency.EVERY_2_DAYS: 2 * 24 * 60,
MonitoringFrequency.WEEKLY: 7 * 24 * 60,
MonitoringFrequency.EVERY_2_WEEKS: 14 * 24 * 60,
MonitoringFrequency.MONTHLY: 30 * 24 * 60,
}
class SeverityLevel(StrEnum):
CRITICAL = "critical"
HIGH = "high"
MEDIUM = "medium"
LOW = "low"
# Ordering for threshold comparisons (index 0 = most severe).
SEVERITY_ORDER: list[SeverityLevel] = [
SeverityLevel.CRITICAL,
SeverityLevel.HIGH,
SeverityLevel.MEDIUM,
SeverityLevel.LOW,
]
class NotificationType(StrEnum):
EMAIL = "email"
SMS = "sms"
CONSOLE = "console"
class SourceType(StrEnum):
WEBSITE = "website"
RSS = "rss"
CUSTOM_URL = "custom_url"
SEC_EDGAR = "sec_edgar"
GITHUB = "github"
JOB_POSTING = "job_posting"
PATENT = "patent"
REVIEW = "review"
GOV_CONTRACT = "gov_contract"
class SourceStatus(StrEnum):
ACTIVE = "active"
DISABLED = "disabled"
RATE_LIMITED = "rate_limited"
AUTH_REQUIRED = "auth_required"
BLOCKED_BY_POLICY = "blocked_by_policy"
FAILED = "failed"
class MonitoringRunTrigger(StrEnum):
SCHEDULED = "scheduled"
MANUAL = "manual"
INITIAL = "initial"
RETRY = "retry"
class MonitoringRunStatus(StrEnum):
QUEUED = "queued"
RUNNING = "running"
SUCCESSFUL = "successful"
PARTIAL = "partial"
FAILED = "failed"
class ChangeType(StrEnum):
NEW_DOCUMENT = "new_document"
REMOVED_DOCUMENT = "removed_document"
CONTENT_MODIFIED = "content_modified"
PRICE_CHANGE = "price_change"
LEADERSHIP_CHANGE = "leadership_change"
FILING_NEW = "filing_new"
class ChangeStatus(StrEnum):
NEW = "new"
ACKNOWLEDGED = "acknowledged"
DISMISSED = "dismissed"
class ReportType(StrEnum):
BASELINE = "baseline"
UPDATE = "update"
MONTHLY = "monthly"
MANUAL = "manual"
class NotificationDeliveryStatus(StrEnum):
PENDING = "pending"
SENT = "sent"
FAILED = "failed"
class EnrichmentStatus(StrEnum):
PENDING = "pending"
PARTIAL = "partial"
COMPLETE = "complete"
FAILED = "failed"
class EmailCodePurpose(StrEnum):
VERIFY_EMAIL = "verify_email"
PASSWORD_RESET = "password_reset"
class ThrottleAction(StrEnum):
RESEND_VERIFICATION = "resend_verification"
RESEND_RESET = "resend_reset"
FAILED_LOGIN = "failed_login"
VERIFY_EMAIL_CODE = "verify_email_code"
CONFIRM_RESET_CODE = "confirm_reset_code"
class SecurityEventType(StrEnum):
LOGIN_SUCCESS = "login_success"
LOGIN_FAILED = "login_failed"
ACCOUNT_LOCKED = "account_locked"
PASSWORD_RESET_REQUESTED = "password_reset_requested"
PASSWORD_RESET_COMPLETED = "password_reset_completed"
EMAIL_VERIFICATION_SENT = "email_verification_sent"
EMAIL_VERIFIED = "email_verified"
SERVER_SECRET_UPDATED = "server_secret_updated"
API_KEY_UPDATED = "api_key_updated"
DB_VIEWER_SESSION_CREATED = "db_viewer_session_created"
DB_VIEWER_ACCESSED = "db_viewer_accessed"
PASSWORD_CHANGED = "password_changed"
PASSWORD_CHANGE_REQUIRED = "password_change_required"
class ApiKeyProvider(StrEnum):
"""Third-party providers a user can supply their own key for - see
app/services/user_api_key_service.py's PROVIDER_META for the matching
Settings field, display label, and credits/notes shown in Settings."""
ANTHROPIC = "anthropic"
BRAVE_SEARCH = "brave_search"
NINJAPEAR = "ninjapear"
USPTO = "uspto"
class SystemSecretKey(StrEnum):
"""Server-wide (not per-user) secrets an admin can configure from the
Settings page instead of only via .env - see
app/services/system_secret_service.py's META for the matching Settings
field and display label."""
TURNSTILE_SITE_KEY = "turnstile_site_key"
TURNSTILE_SECRET = "turnstile_secret"
RESEND_API_KEY = "resend_api_key"