new: basic email template with csv attachments for the orded and each line

This commit is contained in:
cătălin 2021-01-25 02:57:36 +01:00
commit 0148d193ee
8 changed files with 126 additions and 143 deletions

View file

@ -1,9 +1,9 @@
from django.core.mail import EmailMessage
from django.core.mail import EmailMessage, EmailMultiAlternatives
from django.shortcuts import render
from django.template.loader import render_to_string
from rest_framework import viewsets, permissions, status
from rest_framework.decorators import action
from rest_framework.response import Response
from bernini import settings
from order.models import SaleOrder, SaleOrderLine, Product
from order.serializers import (
@ -33,7 +33,7 @@ class SaleOrderViewSet(viewsets.ModelViewSet):
if request.data.get(field) != SaleOrderSerializer(order).data[field]:
return Response(
data=f"You can't manually set the field {field}",
status=status.HTTP_400_BAD_REQUEST
status=status.HTTP_400_BAD_REQUEST,
)
return super(SaleOrderViewSet, self).update(request, *args, **kwargs)
@ -44,7 +44,7 @@ class SaleOrderViewSet(viewsets.ModelViewSet):
if request.data.get(field) != SaleOrderSerializer(order).data[field]:
return Response(
data=f"You can't manually set the field {field}",
status=status.HTTP_400_BAD_REQUEST
status=status.HTTP_400_BAD_REQUEST,
)
return super(SaleOrderViewSet, self).partial_update(request, *args, **kwargs)
@ -73,30 +73,46 @@ class SaleOrderViewSet(viewsets.ModelViewSet):
@action(detail=True)
def sent(self, request, pk=None):
order: SaleOrder = self.get_object()
if order.sold_at and order.sold_to.email and settings.EMAIL_HOST_USER:
mail = EmailMessage(
f'Order {order.name} from Zapatos Bernini',
render(
'order_sold.html',
{
'order': order
},
),
settings.EMAIL_HOST_USER,
[order.sold_to.email],
reply_to=[settings.EMAIL_HOST_USER]
mail = EmailMultiAlternatives(
subject=f"Order {order.name} from Zapatos Bernini",
from_email=settings.EMAIL_HOST_USER,
to=[order.sold_to.email],
reply_to=[settings.EMAIL_HOST_USER],
)
mail.attach_alternative(
render_to_string(
template_name="order_sold.html",
context={"order": order},
),
mimetype="text/html",
)
mail.attach(
filename=f"Bernini order {order.name}.csv",
content=order.as_csv(),
mimetype="text/csv",
)
for line in order.saleorderline_set.all():
mail.attach(
filename=f"Bernini order {order.name}/{line.name}.csv",
content=line.as_csv(),
mimetype="text/csv",
)
mail.send()
return Response(status=status.HTTP_200_OK,
data=f"Email sent! You should receive it at {order.sold_to.email}")
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR, data="Something went wrong on our end")
return Response(
status=status.HTTP_200_OK,
data=f"Email sent! You should receive it at {order.sold_to.email}",
)
return Response(
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
data="Something went wrong on our end",
)
class SaleOrderLineViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows orders to be viewed or edited.
"""
API endpoint that allows orders to be viewed or edited.
"""
queryset = SaleOrderLine.objects.all().order_by("name")
serializer_class = SaleOrderLineSerializer