From 4a4d009b04c5644eefc3ec0c35b7fcfb7ac25cb1 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 8 Sep 2026 00:28:26 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=B1=D0=BB=D0=BE=D0=B3=D0=B8=20(1)=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=D1=82=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=BA=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B5=20SVG-=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hypn0/hypn0_site/admin.py | 7 ++- hypn0/hypn0_site/models.py | 9 ++++ hypn0/hypn0_site/tests.py | 43 ++++++++++++++++ hypn0/templates/gallery/detail.html | 77 ++++++++++++++++++++++++++++- 4 files changed, 133 insertions(+), 3 deletions(-) diff --git a/hypn0/hypn0_site/admin.py b/hypn0/hypn0_site/admin.py index b58d53f..167c990 100644 --- a/hypn0/hypn0_site/admin.py +++ b/hypn0/hypn0_site/admin.py @@ -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",), ), }), ("Основные поля", { diff --git a/hypn0/hypn0_site/models.py b/hypn0/hypn0_site/models.py index 1a716af..1a931ae 100644 --- a/hypn0/hypn0_site/models.py +++ b/hypn0/hypn0_site/models.py @@ -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}" diff --git a/hypn0/hypn0_site/tests.py b/hypn0/hypn0_site/tests.py index 88d5445..ae72a61 100644 --- a/hypn0/hypn0_site/tests.py +++ b/hypn0/hypn0_site/tests.py @@ -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, "Секретный черновик") diff --git a/hypn0/templates/gallery/detail.html b/hypn0/templates/gallery/detail.html index b4415b7..a475ac3 100644 --- a/hypn0/templates/gallery/detail.html +++ b/hypn0/templates/gallery/detail.html @@ -170,12 +170,87 @@ + + {% if item.published_blog_posts %} +
+
+
+

+ {% if item.id|divisibleby:6 %}Сигналы из параллельного континуума + {% elif item.id|divisibleby:5 %}Психо-артефакты ноосферы + {% elif item.id|divisibleby:4 %}Заметки астрального консилиума + {% elif item.id|divisibleby:3 %}Рефлекторные отклики мозговых слизней + {% elif item.id|divisibleby:2 %}Публикации из глубин подсознания + {% else %}Материалы хроник гипноза{% endif %} +

+
+ +
+ {% for blog_post in item.published_blog_posts %} + + {% endfor %} +
+
+ {% endif %} +

- Психо-телеметрия и структура волновой матрицы + Метрики и структура волновой матрицы