Source code for django_webapps_fullstack.error.views

"""
This module provides centralized error handling for the dingx logistics platform, implementing custom
error pages for HTTP status codes and test triggers for development/testing environments. It ensures
users receive informative, branded error messages when issues occur.

**Business Context:**

Professional error handling is crucial for user experience and platform credibility. When users encounter
errors (page not found, server errors, permission issues), they receive user-friendly error pages that
maintain the dingx brand experience and provide helpful guidance. This module ensures consistent error
handling across the entire platform.

**Key Business Value:**

1. **User Experience:**

- Professional, branded error pages instead of generic browser errors
    - Clear messaging about what went wrong
    - Guidance on how to proceed (return home, contact support)
    - Consistent design with platform theme
    - Multi-language support for error messages

2. **Development & Testing:**

- Test trigger views for QA and development
    - Easy error page validation before production
    - Consistent error handling patterns

3. **Production Reliability:**

- Graceful error handling prevents application crashes
    - Logged errors for debugging and monitoring
    - User-friendly messages maintain platform trust

**Error Handling:**

Production Error Handlers (Called by Django automatically):

- :func:`error_400_view`: Bad Request - Malformed client request

- :func:`error_403_view`: Forbidden - Permission denied

- :func:`error_404_view`: Not Found - Resource doesn't exist

- :func:`error_500_view`: Internal Server Error - Application error

- :func:`error_502_view`: Bad Gateway - Proxy/upstream server error

- :func:`error_503_view`: Service Unavailable - Temporary maintenance/overload

Test Trigger Views (For development/testing only):

- :func:`trigger_400_test`: Generate test 400 error

- :func:`trigger_403_test`: Generate test 403 error

- :func:`trigger_404_test`: Generate test 404 error

- :func:`trigger_500_test`: Generate test 500 error

- :func:`trigger_502_test`: Generate test 502 error

- :func:`trigger_503_test`: Generate test 503 error

**Common Error Scenarios:**

- **400 Bad Request:** User submits malformed data or suspicious operation
- **403 Forbidden:** User attempts unauthorized action
- **404 Not Found:** User navigates to non-existent page or product
- **500 Internal Server Error:** Application logic error or backend failure
- **502 Bad Gateway:** Odoo backend connection issues
- **503 Service Unavailable:** Platform maintenance or overload

**Technical Features:**

- Custom error templates with dingx branding
- HTTP status code preservation
- Exception handling with Django's exception framework
- Test routes for error page validation
- Integration with Django's error handling middleware

**Integration:**

Error views integrate with:

- Django's URL routing for error handlers
- Template system for consistent branding
- Internationalization framework for multi-language errors
- Logging system for error tracking

**Security:**

- No sensitive information exposed in error messages
- Test trigger views should be disabled in production
- Safe exception handling prevents information disclosure

**Production Configuration:**

In :mod:`settings.urls`, configure error handlers:

- handler400 = :func:`error_400_view`
- handler403 = :func:`error_403_view`
- handler404 = :func:`error_404_view`
- handler500 = :func:`error_500_view`

**Important:** Test trigger views must be removed from production URL configuration.
"""


# Initialize Django settings if running standalone (e.g., in Thonny IDE)
# This allows the module to be imported for inspection without running Django server
import sys
import os
if __name__ == "__main__" or 'django.conf.settings' not in sys.modules or not hasattr(sys.modules.get('django.conf.settings', None), 'configured'):
    import django
    from django.conf import settings
    if not settings.configured:
        # Add the project root to Python path
        project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        if project_root not in sys.path:
            sys.path.insert(0, project_root)
        # Set the Django settings module
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings')
        # Setup Django
        django.setup()

from django.shortcuts import render
from django.http      import HttpResponseNotFound, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseServerError
from django.core.exceptions import SuspiciousOperation, PermissionDenied

# used for internationalization (i18n) and localization (l10n)
from django.utils             import translation
# for the use of the gettext function to mark text for translation
from django.utils.translation import gettext as _
# set the desired language for templates
from django.utils.translation import activate, deactivate


[docs] def error_400_view(request, exception): """ Error handling for 400 error. """ return render(request, 'error_400.html', status=400)
[docs] def error_403_view(request, exception): """ Error handling for 403 error. """ return render(request, 'error_403.html', status=403)
[docs] def error_404_view(request, exception): """ Error handling for 404 error. """ return render(request, 'error_404.html', status=404)
[docs] def error_500_view(request, *args, **argv): """ Error handling for 500 error. """ return render(request, 'error_500.html', status=500)
[docs] def error_502_view(request, *args, **argv): """ Error handling for 502 Bad Gateway error. """ return render(request, 'error_502.html', status=502)
[docs] def error_503_view(request, *args, **argv): """ Error handling for 503 Service Unavailable error. """ return render(request, 'error_503.html', status=503)
# Test trigger views (for testing error pages only)
[docs] def trigger_400_test(request): """ Test view to trigger a 400 Bad Request error. This view should only be used in testing environments. """ raise SuspiciousOperation("Test 400 error")
[docs] def trigger_403_test(request): """ Test view to trigger a 403 Forbidden error. This view should only be used in testing environments. """ raise PermissionDenied("Test 403 error")
[docs] def trigger_404_test(request): """ Test view to trigger a 404 Not Found error. This view should only be used in testing environments. """ return render(request, 'error_404.html', status=404)
[docs] def trigger_500_test(request): """ Test view to trigger a 500 Internal Server Error. This view should only be used in testing environments. """ raise Exception("Test 500 error")
[docs] def trigger_502_test(request): """ Test view to manually trigger a 502 Bad Gateway error. This view should only be used in testing environments. Note: Real 502 errors occur at the web server level, not in Django. """ return render(request, 'error_502.html', status=502)
[docs] def trigger_503_test(request): """ Test view to manually trigger a 503 Service Unavailable error. This view should only be used in testing environments. Note: Real 503 errors typically occur at the web server level for maintenance mode. """ return render(request, 'error_503.html', status=503)