adding details
This commit is contained in:
134
backend/api/views.py
Normal file
134
backend/api/views.py
Normal file
@@ -0,0 +1,134 @@
|
||||
"""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"})
|
||||
Reference in New Issue
Block a user