Louis Mazin 7677667d0b nice
2026-10-13 18:32:32 +02:00

86 lines
3.0 KiB
Python

import logging
from django.conf import settings
from django.core.mail import send_mail
from django.utils import timezone
from rest_framework import generics, permissions, status, throttling
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Announcement, Resource, Testimonial
from .serializers import AnnouncementSerializer, ContactSerializer, ResourceSerializer, TestimonialSerializer
logger = logging.getLogger(__name__)
class ResourcesView(generics.ListAPIView):
serializer_class = ResourceSerializer
permission_classes = [permissions.AllowAny]
authentication_classes = []
pagination_class = None
def get_queryset(self):
qs = Resource.objects.filter(published=True)
category = self.request.query_params.get('category')
if category:
qs = qs.filter(category=category)
return qs
class TestimonialsView(generics.ListAPIView):
queryset = Testimonial.objects.filter(published=True)
serializer_class = TestimonialSerializer
permission_classes = [permissions.AllowAny]
authentication_classes = []
pagination_class = None
class AnnouncementView(generics.ListAPIView):
serializer_class = AnnouncementSerializer
permission_classes = [permissions.AllowAny]
authentication_classes = []
pagination_class = None
def get_queryset(self):
today = timezone.localdate()
return Announcement.objects.filter(active=True).filter(
models_q_starts(today), models_q_ends(today)
).order_by('-id')[:3]
def models_q_starts(today):
from django.db.models import Q
return Q(starts_at__isnull=True) | Q(starts_at__lte=today)
def models_q_ends(today):
from django.db.models import Q
return Q(ends_at__isnull=True) | Q(ends_at__gte=today)
class ContactThrottle(throttling.AnonRateThrottle):
scope = 'contact'
class ContactView(APIView):
permission_classes = [permissions.AllowAny]
authentication_classes = []
throttle_classes = [ContactThrottle]
def post(self, request):
serializer = ContactSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
contact = serializer.save()
recipient = getattr(settings, 'CONTACT_NOTIFICATION_EMAIL', '')
# L'enregistrement en base reste prioritaire si l'e-mail SMTP échoue.
if recipient:
try:
send_mail(
subject=f'[AccroCbio] Contact de {contact.name}',
message=f'De : {contact.name} <{contact.email}>\nTéléphone : {contact.phone}\nNiveau : {contact.level}\n\n{contact.message}',
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=[recipient],
fail_silently=False,
)
except Exception:
logger.exception('Envoi de la notification contact impossible (message conservé en base)')
return Response({'message': 'Merci, votre message a bien été transmis.'}, status=status.HTTP_201_CREATED)