feat: pagination for videos and icon separating

This commit is contained in:
mohamad
2026-08-01 17:45:55 +03:30
parent 7cddc03a57
commit 04b6e9049e
15 changed files with 508 additions and 25 deletions
+73
View File
@@ -80,6 +80,17 @@ class CustomPageVideoSectionTest(TestCase):
class PageVideoTest(TestCase):
def _create_page_videos(self, page, count):
for index in range(count):
PageVideo.objects.create(
page=page,
title=f"Video {index + 1}",
video_source="youtube",
video_url="https://youtu.be/dQw4w9WgXcQ",
order=index,
is_active=True,
)
def test_contact_page_video(self):
PageVideo.objects.create(
page=PageVideo.PAGE_CONTACT,
@@ -103,6 +114,44 @@ class PageVideoTest(TestCase):
response = self.client.get(reverse("pages:faq"))
self.assertContains(response, "Tutorial")
def test_page_shows_three_video_preview_and_archive_link(self):
self._create_page_videos(PageVideo.PAGE_FAQ, 8)
response = self.client.get(reverse("pages:faq"))
self.assertEqual(response.content.count(b"youtube-nocookie.com/embed"), 3)
self.assertContains(
response,
reverse(
"pages:video_archive",
kwargs={"library": PageVideo.PAGE_FAQ},
),
)
self.assertContains(response, "More videos")
def test_page_video_archive_is_paginated(self):
self._create_page_videos(PageVideo.PAGE_FAQ, 8)
archive_url = reverse(
"pages:video_archive",
kwargs={"library": PageVideo.PAGE_FAQ},
)
first_page = self.client.get(archive_url)
second_page = self.client.get(archive_url, {"page": 2})
self.assertEqual(first_page.status_code, 200)
self.assertEqual(first_page.content.count(b"youtube-nocookie.com/embed"), 6)
self.assertContains(first_page, "Page 1 of 2")
self.assertContains(first_page, "?page=2")
self.assertEqual(second_page.content.count(b"youtube-nocookie.com/embed"), 2)
self.assertContains(second_page, "Page 2 of 2")
def test_unknown_page_video_archive_returns_404(self):
response = self.client.get(
reverse("pages:video_archive", kwargs={"library": "unknown"})
)
self.assertEqual(response.status_code, 404)
class ProductVideoTest(TestCase):
def setUp(self):
@@ -129,6 +178,30 @@ class ProductVideoTest(TestCase):
self.assertContains(response, "Product Demo")
self.assertContains(response, "video-block--full")
def test_product_video_preview_links_to_paginated_archive(self):
for index in range(7):
ProductVideo.objects.create(
main_product=self.main_product,
title=f"Product video {index + 1}",
video_source="youtube",
video_url="https://youtu.be/dQw4w9WgXcQ",
order=index,
is_active=True,
)
archive_url = reverse(
"products:main_product_videos",
kwargs={"main_slug": self.main_product.slug},
)
detail_response = self.client.get(self.main_product.get_absolute_url())
archive_response = self.client.get(archive_url)
second_page = self.client.get(archive_url, {"page": 2})
self.assertEqual(detail_response.content.count(b"youtube-nocookie.com/embed"), 3)
self.assertContains(detail_response, archive_url)
self.assertEqual(archive_response.content.count(b"youtube-nocookie.com/embed"), 6)
self.assertEqual(second_page.content.count(b"youtube-nocookie.com/embed"), 1)
class VideoStyledBackgroundTest(TestCase):
def test_styled_background_renders_panel(self):
+5
View File
@@ -9,5 +9,10 @@ urlpatterns = [
path("about/", views.AboutView.as_view(), name="about"),
path("faq/", views.FAQView.as_view(), name="faq"),
path("contact/", views.ContactView.as_view(), name="contact"),
path(
"videos/<slug:library>/",
views.PageVideoArchiveView.as_view(),
name="video_archive",
),
path("<slug>/", views.CustomPageView.as_view(), name="custom_page"),
]
+89 -7
View File
@@ -1,8 +1,9 @@
import random
from django.db.models import Prefetch
from django.http import JsonResponse
from django.http import Http404, JsonResponse
from django.shortcuts import render
from django.urls import reverse
from django.views import View
from django.views.generic import DetailView, ListView, TemplateView
@@ -20,6 +21,18 @@ from .models import (
PageVideo,
)
VIDEO_PREVIEW_LIMIT = 3
VIDEO_ARCHIVE_PAGE_SIZE = 6
def _video_preview_context(queryset, archive_url):
total = queryset.count()
return {
"videos": queryset[:VIDEO_PREVIEW_LIMIT],
"videos_total_count": total,
"videos_archive_url": archive_url if total > VIDEO_PREVIEW_LIMIT else "",
}
def _homepage_products_catalog_queryset():
return (
@@ -74,10 +87,20 @@ class FAQView(ListView):
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["faq_videos"] = PageVideo.objects.filter(
videos = PageVideo.objects.filter(
page=PageVideo.PAGE_FAQ,
is_active=True,
).order_by("order")
).order_by("order", "pk")
preview = _video_preview_context(
videos,
reverse(
"pages:video_archive",
kwargs={"library": PageVideo.PAGE_FAQ},
),
)
ctx["faq_videos"] = preview["videos"]
ctx["videos_total_count"] = preview["videos_total_count"]
ctx["videos_archive_url"] = preview["videos_archive_url"]
return ctx
@@ -90,16 +113,26 @@ class ContactView(View):
return f"{a} + {b}"
def get(self, request, *args, **kwargs):
videos = PageVideo.objects.filter(
page=PageVideo.PAGE_CONTACT,
is_active=True,
).order_by("order", "pk")
preview = _video_preview_context(
videos,
reverse(
"pages:video_archive",
kwargs={"library": PageVideo.PAGE_CONTACT},
),
)
return render(
request,
self.template_name,
{
"form": ContactForm(),
"captcha_question": self._new_captcha(request),
"contact_videos": PageVideo.objects.filter(
page=PageVideo.PAGE_CONTACT,
is_active=True,
).order_by("order"),
"contact_videos": preview["videos"],
"videos_total_count": preview["videos_total_count"],
"videos_archive_url": preview["videos_archive_url"],
},
)
@@ -163,3 +196,52 @@ class CustomPageView(DetailView):
)
ctx["homepage_products_catalog"] = _homepage_products_catalog_queryset()
return ctx
class PageVideoArchiveView(ListView):
model = PageVideo
template_name = "videos/archive.html"
context_object_name = "videos"
paginate_by = VIDEO_ARCHIVE_PAGE_SIZE
PAGE_CONFIG = {
PageVideo.PAGE_CONTACT: (
"Contact videos",
"Guides and updates from the Radiuma team.",
"pages:contact",
),
PageVideo.PAGE_FAQ: (
"FAQ videos",
"Video answers to common questions.",
"pages:faq",
),
}
def get_page_config(self):
try:
return self.PAGE_CONFIG[self.kwargs["library"]]
except KeyError as exc:
raise Http404("Video library not found.") from exc
def get_queryset(self):
self.get_page_config()
return PageVideo.objects.filter(
page=self.kwargs["library"],
is_active=True,
).order_by("order", "pk")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
title, description, source_url_name = self.get_page_config()
context.update(
{
"library_title": title,
"library_description": description,
"library_back_url": reverse(source_url_name),
"library_back_label": "Back to page",
"pagination_range": context["paginator"].get_elided_page_range(
context["page_obj"].number
),
}
)
return context