
This commit introduces new models and endpoints for managing chore history and scheduling within the application. Key changes include: - Added `ChoreHistory` and `ChoreAssignmentHistory` models to track changes and events related to chores and assignments. - Implemented CRUD operations for chore history in the `history.py` module. - Created endpoints to retrieve chore and assignment history in the `chores.py` and `groups.py` files. - Introduced a scheduling feature for group chores, allowing for round-robin assignment generation. - Updated existing chore and assignment CRUD operations to log history entries for create, update, and delete actions. This enhancement improves the tracking of chore-related events and facilitates better management of group chore assignments.
83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
# be/app/crud/history.py
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy.future import select
|
|
from sqlalchemy.orm import selectinload
|
|
from typing import List, Optional, Any, Dict
|
|
|
|
from app.models import ChoreHistory, ChoreAssignmentHistory, ChoreHistoryEventTypeEnum, User, Chore, Group
|
|
from app.schemas.chore import ChoreHistoryPublic, ChoreAssignmentHistoryPublic
|
|
|
|
async def create_chore_history_entry(
|
|
db: AsyncSession,
|
|
*,
|
|
chore_id: Optional[int],
|
|
group_id: Optional[int],
|
|
changed_by_user_id: Optional[int],
|
|
event_type: ChoreHistoryEventTypeEnum,
|
|
event_data: Optional[Dict[str, Any]] = None,
|
|
) -> ChoreHistory:
|
|
"""Logs an event in the chore history."""
|
|
history_entry = ChoreHistory(
|
|
chore_id=chore_id,
|
|
group_id=group_id,
|
|
changed_by_user_id=changed_by_user_id,
|
|
event_type=event_type,
|
|
event_data=event_data or {},
|
|
)
|
|
db.add(history_entry)
|
|
await db.flush()
|
|
await db.refresh(history_entry)
|
|
return history_entry
|
|
|
|
async def create_assignment_history_entry(
|
|
db: AsyncSession,
|
|
*,
|
|
assignment_id: int,
|
|
changed_by_user_id: int,
|
|
event_type: ChoreHistoryEventTypeEnum,
|
|
event_data: Optional[Dict[str, Any]] = None,
|
|
) -> ChoreAssignmentHistory:
|
|
"""Logs an event in the chore assignment history."""
|
|
history_entry = ChoreAssignmentHistory(
|
|
assignment_id=assignment_id,
|
|
changed_by_user_id=changed_by_user_id,
|
|
event_type=event_type,
|
|
event_data=event_data or {},
|
|
)
|
|
db.add(history_entry)
|
|
await db.flush()
|
|
await db.refresh(history_entry)
|
|
return history_entry
|
|
|
|
async def get_chore_history(db: AsyncSession, chore_id: int) -> List[ChoreHistory]:
|
|
"""Gets all history for a specific chore."""
|
|
result = await db.execute(
|
|
select(ChoreHistory)
|
|
.where(ChoreHistory.chore_id == chore_id)
|
|
.options(selectinload(ChoreHistory.changed_by_user))
|
|
.order_by(ChoreHistory.timestamp.desc())
|
|
)
|
|
return result.scalars().all()
|
|
|
|
async def get_assignment_history(db: AsyncSession, assignment_id: int) -> List[ChoreAssignmentHistory]:
|
|
"""Gets all history for a specific assignment."""
|
|
result = await db.execute(
|
|
select(ChoreAssignmentHistory)
|
|
.where(ChoreAssignmentHistory.assignment_id == assignment_id)
|
|
.options(selectinload(ChoreAssignmentHistory.changed_by_user))
|
|
.order_by(ChoreAssignmentHistory.timestamp.desc())
|
|
)
|
|
return result.scalars().all()
|
|
|
|
async def get_group_chore_history(db: AsyncSession, group_id: int) -> List[ChoreHistory]:
|
|
"""Gets all chore-related history for a group, including chore-specific and group-level events."""
|
|
result = await db.execute(
|
|
select(ChoreHistory)
|
|
.where(ChoreHistory.group_id == group_id)
|
|
.options(
|
|
selectinload(ChoreHistory.changed_by_user),
|
|
selectinload(ChoreHistory.chore) # Also load chore info if available
|
|
)
|
|
.order_by(ChoreHistory.timestamp.desc())
|
|
)
|
|
return result.scalars().all() |