Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions frontend/src/layouts/AppLayout/TutorialPanel/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export const useTutorials = () => {
const { data: projectData } = useGetProjectsQuery({});
const { data: runsData } = useGetRunsQuery({
limit: 1,
job_submissions_limit: 1,
});

const completeIsChecked = useRef<boolean>(false);
Expand Down
1 change: 1 addition & 0 deletions frontend/src/pages/Project/Details/Settings/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export const ProjectSettings: React.FC = () => {
const { data: runsData } = useGetRunsQuery({
project_name: paramProjectName,
limit: 1,
job_submissions_limit: 1,
});

useEffect(() => {
Expand Down
1 change: 1 addition & 0 deletions src/dstack/_internal/cli/commands/ps.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ def _command(self, args: argparse.Namespace):
if args.watch and args.format == "json":
raise CLIError("JSON output is not supported together with --watch")

# TODO: Add a `ps --json` option to control how many job submissions are returned.
runs = self.api.runs.list(all=args.all, limit=args.last)
deprecated_router_runs = [
run._run.run_spec.run_name
Expand Down
33 changes: 20 additions & 13 deletions src/dstack/_internal/server/services/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -469,19 +469,24 @@ async def list_user_project_models(
user: UserModel,
only_names: bool = False,
include_members: bool = False,
project_names: Optional[List[str]] = None,
) -> List[ProjectModel]:
load_only_attrs = []
if only_names:
load_only_attrs += [ProjectModel.id, ProjectModel.name]
if user.global_role == GlobalRole.ADMIN:
return await list_project_models(
session=session, load_only_attrs=load_only_attrs, include_members=include_members
session=session,
load_only_attrs=load_only_attrs,
include_members=include_members,
project_names=project_names,
)
return await list_member_project_models(
session=session,
user=user,
load_only_attrs=load_only_attrs,
include_members=include_members,
project_names=project_names,
)


Expand All @@ -490,6 +495,7 @@ async def list_member_project_models(
user: UserModel,
include_members: bool = False,
load_only_attrs: Optional[List[QueryableAttribute]] = None,
project_names: Optional[List[str]] = None,
) -> List[ProjectModel]:
"""
List project models for a user where they are a member.
Expand All @@ -499,15 +505,14 @@ async def list_member_project_models(
options.append(joinedload(ProjectModel.members))
if load_only_attrs:
options.append(load_only(*load_only_attrs))
res = await session.execute(
select(ProjectModel)
.where(
MemberModel.project_id == ProjectModel.id,
MemberModel.user_id == user.id,
ProjectModel.deleted == False,
)
.options(*options)
)
filters = [
MemberModel.project_id == ProjectModel.id,
MemberModel.user_id == user.id,
ProjectModel.deleted == False,
]
if project_names is not None:
filters.append(ProjectModel.name.in_(project_names))
res = await session.execute(select(ProjectModel).where(*filters).options(*options))
return list(res.scalars().unique().all())


Expand Down Expand Up @@ -547,15 +552,17 @@ async def list_project_models(
session: AsyncSession,
load_only_attrs: Optional[List[QueryableAttribute]] = None,
include_members: bool = False,
project_names: Optional[List[str]] = None,
) -> List[ProjectModel]:
options = []
if include_members:
options.append(joinedload(ProjectModel.members))
if load_only_attrs:
options.append(load_only(*load_only_attrs))
res = await session.execute(
select(ProjectModel).where(ProjectModel.deleted == False).options(*options)
)
filters = [ProjectModel.deleted == False]
if project_names is not None:
filters.append(ProjectModel.name.in_(project_names))
res = await session.execute(select(ProjectModel).where(*filters).options(*options))
return list(res.scalars().unique().all())


Expand Down
Loading
Loading