diff --git a/services/training/app/services/training_orchestrator.py b/services/training/app/services/training_orchestrator.py index 0b3363dc..d2cc3dfd 100644 --- a/services/training/app/services/training_orchestrator.py +++ b/services/training/app/services/training_orchestrator.py @@ -177,24 +177,29 @@ class TrainingDataOrchestrator: raise ValueError(f"Failed to prepare training data: {str(e)}") def _extract_sales_date_range(self, sales_data: List[Dict[str, Any]]) -> DateRange: - """Extract date range from sales data with timezone handling""" + """Extract date range from sales data with timezone handling and strict date format.""" if not sales_data: raise ValueError("No sales data provided") dates = [] + for record in sales_data: date_value = record.get('date') - if date_value: - # ✅ FIX: Ensure timezone-aware datetime - if isinstance(date_value, str): - dt = pd.to_datetime(date_value) - if dt.tz is None: - dt = dt.replace(tzinfo=timezone.utc) - dates.append(dt.to_pydatetime()) - elif isinstance(date_value, datetime): - if date_value.tzinfo is None: - date_value = date_value.replace(tzinfo=timezone.utc) - dates.append(date_value) + if not date_value: + continue # Skip records with missing date + + if isinstance(date_value, str): + # Parse string with explicit format + dt = pd.to_datetime(date_value, format='mixed', errors='raise') + if dt.tz is None: + dt = dt.tz_localize('UTC') # Assign UTC timezone if none + dates.append(dt.to_pydatetime()) + elif isinstance(date_value, datetime): + if date_value.tzinfo is None: + date_value = date_value.replace(tzinfo=timezone.utc) + dates.append(date_value) + else: + continue if not dates: raise ValueError("No valid dates found in sales data") diff --git a/services/training/app/services/training_service.py b/services/training/app/services/training_service.py index 51361a61..1518e526 100644 --- a/services/training/app/services/training_service.py +++ b/services/training/app/services/training_service.py @@ -51,10 +51,6 @@ def make_json_serializable(obj): return obj.tolist() elif isinstance(obj, pd.DataFrame): return obj.to_dict('records') - elif isinstance(obj, datetime): - return obj.isoformat() - elif isinstance(obj, date): - return obj.isoformat() elif isinstance(obj, uuid.UUID): return str(obj) elif hasattr(obj, '__class__') and 'UUID' in str(obj.__class__): @@ -132,8 +128,7 @@ class EnhancedTrainingService: tenant_id=tenant_id) # Get session and initialize repositories - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session() as session: await self._init_repositories(session) try: @@ -431,8 +426,7 @@ class EnhancedTrainingService: async def get_training_status(self, job_id: str) -> Dict[str, Any]: """Get training job status using repository""" try: - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session()() as session: await self._init_repositories(session) log = await self.training_log_repo.get_log_by_job_id(job_id) @@ -466,8 +460,7 @@ class EnhancedTrainingService: ) -> List[Dict[str, Any]]: """Get models for a tenant using repository""" try: - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session() as session: await self._init_repositories(session) if active_only: @@ -494,8 +487,7 @@ class EnhancedTrainingService: async def get_model_performance(self, model_id: str) -> Dict[str, Any]: """Get model performance metrics using repository""" try: - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session() as session: await self._init_repositories(session) # Get model summary @@ -526,8 +518,7 @@ class EnhancedTrainingService: async def get_tenant_statistics(self, tenant_id: str) -> Dict[str, Any]: """Get comprehensive tenant statistics using repositories""" try: - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session() as session: await self._init_repositories(session) # Get model statistics @@ -577,8 +568,7 @@ class EnhancedTrainingService: tenant_id: str = None): """Update job status using repository pattern""" try: - from app.core.database import get_background_db_session - async with get_background_db_session() as session: + async with self.database_manager.get_session() as session: await self._init_repositories(session) # Check if log exists, create if not