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,16 +67,22 @@ class UserRepository:
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
def dashboard_rows(self) -> list[UserDashboardRow]:
|
def dashboard_rows(self) -> list[UserDashboardRow]:
|
||||||
users = self.list_all()
|
return [self._build_dashboard_row(user) for user in self.list_all()]
|
||||||
rows = []
|
|
||||||
for user in users:
|
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(
|
last_run = self.session.scalar(
|
||||||
select(SyncRun).where(SyncRun.user_id == user.id).order_by(SyncRun.started_at.desc()).limit(1)
|
select(SyncRun).where(SyncRun.user_id == user.id).order_by(SyncRun.started_at.desc()).limit(1)
|
||||||
)
|
)
|
||||||
last_activity = self.session.scalar(
|
last_activity = self.session.scalar(
|
||||||
select(Activity).where(Activity.user_id == user.id).order_by(Activity.created_at.desc()).limit(1)
|
select(Activity).where(Activity.user_id == user.id).order_by(Activity.created_at.desc()).limit(1)
|
||||||
)
|
)
|
||||||
rows.append(UserDashboardRow(
|
return UserDashboardRow(
|
||||||
id=user.id,
|
id=user.id,
|
||||||
name=user.name,
|
name=user.name,
|
||||||
enabled=user.enabled,
|
enabled=user.enabled,
|
||||||
@@ -85,8 +91,7 @@ class UserRepository:
|
|||||||
last_sync_at=last_run.finished_at if last_run else None,
|
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_name=last_activity.activity_name if last_activity else None,
|
||||||
last_activity_status=last_activity.status.value if last_activity else None,
|
last_activity_status=last_activity.status.value if last_activity else None,
|
||||||
))
|
)
|
||||||
return rows
|
|
||||||
|
|
||||||
def dashboard_summary(self, *, since: datetime) -> DashboardSummary:
|
def dashboard_summary(self, *, since: datetime) -> DashboardSummary:
|
||||||
rider_total = self.session.scalar(select(func.count()).select_from(SyncUser)) or 0
|
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))
|
summary = user_repository.dashboard_summary(since=datetime.now(timezone.utc) - timedelta(days=7))
|
||||||
|
|
||||||
assert summary.success_rate_recent is None
|
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