picture-display/src/pictures/views.py

82 lines
2.5 KiB
Python
Raw Normal View History

2021-02-13 16:47:34 +01:00
import json
2021-01-24 18:58:58 +01:00
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
2021-01-24 15:43:51 +01:00
from django.views import generic
2021-02-13 16:47:34 +01:00
from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie
from django.views.decorators.http import require_http_methods
2021-01-24 12:42:24 +01:00
2021-02-13 16:47:34 +01:00
from pictures.models import Contact, Message
STATUS_OK = "ok"
STATUS_ERROR = "error"
2021-01-24 15:43:51 +01:00
class MessageListView(generic.ListView):
model = Message
template_name = "pictures/messages-list.html"
context_object_name = "messages"
2021-01-24 16:01:36 +01:00
2021-01-24 18:58:58 +01:00
@method_decorator(ensure_csrf_cookie, name="dispatch")
2021-01-24 16:01:36 +01:00
class MessageDetailView(generic.DetailView):
model = Message
template_name = "pictures/messages-detail.html"
context_object_name = "message"
2021-01-24 18:58:58 +01:00
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:
2021-02-13 16:47:34 +01:00
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)