135 lines
4.6 KiB
Python
135 lines
4.6 KiB
Python
"""API endpoints for the RisingCompute marketing site."""
|
|
from __future__ import annotations
|
|
|
|
from django.conf import settings
|
|
from django.core.mail import send_mail
|
|
from rest_framework import generics, status
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from .models import BlogPost, Founder, JobOpening, Product
|
|
from .serializers import (
|
|
BlogPostDetailSerializer,
|
|
BlogPostListSerializer,
|
|
ContactSubmissionSerializer,
|
|
FounderSerializer,
|
|
JobApplicationSerializer,
|
|
JobOpeningSerializer,
|
|
NewsletterSignupSerializer,
|
|
ProductSerializer,
|
|
)
|
|
|
|
|
|
def _client_ip(request) -> str | None:
|
|
forwarded = request.META.get("HTTP_X_FORWARDED_FOR", "")
|
|
if forwarded:
|
|
return forwarded.split(",")[0].strip()
|
|
return request.META.get("REMOTE_ADDR")
|
|
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# Read endpoints — content for the public site
|
|
# --------------------------------------------------------------------------- #
|
|
class ProductListView(generics.ListAPIView):
|
|
serializer_class = ProductSerializer
|
|
queryset = Product.objects.filter(is_published=True)
|
|
|
|
|
|
class ProductDetailView(generics.RetrieveAPIView):
|
|
serializer_class = ProductSerializer
|
|
queryset = Product.objects.filter(is_published=True)
|
|
lookup_field = "slug"
|
|
|
|
|
|
class FounderListView(generics.ListAPIView):
|
|
serializer_class = FounderSerializer
|
|
queryset = Founder.objects.filter(is_published=True)
|
|
|
|
|
|
class BlogPostListView(generics.ListAPIView):
|
|
serializer_class = BlogPostListSerializer
|
|
queryset = BlogPost.objects.filter(is_published=True)
|
|
|
|
|
|
class BlogPostDetailView(generics.RetrieveAPIView):
|
|
serializer_class = BlogPostDetailSerializer
|
|
queryset = BlogPost.objects.filter(is_published=True)
|
|
lookup_field = "slug"
|
|
|
|
|
|
class JobOpeningListView(generics.ListAPIView):
|
|
serializer_class = JobOpeningSerializer
|
|
queryset = JobOpening.objects.filter(is_open=True)
|
|
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# Write endpoints — form submissions
|
|
# --------------------------------------------------------------------------- #
|
|
class ContactSubmissionView(APIView):
|
|
"""Accepts a contact / evaluation request from the website."""
|
|
|
|
def post(self, request):
|
|
serializer = ContactSubmissionSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
submission = serializer.save(
|
|
user_agent=request.META.get("HTTP_USER_AGENT", "")[:400],
|
|
ip_address=_client_ip(request),
|
|
)
|
|
|
|
try:
|
|
send_mail(
|
|
subject=f"[risingcompute.in] New enquiry — {submission.get_interest_display()}",
|
|
message=(
|
|
f"From: {submission.name} <{submission.email}>\n"
|
|
f"Company: {submission.company}\n"
|
|
f"Role: {submission.role}\n"
|
|
f"Country: {submission.country}\n"
|
|
f"Interest: {submission.get_interest_display()}\n"
|
|
f"Referrer: {submission.referrer}\n\n"
|
|
f"Message:\n{submission.message}\n"
|
|
),
|
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
recipient_list=[settings.NOTIFY_EMAIL_TO],
|
|
fail_silently=True,
|
|
)
|
|
except Exception:
|
|
# Never let an email hiccup break the submission flow.
|
|
pass
|
|
|
|
return Response(
|
|
{"ok": True, "message": "Thanks — we'll be in touch shortly."},
|
|
status=status.HTTP_201_CREATED,
|
|
)
|
|
|
|
|
|
class NewsletterSignupView(APIView):
|
|
def post(self, request):
|
|
serializer = NewsletterSignupSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return Response(
|
|
{"ok": True, "message": "You're on the list."},
|
|
status=status.HTTP_201_CREATED,
|
|
)
|
|
|
|
|
|
class JobApplicationView(APIView):
|
|
def post(self, request):
|
|
serializer = JobApplicationSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return Response(
|
|
{"ok": True, "message": "Application received — we'll be in touch."},
|
|
status=status.HTTP_201_CREATED,
|
|
)
|
|
|
|
|
|
# --------------------------------------------------------------------------- #
|
|
# Health check
|
|
# --------------------------------------------------------------------------- #
|
|
class HealthView(APIView):
|
|
"""Simple uptime check used by deploy / monitoring."""
|
|
|
|
def get(self, request):
|
|
return Response({"status": "ok", "service": "risingcompute-api"})
|