mod: блоги (1) список связанных статей к карточке SVG-генерации
This commit is contained in:
@@ -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",),
|
||||
),
|
||||
}),
|
||||
("Основные поля", {
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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, "Секретный черновик")
|
||||
|
||||
Reference in New Issue
Block a user