diff --git a/backend/apps/core/management/commands/calculate_new_content.py b/backend/apps/core/management/commands/calculate_new_content.py index 5dce040c..80160017 100644 --- a/backend/apps/core/management/commands/calculate_new_content.py +++ b/backend/apps/core/management/commands/calculate_new_content.py @@ -16,6 +16,7 @@ from django.utils import timezone from apps.parks.models import Park from apps.rides.models import Ride +from apps.core.utils import capture_and_log logger = logging.getLogger(__name__) @@ -90,7 +91,7 @@ class Command(BaseCommand): self.stdout.write(f" {item['name']} ({item['park']}) - opened: {item['date_opened']}") except Exception as e: - logger.error(f"Error calculating new content: {e}", exc_info=True) + capture_and_log(e, 'Calculate new content', source='management', severity='high') raise CommandError(f"Failed to calculate new content: {e}") from None def _get_new_parks(self, cutoff_date: datetime, limit: int) -> list[dict[str, Any]]: diff --git a/backend/apps/core/management/commands/calculate_trending.py b/backend/apps/core/management/commands/calculate_trending.py index 952f689c..4f461eea 100644 --- a/backend/apps/core/management/commands/calculate_trending.py +++ b/backend/apps/core/management/commands/calculate_trending.py @@ -16,6 +16,7 @@ from django.utils import timezone from apps.core.analytics import PageView from apps.parks.models import Park from apps.rides.models import Ride +from apps.core.utils import capture_and_log logger = logging.getLogger(__name__) @@ -99,7 +100,7 @@ class Command(BaseCommand): self.stdout.write(f" {item['name']} (score: {item.get('views_change', 'N/A')})") except Exception as e: - logger.error(f"Error calculating trending content: {e}", exc_info=True) + capture_and_log(e, 'Calculate trending content', source='management', severity='high') raise CommandError(f"Failed to calculate trending content: {e}") from None def _calculate_trending_parks( @@ -199,7 +200,7 @@ class Command(BaseCommand): return final_score except Exception as e: - logger.error(f"Error calculating score for {content_type} {content_obj.id}: {e}") + capture_and_log(e, f'Calculate score for {content_type} {content_obj.id}', source='management', severity='medium') return 0.0 def _calculate_view_growth_score( diff --git a/backend/apps/core/state_machine/callback_base.py b/backend/apps/core/state_machine/callback_base.py index f0176f12..0947683d 100644 --- a/backend/apps/core/state_machine/callback_base.py +++ b/backend/apps/core/state_machine/callback_base.py @@ -75,8 +75,6 @@ from typing import Any, Optional from django.db import models -from apps.core.utils import capture_and_log - logger = logging.getLogger(__name__) @@ -499,11 +497,9 @@ class TransitionCallbackRegistry: overall_success = False if not callback.continue_on_error: - capture_and_log( - RuntimeError(f'Callback {callback.name} returned False'), - f'Aborting callback chain - continue_on_error=False', - source='state_machine', - severity='medium', + logger.error( + f"Aborting callback chain - {callback.name} failed " + f"and continue_on_error=False" ) break @@ -513,11 +509,9 @@ class TransitionCallbackRegistry: overall_success = False if not callback.continue_on_error: - capture_and_log( - e, - f'Aborting callback chain - {callback.name} raised exception', - source='state_machine', - severity='high', + logger.error( + f"Aborting callback chain - {callback.name} raised exception " + f"and continue_on_error=False" ) break diff --git a/backend/apps/core/state_machine/decorators.py b/backend/apps/core/state_machine/decorators.py index 01a9921c..1199a98d 100644 --- a/backend/apps/core/state_machine/decorators.py +++ b/backend/apps/core/state_machine/decorators.py @@ -20,7 +20,6 @@ from .signals import ( pre_state_transition, state_transition_failed, ) -from apps.core.utils import capture_and_log logger = logging.getLogger(__name__) @@ -85,12 +84,8 @@ def with_callbacks( if not pre_success and pre_failures: for callback, exc in pre_failures: if not callback.continue_on_error: - capture_and_log( - exc or RuntimeError(f'Pre-transition callback {callback.name} failed'), - f'Aborting transition - pre-callback failed', - source='state_machine', - severity='high', - ) + logger.error(f"Pre-transition callback {callback.name} failed, " + f"aborting transition") if exc: raise exc raise RuntimeError(f"Pre-transition callback {callback.name} failed") diff --git a/backend/apps/parks/management/commands/seed_sample_data.py b/backend/apps/parks/management/commands/seed_sample_data.py index 52454d59..6c73e142 100644 --- a/backend/apps/parks/management/commands/seed_sample_data.py +++ b/backend/apps/parks/management/commands/seed_sample_data.py @@ -12,6 +12,7 @@ from apps.rides.models import ( RollerCoasterStats, ) from apps.rides.models.company import Company as RideCompany +from apps.core.utils import capture_and_log class Command(BaseCommand): @@ -111,9 +112,11 @@ class Command(BaseCommand): self.stdout.write(self.style.SUCCESS("Successfully cleaned up existing sample data!")) except Exception as e: - self.logger.error( - f"Error during data cleanup: {str(e)}", - exc_info=True, + capture_and_log( + e, + 'Data cleanup error', + source='management', + severity='high', ) self.stdout.write(self.style.ERROR(f"Failed to clean up existing data: {str(e)}")) raise @@ -152,7 +155,7 @@ class Command(BaseCommand): self.stdout.write(self.style.SUCCESS("Successfully created comprehensive sample data!")) except Exception as e: - self.logger.error(f"Error during sample data creation: {str(e)}", exc_info=True) + capture_and_log(e, 'Sample data creation error', source='management', severity='high') self.stdout.write(self.style.ERROR(f"Failed to create sample data: {str(e)}")) raise @@ -333,7 +336,7 @@ class Command(BaseCommand): }" ) except Exception as e: - self.logger.error(f"Error creating park company {data['name']}: {str(e)}") + capture_and_log(e, f"Create park company {data['name']}", source='management', severity='medium') raise # Create companies in rides app (for manufacturers and designers) @@ -356,11 +359,11 @@ class Command(BaseCommand): }" ) except Exception as e: - self.logger.error(f"Error creating ride company {data['name']}: {str(e)}") + capture_and_log(e, f"Create ride company {data['name']}", source='management', severity='medium') raise except Exception as e: - self.logger.error(f"Error in create_companies: {str(e)}") + capture_and_log(e, 'Create companies', source='management', severity='high') raise def create_parks(self): @@ -518,19 +521,18 @@ class Command(BaseCommand): park_location.set_coordinates(loc_data["latitude"], loc_data["longitude"]) park_location.save() except Exception as e: - self.logger.error( - f"Error creating location for park { - park_data['name'] - }: {str(e)}" + capture_and_log( + e, f"Create location for park {park_data['name']}", + source='management', severity='medium' ) raise except Exception as e: - self.logger.error(f"Error creating park {park_data['name']}: {str(e)}") + capture_and_log(e, f"Create park {park_data['name']}", source='management', severity='medium') raise except Exception as e: - self.logger.error(f"Error in create_parks: {str(e)}") + capture_and_log(e, 'Create parks', source='management', severity='high') raise def create_rides(self): @@ -597,7 +599,7 @@ class Command(BaseCommand): }" ) except Exception as e: - self.logger.error(f"Error creating ride model {model_data['name']}: {str(e)}") + capture_and_log(e, f"Create ride model {model_data['name']}", source='management', severity='medium') raise # Create rides @@ -822,19 +824,18 @@ class Command(BaseCommand): stats_data = ride_data["coaster_stats"] RollerCoasterStats.objects.create(ride=ride, **stats_data) except Exception as e: - self.logger.error( - f"Error creating stats for ride {ride_data['name']}: { - str(e) - }" + capture_and_log( + e, f"Create stats for ride {ride_data['name']}", + source='management', severity='medium' ) raise except Exception as e: - self.logger.error(f"Error creating ride {ride_data['name']}: {str(e)}") + capture_and_log(e, f"Create ride {ride_data['name']}", source='management', severity='medium') raise except Exception as e: - self.logger.error(f"Error in create_rides: {str(e)}") + capture_and_log(e, 'Create rides', source='management', severity='high') raise def create_park_areas(self): @@ -967,11 +968,11 @@ class Command(BaseCommand): } in {park.name}" ) except Exception as e: - self.logger.error(f"Error creating areas for park {area_group['park']}: {str(e)}") + capture_and_log(e, f"Create areas for park {area_group['park']}", source='management', severity='medium') raise except Exception as e: - self.logger.error(f"Error in create_park_areas: {str(e)}") + capture_and_log(e, 'Create park areas', source='management', severity='high') raise def create_reviews(self): @@ -1043,10 +1044,9 @@ class Command(BaseCommand): }" ) except Exception as e: - self.logger.error( - f"Error creating park review for {review_data['park']}: { - str(e) - }" + capture_and_log( + e, f"Create park review for {review_data['park']}", + source='management', severity='medium' ) raise @@ -1102,15 +1102,14 @@ class Command(BaseCommand): }" ) except Exception as e: - self.logger.error( - f"Error creating ride review for {review_data['ride']}: { - str(e) - }" + capture_and_log( + e, f"Create ride review for {review_data['ride']}", + source='management', severity='medium' ) raise self.stdout.write(self.style.SUCCESS("Sample data creation completed!")) except Exception as e: - self.logger.error(f"Error in create_reviews: {str(e)}") + capture_and_log(e, 'Create reviews', source='management', severity='high') raise