From a2b78f7e96a79d1498da6863d150d07b5a1488c1 Mon Sep 17 00:00:00 2001 From: Brian Bjarke Jensen Date: Tue, 11 Nov 2025 20:43:47 +0100 Subject: [PATCH] code quality fixes --- README.md | 16 +- .../repositories/child/sqlite_child.py | 2 +- .../sqlite_child_invitation.py | 10 +- .../diaper_change/sqlite_diaper_change.py | 2 +- .../repositories/feeding/sqlite_feeding.py | 2 +- .../invitation/sqlite_invitation.py | 20 +- .../repositories/sleep/sqlite_sleep.py | 2 +- .../repositories/user/sqlite_user.py | 2 +- src/baby_monitor/routers/child.py | 26 +-- src/baby_monitor/routers/diaper_change.py | 16 +- src/baby_monitor/routers/feeding.py | 24 +-- src/baby_monitor/routers/sleep.py | 44 +--- src/baby_monitor/static/add-child.html | 16 +- src/baby_monitor/static/diapers.html | 11 +- src/baby_monitor/static/feedings.html | 96 +++++---- src/baby_monitor/static/sleep.html | 195 ++++++++++-------- src/baby_monitor/utils/__init__.py | 1 + 17 files changed, 236 insertions(+), 249 deletions(-) diff --git a/README.md b/README.md index 650b6c7..4eb8eb4 100644 --- a/README.md +++ b/README.md @@ -81,14 +81,14 @@ uv run uvicorn src.baby_monitor.main:app --reload --host 0.0.0.0 --port 8000 ### Environment Variables -| Variable | Default | Description | -| ---------------- | ------------ | --------------------------------------------- | -| `ENVIRONMENT` | `production` | Set to `development` to enable API docs | -| `ADMIN_PASSWORD` | _(required)_ | Admin user password | -| `ADMIN_USERNAME` | `admin` | Admin username | -| `DATA_DIR` | `/data` | Directory for SQLite database (SQLite only) | -| `REDIS_URI` | _(optional)_ | Redis connection URI for distributed tokens | -| `POSTGRES_URI` | _(optional)_ | PostgreSQL connection URI for database storage| +| Variable | Default | Description | +| ---------------- | ------------ | ---------------------------------------------- | +| `ENVIRONMENT` | `production` | Set to `development` to enable API docs | +| `ADMIN_PASSWORD` | _(required)_ | Admin user password | +| `ADMIN_USERNAME` | `admin` | Admin username | +| `DATA_DIR` | `/data` | Directory for SQLite database (SQLite only) | +| `REDIS_URI` | _(optional)_ | Redis connection URI for distributed tokens | +| `POSTGRES_URI` | _(optional)_ | PostgreSQL connection URI for database storage | ### Storage Options diff --git a/src/baby_monitor/repositories/child/sqlite_child.py b/src/baby_monitor/repositories/child/sqlite_child.py index 354d27f..ed0fc3f 100644 --- a/src/baby_monitor/repositories/child/sqlite_child.py +++ b/src/baby_monitor/repositories/child/sqlite_child.py @@ -15,7 +15,7 @@ from baby_monitor.models.db.child_parent import ChildParent class DatabaseChildRepository(ChildRepositoryInterface): """Database implementation for child data access. - + Works with both SQLite and PostgreSQL databases. """ diff --git a/src/baby_monitor/repositories/child_invitation/sqlite_child_invitation.py b/src/baby_monitor/repositories/child_invitation/sqlite_child_invitation.py index b8ac2e9..30bb674 100644 --- a/src/baby_monitor/repositories/child_invitation/sqlite_child_invitation.py +++ b/src/baby_monitor/repositories/child_invitation/sqlite_child_invitation.py @@ -15,7 +15,7 @@ from baby_monitor.repositories.interfaces import ( class DatabaseChildInvitationRepository(ChildInvitationRepositoryInterface): """Database implementation of child invitation repository. - + Works with both SQLite and PostgreSQL databases. """ @@ -26,10 +26,10 @@ class DatabaseChildInvitationRepository(ChildInvitationRepositoryInterface): def _get_now_utc(self, reference_dt: datetime) -> datetime: """ Get current UTC time matching the timezone awareness of reference. - + Args: reference_dt: A datetime from DB to match timezone format - + Returns: Current UTC time (naive for SQLite, aware for PostgreSQL) """ @@ -84,9 +84,7 @@ class DatabaseChildInvitationRepository(ChildInvitationRepositoryInterface): def verify_invitation(self, code: str) -> bool: """Verify if an invitation code is valid and not expired.""" invitation = ( - self.db.query(ChildInvitation) - .filter(ChildInvitation.code == code) - .first() + self.db.query(ChildInvitation).filter(ChildInvitation.code == code).first() ) if not invitation: diff --git a/src/baby_monitor/repositories/diaper_change/sqlite_diaper_change.py b/src/baby_monitor/repositories/diaper_change/sqlite_diaper_change.py index 054bd18..18851fc 100644 --- a/src/baby_monitor/repositories/diaper_change/sqlite_diaper_change.py +++ b/src/baby_monitor/repositories/diaper_change/sqlite_diaper_change.py @@ -16,7 +16,7 @@ from baby_monitor.models.db.child_parent import ChildParent class DatabaseDiaperChangeRepository(DiaperChangeRepositoryInterface): """Database implementation for diaper change log data access. - + Works with both SQLite and PostgreSQL databases. """ diff --git a/src/baby_monitor/repositories/feeding/sqlite_feeding.py b/src/baby_monitor/repositories/feeding/sqlite_feeding.py index b1e5168..3d9226e 100644 --- a/src/baby_monitor/repositories/feeding/sqlite_feeding.py +++ b/src/baby_monitor/repositories/feeding/sqlite_feeding.py @@ -16,7 +16,7 @@ from baby_monitor.models.db.child_parent import ChildParent class DatabaseFeedingRepository(FeedingRepositoryInterface): """Database implementation for feeding log data access. - + Works with both SQLite and PostgreSQL databases. """ diff --git a/src/baby_monitor/repositories/invitation/sqlite_invitation.py b/src/baby_monitor/repositories/invitation/sqlite_invitation.py index c5d0e51..8140f23 100644 --- a/src/baby_monitor/repositories/invitation/sqlite_invitation.py +++ b/src/baby_monitor/repositories/invitation/sqlite_invitation.py @@ -19,7 +19,7 @@ from baby_monitor.repositories.interfaces import ( class DatabaseInvitationRepository(InvitationRepositoryInterface): """Database implementation for managing invitation tokens. - + Works with both SQLite and PostgreSQL databases. """ @@ -30,10 +30,10 @@ class DatabaseInvitationRepository(InvitationRepositoryInterface): def _get_now_utc(self, reference_dt: datetime) -> datetime: """ Get current UTC time matching the timezone awareness of reference. - + Args: reference_dt: A datetime from DB to match timezone format - + Returns: Current UTC time (naive for SQLite, aware for PostgreSQL) """ @@ -82,9 +82,7 @@ class DatabaseInvitationRepository(InvitationRepositoryInterface): Returns: True if valid and not consumed, False otherwise """ - invitation = self.db.query(Invitation).filter( - Invitation.token == token - ).first() + invitation = self.db.query(Invitation).filter(Invitation.token == token).first() if not invitation: return False @@ -110,9 +108,7 @@ class DatabaseInvitationRepository(InvitationRepositoryInterface): Returns: True if successfully consumed, False if invalid or already used """ - invitation = self.db.query(Invitation).filter( - Invitation.token == token - ).first() + invitation = self.db.query(Invitation).filter(Invitation.token == token).first() if not invitation: return False @@ -143,8 +139,6 @@ class DatabaseInvitationRepository(InvitationRepositoryInterface): else: # No invitations, use naive UTC (safe default) now_utc = datetime.now(UTC).replace(tzinfo=None) - - self.db.query(Invitation).filter( - Invitation.expires_at < now_utc - ).delete() + + self.db.query(Invitation).filter(Invitation.expires_at < now_utc).delete() self.db.commit() diff --git a/src/baby_monitor/repositories/sleep/sqlite_sleep.py b/src/baby_monitor/repositories/sleep/sqlite_sleep.py index da1024f..1eb2bff 100644 --- a/src/baby_monitor/repositories/sleep/sqlite_sleep.py +++ b/src/baby_monitor/repositories/sleep/sqlite_sleep.py @@ -16,7 +16,7 @@ from baby_monitor.models.db.child_parent import ChildParent class DatabaseSleepRepository(SleepRepositoryInterface): """Database implementation for sleep log data access. - + Works with both SQLite and PostgreSQL databases. """ diff --git a/src/baby_monitor/repositories/user/sqlite_user.py b/src/baby_monitor/repositories/user/sqlite_user.py index 58fbf3b..5cd8ad7 100644 --- a/src/baby_monitor/repositories/user/sqlite_user.py +++ b/src/baby_monitor/repositories/user/sqlite_user.py @@ -11,7 +11,7 @@ from baby_monitor.models.db.user import User class DatabaseUserRepository(UserRepositoryInterface): """Database-based user repository. - + Works with both SQLite and PostgreSQL databases. """ diff --git a/src/baby_monitor/routers/child.py b/src/baby_monitor/routers/child.py index 13309a4..456e78b 100644 --- a/src/baby_monitor/routers/child.py +++ b/src/baby_monitor/routers/child.py @@ -10,7 +10,7 @@ from baby_monitor.models.child import CreateChildRequest, ChildResponse from baby_monitor.routers.auth import verify_token from baby_monitor.repositories.interfaces import ( ChildRepositoryInterface, - ChildInvitationRepositoryInterface + ChildInvitationRepositoryInterface, ) from baby_monitor.repositories.dependencies import ( get_child_repository, @@ -45,9 +45,7 @@ class RedeemChildInvitationRequest(BaseModel): def create_child( request: CreateChildRequest, user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> ChildResponse: """Create a new child for the authenticated user.""" child = child_repo.create( @@ -63,9 +61,7 @@ def create_child( @router.get("", response_model=list[ChildResponse]) def get_user_children( user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> list[ChildResponse]: """Get all children for the authenticated user.""" children = child_repo.get_by_user_id(user_id) @@ -76,9 +72,7 @@ def get_user_children( def get_child( child_id: int, user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> ChildResponse: """Get a specific child by ID.""" child = child_repo.get_by_id(child_id) @@ -99,9 +93,7 @@ def update_child( child_id: int, request: CreateChildRequest, user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> ChildResponse: """Update a child's information.""" # First check if child exists and belongs to user @@ -132,9 +124,7 @@ def update_child( def create_child_invitation( request: CreateChildInvitationRequest, user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], invitation_repo: Annotated[ ChildInvitationRepositoryInterface, Depends(get_child_invitation_repository), @@ -176,9 +166,7 @@ def create_child_invitation( def redeem_child_invitation( request: RedeemChildInvitationRequest, user_id: Annotated[int, Depends(verify_token)], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], invitation_repo: Annotated[ ChildInvitationRepositoryInterface, Depends(get_child_invitation_repository), diff --git a/src/baby_monitor/routers/diaper_change.py b/src/baby_monitor/routers/diaper_change.py index 876de8a..312847d 100644 --- a/src/baby_monitor/routers/diaper_change.py +++ b/src/baby_monitor/routers/diaper_change.py @@ -29,9 +29,7 @@ def create_diaper_change( diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Create a new diaper change log entry.""" # Verify the child belongs to the authenticated user @@ -68,9 +66,7 @@ def get_diaper_change( diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Get a specific diaper change log by ID.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) @@ -92,9 +88,7 @@ def update_diaper_change( diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> DiaperChangeResponse: """Update an existing diaper change log.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) @@ -129,9 +123,7 @@ def delete_diaper_change( diaper_repo: Annotated[ DiaperChangeRepositoryInterface, Depends(get_diaper_change_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> None: """Delete a diaper change log.""" diaper_change = diaper_repo.get_by_id(diaper_change_id) diff --git a/src/baby_monitor/routers/feeding.py b/src/baby_monitor/routers/feeding.py index f2d8313..929d038 100644 --- a/src/baby_monitor/routers/feeding.py +++ b/src/baby_monitor/routers/feeding.py @@ -29,9 +29,7 @@ def create_feeding( feeding_repo: Annotated[ FeedingRepositoryInterface, Depends(get_feeding_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> FeedingResponse: """Create a new feeding log entry.""" # Verify the child belongs to the authenticated user @@ -53,9 +51,7 @@ def get_active_feeding( feeding_repo: Annotated[ FeedingRepositoryInterface, Depends(get_feeding_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> FeedingResponse | None: """Get the current active feeding (where end_time is null) for the user.""" feedings = feeding_repo.get_by_user_id(user_id) @@ -92,9 +88,7 @@ def get_feeding( feeding_repo: Annotated[ FeedingRepositoryInterface, Depends(get_feeding_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> FeedingResponse: """Get a specific feeding log by ID.""" feeding = feeding_repo.get_by_id(feeding_id) @@ -116,9 +110,7 @@ def update_feeding( feeding_repo: Annotated[ FeedingRepositoryInterface, Depends(get_feeding_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> FeedingResponse: """Update a feeding log entry.""" feeding = feeding_repo.get_by_id(feeding_id) @@ -130,9 +122,7 @@ def update_feeding( verify_child_access(child_repo, feeding["child_id"], user_id) # Update the feeding - feeding_type_value = ( - request.feeding_type.value if request.feeding_type else None - ) + feeding_type_value = request.feeding_type.value if request.feeding_type else None updated_feeding = feeding_repo.update( feeding_id=feeding_id, start_time=request.start_time, @@ -153,9 +143,7 @@ def delete_feeding( feeding_repo: Annotated[ FeedingRepositoryInterface, Depends(get_feeding_repository) ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> None: """Delete a feeding log entry.""" feeding = feeding_repo.get_by_id(feeding_id) diff --git a/src/baby_monitor/routers/sleep.py b/src/baby_monitor/routers/sleep.py index 9ca901f..a04d10f 100644 --- a/src/baby_monitor/routers/sleep.py +++ b/src/baby_monitor/routers/sleep.py @@ -26,12 +26,8 @@ router = APIRouter(prefix="/api/sleep", tags=["sleep"]) def create_sleep( request: CreateSleepRequest, user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> SleepResponse: """Create a new sleep log entry.""" # Verify the child belongs to the authenticated user @@ -48,12 +44,8 @@ def create_sleep( @router.get("/active", response_model=SleepResponse | None) def get_active_sleep( user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> SleepResponse | None: """Get the current active sleep (where end_time is null) for the user.""" sleeps = sleep_repo.get_by_user_id(user_id) @@ -74,9 +66,7 @@ def get_active_sleep( @router.get("", response_model=list[SleepResponse]) def get_user_sleeps( user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], ) -> list[SleepResponse]: """Get all sleep logs for the authenticated user's children.""" sleeps = sleep_repo.get_by_user_id(user_id) @@ -87,12 +77,8 @@ def get_user_sleeps( def get_sleep( sleep_id: int, user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> SleepResponse: """Get a specific sleep log by ID.""" sleep = sleep_repo.get_by_id(sleep_id) @@ -111,12 +97,8 @@ def update_sleep( sleep_id: int, request: UpdateSleepRequest, user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> SleepResponse: """Update an existing sleep log.""" sleep = sleep_repo.get_by_id(sleep_id) @@ -142,12 +124,8 @@ def update_sleep( def delete_sleep( sleep_id: int, user_id: Annotated[int, Depends(verify_token)], - sleep_repo: Annotated[ - SleepRepositoryInterface, Depends(get_sleep_repository) - ], - child_repo: Annotated[ - ChildRepositoryInterface, Depends(get_child_repository) - ], + sleep_repo: Annotated[SleepRepositoryInterface, Depends(get_sleep_repository)], + child_repo: Annotated[ChildRepositoryInterface, Depends(get_child_repository)], ) -> None: """Delete a sleep log.""" sleep = sleep_repo.get_by_id(sleep_id) diff --git a/src/baby_monitor/static/add-child.html b/src/baby_monitor/static/add-child.html index 2bbcfa6..85e7336 100644 --- a/src/baby_monitor/static/add-child.html +++ b/src/baby_monitor/static/add-child.html @@ -192,12 +192,20 @@ Cancel - -