From 6247fee7051a4c6972583defd31ae7373b80524d Mon Sep 17 00:00:00 2001 From: Raz Date: Tue, 6 May 2025 13:55:50 +0200 Subject: [PATCH] add signal message for shop --- shop/models.py | 20 ++++++++++++++++++++ shop/signals.py | 32 +++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/shop/models.py b/shop/models.py index ae55bbe..bf51bfe 100644 --- a/shop/models.py +++ b/shop/models.py @@ -156,6 +156,26 @@ class Order(models.Model): def shipping_address_can_be_edited(self): return self.status in [OrderStatus.PENDING, OrderStatus.PAID, OrderStatus.PREPARED] + def get_shipping_address(self): + """ + Returns a formatted string of the shipping address + """ + if not self.shipping_address: + return "Aucune adresse de livraison fournie" + + address_parts = [ + self.shipping_address.street_address, + self.shipping_address.apartment if self.shipping_address.apartment else None, + self.shipping_address.city, + self.shipping_address.state if self.shipping_address.state else None, + self.shipping_address.postal_code, + self.shipping_address.country + ] + + # Filter out None values and join with newlines + formatted_address = '\n'.join(part for part in address_parts if part) + return formatted_address + class OrderItem(models.Model): order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items') product = models.ForeignKey(Product, on_delete=models.CASCADE) diff --git a/shop/signals.py b/shop/signals.py index f449550..c226a47 100644 --- a/shop/signals.py +++ b/shop/signals.py @@ -70,11 +70,11 @@ def _get_order_details(instance): # Translate statuses status_fr_map = { "PENDING": "EN ATTENTE", "PAID": "PAYÉE", - "SHIPPED": "EXPÉDIÉE", "DELIVERED": "LIVRÉE", "CANCELED": "ANNULÉE" + "SHIPPED": "EXPÉDIÉE", "DELIVERED": "LIVRÉE", "CANCELED": "ANNULÉE", "REFUNDED": "REMBOURSÉE", "PREPARED": "EN COURS DE PRÉPARATION", } payment_status_fr_map = { - "UNPAID": "NON PAYÉE", "PAID": "PAYÉE", "FAILED": "ÉCHOUÉE" + "UNPAID": "NON PAYÉE", "PAID": "PAYÉE", "FAILED": "ÉCHOUÉE", "REFUNDED": "REMBOURSÉE", } # Calculate discount information @@ -106,7 +106,8 @@ def _get_order_details(instance): 'customer_info': customer_info, 'customer_email': customer_email, 'date_ordered': instance.date_ordered, - 'admin_url': f"{settings.SHOP_SITE_ROOT_URL}{reverse('admin:shop_order_change', args=[instance.id])}" + 'admin_url': f"{settings.SHOP_SITE_ROOT_URL}{reverse('admin:shop_order_change', args=[instance.id])}", + 'shipping_address': instance.get_shipping_address(), } def _build_items_list(order_id, action): @@ -153,6 +154,8 @@ Statut de paiement: {order_details['payment_status_fr']} {order_details['customer_info']} +{order_details['shipping_address']} + Articles: {items_list} @@ -195,7 +198,8 @@ def _send_customer_notification(instance, order_details, items_list): order_details['final_price'], items_list, contact_email, - shop_url + shop_url, + order_details['shipping_address'] ) # Skip if no email content returned @@ -213,7 +217,7 @@ def _send_customer_notification(instance, order_details, items_list): def _get_customer_email_content(status, payment_status, order_id, date, status_fr, total_price, has_coupon, coupon_info, discount_amount, - final_price, items_list, contact_email, shop_url): + final_price, items_list, contact_email, shop_url, shipping_address): """Get the appropriate customer email content based on order status.""" # Build price information with coupon details if applicable @@ -230,21 +234,23 @@ Montant payé: {final_price}€""" 'subject': f"Confirmation de votre commande #{order_id} - Padel Club", 'message': _build_payment_confirmation_email(order_id, date, status_fr, price_info, items_list, - contact_email, shop_url) + contact_email, shop_url, shipping_address) } # Order status update email - elif status in [OrderStatus.SHIPPED, OrderStatus.DELIVERED, OrderStatus.CANCELED]: + elif status in [OrderStatus.SHIPPED, OrderStatus.DELIVERED, OrderStatus.CANCELED, OrderStatus.PREPARED, OrderStatus.REFUNDED]: status_message = { + OrderStatus.PREPARED: "Votre commande est en cours de préparation.", OrderStatus.SHIPPED: "Votre commande a été expédiée et est en cours de livraison.", OrderStatus.DELIVERED: "Votre commande a été livrée. Nous espérons que vous apprécierez vos produits !", + OrderStatus.REFUNDED: "Votre commande a été annulée et son remboursement est en cours de traitement.", OrderStatus.CANCELED: "Votre commande a été annulée. Si vous n'êtes pas à l'origine de cette annulation, veuillez nous contacter immédiatement." }.get(status, "") return { 'subject': f"Mise à jour de votre commande #{order_id} - Padel Club", 'message': _build_status_update_email(order_id, date, status_message, status_fr, - price_info, items_list, contact_email) + price_info, items_list, contact_email, shipping_address) } # Payment issue notification @@ -266,7 +272,7 @@ Montant payé: {final_price}€""" # No email needed return None -def _build_payment_confirmation_email(order_id, date, status_fr, price_info, items_list, contact_email, shop_url): +def _build_payment_confirmation_email(order_id, date, status_fr, price_info, items_list, contact_email, shop_url, shipping_address): """Build payment confirmation email message.""" return f""" Bonjour, @@ -282,7 +288,10 @@ Détail de votre commande : {items_list} IMPORTANT - COMMENT RÉCUPÉRER VOTRE COMMANDE : -Notre boutique fonctionne entre amis 'Padel Club'. Nous allons préparer votre commande et vous la remettre en main propre lors d'une prochaine session de padel ! Aucune expédition n'est prévue, nous vous remettrons directement vos articles sur place. +Notre boutique fonctionne entre amis 'Padel Club'. +Nous allons préparer votre commande et vous la remettre en main propre lors d'une prochaine session de padel ! +Si jamais la livraison est possible, nous vous expédierons votre commande à l'adresse indiquée. Vous serez alors notifiés par email lorsque votre commande sera expédiée. +{shipping_address} Pour toute question concernant votre commande, n'hésitez pas à contacter notre service client : {contact_email} @@ -295,7 +304,7 @@ Merci de votre confiance et à bientôt sur Padel Club ! L'équipe Padel Club """ -def _build_status_update_email(order_id, date, status_message, status_fr, price_info, items_list, contact_email): +def _build_status_update_email(order_id, date, status_message, status_fr, price_info, items_list, contact_email, shipping_address): """Build status update email message.""" return f""" Bonjour, @@ -303,6 +312,7 @@ Bonjour, Mise à jour concernant votre commande Padel Club #{order_id} du {date} : {status_message} +{shipping_address} Statut actuel: {status_fr} {price_info}