Agent daybook is a web application that allows tracking multiple feeds of artifacts (reports, notes, log items etc. etc.) - all the things that AI agents would be producing all day long.
Find a file
peter 4b5ec09ae2 Convert uploaded .xlsx files to csv artifacts server-side
Uploading a .xlsx file no longer becomes a generic downloadable binary -
it's read server-side with openpyxl and converted to a csv artifact,
rendering in the same interactive grid as a native CSV post. Detected by
content type or .xlsx extension (some clients send generic/incorrect
content types for multipart uploads). Only the active sheet converts;
formula cells use whatever cached result the spreadsheet software last
saved (openpyxl doesn't evaluate formulas itself). Corrupt/unreadable
files return 400.

Since the existing posting script already forwards any non-text file via
multipart with no special-casing, `daybook_post.py balance_sheet.xlsx`
already works with zero script changes - verified live.

Two real bugs found and fixed while building this, both now covered by
regression tests:
- {**a_querydict, ...} silently wrapped every value (including title) in
  a list - Python's ** spread on a dict subclass bypasses QueryDict's
  __getitem__ override and exposes its internal one-list-per-key storage
  directly. Fixed by building the delegated dict explicitly via .get().
- Pre-setting None for absent optional fields (e.g. source_prompt) defeated
  create_text_artifact's own data.get(field, default) calls, since .get()
  only falls through to its default when the key is *missing*, not when
  the value is None - caused a NOT NULL constraint failure. Fixed by only
  setting keys that were actually provided.
- csv.writer's default "\r\n" terminator was getting doubled by
  Path.write_text()'s own newline translation on Windows, producing a
  blank line between every row. Fixed with lineterminator="\n".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-02 16:29:39 +01:00
.claude/commands Initial public commit 2026-09-01 21:55:02 +01:00
artifacts Convert uploaded .xlsx files to csv artifacts server-side 2026-09-02 16:29:39 +01:00
daybook_project Fix concurrent posts racing past quota (issue #010) 2026-09-02 15:22:37 +01:00
deploy Close out issue 001: document CSRF/reverse-proxy requirement 2026-09-02 12:28:41 +01:00
docs Convert uploaded .xlsx files to csv artifacts server-side 2026-09-02 16:29:39 +01:00
issues Add json/csv support to the posting script (issue #012) 2026-09-02 15:38:47 +01:00
scripts Initial public commit 2026-09-01 21:55:02 +01:00
skills/daybook-posting Convert uploaded .xlsx files to csv artifacts server-side 2026-09-02 16:29:39 +01:00
static Add per-artifact public sharing 2026-09-02 16:00:39 +01:00
templates/artifacts Add per-artifact public sharing 2026-09-02 16:00:39 +01:00
tests Convert uploaded .xlsx files to csv artifacts server-side 2026-09-02 16:29:39 +01:00
.dockerignore Initial public commit 2026-09-01 21:55:02 +01:00
.gitignore Initial public commit 2026-09-01 21:55:02 +01:00
CLAUDE.md Add per-artifact public sharing 2026-09-02 16:00:39 +01:00
manage.py Initial public commit 2026-09-01 21:55:02 +01:00
requirements.txt Convert uploaded .xlsx files to csv artifacts server-side 2026-09-02 16:29:39 +01:00