mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-27 12:07:04 -05:00
feat: Introduce lists and reviews apps, refactor user list functionality from accounts, and add user profile fields.
This commit is contained in:
90
backend/apps/lists/admin.py
Normal file
90
backend/apps/lists/admin.py
Normal file
@@ -0,0 +1,90 @@
|
||||
from django.contrib import admin
|
||||
from django.db.models import Count
|
||||
from django.utils.html import format_html
|
||||
from apps.core.admin import (
|
||||
BaseModelAdmin,
|
||||
ExportActionMixin,
|
||||
QueryOptimizationMixin,
|
||||
TimestampFieldsMixin,
|
||||
)
|
||||
from .models import UserList, ListItem
|
||||
|
||||
|
||||
class ListItemInline(admin.TabularInline):
|
||||
"""Inline admin for ListItem within UserList admin."""
|
||||
model = ListItem
|
||||
extra = 1
|
||||
fields = ("content_type", "object_id", "rank", "notes")
|
||||
ordering = ("rank",)
|
||||
show_change_link = True
|
||||
|
||||
|
||||
@admin.register(UserList)
|
||||
class UserListAdmin(QueryOptimizationMixin, ExportActionMixin, TimestampFieldsMixin, BaseModelAdmin):
|
||||
"""Admin interface for UserList."""
|
||||
list_display = (
|
||||
"title",
|
||||
"user_link",
|
||||
"category",
|
||||
"is_public",
|
||||
"item_count",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
)
|
||||
list_filter = ("category", "is_public", "created_at", "updated_at")
|
||||
list_select_related = ["user"]
|
||||
list_prefetch_related = ["items"]
|
||||
search_fields = ("title", "user__username", "description")
|
||||
autocomplete_fields = ["user"]
|
||||
inlines = [ListItemInline]
|
||||
|
||||
export_fields = ["id", "title", "user", "category", "is_public", "created_at", "updated_at"]
|
||||
export_filename_prefix = "user_lists"
|
||||
|
||||
fieldsets = (
|
||||
(
|
||||
"Basic Information",
|
||||
{
|
||||
"fields": ("user", "title", "category", "description", "is_public"),
|
||||
"description": "List identification and categorization.",
|
||||
},
|
||||
),
|
||||
(
|
||||
"Timestamps",
|
||||
{
|
||||
"fields": ("created_at", "updated_at"),
|
||||
"classes": ("collapse",),
|
||||
},
|
||||
),
|
||||
)
|
||||
readonly_fields = ("created_at", "updated_at")
|
||||
|
||||
@admin.display(description="User")
|
||||
def user_link(self, obj):
|
||||
if obj.user:
|
||||
from django.urls import reverse
|
||||
url = reverse("admin:accounts_customuser_change", args=[obj.user.pk])
|
||||
return format_html('<a href="{}">{}</a>', url, obj.user.username)
|
||||
return "-"
|
||||
|
||||
@admin.display(description="Items")
|
||||
def item_count(self, obj):
|
||||
return obj.items.count()
|
||||
|
||||
def get_queryset(self, request):
|
||||
qs = super().get_queryset(request)
|
||||
qs = qs.annotate(_item_count=Count("items", distinct=True))
|
||||
return qs
|
||||
|
||||
|
||||
@admin.register(ListItem)
|
||||
class ListItemAdmin(QueryOptimizationMixin, BaseModelAdmin):
|
||||
"""Admin interface for ListItem."""
|
||||
list_display = (
|
||||
"user_list",
|
||||
"content_type",
|
||||
"object_id",
|
||||
"rank",
|
||||
)
|
||||
list_filter = ("user_list__category", "content_type", "rank")
|
||||
list_select_related = ["user_list", "user_list__user", "content_type"]
|
||||
Reference in New Issue
Block a user