from celery import shared_task from django.apps import apps from django.utils import timezone from notifications.models import Notification from notifications.tasks import send_email_with_context def _notify_order(order, title, text, template_path, action_url=None): """Send in-app notification + email for logged-in users, email-only for guests.""" if order.user: Notification.notify( user=order.user, title=title, text=text, notification_type=Notification.Type.ORDER, action_url=action_url or f"/objednavky/{order.id}/", template_path=template_path, email_context={"order": order}, ) else: send_email_with_context( recipients=order.email, subject=title, template_path=template_path, context={"order": order}, ) # -- CLEANUP TASKS -- @shared_task def delete_expired_orders(): Order = apps.get_model('commerce', 'Order') expired_orders = Order.objects.filter( status=Order.OrderStatus.CANCELLED, created_at__lt=timezone.now() - timezone.timedelta(hours=24), ) count = expired_orders.count() expired_orders.delete() return count # -- CARRIER NOTIFICATIONS -- @shared_task def notify_zasilkovna_sended(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Vaše objednávka byla odeslána", text=f"Objednávka #{order.id} byla předána přepravci Zásilkovna.", template_path="email/shipping/zasilkovna/zasilkovna_sended.html", ) @shared_task def notify_Ready_to_pickup(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Vaše objednávka je připravena k vyzvednutí", text=f"Objednávka #{order.id} čeká na vyzvednutí na prodejně.", template_path="email/shipping/ready_to_pickup/ready_to_pickup.html", ) # -- ORDER NOTIFICATIONS -- @shared_task def notify_order_successfuly_created(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Objednávka byla úspěšně vytvořena", text=f"Vaše objednávka #{order.id} byla přijata a čeká na zpracování.", template_path="email/order_created.html", ) @shared_task def notify_order_payed(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Platba objednávky přijata", text=f"Platba za objednávku #{order.id} byla úspěšně přijata.", template_path="email/order_paid.html", ) @shared_task def notify_about_missing_payment(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Nezaplacená objednávka", text=f"Objednávka #{order.id} dosud nebyla zaplacena. Dokončete platbu co nejdříve.", template_path="email/order_missing_payment.html", ) # -- REFUND NOTIFICATIONS -- @shared_task def notify_refund_items_arrived(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Vrácené zboží přijato", text=f"Vrácené zboží k objednávce #{order.id} bylo přijato. Reklamace bude zpracována.", template_path="email/order_refund_items_arrived.html", ) @shared_task def notify_refund_accepted(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Vrácení peněz schváleno", text=f"Vaše reklamace k objednávce #{order.id} byla schválena. Peníze budou vráceny.", template_path="email/order_refund_accepted.html", ) # -- ORDER STATUS NOTIFICATIONS -- @shared_task def notify_order_cancelled(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Objednávka zrušena", text=f"Objednávka #{order.id} byla zrušena.", template_path="email/order_cancelled.html", ) @shared_task def notify_order_completed(order=None, **kwargs): if not order: raise ValueError("Order must be provided.") _notify_order( order, title="Objednávka dokončena", text=f"Vaše objednávka #{order.id} byla úspěšně dokončena. Děkujeme za nákup!", template_path="email/order_completed.html", )