2022-10-21 13:20:22 +01:00
|
|
|
from typing import Optional, Tuple
|
|
|
|
|
2022-06-12 21:08:11 +01:00
|
|
|
from django.db import models
|
2022-07-25 20:02:54 +01:00
|
|
|
from django.http.request import HttpRequest
|
2022-10-21 13:20:22 +01:00
|
|
|
from django_cache_decorator import django_cache_decorator
|
2022-06-12 21:08:11 +01:00
|
|
|
from wagtail.admin.panels import FieldPanel
|
2022-06-15 09:27:20 +01:00
|
|
|
from wagtail.images import get_image_model_string
|
2022-08-19 16:56:20 +01:00
|
|
|
from wagtail.images.models import Image
|
|
|
|
from wagtailmetadata.models import WagtailImageMetadataMixin
|
2022-06-12 21:08:11 +01:00
|
|
|
|
2022-06-10 15:48:07 +01:00
|
|
|
from website.common.models import BasePage
|
2022-08-28 20:24:59 +01:00
|
|
|
from website.contrib.singleton_page.utils import SingletonPageCache
|
2022-06-09 08:36:29 +01:00
|
|
|
|
2022-06-12 15:17:28 +01:00
|
|
|
|
2023-06-26 13:26:28 +01:00
|
|
|
@django_cache_decorator(time=600)
|
2022-10-21 13:20:22 +01:00
|
|
|
def get_latest_blog_post() -> Optional[Tuple[str, str]]:
|
|
|
|
from website.blog.models import BlogPostPage
|
|
|
|
|
|
|
|
try:
|
|
|
|
latest_blog_post = (
|
|
|
|
BlogPostPage.objects.live().public().defer_streamfields().latest("date")
|
|
|
|
)
|
|
|
|
except BlogPostPage.DoesNotExist:
|
|
|
|
return None
|
|
|
|
|
|
|
|
return latest_blog_post.title, latest_blog_post.get_url()
|
|
|
|
|
|
|
|
|
2022-08-19 16:56:20 +01:00
|
|
|
class HomePage(BasePage, WagtailImageMetadataMixin):
|
2022-06-14 20:57:50 +01:00
|
|
|
max_count = 1
|
|
|
|
|
2022-06-12 21:08:11 +01:00
|
|
|
heading = models.CharField(max_length=128, blank=True)
|
2022-06-15 09:27:20 +01:00
|
|
|
image = models.ForeignKey(
|
|
|
|
get_image_model_string(), null=True, on_delete=models.SET_NULL
|
|
|
|
)
|
2022-06-12 21:08:11 +01:00
|
|
|
|
2022-06-15 09:27:20 +01:00
|
|
|
content_panels = BasePage.content_panels + [
|
|
|
|
FieldPanel("heading"),
|
|
|
|
FieldPanel("image"),
|
|
|
|
]
|
2022-07-25 20:02:54 +01:00
|
|
|
|
2022-08-19 16:56:20 +01:00
|
|
|
def get_meta_url(self) -> str:
|
|
|
|
return self.full_url
|
|
|
|
|
|
|
|
def get_meta_image(self) -> Image | None:
|
|
|
|
return self.image
|
|
|
|
|
|
|
|
def get_meta_title(self) -> str:
|
|
|
|
return self.seo_title or self.title
|
|
|
|
|
|
|
|
def get_meta_description(self) -> str:
|
|
|
|
return self.search_description
|
|
|
|
|
|
|
|
def get_object_title(self) -> str:
|
2022-10-30 12:53:15 +00:00
|
|
|
return self.html_title
|
2022-08-19 16:56:20 +01:00
|
|
|
|
2022-07-25 20:02:54 +01:00
|
|
|
def get_context(self, request: HttpRequest) -> dict:
|
2022-08-04 14:17:50 +01:00
|
|
|
from website.search.models import SearchPage
|
|
|
|
|
2022-07-25 20:02:54 +01:00
|
|
|
context = super().get_context(request)
|
2022-10-21 13:20:22 +01:00
|
|
|
context["latest_blog_post"] = get_latest_blog_post()
|
2022-08-31 19:06:02 +01:00
|
|
|
context["search_page_url"] = SingletonPageCache.get_url(SearchPage, request)
|
2022-07-25 20:02:54 +01:00
|
|
|
return context
|