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, } )