You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
padelclub_backend/shop/signals.py

124 lines
3.9 KiB

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.core.mail import send_mail
from django.conf import settings
from django.urls import reverse
from .models import Order, OrderItem, OrderStatus
from django.db import transaction
@receiver([post_save, post_delete], sender=Order)
def send_order_notification(sender, instance, **kwargs):
print("send_order_notification")
"""
Send an email notification when an order is created, updated, or deleted.
"""
# Use transaction.on_commit to ensure database operations are complete
transaction.on_commit(lambda: _send_order_email(instance, **kwargs))
def _send_order_email(instance, **kwargs):
created = kwargs.get('created', False)
update_fields = kwargs.get('update_fields', None)
# Determine the action type
if 'signal' in kwargs and kwargs['signal'] == post_delete:
action = "DELETED"
return
elif created:
action = "CREATED"
return
else:
action = "UPDATED"
print('updated', update_fields)
if update_fields and 'status' in update_fields:
action = "UPDATED"
# Get order details
order_id = instance.id
status = instance.status
print("status", status)
if status == OrderStatus.PENDING:
return
total_price = instance.total_price
# Generate admin URL
admin_url = f"{settings.SITE_URL}{reverse('admin:shop_order_change', args=[order_id])}"
# Get customer info
if instance.user:
customer_info = f"Utilisateur: {instance.user.email}"
elif instance.guest_user:
customer_info = f"Invité: {instance.guest_user.email} ({instance.guest_user.phone})"
else:
customer_info = "Client inconnu"
# Construire les détails des articles - obtenir une requête fraîche des articles de la commande
items_list = ""
if action != "DELETED":
# Utiliser une requête fraîche pour s'assurer d'avoir les données les plus récentes
order_items = OrderItem.objects.filter(order_id=order_id).select_related('product', 'color', 'size')
for item in order_items:
color = item.color.name if item.color else "N/A"
size = item.size.name if item.size else "N/A"
item_line = f"- {item.quantity}x {item.product.title} (Couleur: {color}, Taille: {size}, Prix: {item.price}€)\n"
items_list += item_line
# Composer l'email
if action == "CREATED":
action_fr = "CRÉÉE"
elif action == "UPDATED":
action_fr = "MISE À JOUR"
elif action == "DELETED":
action_fr = "SUPPRIMÉE"
else:
action_fr = action
# Traduire le statut actuel
status_fr_map = {
"PENDING": "EN ATTENTE",
"PAID": "PAYÉE",
"SHIPPED": "EXPÉDIÉE",
"DELIVERED": "LIVRÉE",
"CANCELED": "ANNULÉE"
}
status_fr = status_fr_map.get(status, status)
# Traduire le statut de paiement
payment_status_fr_map = {
"UNPAID": "NON PAYÉE",
"PAID": "PAYÉE",
"FAILED": "ÉCHOUÉE"
}
payment_status_fr = payment_status_fr_map.get(instance.payment_status, instance.payment_status)
subject = f"Commande #{order_id} {action_fr}: {status_fr}"
message = f"""
La commande #{order_id} a été {action_fr.lower()}
Statut: {status_fr}
Statut de paiement: {payment_status_fr}
Prix total: {total_price}
{customer_info}
Articles:
{items_list}
Voir la commande dans le panneau d'administration: {admin_url}
Ceci est un message automatique. Merci de ne pas répondre.
"""
# Send email
recipient_list = [email for name, email in settings.MANAGERS]
if not recipient_list:
recipient_list = [settings.DEFAULT_FROM_EMAIL]
send_mail(
subject=subject,
message=message,
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=recipient_list,
fail_silently=False,
)