From 102494ede73dfb88fbc1d1cda75dda3690685445 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Mon, 15 Jun 2026 13:25:10 -0400 Subject: [PATCH] [admin] Use raw ids where possible and simplify scrobble inlines --- PROJECT.org | 50 +++++++++++++++++++++---------- vrobbler/apps/beers/admin.py | 1 + vrobbler/apps/birds/admin.py | 1 + vrobbler/apps/boardgames/admin.py | 2 ++ vrobbler/apps/books/admin.py | 4 ++- vrobbler/apps/foods/admin.py | 1 + vrobbler/apps/people/admin.py | 1 + vrobbler/apps/podcasts/admin.py | 2 ++ vrobbler/apps/profiles/admin.py | 1 + vrobbler/apps/puzzles/admin.py | 1 + vrobbler/apps/scrobbles/admin.py | 42 ++++++++------------------ vrobbler/apps/sports/admin.py | 6 ++++ vrobbler/apps/videogames/admin.py | 1 + 13 files changed, 68 insertions(+), 45 deletions(-) diff --git a/PROJECT.org b/PROJECT.org index 846a8a0..9cb4114 100644 --- a/PROJECT.org +++ b/PROJECT.org @@ -88,8 +88,8 @@ fetching and simple saving. *** Metadata sources **** Scraper -* Backlog [0/16] :vrobbler:project:personal: -** TODO [#C] Create small utility to clean up tracks scrobbled with wonky playback times :vrobbler:personal:bug:music:scrobbles: +* Backlog [3/19] :vrobbler:project:personal: +** TODO [#C] Create small utility to clean up tracks scrobbled with wonky playback times :bug:music:scrobbles: :PROPERTIES: :ID: 702462cf-d54b-48c6-8a7c-78b8de751deb :END: @@ -387,11 +387,11 @@ fetching and simple saving. } } #+end_src -** TODO [#C] User should be able to enable auto trail tracking via amail reader with Garmin LiveTrack URLs :vrobbler:trails:project:feature:personal: +** 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:project:feature: +** TODO [#C] Fix exporting so it works reliably :exporting:feature: *** Description @@ -405,8 +405,7 @@ placed in the media directory: And this should all be done in a celery task that is just kicked off by the "Export" button on the frontend - -** TODO [#B] Add AllTrails as a source for Trail data :vrobbler:trails:feature:personal:project: +** TODO [#B] Add AllTrails as a source for Trail data :trails:feature: :PROPERTIES: :ID: 39313362-cdfe-46e7-bbd4-9139a65c0b3c :END: @@ -416,7 +415,7 @@ Pretty clear, I would love to make trails more useful. Historically I wasn't hiking a lot, which made the source for this a bit silly. But it's clear that AllTrails is the best source, though having TrailForks is nice to. -** TODO [#B] Add `garmin_activity_id` to the TrailLogData class :trails:feature:personal:project: +** TODO [#B] Add `garmin_activity_id` to the TrailLogData class :trails:feature: :PROPERTIES: :ID: 5a4fb0f8-0555-40ec-b06f-93c26bd686f4 :END: @@ -440,7 +439,7 @@ added. They should also probably support markdown formatting and that should be displayed in the template. -** TODO [#B] Add CSV endpoint for book scrobbles that LibraryThing can ingest :personal:project:books:feature:export: +** TODO [#B] Add CSV endpoint for book scrobbles that LibraryThing can ingest :books:feature:export: https://app.todoist.com/app/task/add-a-csv-endpoint-for-users-book-reads-that-library-thing-can-ingest-6X7QPMRp265xMXqg#comment-6X7QrXq6gJjMP4hg ** TODO [#B] Make IMAP and WebDAV configurable :webdav:feature:imap:importers: :PROPERTIES: @@ -465,7 +464,6 @@ needed import celery task. This is how the WebDAV celery task currently works. This would also be an opporunity to clean up the code around WebDAV imports and make them more re-usable for other import services. - ** TODO [#A] Add an exception list of artists as a constant that are exempted from splitting :music:artists:metadata: :PROPERTIES: :ID: fd86a11a-73ec-470d-b5e3-2d90ba9137c8 @@ -477,7 +475,6 @@ Certain artists like "Simon & Garfunkel" are actually one artist. While we don't tracks into featured artists, we should have a "LITERAL_ARTIST_TITLES" constant that can have exceptions like this put into it and then we stop trying to pull the artist apart when we run into it. - ** TODO [#A] Before enriching anything, trust the POST data :feature:scrobbles:metadata: :PROPERTIES: :ID: db6b05f8-09f4-49f5-9838-fbacc9fe9cd0 @@ -509,11 +506,6 @@ log a warning and move on. We should have a global view `/favorites/` that shows the logged in users's favorited media objects. -** TODO [#B] Scrape ComicBookRoundUp ratings for comic book metadata :vrobbler:books:feature:comicbook:personal:project: - -- Note taken on [2025-09-25 Thu 10:51] - - As an example https://comicbookroundup.com/comic-books/reviews/humanoids-publishing/the-history-of-science-fiction ** TODO [#B] Find page numbers for comic books from ComicVine :feature:books: :PROPERTIES: :ID: 79f867c3-1288-4143-b6bf-2a452983ee9f @@ -547,6 +539,34 @@ Examples of trends: - trail_scrobble__average_heartrate per trail - ... +** TODO [#B] Scrape ComicBookRoundUp ratings for comic book metadata :books:feature:comicbook: +:PROPERTIES: +:ID: b3cc57ca-3d2c-468d-ab7c-c47f1120309b +:END: + +*** Description +As an example https://comicbookroundup.com/comic-books/reviews/humanoids-publishing/the-history-of-science-fiction + +** DONE [#B] Paginate or limite scrobbles on media admin pages :admin:scrobbles:media: +:PROPERTIES: +:ID: f02e487b-d7ed-4834-838a-303560f2ad3b +:END: + +** DONE [#B] Clean up books admin :admin:books:bug: +:PROPERTIES: +:ID: 7539bee6-0a52-26f6-ebc6-5554ac49a716 +:END: +** DONE [#B] Clean up favorites admin :admin:favorites:scrobbles: +:PROPERTIES: +:ID: f2be0c69-1bf8-b5a3-5269-9c8ea873361d +:END: + + +*** Description + +Some FK lookups in admin should be raw_id_fields. + + * Version 51.4 [1/1] ** DONE [#A] Clean up metadata comicbook enrichment :bug:comics:books:metadata: :PROPERTIES: diff --git a/vrobbler/apps/beers/admin.py b/vrobbler/apps/beers/admin.py index 34d7775..7a08e17 100644 --- a/vrobbler/apps/beers/admin.py +++ b/vrobbler/apps/beers/admin.py @@ -27,6 +27,7 @@ class BeerAdmin(admin.ModelAdmin): "uuid", "title", ) + raw_id_fields = ("styles", "producer") ordering = ("-created",) search_fields = ("title",) inlines = [ diff --git a/vrobbler/apps/birds/admin.py b/vrobbler/apps/birds/admin.py index 106de5d..c7e3cb5 100644 --- a/vrobbler/apps/birds/admin.py +++ b/vrobbler/apps/birds/admin.py @@ -27,4 +27,5 @@ class BirdingLocationAdmin(admin.ModelAdmin): class BirdingCSVImportAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("uuid", "process_count", "processed_finished", "processing_started", "error_log") + raw_id_fields = ("user",) ordering = ("-created",) diff --git a/vrobbler/apps/boardgames/admin.py b/vrobbler/apps/boardgames/admin.py index c59c5ac..207dfb3 100644 --- a/vrobbler/apps/boardgames/admin.py +++ b/vrobbler/apps/boardgames/admin.py @@ -38,6 +38,7 @@ class BoardGameLocationAdmin(admin.ModelAdmin): "uuid", "geo_location", ) + raw_id_fields = ("geo_location",) ordering = ("-created",) @@ -49,6 +50,7 @@ class BoardGameAdmin(admin.ModelAdmin): "title", "published_year", ) + raw_id_fields = ("publisher", "publishers", "designers", "expansion_for_boardgame") search_fields = ("title",) ordering = ("-created",) inlines = [ diff --git a/vrobbler/apps/books/admin.py b/vrobbler/apps/books/admin.py index 4082475..5f2e1df 100644 --- a/vrobbler/apps/books/admin.py +++ b/vrobbler/apps/books/admin.py @@ -27,6 +27,7 @@ class BookAdmin(admin.ModelAdmin): "first_publish_year", "pages", ) + raw_id_fields = ("authors",) search_fields = ("name",) ordering = ("-created",) inlines = [ @@ -38,7 +39,7 @@ class BookAdmin(admin.ModelAdmin): @admin.register(Paper) -class BookAdmin(admin.ModelAdmin): +class PaperAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ( "title", @@ -47,6 +48,7 @@ class BookAdmin(admin.ModelAdmin): "first_publish_year", "pages", ) + raw_id_fields = ("authors",) search_fields = ("name",) ordering = ("-created",) inlines = [ diff --git a/vrobbler/apps/foods/admin.py b/vrobbler/apps/foods/admin.py index 6c1b685..f621e06 100644 --- a/vrobbler/apps/foods/admin.py +++ b/vrobbler/apps/foods/admin.py @@ -21,6 +21,7 @@ class FoodAdmin(admin.ModelAdmin): "uuid", "title", ) + raw_id_fields = ("category",) ordering = ("-created",) search_fields = ("title",) inlines = [ diff --git a/vrobbler/apps/people/admin.py b/vrobbler/apps/people/admin.py index 20240b3..a794c01 100644 --- a/vrobbler/apps/people/admin.py +++ b/vrobbler/apps/people/admin.py @@ -6,6 +6,7 @@ from people.models import Person, PersonScrobble class PersonAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "bgg_username", "bgstats_id") + raw_id_fields = ("user", "created_by") ordering = ("-created",) search_fields = ("name",) diff --git a/vrobbler/apps/podcasts/admin.py b/vrobbler/apps/podcasts/admin.py index 7770040..306d6a0 100644 --- a/vrobbler/apps/podcasts/admin.py +++ b/vrobbler/apps/podcasts/admin.py @@ -18,6 +18,7 @@ class PodcastAdmin(admin.ModelAdmin): "producer", "active", ) + raw_id_fields = ("producer",) ordering = ("name",) @@ -28,6 +29,7 @@ class PodcastEpisodeAdmin(admin.ModelAdmin): "title", "podcast", ) + raw_id_fields = ("podcast",) list_filter = ("podcast",) ordering = ("-created",) inlines = [ diff --git a/vrobbler/apps/profiles/admin.py b/vrobbler/apps/profiles/admin.py index e38136c..f8d71bb 100644 --- a/vrobbler/apps/profiles/admin.py +++ b/vrobbler/apps/profiles/admin.py @@ -6,6 +6,7 @@ from profiles.models import UserProfile @admin.register(UserProfile) class UserProfileAdmin(admin.ModelAdmin): date_hierarchy = "created" + raw_id_fields = ("user",) ordering = ("-created",) readonly_fields = ("timezone_change_log",) exclude = ( diff --git a/vrobbler/apps/puzzles/admin.py b/vrobbler/apps/puzzles/admin.py index 44f1043..f5c3c7a 100644 --- a/vrobbler/apps/puzzles/admin.py +++ b/vrobbler/apps/puzzles/admin.py @@ -21,6 +21,7 @@ class PuzzleAdmin(admin.ModelAdmin): "uuid", "title", ) + raw_id_fields = ("manufacturer",) ordering = ("-created",) search_fields = ("title",) inlines = [ diff --git a/vrobbler/apps/scrobbles/admin.py b/vrobbler/apps/scrobbles/admin.py index 10aae54..020ebfe 100644 --- a/vrobbler/apps/scrobbles/admin.py +++ b/vrobbler/apps/scrobbles/admin.py @@ -19,35 +19,11 @@ from scrobbles.mixins import Genre class ScrobbleInline(admin.TabularInline): model = Scrobble extra = 0 - raw_id_fields = ( - "video", - "channel", - "podcast_episode", - "track", - "video_game", - "book", - "paper", - "sport_event", - "food", - "board_game", - "geo_location", - "task", - "puzzle", - "mood", - "brick_set", - "trail", - "beer", - "web_page", - "life_event", - "birding_location", - "user", - ) - exclude = ( - "scrobble_log", - "timezone", - "videogame_save_data", - "screenshot", - ) + per_page = 15 + ordering = ("-timestamp",) + show_change_link = True + fields = ("timestamp", "media_type", "source", "in_progress") + readonly_fields = fields class ImportBaseAdmin(admin.ModelAdmin): @@ -121,7 +97,9 @@ class ScrobbleAdmin(admin.ModelAdmin): "user", ) raw_id_fields = ( + "user", "video", + "channel", "podcast_episode", "track", "sport_event", @@ -152,6 +130,7 @@ class ScrobbleAdmin(admin.ModelAdmin): "user", ) ordering = ("-timestamp",) + readonly_fields = ("share_token_version", "share_view_count") def media_name(self, obj): return obj.media_obj @@ -178,14 +157,19 @@ class FavoriteMediaAdmin(admin.ModelAdmin): list_filter = ("media_type", "sent_to_mopidy", "user") date_hierarchy = "created" raw_id_fields = ( + "user", "video", + "channel", "track", "podcast_episode", "sport_event", "book", + "paper", "video_game", "board_game", "geo_location", + "puzzle", + "food", "task", "mood", "brick_set", diff --git a/vrobbler/apps/sports/admin.py b/vrobbler/apps/sports/admin.py index f6731f9..70e6111 100644 --- a/vrobbler/apps/sports/admin.py +++ b/vrobbler/apps/sports/admin.py @@ -23,6 +23,7 @@ class SportAdmin(admin.ModelAdmin): class LeagueAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "abbreviation_str") + raw_id_fields = ("sport",) ordering = ("name",) @@ -30,6 +31,7 @@ class LeagueAdmin(admin.ModelAdmin): class PlayerAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "league", "team") + raw_id_fields = ("league", "team") ordering = ("name",) @@ -37,6 +39,7 @@ class PlayerAdmin(admin.ModelAdmin): class SeasonAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "league") + raw_id_fields = ("league",) ordering = ("name",) @@ -44,6 +47,7 @@ class SeasonAdmin(admin.ModelAdmin): class RoundAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "season") + raw_id_fields = ("season",) ordering = ("name",) @@ -51,6 +55,7 @@ class RoundAdmin(admin.ModelAdmin): class TeamAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "league") + raw_id_fields = ("league",) ordering = ("name",) @@ -63,6 +68,7 @@ class SportEventAdmin(admin.ModelAdmin): "event_type", "comp_str", ) + raw_id_fields = ("league", "teams", "players", "round") list_filter = ("league", "event_type") ordering = ("-created",) inlines = [ diff --git a/vrobbler/apps/videogames/admin.py b/vrobbler/apps/videogames/admin.py index f5d3092..5d10058 100644 --- a/vrobbler/apps/videogames/admin.py +++ b/vrobbler/apps/videogames/admin.py @@ -26,6 +26,7 @@ class GameAdmin(admin.ModelAdmin): "main_story_time", "release_year", ) + raw_id_fields = ("platforms",) search_fields = ( "title", "alternative_name",