feat: add PendingRewardDialog, RewardConfirmDialog, and TaskConfirmDialog components
All checks were successful
Gitea Actions Demo / build-and-push (push) Successful in 25s
All checks were successful
Gitea Actions Demo / build-and-push (push) Successful in 25s
- Implemented PendingRewardDialog for handling pending reward requests. - Created RewardConfirmDialog for confirming reward redemption. - Developed TaskConfirmDialog for task confirmation with child name display. test: add unit tests for ChildView and ParentView components - Added comprehensive tests for ChildView including task triggering and SSE event handling. - Implemented tests for ParentView focusing on override modal and SSE event management. test: add ScrollingList component tests - Created tests for ScrollingList to verify item fetching, loading states, and custom item classes. - Included tests for two-step click interactions and edit button display logic. - Moved toward hashed passwords.
This commit is contained in:
146
backend/db/child_overrides.py
Normal file
146
backend/db/child_overrides.py
Normal file
@@ -0,0 +1,146 @@
|
||||
"""Helper functions for child override database operations."""
|
||||
import logging
|
||||
from typing import Optional, List
|
||||
from tinydb import Query
|
||||
from db.db import child_overrides_db
|
||||
from models.child_override import ChildOverride
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def insert_override(override: ChildOverride) -> str:
|
||||
"""
|
||||
Insert or update an override. Only one override per (child_id, entity_id).
|
||||
|
||||
Args:
|
||||
override: ChildOverride instance to insert or update
|
||||
|
||||
Returns:
|
||||
The override ID
|
||||
"""
|
||||
try:
|
||||
OverrideQuery = Query()
|
||||
existing = child_overrides_db.get(
|
||||
(OverrideQuery.child_id == override.child_id) &
|
||||
(OverrideQuery.entity_id == override.entity_id)
|
||||
)
|
||||
|
||||
if existing:
|
||||
# Update existing override
|
||||
override.touch() # Update timestamp
|
||||
child_overrides_db.update(override.to_dict(), doc_ids=[existing.doc_id])
|
||||
logger.info(f"Override updated: child={override.child_id}, entity={override.entity_id}, value={override.custom_value}")
|
||||
else:
|
||||
# Insert new override
|
||||
child_overrides_db.insert(override.to_dict())
|
||||
logger.info(f"Override created: child={override.child_id}, entity={override.entity_id}, value={override.custom_value}")
|
||||
|
||||
return override.id
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to insert override: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def get_override(child_id: str, entity_id: str) -> Optional[ChildOverride]:
|
||||
"""
|
||||
Get override for a specific child and entity.
|
||||
|
||||
Args:
|
||||
child_id: Child ID
|
||||
entity_id: Entity ID (task or reward)
|
||||
|
||||
Returns:
|
||||
ChildOverride instance or None if not found
|
||||
"""
|
||||
OverrideQuery = Query()
|
||||
result = child_overrides_db.get(
|
||||
(OverrideQuery.child_id == child_id) &
|
||||
(OverrideQuery.entity_id == entity_id)
|
||||
)
|
||||
return ChildOverride.from_dict(result) if result else None
|
||||
|
||||
|
||||
def get_overrides_for_child(child_id: str) -> List[ChildOverride]:
|
||||
"""
|
||||
Get all overrides for a specific child.
|
||||
|
||||
Args:
|
||||
child_id: Child ID
|
||||
|
||||
Returns:
|
||||
List of ChildOverride instances
|
||||
"""
|
||||
OverrideQuery = Query()
|
||||
results = child_overrides_db.search(OverrideQuery.child_id == child_id)
|
||||
return [ChildOverride.from_dict(r) for r in results]
|
||||
|
||||
|
||||
def delete_override(child_id: str, entity_id: str) -> bool:
|
||||
"""
|
||||
Delete a specific override.
|
||||
|
||||
Args:
|
||||
child_id: Child ID
|
||||
entity_id: Entity ID
|
||||
|
||||
Returns:
|
||||
True if deleted, False if not found
|
||||
"""
|
||||
try:
|
||||
OverrideQuery = Query()
|
||||
deleted = child_overrides_db.remove(
|
||||
(OverrideQuery.child_id == child_id) &
|
||||
(OverrideQuery.entity_id == entity_id)
|
||||
)
|
||||
if deleted:
|
||||
logger.info(f"Override deleted: child={child_id}, entity={entity_id}")
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to delete override: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def delete_overrides_for_child(child_id: str) -> int:
|
||||
"""
|
||||
Delete all overrides for a child.
|
||||
|
||||
Args:
|
||||
child_id: Child ID
|
||||
|
||||
Returns:
|
||||
Count of deleted overrides
|
||||
"""
|
||||
try:
|
||||
OverrideQuery = Query()
|
||||
deleted = child_overrides_db.remove(OverrideQuery.child_id == child_id)
|
||||
count = len(deleted)
|
||||
if count > 0:
|
||||
logger.info(f"Overrides cascade deleted for child: child_id={child_id}, count={count}")
|
||||
return count
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to delete overrides for child: {e}")
|
||||
raise
|
||||
|
||||
|
||||
def delete_overrides_for_entity(entity_id: str) -> int:
|
||||
"""
|
||||
Delete all overrides for an entity.
|
||||
|
||||
Args:
|
||||
entity_id: Entity ID (task or reward)
|
||||
|
||||
Returns:
|
||||
Count of deleted overrides
|
||||
"""
|
||||
try:
|
||||
OverrideQuery = Query()
|
||||
deleted = child_overrides_db.remove(OverrideQuery.entity_id == entity_id)
|
||||
count = len(deleted)
|
||||
if count > 0:
|
||||
logger.info(f"Overrides cascade deleted for entity: entity_id={entity_id}, count={count}")
|
||||
return count
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to delete overrides for entity: {e}")
|
||||
raise
|
||||
Reference in New Issue
Block a user