Keep e621 metadata on downloaded posts; clear up account roles

Roles:
- JakeBreathild is now staff + superuser (the real account); the 'jake'
  smoke-test account was demoted to a regular user
- /me exposes is_superuser and the account page shows an admin badge

e621 metadata:
- MediaItem gains e621_post_id and e621_data (trimmed post payload:
  tags by category, rating, score, favourites, comments, sources,
  description, pools, relationships, file info, uploader)
- Download to Library accepts the post payload from the SPA and stores
  it; the item's custom rating is seeded from the e621 rating when empty
- Library detail shows an e621 metadata card: link to the in-app post,
  score/favourites/comments, taxonomy-coloured tags, DText description,
  sources and pools; grid cards get an e621 badge and fall back to the
  e621 rating for their colour (display_rating)
- Guest visibility now also considers e621 tags, so downloaded explicit
  content is hidden from anonymous visitors
This commit is contained in:
2026-09-17 10:27:06 -05:00
parent e5cc63b0cc
commit ebac3ac922
13 changed files with 343 additions and 29 deletions
+14
View File
@@ -19,6 +19,7 @@ class MediaItemSerializer(serializers.ModelSerializer):
rating = serializers.ChoiceField(choices=["", "s", "q", "e"], required=False)
locations = MediaLocationSerializer(many=True, read_only=True)
j_id = serializers.SerializerMethodField()
display_rating = serializers.SerializerMethodField()
filename = serializers.SerializerMethodField()
extension = serializers.SerializerMethodField()
kind = serializers.SerializerMethodField()
@@ -33,6 +34,7 @@ class MediaItemSerializer(serializers.ModelSerializer):
"md5",
"size",
"rating",
"display_rating",
"tags",
"notes",
"filename",
@@ -40,6 +42,8 @@ class MediaItemSerializer(serializers.ModelSerializer):
"kind",
"uploaded_by",
"uploaded_by_id",
"e621_post_id",
"e621_data",
"locations",
"created_at",
"updated_at",
@@ -49,11 +53,14 @@ class MediaItemSerializer(serializers.ModelSerializer):
"j_id",
"md5",
"size",
"display_rating",
"filename",
"extension",
"kind",
"uploaded_by",
"uploaded_by_id",
"e621_post_id",
"e621_data",
"locations",
"created_at",
"updated_at",
@@ -62,6 +69,13 @@ class MediaItemSerializer(serializers.ModelSerializer):
def get_j_id(self, obj):
return f"J-{obj.id}"
def get_display_rating(self, obj):
if obj.rating:
return obj.rating
data = obj.e621_data or {}
rating = data.get("rating") if isinstance(data, dict) else None
return rating if rating in {"s", "q", "e"} else ""
def get_uploaded_by(self, obj):
return obj.uploaded_by.username if obj.uploaded_by else None