diff --git a/hypn0/hypn0_site/admin.py b/hypn0/hypn0_site/admin.py index e5bb6e0..9f35f3a 100644 --- a/hypn0/hypn0_site/admin.py +++ b/hypn0/hypn0_site/admin.py @@ -147,10 +147,7 @@ class TbHypn0ItemAdminForm(CodeMirrorFormMixin): model = TbHypn0Item fields = ( 's_title', "s_promo_title", "s_promo_url", "i_level", - "i_file_size", - "i_likes_count", - "i_views_count", - "i_claims_count", + "i_likes_count", "i_views_count", "i_claims_count", "f_score", "i_promo_clicks", ) @@ -173,8 +170,19 @@ class TbHypn0ItemAdminForm(CodeMirrorFormMixin): self.setup_codemirror_field('s_promo_url', language='text', css_class='codemirror-width-xl codemirror-no-lines') self.setup_codemirror_field('i_likes_count', language='text', - css_class='codemirror-width-xl codemirror-no-lines') + css_class='codemirror-width-s codemirror-no-lines') + self.setup_codemirror_field('i_claims_count', language='text', + css_class='codemirror-width-s codemirror-no-lines') + self.setup_codemirror_field('i_views_count', language='text', + css_class='codemirror-width-s codemirror-no-lines') + self.setup_codemirror_field('f_score', language='text', + css_class='codemirror-width-s codemirror-no-lines') + self.setup_codemirror_field('i_promo_clicks', language='text', + css_class='codemirror-width-s codemirror-no-lines') + self.setup_codemirror_field('j_metadata', language='json', + css_class='codemirror-width-sl codemirror-min-height-10') +# Конфигурация админки @admin.register(TbHypn0Item) class TbHypn0ItemAdmin(admin.ModelAdmin): """ @@ -182,92 +190,39 @@ class TbHypn0ItemAdmin(admin.ModelAdmin): Создание новых картин через админку заблокировано (создание только на фронтенде). """ form = TbHypn0ItemAdminForm - list_display = ( - "id", - "s_hash_id", - "title_preview", - "i_level", - "i_likes_count", - "i_claims_count", - "i_views_count", - "f_score", - "is_public", - "d_created_at", - ) + list_display = ("id", "s_hash_id", "title_preview", "i_level", "i_likes_count", "i_claims_count", + "i_views_count", "i_file_size", "f_score", "is_public", "d_created_at", ) list_display_links = ("id", "s_hash_id", "title_preview") list_filter = ("i_level", "is_public", "d_created_at") search_fields = ("s_hash_id", "s_title", "s_promo_title", "s_promo_url") - readonly_fields = ( - "id", - "s_hash_id", - "i_file_size", - # "i_likes_count", - "i_views_count", - "i_claims_count", - "i_promo_clicks", - "d_created_at", - "d_updated_at", - "svg_preview", - ) + readonly_fields = ("id", "s_hash_id", "i_file_size", "d_created_at", "d_updated_at", "svg_preview",) fieldsets = ( ("ID & Hash-ID", { "fields": (("id", "s_hash_id",), ), - "classes": ("collapse",), + "classes": ("collapse", ), }), ("Основная информация", { - "fields": ("s_title", - "file_svg", - "svg_preview", - "i_file_size", - "is_public", - ) - }, - ), - ( - "Модерация и Smart Retention", - { - "fields": ( - "i_level", - "f_score", - ), - "description": "Уровень модерации и рейтинг 'гравитации' для ротации и очистки хранилища.", - }, - ), - ( - "Метрики популярности", - { - "fields": ( - "i_likes_count", - "i_claims_count", - "i_views_count", - ), - }, - ), - ( - "Промо-блок (Спонсоры и Авторы)", - { - "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",), - }, - ), + "fields": ("s_title", ("file_svg", "svg_preview", "i_file_size", "is_public", ), ) + }), + ("Модерация и Smart Retention", { + "fields": (("i_level", "f_score", ), ), + "description": "Уровень модерации и рейтинг 'гравитации' для ротации и очистки хранилища.", + }), + ("Метрики популярности", { + "fields": ("i_likes_count", "i_claims_count", "i_views_count", ), + "classes": ("collapse", ), + }), + ("Промо-блок (Спонсоры и Авторы)", { + "fields": ("s_promo_url", "s_promo_title", "i_promo_clicks", ), + "classes": ("collapse",), + }), + ("Метаданные генерации", { + "fields": ("j_metadata",), + }), + ("Штампы времени", { + "fields": ("d_created_at", "d_updated_at"), + "classes": ("collapse",), + }), ) def has_add_permission(self, request): @@ -284,15 +239,16 @@ class TbHypn0ItemAdmin(admin.ModelAdmin): def svg_preview(self, obj): if obj.file_svg: return format_html( - '
' - '' + '
' + '' '
', obj.file_svg.url, ) return "Нет файла" + # ---- -# АДМИНКА ЛАЙКОВ/ДИСЛАЙКОВ +# АДМИНКА ЛАЙКОВ/ДИСЛАЙКОВ (все только на просмотр) @admin.register(TbVote) class TbVoteAdmin(admin.ModelAdmin): """ @@ -402,6 +358,7 @@ class BlogPostAdminForm(CodeMirrorFormMixin): self.setup_codemirror_field('s_content', language='html', css_class='codemirror-width-xl codemirror-min-height-10') +# Конфигурация админки @admin.register(TbBlogPost) class TbBlogPostAdmin(RequestInFormMixin, admin.ModelAdmin): """ diff --git a/hypn0/hypn0_site/models.py b/hypn0/hypn0_site/models.py index 10f5883..c74fc81 100644 --- a/hypn0/hypn0_site/models.py +++ b/hypn0/hypn0_site/models.py @@ -80,18 +80,18 @@ class TbHypn0Item(models.Model): i_likes_count = models.PositiveIntegerField( default=1, db_index=True, - verbose_name="Число лайков", + verbose_name="Лайков", help_text="Число лайков гипнотической SVG-картины. Поле используется для отображения в интерфейсе. Для расчета" " рейтинга популярности намеренно НЕ ИСПОЛЬЗУЕТСЯ. Рейтинг будет рассчитан на основе таблицы" " Голоса/Лайка с учетом весов лайков и клаймов.", ) i_views_count = models.PositiveIntegerField( default=1, - verbose_name="Число просмотров", + verbose_name="Просмотров", ) i_claims_count = models.PositiveIntegerField( default=0, - verbose_name="Число жалоб", + verbose_name="Жалоб", help_text="Число жалоб на гипнотическую SVG-картину. Поле используется для отображения в интерфейсе. Для расчета" " рейтинга популярности намеренно НЕ ИСПОЛЬЗУЕТСЯ. Рейтинг будет рассчитан на основе таблицы" " Голоса/Лайка с учетом весов лайков и клаймов.", @@ -99,7 +99,7 @@ class TbHypn0Item(models.Model): f_score = models.FloatField( default=0.0, db_index=True, - verbose_name="Рейтинг популярности", + verbose_name="Рейтинг", help_text="Рейтинг для Smart Retention и определения, что удалять при чистке по лимитам, а что оставлять", ) @@ -107,8 +107,8 @@ class TbHypn0Item(models.Model): i_level = models.IntegerField( choices=Level.choices, default=Level.CANDIDATE, - help_text="Уровень", - verbose_name="В какой группе находится SVG-файл генерации", + verbose_name="Уровень", + help_text="В какой группе находится SVG-файл генерации", ) is_public = models.BooleanField( default=True,