Add UserRepository.dashboard_row for single-row refresh
Extracts the dashboard_rows() loop body into a shared _build_dashboard_row helper so a single rider's row can be re-queried after a sync action, without changing dashboard_rows()'s behavior. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -67,26 +67,31 @@ class UserRepository:
|
||||
return user
|
||||
|
||||
def dashboard_rows(self) -> list[UserDashboardRow]:
|
||||
users = self.list_all()
|
||||
rows = []
|
||||
for user in users:
|
||||
last_run = self.session.scalar(
|
||||
select(SyncRun).where(SyncRun.user_id == user.id).order_by(SyncRun.started_at.desc()).limit(1)
|
||||
)
|
||||
last_activity = self.session.scalar(
|
||||
select(Activity).where(Activity.user_id == user.id).order_by(Activity.created_at.desc()).limit(1)
|
||||
)
|
||||
rows.append(UserDashboardRow(
|
||||
id=user.id,
|
||||
name=user.name,
|
||||
enabled=user.enabled,
|
||||
health_state=user.health_state.value,
|
||||
action_reason=user.action_reason,
|
||||
last_sync_at=last_run.finished_at if last_run else None,
|
||||
last_activity_name=last_activity.activity_name if last_activity else None,
|
||||
last_activity_status=last_activity.status.value if last_activity else None,
|
||||
))
|
||||
return rows
|
||||
return [self._build_dashboard_row(user) for user in self.list_all()]
|
||||
|
||||
def dashboard_row(self, user_id: int) -> UserDashboardRow | None:
|
||||
user = self.get(user_id)
|
||||
if user is None:
|
||||
return None
|
||||
return self._build_dashboard_row(user)
|
||||
|
||||
def _build_dashboard_row(self, user: SyncUser) -> UserDashboardRow:
|
||||
last_run = self.session.scalar(
|
||||
select(SyncRun).where(SyncRun.user_id == user.id).order_by(SyncRun.started_at.desc()).limit(1)
|
||||
)
|
||||
last_activity = self.session.scalar(
|
||||
select(Activity).where(Activity.user_id == user.id).order_by(Activity.created_at.desc()).limit(1)
|
||||
)
|
||||
return UserDashboardRow(
|
||||
id=user.id,
|
||||
name=user.name,
|
||||
enabled=user.enabled,
|
||||
health_state=user.health_state.value,
|
||||
action_reason=user.action_reason,
|
||||
last_sync_at=last_run.finished_at if last_run else None,
|
||||
last_activity_name=last_activity.activity_name if last_activity else None,
|
||||
last_activity_status=last_activity.status.value if last_activity else None,
|
||||
)
|
||||
|
||||
def dashboard_summary(self, *, since: datetime) -> DashboardSummary:
|
||||
rider_total = self.session.scalar(select(func.count()).select_from(SyncUser)) or 0
|
||||
|
||||
@@ -207,3 +207,19 @@ def test_dashboard_summary_success_rate_is_none_without_finished_runs_in_window(
|
||||
summary = user_repository.dashboard_summary(since=datetime.now(timezone.utc) - timedelta(days=7))
|
||||
|
||||
assert summary.success_rate_recent is None
|
||||
|
||||
|
||||
def test_dashboard_row_returns_row_for_known_user(user_repository) -> None:
|
||||
user = _make_user(user_repository, "Alex")
|
||||
|
||||
row = user_repository.dashboard_row(user.id)
|
||||
|
||||
assert row is not None
|
||||
assert row.id == user.id
|
||||
assert row.name == "Alex"
|
||||
|
||||
|
||||
def test_dashboard_row_returns_none_for_unknown_user(user_repository) -> None:
|
||||
row = user_repository.dashboard_row(999)
|
||||
|
||||
assert row is None
|
||||
|
||||
Reference in New Issue
Block a user