Commit graph

2 commits

Author SHA1 Message Date
e0f1cce626 Add per-user disk quotas, auto-eviction, and Keep flag
Bounds each user's disk footprint and makes throwaway artifacts self-clean:

- Per-user quota (default 1 GB) stored on a new UserProfile model,
  adjustable per user in Django admin. Artifact.size_bytes records each
  artifact's on-disk footprint (primary file + markdown sidecar) at
  ingest so usage is a cheap SUM.
- Automatic eviction: on each post, oldest unkept artifacts are deleted
  (files and rows) until the new one fits under quota. If the quota is
  full of kept artifacts, the post is rejected with HTTP 413 rather than
  evicting anything protected.
- Keep flag (Artifact.is_kept): a Keep button in the preview control bar
  toggles protection via POST /a/{id}/keep; kept items are never evicted.
  Kept rows show a green "K" badge in the listing.
- Details panel: a Details toggle in the control bar expands a panel
  under it with full source, type, created time, size, and tags.
- Settings -> Storage: usage bar (green/amber/red), used/quota summary,
  artifact and kept counts; superusers also see total allocated quota vs
  free disk with an oversubscription warning.
- Type indicator in the listing is now a small grey pill instead of
  plain text.

Storage accounting/eviction logic lives in artifacts/storage.py.
Migrations 0009 (fields + UserProfile) and 0010 (backfill sizes and
create profiles for existing users). Fresh installs no-op the backfill.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 10:07:28 +02:00
37cd96fa7a Add multi-user auth, settings area, and unified label feed
Turns Daybook into a multi-user tool and reworks the feed UI:

- Multi-user: Django session login (username/password + remember-me),
  per-user personal API tokens (DRF authtoken), whole app gated behind
  login. Each artifact has an owner; feeds are private per user.
- Rename persona -> source (free-text label for whatever posted an
  artifact: agent-profile, script, or person). source + tags form one
  unified label system; single label filter matches tags, source has
  its own filter/column/sidebar.
- Settings area (gear/user menu, top-right): Account (view/regenerate
  token) and Demo Data (in-app button seeding one artifact per kind).
  User account management via Django admin (superusers only).
- Feed rework: rolling 7-day window with sticky inline date separators
  and infinite scroll; left sidebar is now a Sources list with per-source
  unread counts; artifact type shown as text after title; source in its
  own column.
- Unread tracking: read_at on Artifact, marked read when previewed,
  bold titles for unread, sidebar unread badges, old banner removed.
- Tag colours: global shared registry, hash-based default with optional
  per-tag override via tag_colors on POST/PATCH.
- Ingest: token resolves owner; same source name under two users' tokens
  stays isolated. daybook_post.py renamed persona->source, requires a
  real token, --check accepts a bearer token. Docs updated to match.

Migrations 0004-0008 rename persona, add owner (nullable -> backfill to
first superuser -> required), and add read_at. Fresh installs no-op the
backfill.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 09:06:46 +02:00