* Vietnamese translation incomplete

Cruise signals

Cruise signals (English fallback)

Aug. 17, 2025

Posted by admin

Nhom

Notes

 

Django Signals in Cruise Application - Detailed Analysis

What Are Django Signals?

Django signals are a form of event-driven programming that allows certain senders to notify a set of receivers when specific actions occur. They implement the Observer Pattern and provide a way to automatically execute code when database operations happen.

Your Current Signals Implementation

Let me examine the complete signals file and explain each component:

Read signals.py

 

 

Detailed Signal Analysis

 

 

1. Signal #1: calculate_commission (pre_save)

Typepre_save signal Trigger: Before a CruiseBooking instance is saved to the database Purpose: Automatic commission calculation for travel agents/booking platform

@receiver(pre_save, sender=CruiseBooking)

def calculate_commission(sender, instance, **kwargs):

    """Calculate commission amount before saving booking"""

    if instance.total_price and instance.commission_rate:

        instance.commission_amount = (instance.total_price * instance.commission_rate) / 100

Business Logic Explanation:

  • When: Executes every time a CruiseBooking is about to be saved
  • What: Automatically calculates commission based on total price and commission rate
  • Why: Ensures consistent commission calculations without manual intervention

Real-World Scenario:

# When this happens in your booking view:

booking = CruiseBooking.objects.create(

    total_price=Decimal('2500.00'),

    commission_rate=Decimal('10.00'),  # 10%

    # ... other fields

)

# The signal automatically sets:

# booking.commission_amount = 250.00 (before saving)

Benefits:

  • Consistency: No manual calculation errors
  • Automation: Reduces code duplication across views
  • Business Rules: Centralizes commission logic
  • Data Integrity: Ensures commission always matches price and rate

 

 

2. Signal #2: update_cabin_availability (post_save)

Typepost_save signal Trigger: After a CruiseBooking instance is saved to the database Purpose: Inventory management for cruise cabin availability

@receiver(post_save, sender=CruiseBooking)

def update_cabin_availability(sender, instance, created, **kwargs):

    """Update cabin availability when booking is created/confirmed"""

    if created and instance.status == 'confirmed':

        # Reduce available cabins

        cruise_price = instance.cruise.prices.filter(

            cabin_category=instance.cabin_category

        ).first()

        if cruise_price and cruise_price.available_cabins > 0:

            cruise_price.available_cabins -= 1

            cruise_price.save()

 

 

Business Logic Explanation:

  • When: After a new confirmed booking is created
  • What: Decreases available cabin count by 1
  • Why: Maintains real-time inventory accuracy

Inventory Management Flow:

  1. Customer books a cabin → CruiseBooking created with status='confirmed'
  2. Signal automatically finds matching CruisePrice record
  3. Reduces available_cabins by 1
  4. Prevents overbooking by maintaining accurate inventory

 

 

Enhanced Signals Implementation

Let me show you how to expand this signals system for a production-ready cruise booking platform:

signals.py+195-2

Let me fix the import error:

signals.py+1-0

signals.py+0-1

Now let me check if there are any additional signal-related issues and explain the comprehensive signal system:

Checked signals.py, no problems found

Perfect! Now let me provide you with a comprehensive explanation of the enhanced signals system:

 

 

Complete Django Signals Analysis for Cruise Application

Signal Types and Their Uses

1. pre_save Signals - Data Preparation

Purpose: Execute logic BEFORE an object is saved to the database Use Cases: Data validation, automatic calculations, field population

2. post_save Signals - Post-Processing

Purpose: Execute logic AFTER an object is successfully saved Use Cases: Related model updates, notifications, logging, analytics

3. post_delete Signals - Cleanup Operations

Purpose: Execute logic AFTER an object is deleted Use Cases: Cleanup, counter updates, cascade operations

 

 

Enhanced Signal Functions Explained

 

 

1. Commission Calculation (pre_save)

@receiver(pre_save, sender=CruiseBooking)

def calculate_commission(sender, instance, **kwargs):

Business Purpose: Ensures every booking automatically calculates travel agent commissions Benefits:

  • Prevents manual calculation errors
  • Maintains consistent commission rates
  • Supports revenue tracking for agents

 

 

2. Inventory Management (post_save)

@receiver(post_save, sender=CruiseBooking)

def update_cabin_availability(sender, instance, created, **kwargs):

Business Purpose: Real-time cabin inventory management Benefits:

  • Prevents overbooking
  • Maintains accurate availability counts
  • Supports dynamic pricing strategies

 

 

3. Booking Status Management (post_save)

@receiver(post_save, sender=CruiseBooking)

def handle_booking_status_changes(sender, instance, created, **kwargs):

Business Purpose: Automated customer communication and workflow management Features:

  • Automatic email confirmations
  • Status-specific messaging
  • Workflow automation

 

 

4. Cancellation Processing (post_save)

@receiver(post_save, sender=CruiseBooking)

def restore_cabin_availability_on_cancellation(sender, instance, **kwargs):

Business Purpose: Inventory restoration and cancellation fee processing Features:

  • Automatic cabin availability restoration
  • Cancellation fee calculation based on timing

Refund amount calculation

 

5. Review Rating Updates (post_save)

@receiver(post_save, sender=CruiseReview)

def update_cruise_rating(sender, instance, created, **kwargs):

Business Purpose: Dynamic cruise rating calculation Features:

  • Real-time average rating updates
  • Review verification checking
  • Rating-based ranking support

 

 

6. Wishlist Analytics (post_save & post_delete)

@receiver(post_save, sender=CruiseWishlist)

def track_wishlist_analytics(sender, instance, created, **kwargs):

Business Purpose: Customer preference tracking and marketing analytics Features:

  • Popular cruise identification
  • Demand forecasting data
  • Marketing campaign targeting
  •  

 

 

Advanced Signal Features

Email Notification System

The signals include comprehensive email handling:

  • Booking Confirmations: Automatic confirmation emails with booking details
  • Pending Notifications: Status update emails for processing bookings
  • Cancellation Confirmations: Refund and cancellation details

Logging and Monitoring

logger = logging.getLogger(__name__)

logger.info(f"Commission calculated for booking {instance.pk}: ${instance.commission_amount}")

Benefits:

  • Audit trail for business operations
  • Error tracking and debugging
  • Performance monitoring

Error Handling

try:

    # Email sending logic

except Exception as e:

    logger.error(f"Failed to send email: {str(e)}")

Features:

  • Graceful failure handling
  • Prevents signal errors from breaking main operations
  • Comprehensive error logging

 

 

Business Rules Implementation

Cancellation Policy Automation

days_until_departure = (booking.cruise.departure_date - timezone.now().date()).days

if days_until_departure < 30:

    cancellation_fee = booking.total_price * Decimal('0.25')  # 25% fee

 

 

Business Logic:

  • 30+ days: Full refund
  • < 30 days: 25% cancellation fee
  • Automatic refund calculation

 

 

Signal Registration and Apps.py Integration

To ensure signals are properly loaded, you need to register them in your apps.py:

Read apps.py

Great! The signals are already properly registered in the apps.py file.

Performance Considerations

Signal Optimization Best Practices:

  1. Conditional Execution: Use conditions to prevent unnecessary processing

if created and instance.status == 'confirmed':  # Only for new confirmed bookings

  1. Selective Field Updates: Use update_fields to minimize database writes

cruise.save(update_fields=['average_rating'])

  1. Error Isolation: Prevent signal failures from affecting main operations

try:

    # Signal logic

except Exception as e:

    logger.error(f"Signal error: {str(e)}")

 

 

Testing Signals

Here's how you would test these signals:

from django.test import TestCase

from apps.cruise.models import CruiseBooking

from decimal import Decimal

class SignalTests(TestCase):

    def test_commission_calculation(self):

        booking = CruiseBooking.objects.create(

            total_price=Decimal('1000.00'),

            commission_rate=Decimal('10.00'),

            # ... other required fields

        )

        self.assertEqual(booking.commission_amount, Decimal('100.00'))

    

    def test_cabin_availability_update(self):

        # Test that confirmed booking reduces availability

        initial_cabins = cruise_price.available_cabins

        CruiseBooking.objects.create(

            status='confirmed',

            # ... other fields

        )

        cruise_price.refresh_from_db()

        self.assertEqual(cruise_price.available_cabins, initial_cabins - 1)

 

 

Production Considerations

Monitoring and Alerting:

  • Set up logging aggregation (ELK stack, CloudWatch)
  • Monitor signal performance and failures
  • Alert on critical business operations (booking confirmations, inventory changes)

Scalability:

  • Consider using Celery for heavy signal operations
  • Implement rate limiting for email sending
  • Cache frequently accessed data

Data Consistency:

  • Use database transactions for related operations
  • Implement idempotency for critical signals
  • Plan for signal retry mechanisms

This comprehensive signal system transforms your cruise booking platform into an automated, business-rule-driven application that handles complex workflows without manual intervention, ensuring data consistency, customer communication, and operational efficienc

 

Vietnamese translation is not available for this article. Showing English content:

Nhom

Notes

 

Django Signals in Cruise Application - Detailed Analysis

What Are Django Signals?

Django signals are a form of event-driven programming that allows certain senders to notify a set of receivers when specific actions occur. They implement the Observer Pattern and provide a way to automatically execute code when database operations happen.

Your Current Signals Implementation

Let me examine the complete signals file and explain each component:

Read signals.py

 

 

Detailed Signal Analysis

 

 

1. Signal #1: calculate_commission (pre_save)

Typepre_save signal Trigger: Before a CruiseBooking instance is saved to the database Purpose: Automatic commission calculation for travel agents/booking platform

@receiver(pre_save, sender=CruiseBooking)

def calculate_commission(sender, instance, **kwargs):

    """Calculate commission amount before saving booking"""

    if instance.total_price and instance.commission_rate:

        instance.commission_amount = (instance.total_price * instance.commission_rate) / 100

Business Logic Explanation:

  • When: Executes every time a CruiseBooking is about to be saved
  • What: Automatically calculates commission based on total price and commission rate
  • Why: Ensures consistent commission calculations without manual intervention

Real-World Scenario:

# When this happens in your booking view:

booking = CruiseBooking.objects.create(

    total_price=Decimal('2500.00'),

    commission_rate=Decimal('10.00'),  # 10%

    # ... other fields

)

# The signal automatically sets:

# booking.commission_amount = 250.00 (before saving)

Benefits:

  • Consistency: No manual calculation errors
  • Automation: Reduces code duplication across views
  • Business Rules: Centralizes commission logic
  • Data Integrity: Ensures commission always matches price and rate

 

 

2. Signal #2: update_cabin_availability (post_save)

Typepost_save signal Trigger: After a CruiseBooking instance is saved to the database Purpose: Inventory management for cruise cabin availability

@receiver(post_save, sender=CruiseBooking)

def update_cabin_availability(sender, instance, created, **kwargs):

    """Update cabin availability when booking is created/confirmed"""

    if created and instance.status == 'confirmed':

        # Reduce available cabins

        cruise_price = instance.cruise.prices.filter(

            cabin_category=instance.cabin_category

        ).first()

        if cruise_price and cruise_price.available_cabins > 0:

            cruise_price.available_cabins -= 1

            cruise_price.save()

 

 

Business Logic Explanation:

  • When: After a new confirmed booking is created
  • What: Decreases available cabin count by 1
  • Why: Maintains real-time inventory accuracy

Inventory Management Flow:

  1. Customer books a cabin → CruiseBooking created with status='confirmed'
  2. Signal automatically finds matching CruisePrice record
  3. Reduces available_cabins by 1
  4. Prevents overbooking by maintaining accurate inventory

 

 

Enhanced Signals Implementation

Let me show you how to expand this signals system for a production-ready cruise booking platform:

signals.py+195-2

Let me fix the import error:

signals.py+1-0

signals.py+0-1

Now let me check if there are any additional signal-related issues and explain the comprehensive signal system:

Checked signals.py, no problems found

Perfect! Now let me provide you with a comprehensive explanation of the enhanced signals system:

 

 

Complete Django Signals Analysis for Cruise Application

Signal Types and Their Uses

1. pre_save Signals - Data Preparation

Purpose: Execute logic BEFORE an object is saved to the database Use Cases: Data validation, automatic calculations, field population

2. post_save Signals - Post-Processing

Purpose: Execute logic AFTER an object is successfully saved Use Cases: Related model updates, notifications, logging, analytics

3. post_delete Signals - Cleanup Operations

Purpose: Execute logic AFTER an object is deleted Use Cases: Cleanup, counter updates, cascade operations

 

 

Enhanced Signal Functions Explained

 

 

1. Commission Calculation (pre_save)

@receiver(pre_save, sender=CruiseBooking)

def calculate_commission(sender, instance, **kwargs):

Business Purpose: Ensures every booking automatically calculates travel agent commissions Benefits:

  • Prevents manual calculation errors
  • Maintains consistent commission rates
  • Supports revenue tracking for agents

 

 

2. Inventory Management (post_save)

@receiver(post_save, sender=CruiseBooking)

def update_cabin_availability(sender, instance, created, **kwargs):

Business Purpose: Real-time cabin inventory management Benefits:

  • Prevents overbooking
  • Maintains accurate availability counts
  • Supports dynamic pricing strategies

 

 

3. Booking Status Management (post_save)

@receiver(post_save, sender=CruiseBooking)

def handle_booking_status_changes(sender, instance, created, **kwargs):

Business Purpose: Automated customer communication and workflow management Features:

  • Automatic email confirmations
  • Status-specific messaging
  • Workflow automation

 

 

4. Cancellation Processing (post_save)

@receiver(post_save, sender=CruiseBooking)

def restore_cabin_availability_on_cancellation(sender, instance, **kwargs):

Business Purpose: Inventory restoration and cancellation fee processing Features:

  • Automatic cabin availability restoration
  • Cancellation fee calculation based on timing

Refund amount calculation

 

5. Review Rating Updates (post_save)

@receiver(post_save, sender=CruiseReview)

def update_cruise_rating(sender, instance, created, **kwargs):

Business Purpose: Dynamic cruise rating calculation Features:

  • Real-time average rating updates
  • Review verification checking
  • Rating-based ranking support

 

 

6. Wishlist Analytics (post_save & post_delete)

@receiver(post_save, sender=CruiseWishlist)

def track_wishlist_analytics(sender, instance, created, **kwargs):

Business Purpose: Customer preference tracking and marketing analytics Features:

  • Popular cruise identification
  • Demand forecasting data
  • Marketing campaign targeting
  •  

 

 

Advanced Signal Features

Email Notification System

The signals include comprehensive email handling:

  • Booking Confirmations: Automatic confirmation emails with booking details
  • Pending Notifications: Status update emails for processing bookings
  • Cancellation Confirmations: Refund and cancellation details

Logging and Monitoring

logger = logging.getLogger(__name__)

logger.info(f"Commission calculated for booking {instance.pk}: ${instance.commission_amount}")

Benefits:

  • Audit trail for business operations
  • Error tracking and debugging
  • Performance monitoring

Error Handling

try:

    # Email sending logic

except Exception as e:

    logger.error(f"Failed to send email: {str(e)}")

Features:

  • Graceful failure handling
  • Prevents signal errors from breaking main operations
  • Comprehensive error logging

 

 

Business Rules Implementation

Cancellation Policy Automation

days_until_departure = (booking.cruise.departure_date - timezone.now().date()).days

if days_until_departure < 30:

    cancellation_fee = booking.total_price * Decimal('0.25')  # 25% fee

 

 

Business Logic:

  • 30+ days: Full refund
  • < 30 days: 25% cancellation fee
  • Automatic refund calculation

 

 

Signal Registration and Apps.py Integration

To ensure signals are properly loaded, you need to register them in your apps.py:

Read apps.py

Great! The signals are already properly registered in the apps.py file.

Performance Considerations

Signal Optimization Best Practices:

  1. Conditional Execution: Use conditions to prevent unnecessary processing

if created and instance.status == 'confirmed':  # Only for new confirmed bookings

  1. Selective Field Updates: Use update_fields to minimize database writes

cruise.save(update_fields=['average_rating'])

  1. Error Isolation: Prevent signal failures from affecting main operations

try:

    # Signal logic

except Exception as e:

    logger.error(f"Signal error: {str(e)}")

 

 

Testing Signals

Here's how you would test these signals:

from django.test import TestCase

from apps.cruise.models import CruiseBooking

from decimal import Decimal

class SignalTests(TestCase):

    def test_commission_calculation(self):

        booking = CruiseBooking.objects.create(

            total_price=Decimal('1000.00'),

            commission_rate=Decimal('10.00'),

            # ... other required fields

        )

        self.assertEqual(booking.commission_amount, Decimal('100.00'))

    

    def test_cabin_availability_update(self):

        # Test that confirmed booking reduces availability

        initial_cabins = cruise_price.available_cabins

        CruiseBooking.objects.create(

            status='confirmed',

            # ... other fields

        )

        cruise_price.refresh_from_db()

        self.assertEqual(cruise_price.available_cabins, initial_cabins - 1)

 

 

Production Considerations

Monitoring and Alerting:

  • Set up logging aggregation (ELK stack, CloudWatch)
  • Monitor signal performance and failures
  • Alert on critical business operations (booking confirmations, inventory changes)

Scalability:

  • Consider using Celery for heavy signal operations
  • Implement rate limiting for email sending
  • Cache frequently accessed data

Data Consistency:

  • Use database transactions for related operations
  • Implement idempotency for critical signals
  • Plan for signal retry mechanisms

This comprehensive signal system transforms your cruise booking platform into an automated, business-rule-driven application that handles complex workflows without manual intervention, ensuring data consistency, customer communication, and operational efficienc

 

Attached Files

0 files found.

You are viewing this article in public mode. Some features may be limited.