WesternFriend/WF-website

View on GitHub
documents/models.py

Summary

Maintainability
A
0 mins
Test Coverage
A
94%
from django.db import models
from wagtail.admin.panels import FieldPanel
from wagtail.models import Page
from wagtail.fields import StreamField, RichTextField
from wagtail.search import index
from core.constants import COMMON_STREAMFIELD_BLOCKS

from common.models import DrupalFields


class MeetingDocumentIndexPage(Page):
    intro = RichTextField(
        blank=True,
        null=True,
        features=[
            "bold",
            "italic",
            "ol",
            "ul",
            "hr",
            "link",
        ],
    )

    parent_page_types = ["home.HomePage"]
    subpage_types = ["documents.MeetingDocument"]

    content_panels = Page.content_panels + [
        FieldPanel("intro", classname="full"),
    ]

    def get_context(self, request):
        context = super().get_context(request)
        context["meeting_documents"] = MeetingDocument.objects.live().public()
        return context


class MeetingDocument(DrupalFields, Page):
    class MeetingDocmentTypeChoices(models.TextChoices):
        EPISTLE = (
            "epistle",
            "Epistle",
        )
        MINUTE = (
            "minute",
            "Minute of Concern",
        )
        PHOTOS = (
            "photos",
            "Photos",
        )

    publication_date = models.DateField()
    drupal_node_id = models.PositiveIntegerField(
        null=True,
        blank=True,
    )
    publishing_meeting = models.ForeignKey(
        "contact.Meeting",
        on_delete=models.PROTECT,
        related_name="published_documents",
    )
    document_type = models.CharField(
        choices=MeetingDocmentTypeChoices.choices,
        max_length=100,
    )
    body = StreamField(
        COMMON_STREAMFIELD_BLOCKS,
        use_json_field=True,
    )

    parent_page_types = ["documents.MeetingDocumentIndexPage"]
    subpage_types: list[str] = []

    content_panels = Page.content_panels + [
        FieldPanel("publishing_meeting"),
        FieldPanel("document_type"),
        FieldPanel("publication_date"),
        FieldPanel("body"),
    ]

    search_fields = Page.search_fields + [
        index.SearchField("body"),
        index.RelatedFields(
            "publishing_meeting",
            [
                index.SearchField("title"),
            ],
        ),
    ]

    class Meta:
        ordering = [
            "-publication_date",
            "publishing_meeting",
            "document_type",
            "title",
        ]
        indexes = [
            models.Index(fields=["publication_date"]),
            models.Index(fields=["document_type"]),
        ]


class PublicBoardDocumentIndexPage(Page):
    intro = RichTextField(
        blank=True,
        null=True,
        features=[
            "bold",
            "italic",
            "ol",
            "ul",
            "hr",
            "link",
        ],
    )

    parent_page_types = ["home.HomePage"]
    subpage_types = ["documents.PublicBoardDocument"]

    content_panels = Page.content_panels + [
        FieldPanel("intro", classname="full"),
    ]
    search_fields = Page.search_fields + [
        index.SearchField("intro"),
    ]


class PublicBoardDocument(DrupalFields, Page):
    class PublicBoardDocmentCategoryChoices(models.TextChoices):
        CORPORATION_DOCUMENTS_CURRENT_YEAR = (
            "corporation_documents_current_year",
            "Corporation Documents - current year",
        )
        CORPORATION_DOCUMENTS_PRIOR_YEARS = (
            "corporation_documents_prior_years",
            "Corporation Documents - prior years",
        )
        ANNUAL_REPORTS = (
            "annual_reports",
            "Annual Reports",
        )
        RELATIONS_WITH_MONTHLY_MEETINGS = (
            "relations_with_monthly_meetings",
            "Relations with Monthly Meetings",
        )
        BOARD_PHOTOS = (
            "board_photos",
            "Board Photos",
        )
        BOARD_MEMBERSHIP_ABOUT = (
            "board_membership_about",
            "Board Membership - About",
        )

    publication_date = models.DateField()
    drupal_node_id = models.PositiveIntegerField(
        null=True,
        blank=True,
    )
    category = models.CharField(
        choices=PublicBoardDocmentCategoryChoices.choices,
        max_length=100,
    )
    body = StreamField(
        COMMON_STREAMFIELD_BLOCKS,
        use_json_field=True,
    )

    parent_page_types = ["documents.PublicBoardDocumentIndexPage"]
    subpage_types: list[str] = []

    search_fields = Page.search_fields + [
        index.SearchField("body"),
    ]

    content_panels = Page.content_panels + [
        FieldPanel("category"),
        FieldPanel("publication_date"),
        FieldPanel("body"),
    ]