generated from bisco/codex-bootstrap
140 lines
4.5 KiB
Python
140 lines
4.5 KiB
Python
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,
|
|
}
|
|
)
|