import json from smtplib import SMTPException from anymail.exceptions import AnymailRequestsAPIError from django.conf import settings from django.core.mail import EmailMessage from django.http import JsonResponse from django.shortcuts import get_object_or_404 from django.utils.decorators import method_decorator from django.views import generic from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie from django.views.decorators.http import require_http_methods from pictures.models import Contact, Message STATUS_OK = "ok" STATUS_ERROR = "error" class MessageListView(generic.ListView): model = Message template_name = "pictures/messages-list.html" context_object_name = "messages" @method_decorator(ensure_csrf_cookie, name="dispatch") class MessageDetailView(generic.DetailView): model = Message template_name = "pictures/messages-detail.html" context_object_name = "message" def send_email(request, pk): message = get_object_or_404(Message, pk=pk) all_media = message.media_files.all() media_count = len(all_media) if media_count > 1: subject = "Vos photos" else: subject = "Votre photo" message_text = ( message.content + "\n\n-- \nEnvoyé depuis votre cadre photo, par Claire & Gabriel" ) try: email = EmailMessage( subject, message_text, from_email=None, to=[settings.EMAIL_RECIPIENT], ) for media in all_media: email.attach_file(media.file.path) email.send(fail_silently=False) except (SMTPException, AnymailRequestsAPIError) as e: return _error_response(str(e)) return JsonResponse({"status": STATUS_OK}, status=200) def _error_response(message: str, status_code: int = 500): return JsonResponse( {"status": STATUS_ERROR, "message": message}, status=status_code ) @csrf_exempt @require_http_methods(["POST"]) def create_message(request): try: body = request.body.decode("utf-8") data = json.loads(body) phone_number = data.get("phone_number") if phone_number is None: return _error_response("phone_number is required", 400) contact, _ = Contact.objects.get_or_create(phone_number=phone_number) content = data.get("content", "") message = Message.objects.create(sender=contact, content=content) except Exception as e: return _error_response(str(e)) return JsonResponse({"status": STATUS_OK, "data": {"id": message.pk}}, status=201)