mirror of
https://github.com/boostorg/website-v2.git
synced 2026-01-19 04:42:17 +00:00
Re-use the code written for the library detail page for displaying authors and maintainers on the homepage. To avoid duplicating code, moved all the necessary pieces to a mixin to be used by HomepageView and LibraryDetail, and adjusted it to work for both.
97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
import structlog
|
|
from django.conf import settings
|
|
from django.core.cache import cache
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import Http404, HttpResponse
|
|
from django.shortcuts import render
|
|
from django.views import View
|
|
from django.views.generic import TemplateView
|
|
|
|
from core.calendar import extract_calendar_events, events_by_month, get_calendar
|
|
from libraries.constants import LATEST_RELEASE_URL_PATH_STR
|
|
from libraries.mixins import ContributorMixin
|
|
from news.models import Entry
|
|
|
|
|
|
logger = structlog.get_logger()
|
|
|
|
|
|
class HomepageView(ContributorMixin, TemplateView):
|
|
"""
|
|
Define all the pieces that will be displayed on the home page
|
|
"""
|
|
|
|
template_name = "homepage.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context["entries"] = Entry.objects.published().order_by("-publish_at")[:3]
|
|
context["events"] = self.get_events()
|
|
if context["events"]:
|
|
context["num_months"] = len(context["events"])
|
|
else:
|
|
context["num_months"] = 0
|
|
context["LATEST_RELEASE_URL_PATH_STR"] = LATEST_RELEASE_URL_PATH_STR
|
|
return context
|
|
|
|
def get_events(self):
|
|
"""Returns the events from the Boost Google Calendar."""
|
|
cached_events = cache.get(settings.EVENTS_CACHE_KEY)
|
|
if cached_events:
|
|
return cached_events
|
|
|
|
try:
|
|
raw_event_data = get_calendar()
|
|
except Exception:
|
|
logger.info("Error getting events")
|
|
return
|
|
|
|
if not raw_event_data:
|
|
return
|
|
|
|
events = extract_calendar_events(raw_event_data)
|
|
sorted_events = events_by_month(events)
|
|
cache.set(
|
|
settings.EVENTS_CACHE_KEY,
|
|
dict(sorted_events),
|
|
settings.EVENTS_CACHE_TIMEOUT,
|
|
)
|
|
|
|
return dict(sorted_events)
|
|
|
|
|
|
class ForbiddenView(View):
|
|
"""
|
|
This view raises an exception to test our 403.html template
|
|
"""
|
|
|
|
def get(self, *args, **kwargs):
|
|
raise PermissionDenied("403 Forbidden")
|
|
|
|
|
|
class InternalServerErrorView(View):
|
|
"""
|
|
This view raises an exception to test our 500.html template
|
|
"""
|
|
|
|
def get(self, *args, **kwargs):
|
|
raise ValueError("500 Internal Server Error")
|
|
|
|
|
|
class NotFoundView(View):
|
|
"""
|
|
This view raises an exception to test our 404.html template
|
|
"""
|
|
|
|
def get(self, *args, **kwargs):
|
|
raise Http404("404 Not Found")
|
|
|
|
|
|
def custom_404_view(request, exception=None):
|
|
return render(request, "404.html", status=404)
|
|
|
|
|
|
class OKView(View):
|
|
def get(self, *args, **kwargs):
|
|
return HttpResponse("200 OK", status=200)
|