WesternFriend/WF-website

View on GitHub
tags/views.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
from itertools import chain

from django.views.generic import ListView
from django.db.models import Q
from taggit.models import Tag
from wagtail.admin.viewsets.model import ModelViewSet

from library.models import LibraryItem
from magazine.models import MagazineArticle
from news.models import NewsItem
from pagination.helpers import get_paginated_items
from wf_pages.models import WfPage


class TaggedPageListView(ListView):
    template_name = "tags/tagged_page_list.html"
    paginate_by = 10

    def get_queryset(self):
        """Return a list of all the pages tagged with the given tag.

        The combined list is sorted alphabetically by title.
        """
        tag = self.kwargs["tag"]
        # Get all the pages tagged with the given tag
        filter_condition = Q(tags__slug__in=[tag])

        library_items = LibraryItem.objects.filter(filter_condition).order_by("title")

        magazine_articles = MagazineArticle.objects.filter(filter_condition).order_by(
            "title",
        )

        news_items = NewsItem.objects.filter(filter_condition).order_by("title")

        pages = WfPage.objects.filter(filter_condition).order_by("title")

        combined_queryset_list = list(
            chain(
                library_items,
                magazine_articles,
                news_items,
                pages,
            ),
        )

        sorted_queryset = sorted(
            combined_queryset_list,
            key=lambda instance: instance.title.lower(),
        )

        return sorted_queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        tag_slug = self.kwargs["tag"]
        tag_name = Tag.objects.get(slug=tag_slug).name

        context["tag_name"] = tag_name

        page_number = self.request.GET.get("page", "1")

        context["paginated_items"] = get_paginated_items(
            items=self.get_queryset(),
            items_per_page=self.paginate_by,
            page_number=page_number,
        )

        return context


class TagViewSet(ModelViewSet):
    model = Tag
    menu_label = "Tags"
    icon = "tag"
    name = "content_tags"
    list_display = (
        "name",
        "slug",
    )
    search_fields = ("name",)
    ordering = ["name"]
    form_fields = [
        "name",
        "slug",
    ]