mod: админка (11) драфт ver2

This commit is contained in:
2026-08-23 18:27:22 +03:00
parent 1a285a61c6
commit f015351c42
+199 -74
View File
@@ -1,74 +1,199 @@
# from django.contrib import admin from django.contrib import admin
# from django.utils.html import format_html
# from .models import BlogPost, HalftoneItem, HalftoneVote from .models import TbHypn0Item, TbVote, TbBlogPost
#
#
# @admin.register(HalftoneItem) @admin.register(TbHypn0Item)
# class HalftoneItemAdmin(admin.ModelAdmin): class TbHypn0ItemAdmin(admin.ModelAdmin):
# list_display = ( """
# "hash_id", Панель управления гипно-картинами (модерация, просмотр статистики, редактирование).
# "title", Создание новых картин через админку заблокировано (создание только на фронтенде).
# "likes_count", """
# "views_count", list_display = (
# "score", "id",
# "is_curated", "s_hash_id",
# "is_public", "title_preview",
# "created_at", "i_level",
# ) "i_likes_count",
# list_filter = ( "i_claims_count",
# "is_curated", "i_views_count",
# "is_public", "f_score",
# "created_at", "is_public",
# ) "d_created_at",
# search_fields = ( )
# "hash_id", list_display_links = ("id", "s_hash_id", "title_preview")
# "title", list_filter = ("i_level", "is_public", "d_created_at")
# "promo_title", search_fields = ("s_hash_id", "s_title", "s_promo_title", "s_promo_url")
# ) readonly_fields = (
# readonly_fields = ( "id",
# "created_at", "s_hash_id",
# "score", "i_file_size",
# "file_size", "i_likes_count",
# ) "i_views_count",
# "i_claims_count",
# "i_promo_clicks",
# @admin.register(HalftoneVote) "d_created_at",
# class HalftoneVoteAdmin(admin.ModelAdmin): "d_updated_at",
# list_display = ( "svg_preview",
# "item", )
# "fingerprint", fieldsets = (
# "created_at", (
# ) "Основная информация",
# list_filter = ("created_at",) {
# search_fields = ( "fields": (
# "item__hash_id", "id",
# "item__title", "s_hash_id",
# "fingerprint", "s_title",
# ) "file_svg",
# readonly_fields = ("created_at",) "svg_preview",
# "i_file_size",
# "is_public",
# @admin.register(BlogPost) )
# class BlogPostAdmin(admin.ModelAdmin): },
# list_display = ( ),
# "title", (
# "slug", "Модерация и Smart Retention",
# "is_published", {
# "published_at", "fields": (
# "created_at", "i_level",
# ) "f_score",
# list_filter = ( ),
# "is_published", "description": "Уровень модерации и рейтинг 'гравитации' для ротации и очистки хранилища.",
# "published_at", },
# ) ),
# search_fields = ( (
# "title", "Метрики популярности",
# "slug", {
# "summary", "fields": (
# "content", "i_likes_count",
# ) "i_claims_count",
# prepopulated_fields = {"slug": ("title",)} "i_views_count",
# readonly_fields = ( ),
# "created_at", },
# "updated_at", ),
# ) (
"Промо-блок (Спонсоры и Авторы)",
{
"fields": (
"s_promo_url",
"s_promo_title",
"i_promo_clicks",
),
"classes": ("collapse",),
},
),
(
"Метаданные генерации",
{
"fields": ("j_metadata",),
"classes": ("collapse",),
},
),
(
"Временные метки",
{
"fields": ("d_created_at", "d_updated_at"),
"classes": ("collapse",),
},
),
)
def has_add_permission(self, request):
# Создание картин возможно только с фронтенда (требуется обработка растра и согласие пользователя)
return False
@admin.display(description="Название (HTML)")
def title_preview(self, obj):
return format_html(obj.s_title)
@admin.display(description="Превью SVG")
def svg_preview(self, obj):
if obj.file_svg:
return format_html(
'<div style="max-width: 250px; max-height: 250px; background: #1e293b; padding: 8px; border-radius: 8px;">'
'<img src="{}" style="max-width: 100%; max-height: 230px;" />'
'</div>',
obj.file_svg.url,
)
return "Нет файла"
@admin.register(TbVote)
class TbVoteAdmin(admin.ModelAdmin):
"""
Просмотр анонимного журнала голосов и отпечатков (только для чтения).
"""
list_display = ("id", "k_item", "i_direction", "fingerprint_short", "d_created_at")
list_filter = ("i_direction", "d_created_at")
search_fields = ("s_fingerprint", "k_item__s_hash_id", "k_item__s_title")
readonly_fields = ("id", "k_item", "i_direction", "s_fingerprint", "d_created_at")
ordering = ("-d_created_at",)
def has_add_permission(self, request):
return False
def has_change_permission(self, request, obj=None):
return False
@admin.display(description="Отпечаток (хэш)")
def fingerprint_short(self, obj):
return f"{obj.s_fingerprint[:12]}..."
@admin.register(TbBlogPost)
class TbBlogPostAdmin(admin.ModelAdmin):
"""
Управление статьями блога, документацией и инфо-страницами (HTML + etpgrf).
"""
list_display = ("id", "s_title_display", "slug", "is_published", "d_published_at", "d_created_at")
list_display_links = ("id", "s_title_display")
list_filter = ("is_published", "d_published_at", "d_created_at")
search_fields = ("s_title", "slug", "s_teaser", "s_content")
prepopulated_fields = {"slug": ("s_title",)}
readonly_fields = ("id", "d_created_at", "d_updated_at")
fieldsets = (
(
"Публикация",
{
"fields": (
"is_published",
"d_published_at",
)
},
),
(
"Заголовок и URL",
{
"fields": (
"s_title",
"slug",
"f_cover_img",
)
},
),
(
"Контент статьи (HTML + etpgrf)",
{
"fields": (
"s_teaser",
"s_content",
),
"description": "HTML-текст, типографированный etpgrf. Поддерживается чистая верстка.",
},
),
(
"Системные даты",
{
"fields": (
"id",
"d_created_at",
"d_updated_at",
),
"classes": ("collapse",),
},
),
)
@admin.display(description="Заголовок")
def s_title_display(self, obj):
return format_html(obj.s_title)