61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
"""
|
|
Task Loader Utilities
|
|
Functions to load due tasks from database.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
from sqlalchemy.orm import Session, joinedload
|
|
from sqlalchemy import and_, or_
|
|
|
|
from models.monitoring_models import MonitoringTask
|
|
from models.enhanced_strategy_models import EnhancedContentStrategy
|
|
|
|
|
|
def load_due_monitoring_tasks(
|
|
db: Session,
|
|
user_id: Optional[int] = None
|
|
) -> List[MonitoringTask]:
|
|
"""
|
|
Load all monitoring tasks that are due for execution.
|
|
|
|
Criteria:
|
|
- status == 'active'
|
|
- next_execution <= now (or is None for first execution)
|
|
- Optional: user_id filter for specific user (for future admin features)
|
|
|
|
Note: Strategy relationship is eagerly loaded to ensure user_id is accessible
|
|
during task execution for user isolation.
|
|
|
|
Args:
|
|
db: Database session
|
|
user_id: Optional user ID to filter tasks (if None, loads all users' tasks)
|
|
|
|
Returns:
|
|
List of due MonitoringTask instances with strategy relationship loaded
|
|
"""
|
|
now = datetime.utcnow()
|
|
|
|
# Join with strategy to ensure relationship is loaded and support user filtering
|
|
query = db.query(MonitoringTask).join(
|
|
EnhancedContentStrategy,
|
|
MonitoringTask.strategy_id == EnhancedContentStrategy.id
|
|
).options(
|
|
joinedload(MonitoringTask.strategy) # Eagerly load strategy relationship
|
|
).filter(
|
|
and_(
|
|
MonitoringTask.status == 'active',
|
|
or_(
|
|
MonitoringTask.next_execution <= now,
|
|
MonitoringTask.next_execution.is_(None)
|
|
)
|
|
)
|
|
)
|
|
|
|
# Apply user filter if provided
|
|
if user_id is not None:
|
|
query = query.filter(EnhancedContentStrategy.user_id == user_id)
|
|
|
|
return query.all()
|
|
|