Add order status email notifications and templates
Introduces email notifications for order status changes (created, cancelled, completed, paid, missing payment, refund events) and adds corresponding HTML email templates. Refactors notification tasks to use only the order object and updates model logic to trigger notifications on relevant status changes.
This commit is contained in:
@@ -270,6 +270,15 @@ class Order(models.Model):
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
is_new = self.pk is None
|
||||
old_status = None
|
||||
|
||||
# Track old status for change detection
|
||||
if not is_new:
|
||||
try:
|
||||
old_instance = Order.objects.get(pk=self.pk)
|
||||
old_status = old_instance.status
|
||||
except Order.DoesNotExist:
|
||||
pass
|
||||
|
||||
# CRITICAL: Set currency from site configuration ONLY at creation time
|
||||
# Once set, currency should NEVER change to maintain order integrity
|
||||
@@ -285,9 +294,19 @@ class Order(models.Model):
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
# Send email notification for new orders
|
||||
if is_new and self.user:
|
||||
if is_new:
|
||||
from .tasks import notify_order_successfuly_created
|
||||
notify_order_successfuly_created.delay(order=self, user=self.user)
|
||||
notify_order_successfuly_created.delay(order=self)
|
||||
|
||||
# Send email notification when status changes to CANCELLED
|
||||
if not is_new and old_status != self.OrderStatus.CANCELLED and self.status == self.OrderStatus.CANCELLED:
|
||||
from .tasks import notify_order_cancelled
|
||||
notify_order_cancelled.delay(order=self)
|
||||
|
||||
# Send email notification when status changes to COMPLETED
|
||||
if not is_new and old_status != self.OrderStatus.COMPLETED and self.status == self.OrderStatus.COMPLETED:
|
||||
from .tasks import notify_order_completed
|
||||
notify_order_completed.delay(order=self)
|
||||
|
||||
def cancel_order(self):
|
||||
"""Cancel the order if possible"""
|
||||
@@ -352,7 +371,7 @@ class Carrier(models.Model):
|
||||
self.shipping_method == self.SHIPPING.STORE):
|
||||
|
||||
if hasattr(self, 'order') and self.order:
|
||||
notify_Ready_to_pickup.delay(order=self.order, user=self.order.user)
|
||||
notify_Ready_to_pickup.delay(order=self.order)
|
||||
|
||||
def get_price(self, order=None):
|
||||
if self.shipping_method == self.SHIPPING.ZASILKOVNA:
|
||||
@@ -381,7 +400,7 @@ class Carrier(models.Model):
|
||||
self.returning = False
|
||||
self.save()
|
||||
|
||||
notify_zasilkovna_sended.delay(order=self.order, user=self.order.user)
|
||||
notify_zasilkovna_sended.delay(order=self.order)
|
||||
|
||||
elif self.shipping_method == self.SHIPPING.DEUTSCHEPOST:
|
||||
# Import here to avoid circular imports
|
||||
@@ -400,7 +419,7 @@ class Carrier(models.Model):
|
||||
self.state = self.STATE.READY_TO_PICKUP
|
||||
self.save()
|
||||
|
||||
notify_Ready_to_pickup.delay(order=self.order, user=self.order.user)
|
||||
notify_Ready_to_pickup.delay(order=self.order)
|
||||
|
||||
else:
|
||||
raise ValidationError("Tato metoda dopravy nepodporuje objednání přepravy.")
|
||||
@@ -707,7 +726,7 @@ class Refund(models.Model):
|
||||
self.order.save(update_fields=["status", "updated_at"])
|
||||
|
||||
|
||||
notify_refund_accepted.delay(order=self.order, user=self.order.user)
|
||||
notify_refund_accepted.delay(order=self.order)
|
||||
|
||||
|
||||
def generate_refund_pdf_for_customer(self):
|
||||
|
||||
Reference in New Issue
Block a user