generated from bisco/codex-bootstrap
feat: build headless theatre laboratory website
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from django.conf import settings as django_settings
|
||||
from django.db import DatabaseError, connection
|
||||
from django.http import JsonResponse
|
||||
from django.views.decorators.http import require_GET
|
||||
from wagtail.models import Site
|
||||
|
||||
from .models import GalleryItem, HomePage, LessonInfo, Show, SiteSettings, TeacherProfile
|
||||
|
||||
|
||||
def serialize_image(request, image):
|
||||
if image is None:
|
||||
return None
|
||||
public_base_url = django_settings.WAGTAILADMIN_BASE_URL or request.build_absolute_uri("/")
|
||||
return {
|
||||
"url": urljoin(f"{public_base_url.rstrip('/')}/", image.file.url),
|
||||
"alt": image.title,
|
||||
}
|
||||
|
||||
|
||||
def find_site(request):
|
||||
return Site.find_for_request(request) or Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
|
||||
@require_GET
|
||||
def health(request):
|
||||
try:
|
||||
with connection.cursor() as cursor:
|
||||
cursor.execute("SELECT 1")
|
||||
cursor.fetchone()
|
||||
except DatabaseError:
|
||||
return JsonResponse({"status": "unavailable"}, status=503)
|
||||
return JsonResponse({"status": "ok"})
|
||||
|
||||
|
||||
@require_GET
|
||||
def home_api(request):
|
||||
site = find_site(request)
|
||||
settings = SiteSettings.for_site(site) if site else None
|
||||
homepage = (
|
||||
HomePage.objects.live().filter(id=site.root_page_id).first()
|
||||
if site
|
||||
else HomePage.objects.live().first()
|
||||
)
|
||||
teacher = TeacherProfile.objects.order_by("id").first()
|
||||
lesson = LessonInfo.objects.order_by("id").first()
|
||||
|
||||
settings_data = None
|
||||
if settings:
|
||||
settings_data = {
|
||||
"laboratory_name": settings.laboratory_name,
|
||||
"short_claim": settings.short_claim,
|
||||
"email": settings.email,
|
||||
"phone": settings.phone,
|
||||
"whatsapp": settings.whatsapp,
|
||||
"instagram": settings.instagram,
|
||||
"facebook": settings.facebook,
|
||||
"address": settings.address,
|
||||
"footer_text": settings.footer_text,
|
||||
}
|
||||
|
||||
homepage_data = None
|
||||
feature_cards = []
|
||||
if homepage:
|
||||
homepage_data = {
|
||||
"hero_title": homepage.hero_title,
|
||||
"hero_subtitle": homepage.hero_subtitle,
|
||||
"hero_image": serialize_image(request, homepage.hero_image),
|
||||
"intro_title": homepage.intro_title,
|
||||
"intro_body": str(homepage.intro_body),
|
||||
"cta_primary_label": homepage.cta_primary_label,
|
||||
"cta_primary_url": homepage.cta_primary_url,
|
||||
"cta_secondary_label": homepage.cta_secondary_label,
|
||||
"cta_secondary_url": homepage.cta_secondary_url,
|
||||
"laboratory_title": homepage.laboratory_title,
|
||||
"laboratory_body": str(homepage.laboratory_body),
|
||||
"laboratory_image": serialize_image(request, homepage.laboratory_image),
|
||||
}
|
||||
feature_cards = [
|
||||
{"title": card.title, "text": card.text, "order": card.sort_order}
|
||||
for card in homepage.feature_cards.all()
|
||||
]
|
||||
|
||||
teacher_data = None
|
||||
if teacher:
|
||||
teacher_data = {
|
||||
"name": teacher.name,
|
||||
"photo": serialize_image(request, teacher.photo),
|
||||
"short_bio": teacher.short_bio,
|
||||
"full_bio": str(teacher.full_bio),
|
||||
"quote": teacher.quote,
|
||||
}
|
||||
|
||||
lesson_data = None
|
||||
if lesson:
|
||||
lesson_data = {
|
||||
"day_time": lesson.day_time,
|
||||
"location": lesson.location,
|
||||
"audience": lesson.audience,
|
||||
"description": str(lesson.description),
|
||||
"trial_lesson": lesson.trial_lesson,
|
||||
"notes": lesson.notes,
|
||||
}
|
||||
|
||||
shows = [
|
||||
{
|
||||
"title": show.title,
|
||||
"year": show.year,
|
||||
"short_description": show.short_description,
|
||||
"description": str(show.description),
|
||||
"poster": serialize_image(request, show.poster),
|
||||
"location": show.location,
|
||||
"cast": show.cast,
|
||||
"order": show.order,
|
||||
}
|
||||
for show in Show.objects.filter(visible_on_home=True).select_related("poster")
|
||||
]
|
||||
gallery_items = [
|
||||
{
|
||||
"image": serialize_image(request, item.image),
|
||||
"category": item.category,
|
||||
"caption": item.caption,
|
||||
"order": item.order,
|
||||
}
|
||||
for item in GalleryItem.objects.filter(visible_on_home=True).select_related("image")
|
||||
]
|
||||
|
||||
return JsonResponse(
|
||||
{
|
||||
"settings": settings_data,
|
||||
"homepage": homepage_data,
|
||||
"feature_cards": feature_cards,
|
||||
"teacher": teacher_data,
|
||||
"lesson_info": lesson_data,
|
||||
"shows": shows,
|
||||
"gallery_items": gallery_items,
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user