Cumulative checkpoint since 0.2.26:
- 0.2.27/28: entity valuation-history table; investor gain/loss = NAV +
distributions vs paid-in
- 0.2.29: Reset Fund Partners (endpoint, Partners-tab button, CLI, action)
- 0.2.30: "Current Capital Balance" label, %-only gain/loss
- 0.2.31: Management Entities rename, Carry Vehicle type, chart
distributions-line gate
- 0.2.32: LP-facing polish pass
* Ten31 brand palette from the logo (navy/mint); orange retired
* portfolio summary card across funds; gain labeled "net of paid-in"
* whole-dollar headline figures; "History · N quarters" toggle
* documents grouped by year with a "New" badge (users.docs_seen_at)
* eNAV-created members start on default password with login enabled;
enable-investor-logins CLI + StartOS action for existing accounts
* password minimum raised to 8 chars; login help line (Portal@ten31.xyz)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
1.4 KiB
Python
23 lines
1.4 KiB
Python
"""Application configuration via environment variables."""
|
|
|
|
import os
|
|
|
|
|
|
DB_PATH: str = os.getenv("TEN31_DB_PATH", "/data/ten31portal/portal.db")
|
|
SESSION_SECRET: str = os.getenv("TEN31_SESSION_SECRET", "change-me-in-production")
|
|
DOCS_DIR: str = os.getenv("TEN31_DOCS_DIR", "/data/ten31portal/documents")
|
|
# Cap on a single uploaded document. The docs dir shares the data volume with the DB, so an
|
|
# unbounded upload could fill the disk and take the portal down. Default 50 MB. The same cap
|
|
# also bounds spreadsheet imports (which must be read fully into memory to parse).
|
|
MAX_UPLOAD_SIZE: int = int(os.getenv("TEN31_MAX_UPLOAD_SIZE", str(50 * 1024 * 1024)))
|
|
|
|
# Investor accounts created by the eNAV import (and existing no-login accounts converted via
|
|
# the enable-investor-logins CLI/action) start with this password so the admin can hand out
|
|
# credentials easily; each investor changes it via the portal's own Change password.
|
|
DEFAULT_INVESTOR_PASSWORD: str = os.getenv("TEN31_DEFAULT_INVESTOR_PASSWORD", "Ten31Portal")
|
|
|
|
# Where start.sh records the randomly-generated initial admin password on first boot, so the
|
|
# operator can retrieve it once (via the "Show Initial Admin Password" service action) and then
|
|
# change it. Lives next to the DB on the 0600 data volume; removed once the password is reset.
|
|
ADMIN_PASSWORD_FILE: str = os.path.join(os.path.dirname(DB_PATH) or ".", ".admin-password")
|