del: модели и админка (18) Удалено избыточное поле i_file_size из модели TbHypn0Item ... везде, где использовалось, почистили + миграции
This commit is contained in:
@@ -191,18 +191,18 @@ class TbHypn0ItemAdmin(admin.ModelAdmin):
|
|||||||
"""
|
"""
|
||||||
form = TbHypn0ItemAdminForm
|
form = TbHypn0ItemAdminForm
|
||||||
list_display = ("id", "s_hash_id", "title_preview", "i_level", "i_likes_count", "i_claims_count",
|
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", )
|
"i_views_count", "file_size_display", "f_score", "is_public", "d_created_at", )
|
||||||
list_display_links = ("id", "s_hash_id", "title_preview")
|
list_display_links = ("id", "s_hash_id", "title_preview")
|
||||||
list_filter = ("i_level", "is_public", "d_created_at")
|
list_filter = ("i_level", "is_public", "d_created_at")
|
||||||
search_fields = ("s_hash_id", "s_title", "s_promo_title", "s_promo_url")
|
search_fields = ("s_hash_id", "s_title", "s_promo_title", "s_promo_url")
|
||||||
readonly_fields = ("id", "s_hash_id", "i_file_size", "d_created_at", "d_updated_at", "svg_preview",)
|
readonly_fields = ("id", "s_hash_id", "file_size_display", "d_created_at", "d_updated_at", "svg_preview",)
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
("ID & Hash-ID", {
|
("ID & Hash-ID", {
|
||||||
"fields": (("id", "s_hash_id",), ),
|
"fields": (("id", "s_hash_id",), ),
|
||||||
"classes": ("collapse", ),
|
"classes": ("collapse", ),
|
||||||
}),
|
}),
|
||||||
("Основная информация", {
|
("Основная информация", {
|
||||||
"fields": ("s_title", ("file_svg", "svg_preview", "i_file_size", "is_public", ), )
|
"fields": ("s_title", ("file_svg", "svg_preview", "file_size_display", "is_public", ), )
|
||||||
}),
|
}),
|
||||||
("Модерация и Smart Retention", {
|
("Модерация и Smart Retention", {
|
||||||
"fields": (("i_level", "f_score", ), ),
|
"fields": (("i_level", "f_score", ), ),
|
||||||
@@ -246,6 +246,20 @@ class TbHypn0ItemAdmin(admin.ModelAdmin):
|
|||||||
)
|
)
|
||||||
return "Нет файла"
|
return "Нет файла"
|
||||||
|
|
||||||
|
@admin.display(description="Размер файла")
|
||||||
|
def file_size_display(self, obj):
|
||||||
|
if obj and obj.file_svg:
|
||||||
|
try:
|
||||||
|
size_bytes = obj.file_svg.size
|
||||||
|
if size_bytes >= 1024 * 1024:
|
||||||
|
return f"{size_bytes / (1024 * 1024):.2f} МБ"
|
||||||
|
elif size_bytes >= 1024:
|
||||||
|
return f"{size_bytes / 1024:.1f} КБ"
|
||||||
|
return f"{size_bytes} Б"
|
||||||
|
except Exception:
|
||||||
|
return "—"
|
||||||
|
return "—"
|
||||||
|
|
||||||
|
|
||||||
# ----
|
# ----
|
||||||
# АДМИНКА ЛАЙКОВ/ДИСЛАЙКОВ (все только на просмотр)
|
# АДМИНКА ЛАЙКОВ/ДИСЛАЙКОВ (все только на просмотр)
|
||||||
|
|||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
# Generated by Django 6.1 on 2026-09-02 20:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('hypn0_site', '0002_alter_tbvote_options_alter_tbblogpost_id_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='i_file_size',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbblogpost',
|
||||||
|
name='slug',
|
||||||
|
field=models.SlugField(blank=True, default='', max_length=200, unique=True, verbose_name='URL-слаг'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='f_score',
|
||||||
|
field=models.FloatField(db_index=True, default=0.0, help_text='Рейтинг для Smart Retention и определения, что удалять при чистке по лимитам, а что оставлять', verbose_name='Рейтинг'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='i_claims_count',
|
||||||
|
field=models.PositiveIntegerField(default=0, help_text='Число жалоб на гипнотическую SVG-картину. Поле используется для отображения в интерфейсе. Для расчета рейтинга популярности намеренно НЕ ИСПОЛЬЗУЕТСЯ. Рейтинг будет рассчитан на основе таблицы <tt>Голоса/Лайка</tt> с учетом весов лайков и клаймов.', verbose_name='Жалоб'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='i_level',
|
||||||
|
field=models.IntegerField(choices=[(0, 'Candidate: Шум сознания'), (10, 'Voted: Плеск бессознательного'), (30, 'Moderated: Одобрено Мозговым Слизнем'), (1000, 'Locked: Глубокий транс'), (-20, 'Шейминг (аномальный наплыв жалоб)'), (-10, 'Подозрение на накрутку (спайк лайков)')], default=0, help_text='В какой группе находится SVG-файл генерации', verbose_name='Уровень'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='i_likes_count',
|
||||||
|
field=models.PositiveIntegerField(db_index=True, default=1, help_text='Число лайков гипнотической SVG-картины. Поле используется для отображения в интерфейсе. Для расчета рейтинга популярности намеренно НЕ ИСПОЛЬЗУЕТСЯ. Рейтинг будет рассчитан на основе таблицы <tt>Голоса/Лайка</tt> с учетом весов лайков и клаймов.', verbose_name='Лайков'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='tbhypn0item',
|
||||||
|
name='i_views_count',
|
||||||
|
field=models.PositiveIntegerField(default=1, verbose_name='Просмотров'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -14,7 +14,6 @@ class TbHypn0Item(models.Model):
|
|||||||
• s_hash_id: хэш-сумма шеринга для SVG-генерации (Hashids)
|
• s_hash_id: хэш-сумма шеринга для SVG-генерации (Hashids)
|
||||||
• s_title: Заголовок (до 255 символов, разрешен HTML)
|
• s_title: Заголовок (до 255 символов, разрешен HTML)
|
||||||
• file_svg: SVG-файл генерации
|
• file_svg: SVG-файл генерации
|
||||||
• i_file_size: размер файла в байтах
|
|
||||||
• j_metadata: метаданные файла JSON (параметры алгоритма генерации)
|
• j_metadata: метаданные файла JSON (параметры алгоритма генерации)
|
||||||
• i_likes_count: количество лайков
|
• i_likes_count: количество лайков
|
||||||
• i_views_count: количество просмотров
|
• i_views_count: количество просмотров
|
||||||
@@ -62,11 +61,6 @@ class TbHypn0Item(models.Model):
|
|||||||
verbose_name="SVG-файл",
|
verbose_name="SVG-файл",
|
||||||
help_text="Результирующий SVG-файл генерации",
|
help_text="Результирующий SVG-файл генерации",
|
||||||
)
|
)
|
||||||
i_file_size = models.PositiveIntegerField(
|
|
||||||
default=0,
|
|
||||||
verbose_name="Размер файла",
|
|
||||||
help_text="Размер файла в байтах",
|
|
||||||
)
|
|
||||||
|
|
||||||
# НА ВСЯКИЙ СЛУЧАЙ: Метаданные и снимок параметров для возможного клонирования настроек
|
# НА ВСЯКИЙ СЛУЧАЙ: Метаданные и снимок параметров для возможного клонирования настроек
|
||||||
j_metadata = models.JSONField(
|
j_metadata = models.JSONField(
|
||||||
|
|||||||
@@ -413,7 +413,6 @@ class GalleryDetailAndDownloadTests(BaseMediaTestCase):
|
|||||||
self.item = TbHypn0Item(
|
self.item = TbHypn0Item(
|
||||||
s_title="Астральный Транс Сознания #42",
|
s_title="Астральный Транс Сознания #42",
|
||||||
file_svg=ContentFile(svg_code.encode("utf-8"), name="test_item.svg"),
|
file_svg=ContentFile(svg_code.encode("utf-8"), name="test_item.svg"),
|
||||||
i_file_size=len(svg_code),
|
|
||||||
j_metadata={
|
j_metadata={
|
||||||
"shape": "circle",
|
"shape": "circle",
|
||||||
"cols": 35,
|
"cols": 35,
|
||||||
@@ -486,7 +485,6 @@ class GalleryRandomAndNavigationTests(BaseMediaTestCase):
|
|||||||
item = TbHypn0Item(
|
item = TbHypn0Item(
|
||||||
s_title=f"Гипно Картина #{i}",
|
s_title=f"Гипно Картина #{i}",
|
||||||
file_svg=ContentFile(svg_code.encode("utf-8"), name=f"test_item_{i}.svg"),
|
file_svg=ContentFile(svg_code.encode("utf-8"), name=f"test_item_{i}.svg"),
|
||||||
i_file_size=len(svg_code),
|
|
||||||
j_metadata={"cols": 30 + i},
|
j_metadata={"cols": 30 + i},
|
||||||
is_public=True,
|
is_public=True,
|
||||||
)
|
)
|
||||||
@@ -564,7 +562,6 @@ class UnconsciousMatrixTests(BaseMediaTestCase):
|
|||||||
item = TbHypn0Item(
|
item = TbHypn0Item(
|
||||||
s_title=f"Тестовый транс #{i}",
|
s_title=f"Тестовый транс #{i}",
|
||||||
file_svg=ContentFile(svg_code.encode("utf-8"), name=f"test_matrix_{i}.svg"),
|
file_svg=ContentFile(svg_code.encode("utf-8"), name=f"test_matrix_{i}.svg"),
|
||||||
i_file_size=len(svg_code),
|
|
||||||
j_metadata={"cols": 20 + i},
|
j_metadata={"cols": 20 + i},
|
||||||
is_public=True,
|
is_public=True,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -246,7 +246,6 @@ def publish(request: HttpRequest) -> HttpResponse:
|
|||||||
item = TbHypn0Item(
|
item = TbHypn0Item(
|
||||||
s_title=title,
|
s_title=title,
|
||||||
file_svg=svg_file,
|
file_svg=svg_file,
|
||||||
i_file_size=len(svg_bytes),
|
|
||||||
j_metadata=metadata,
|
j_metadata=metadata,
|
||||||
i_level=TbHypn0Item.Level.CANDIDATE,
|
i_level=TbHypn0Item.Level.CANDIDATE,
|
||||||
is_public=True,
|
is_public=True,
|
||||||
|
|||||||
Reference in New Issue
Block a user