[release] Bump to version 65.6
All checks were successful
ci / test (push) Successful in 2m4s
ci / build-and-deploy (push) Has been skipped

- Add CSV endpoint for book scrobbles that LibraryThing can ingest
- Fix recursive bug in backup script
- TODOIST_* variable names flagged as TODOs (false positives)
This commit is contained in:
2026-08-23 19:12:28 -04:00
parent 2d80c26e6c
commit f213c7c296
3 changed files with 95 additions and 97 deletions

View File

@ -1,5 +1,97 @@
#+title: CHANGELOG
* Version 65.6 [3/3]
** DONE [#B] Add CSV endpoint for book scrobbles that LibraryThing can ingest :books:feature:export:
:PROPERTIES:
:ID: fd8a2778-ff46-394b-9868-edb9a48d0ce6
:END:
*** Description
We should provide an "Export for LibraryThings" link on the Books list page
which creates a CSV file of all books and tags for "in-progress" or "finished"
depending on whether the book has been marked as finished.
[[https://www.librarything.com/LibraryThingSample.csv][Sample CSV file]]
*** Implementation
Added a `books:librarything_export` endpoint (a `LoginRequiredMixin` view) that
streams a CSV matching the [[https://www.librarything.com/LibraryThingSample.csv][LibraryThing sample]]
column layout (TITLE, AUTHOR (last, first), DATE, ISBN, PUBLICATION INFO, TAGS,
RATING, REVIEW, DATE READ, PAGE COUNT, CALL NUMBER). The `TAGS` column is set to
"in-progress" or "finished" based on the user's last scrobble's
`long_play_complete` flag, `DATE READ` reflects that scrobble's timestamp when
finished, author names are reformatted to "last, first", and the export is
limited to books the user has scrobbled. The CSV logic lives in
`books.utils.librarything_csv_rows()` with a `format_author_last_first()`
helper; a link on the Books list page (`book_list.html`) triggers the download.
** DONE [#A] Fix recursive bug in backup script :backups:bug:
:PROPERTIES:
:ID: e986d35e-fc23-5d31-9d2a-0a95da4748a2
:END:
#+begin_src python
ERROR vrobbler.apps.scrobbles.tasks:808 backup_database backup_database: webdav upload failed: Client.mkdir() got an unexpected keyword argument 'recursive'
WARNING vrobbler.apps.scrobbles.tasks:537 _cleanup_failed_backup backup_database: removed incomplete backup /var/backups/vrobbler-backup-2026_08_23.sql.gz
ERROR vrobbler.apps.scrobbles.tasks:827 backup_database backup_database failed: Client.mkdir() got an unexpected keyword argument 'recursive'
DEBUG urllib3.connectionpool:2075 _new_conn Starting new HTTPS connection (1): ntfy.unbl.ink:443
#+end_src
** DONE [#B] TODOIST_* variable names flagged as TODOs (false positives) :tasks:metadata:cleanup:
:PROPERTIES:
:ID: b2fd3053-ce26-4cdb-bf37-578387fef6c7
:END:
*** Description
Need to clean up how we store task data in logdata.
*** Implementation
Task logdata now uses generic, source-agnostic field names instead of
per-source prefixed keys. `TaskLogData` gained `source_id`, `project_id`,
`state` and `raw_data` (the full remaining source payload kept for future
reference, matching the music track `raw_data` convention); the old
`orgmode_id`/`orgmode_state`/`orgmode_properties`/
`orgmode_drawers`/`orgmode_timestamps` and `todoist_id`/`todoist_project_id`
keys are gone. The todoist and emacs scrobblers and webhooks normalize into the
generic fields, and all `log__orgmode_id` / `log__todoist_id` lookups became
`log__source_id`. `Task.source_url_for_user()` now reads `source_id` (fixing the
`todist_id` typo and the never-matching log `source` check). New
`convert_orgmode_task_log_to_generic` / `convert_todoist_task_log_to_generic`
helpers (wired into the `convert_task_log_data` management command) migrate
existing scrobble logs. The scrobble "Edit Log" form no longer renders the
read-only fields (labels, source_id, project_id, state, raw_data) as disabled
inputs — they are excluded from the form and preserved on save — and the form
now defaults to being toggled open. Task labels render as read-only badges in
the detail view instead.
- Files:
- ~vrobbler/settings.py~ (lines 108-109) -- =TODOIST_CLIENT_ID=, =TODOIST_CLIENT_SECRET=
- ~vrobbler/apps/scrobbles/constants.py~ (line 74) -- =TODOIST_TASK_URL=
- These are variable/constant names for the Todoist integration, not actual
TODOs. No action needed, but worth noting they show up in searches.
*** Agent description
Task logdata now uses generic, source-agnostic field names instead of
per-source prefixed keys. `TaskLogData` gained `source_id`, `project_id`,
`state` and `raw_data` (the full remaining source payload kept for future
reference, matching the music track `raw_data` convention); the old `orgmode_*`
and `todoist_*` keys are gone. The todoist and emacs scrobblers and webhooks
normalize into the generic fields, and all `log__orgmode_id` / `log__todoist_id`
lookups became `log__source_id`. `Task.source_url_for_user()` now reads
`source_id` (fixing the `todist_id` typo and the never-matching log `source`
check). New `convert_orgmode_task_log_to_generic` /
`convert_todoist_task_log_to_generic` helpers (wired into the
`convert_task_log_data` management command) migrate existing scrobble logs.
The scrobble "Edit Log" form no longer renders the read-only fields (labels,
source_id, project_id, state, raw_data) as disabled inputs — they are excluded
from the form and preserved on save — and the form now defaults to being
toggled open. Task labels render as read-only badges in the detail view
instead.
* Version 65.5 [2/2]
** DONE [#A] Fix database backup bug where running in celery task fails :bug:backups:celery:tasks:
:PROPERTIES:

View File

@ -18,7 +18,7 @@ tasks, Todoist tasks, web pages I've read and trails I've hiked has turned out
to be sometimes cathartic and sometimes functional as I try to remember when I
did a thing.
* Backlog [2/35] :vrobbler:project:personal:
* Backlog [0/30] :vrobbler:project:personal:
** TODO [#C] Configure IMAP folder/start in user profile :imap:settings:
*** Description
@ -346,15 +346,11 @@ Last.FM timezone handling may not work 100% correctly. And maybe that's okay.
}
}
#+end_src
** TODO [#C] Allow auto trail tracking via email with Garmin LiveTrack URLs :trails:feature:
:PROPERTIES:
:ID: 133bcf71-078f-4efa-a029-1eae4b4d146d
:END:
** TODO [#C] Fix exporting so it works reliably :exporting:feature:
*** Description
The existing export function is very naieve. It runs in the web process, takes
The existing export function is very naive. It runs in the web process, takes
too long and just dumps tracks. We should make it more robust by creating one
CSV file per scrobble media type and writing them into a zip file that gets
placed in the media directory:
@ -594,93 +590,3 @@ The Edit log form should have from top to bottom:
- People (which should be similar to the Bird widget on BirdLocation and allow setting per user score, win true/false, rank, new true/false, seat_ordrer)
- Expansion ids (which should a multi-select widget of expansions for this game)
- Location (which should be a drop down of BoardGameLocations for this user)
** DONE [#B] Add CSV endpoint for book scrobbles that LibraryThing can ingest :books:feature:export:
:PROPERTIES:
:ID: fd8a2778-ff46-394b-9868-edb9a48d0ce6
:END:
*** Description
We should provide an "Export for LibraryThings" link on the Books list page
which creates a CSV file of all books and tags for "in-progress" or "finished"
depending on whether the book has been marked as finished.
[[https://www.librarything.com/LibraryThingSample.csv][Sample CSV file]]
*** Implementation
Added a `books:librarything_export` endpoint (a `LoginRequiredMixin` view) that
streams a CSV matching the [[https://www.librarything.com/LibraryThingSample.csv][LibraryThing sample]]
column layout (TITLE, AUTHOR (last, first), DATE, ISBN, PUBLICATION INFO, TAGS,
RATING, REVIEW, DATE READ, PAGE COUNT, CALL NUMBER). The `TAGS` column is set to
"in-progress" or "finished" based on the user's last scrobble's
`long_play_complete` flag, `DATE READ` reflects that scrobble's timestamp when
finished, author names are reformatted to "last, first", and the export is
limited to books the user has scrobbled. The CSV logic lives in
`books.utils.librarything_csv_rows()` with a `format_author_last_first()`
helper; a link on the Books list page (`book_list.html`) triggers the download.
** DONE [#A] Fix recursive bug in backup script :backups:bug:
:PROPERTIES:
:ID: e986d35e-fc23-5d31-9d2a-0a95da4748a2
:END:
#+begin_src python
ERROR vrobbler.apps.scrobbles.tasks:808 backup_database backup_database: webdav upload failed: Client.mkdir() got an unexpected keyword argument 'recursive'
WARNING vrobbler.apps.scrobbles.tasks:537 _cleanup_failed_backup backup_database: removed incomplete backup /var/backups/vrobbler-backup-2026_08_23.sql.gz
ERROR vrobbler.apps.scrobbles.tasks:827 backup_database backup_database failed: Client.mkdir() got an unexpected keyword argument 'recursive'
DEBUG urllib3.connectionpool:2075 _new_conn Starting new HTTPS connection (1): ntfy.unbl.ink:443
#+end_src
** DONE [#B] TODOIST_* variable names flagged as TODOs (false positives) :tasks:metadata:cleanup:
:PROPERTIES:
:ID: b2fd3053-ce26-4cdb-bf37-578387fef6c7
:END:
*** Description
Need to clean up how we store task data in logdata.
*** Implementation
Task logdata now uses generic, source-agnostic field names instead of
per-source prefixed keys. `TaskLogData` gained `source_id`, `project_id`,
`state` and `raw_data` (the full remaining source payload kept for future
reference, matching the music track `raw_data` convention); the old
`orgmode_id`/`orgmode_state`/`orgmode_properties`/
`orgmode_drawers`/`orgmode_timestamps` and `todoist_id`/`todoist_project_id`
keys are gone. The todoist and emacs scrobblers and webhooks normalize into the
generic fields, and all `log__orgmode_id` / `log__todoist_id` lookups became
`log__source_id`. `Task.source_url_for_user()` now reads `source_id` (fixing the
`todist_id` typo and the never-matching log `source` check). New
`convert_orgmode_task_log_to_generic` / `convert_todoist_task_log_to_generic`
helpers (wired into the `convert_task_log_data` management command) migrate
existing scrobble logs. The scrobble "Edit Log" form no longer renders the
read-only fields (labels, source_id, project_id, state, raw_data) as disabled
inputs — they are excluded from the form and preserved on save — and the form
now defaults to being toggled open. Task labels render as read-only badges in
the detail view instead.
- Files:
- ~vrobbler/settings.py~ (lines 108-109) -- =TODOIST_CLIENT_ID=, =TODOIST_CLIENT_SECRET=
- ~vrobbler/apps/scrobbles/constants.py~ (line 74) -- =TODOIST_TASK_URL=
- These are variable/constant names for the Todoist integration, not actual
TODOs. No action needed, but worth noting they show up in searches.
*** Agent description
Task logdata now uses generic, source-agnostic field names instead of
per-source prefixed keys. `TaskLogData` gained `source_id`, `project_id`,
`state` and `raw_data` (the full remaining source payload kept for future
reference, matching the music track `raw_data` convention); the old `orgmode_*`
and `todoist_*` keys are gone. The todoist and emacs scrobblers and webhooks
normalize into the generic fields, and all `log__orgmode_id` / `log__todoist_id`
lookups became `log__source_id`. `Task.source_url_for_user()` now reads
`source_id` (fixing the `todist_id` typo and the never-matching log `source`
check). New `convert_orgmode_task_log_to_generic` /
`convert_todoist_task_log_to_generic` helpers (wired into the
`convert_task_log_data` management command) migrate existing scrobble logs.
The scrobble "Edit Log" form no longer renders the read-only fields (labels,
source_id, project_id, state, raw_data) as disabled inputs — they are excluded
from the form and preserved on save — and the form now defaults to being
toggled open. Task labels render as read-only badges in the detail view
instead.

View File

@ -1,6 +1,6 @@
[tool.poetry]
name = "vrobbler"
version = "65.5"
version = "65.6"
description = ""
authors = ["Colin Powell <colin@unbl.ink>"]