fix: video pagination
This commit is contained in:
@@ -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,38 @@ 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 +172,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):
|
||||
|
||||
@@ -9,5 +9,6 @@ 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"),
|
||||
]
|
||||
|
||||
+69
-5
@@ -1,8 +1,10 @@
|
||||
import random
|
||||
|
||||
from django.db.models import Prefetch
|
||||
from django.http import Http404
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse
|
||||
from django.views import View
|
||||
from django.views.generic import DetailView, ListView, TemplateView
|
||||
|
||||
@@ -21,6 +23,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 (
|
||||
@@ -79,10 +93,14 @@ 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")
|
||||
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
|
||||
|
||||
|
||||
@@ -95,16 +113,23 @@ 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")
|
||||
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"],
|
||||
},
|
||||
)
|
||||
|
||||
@@ -168,3 +193,42 @@ 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 Tecvico 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
|
||||
|
||||
Reference in New Issue
Block a user