86 lines
3.0 KiB
Python
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)
|