41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
from drf_spectacular.utils import extend_schema
|
|
from rest_framework import status
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from apps.contacts.api.serializers import (
|
|
ContactSubmissionCreateSerializer,
|
|
ContactSubmissionResponseSerializer,
|
|
)
|
|
from apps.contacts.api.throttles import ContactSubmissionThrottle
|
|
|
|
|
|
def _get_client_ip(request):
|
|
forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
|
|
if forwarded_for:
|
|
return forwarded_for.split(",")[0].strip()
|
|
return request.META.get("REMOTE_ADDR")
|
|
|
|
|
|
class ContactSubmissionView(APIView):
|
|
permission_classes = (AllowAny,)
|
|
throttle_classes = (ContactSubmissionThrottle,)
|
|
serializer_class = ContactSubmissionCreateSerializer
|
|
|
|
@extend_schema(
|
|
request=ContactSubmissionCreateSerializer,
|
|
responses={201: ContactSubmissionResponseSerializer},
|
|
)
|
|
def post(self, request):
|
|
serializer = self.serializer_class(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
submission = serializer.save(
|
|
ip_address=_get_client_ip(request),
|
|
user_agent=request.META.get("HTTP_USER_AGENT", ""),
|
|
)
|
|
return Response(
|
|
ContactSubmissionResponseSerializer(submission).data,
|
|
status=status.HTTP_201_CREATED,
|
|
)
|