mod: блоги (1) список связанных статей к карточке SVG-генерации

This commit is contained in:
2026-09-08 00:28:26 +03:00
parent 46a2e57b0c
commit 4a4d009b04
4 changed files with 133 additions and 3 deletions
+5 -2
View File
@@ -368,6 +368,8 @@ class BlogPostAdminForm(CodeMirrorFormMixin):
css_class='codemirror-width-l codemirror-no-lines')
self.setup_codemirror_field('slug', language='text',
css_class='codemirror-width-l codemirror-no-lines')
self.setup_codemirror_field('i_order', language='text',
css_class='codemirror-width-l codemirror-no-lines')
self.setup_codemirror_field('s_teaser', language='html',
css_class='codemirror-width-xl codemirror-min-height-5')
self.setup_codemirror_field('s_content', language='html',
@@ -419,8 +421,9 @@ class TbBlogPostAdmin(RequestInFormMixin, admin.ModelAdmin):
fieldsets = (
("Атрибуты публикации и связи", {
"fields": (
("is_published", "slug", "d_published_at"),
("k_item", "k_parent_post", "i_order"),
("slug",),
("d_published_at", "is_published", ),
("k_item", "k_parent_post", "i_order",),
),
}),
("Основные поля", {
+9
View File
@@ -211,6 +211,11 @@ class TbHypn0Item(models.Model):
dark_bg = f"rgb({max(9, int(9 + r * 0.07))}, {max(9, int(9 + g * 0.07))}, {max(13, int(13 + b * 0.08))})"
return f"--card-bg-light: {light_bg}; --card-bg-dark: {dark_bg};"
@property
def published_blog_posts(self):
"""Возвращает опубликованные статьи блога, привязанные к данной картине."""
return self.blog_posts.filter(is_published=True).order_by("-d_published_at")
@property
def card_svg(self) -> str:
"""
@@ -558,3 +563,7 @@ class TbBlogPost(models.Model):
def __str__(self) -> str:
return self.s_title
def get_absolute_url(self) -> str:
"""Возвращает канонический URL статьи блога."""
return f"/blog/{self.slug}" if self.slug else f"/blog/{self.pk}"
+43
View File
@@ -1274,3 +1274,46 @@ class BlogPostModelAndAdminTests(BaseMediaTestCase):
self.assertTrue(admin_obj.has_svg(post_with_svg))
self.assertFalse(admin_obj.has_svg(post_without_svg))
def test_gallery_detail_renders_blog_teaser(self):
# До создания постов блок блога не отображается
initial_response = self.client.get(f"/gallery/{self.item.s_hash_id}")
self.assertEqual(initial_response.status_code, 200)
self.assertNotContains(initial_response, "Материалы хроник гипноза")
# Опубликованный пост с тизером
published_post = TbBlogPost.objects.create(
s_title="Хроники гипно-транса: Урок 1",
slug="khroniki-hypno-transa-urok-1",
s_teaser="Секретные формулы векторного воздействия на сознание.",
s_content="Полный текст урока...",
k_item=self.item,
is_published=True,
)
# Неопубликованный черновик — не должен отображаться
unpublished_post = TbBlogPost.objects.create(
s_title="Секретный черновик",
slug="sekretniy-chernovik",
s_teaser="Черновик не должен быть виден.",
s_content="Скрытый контент...",
k_item=self.item,
is_published=False,
)
response = self.client.get(f"/gallery/{self.item.s_hash_id}")
self.assertEqual(response.status_code, 200)
# Проверяем, что отображается один из динамических заголовков секции
content = response.content.decode("utf-8")
possible_headings = (
"Сигналы из параллельного континуума",
"Психо-артефакты ноосферы",
"Заметки астрального консилиума",
"Рефлекторные отклики мозговых слизней",
"Публикации из глубин подсознания",
"Материалы хроник гипноза",
)
self.assertTrue(any(heading in content for heading in possible_headings))
self.assertContains(response, "Хроники гипно-транса: Урок 1")
self.assertContains(response, "Секретные формулы векторного воздействия")
self.assertContains(response, "/blog/khroniki-hypno-transa-urok-1")
self.assertNotContains(response, "Секретный черновик")