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)