mirror of
https://github.com/clearml/clearml-server
synced 2025-05-01 18:55:58 +00:00
Add support for moving objects to projects root
This commit is contained in:
parent
14ff639bb0
commit
9c41124b81
@ -297,13 +297,15 @@ class ProjectBLL:
|
|||||||
"""
|
"""
|
||||||
Move a batch of entities to `project` or a project named `project_name` (create if does not exist)
|
Move a batch of entities to `project` or a project named `project_name` (create if does not exist)
|
||||||
"""
|
"""
|
||||||
project = cls.find_or_create(
|
if project_name or project:
|
||||||
user=user,
|
project = cls.find_or_create(
|
||||||
company=company,
|
user=user,
|
||||||
project_id=project,
|
company=company,
|
||||||
project_name=project_name,
|
project_id=project,
|
||||||
description="",
|
project_name=project_name,
|
||||||
)
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
extra = (
|
extra = (
|
||||||
{"set__last_change": datetime.utcnow()}
|
{"set__last_change": datetime.utcnow()}
|
||||||
if hasattr(entity_cls, "last_change")
|
if hasattr(entity_cls, "last_change")
|
||||||
|
@ -985,7 +985,7 @@ move {
|
|||||||
items { type: string }
|
items { type: string }
|
||||||
}
|
}
|
||||||
project {
|
project {
|
||||||
description: "Target project ID. If not provided, `project_name` must be provided."
|
description: "Target project ID. If not provided, `project_name` must be provided. Use null for the root project"
|
||||||
type: string
|
type: string
|
||||||
}
|
}
|
||||||
project_name {
|
project_name {
|
||||||
|
@ -194,7 +194,7 @@ move {
|
|||||||
type: string
|
type: string
|
||||||
}
|
}
|
||||||
project {
|
project {
|
||||||
description: "Target project ID. If not provided, `project_name` must be provided."
|
description: "Target project ID. If not provided, `project_name` must be provided. Use null for the root project"
|
||||||
type: string
|
type: string
|
||||||
}
|
}
|
||||||
project_name {
|
project_name {
|
||||||
|
@ -1998,7 +1998,7 @@ move {
|
|||||||
items { type: string }
|
items { type: string }
|
||||||
}
|
}
|
||||||
project {
|
project {
|
||||||
description: "Target project ID. If not provided, `project_name` must be provided."
|
description: "Target project ID. If not provided, `project_name` must be provided. Use null for the root project"
|
||||||
type: string
|
type: string
|
||||||
}
|
}
|
||||||
project_name {
|
project_name {
|
||||||
|
@ -608,7 +608,7 @@ def make_public(call: APICall, company_id, request: MakePublicRequest):
|
|||||||
|
|
||||||
@endpoint("models.move", request_data_model=MoveRequest)
|
@endpoint("models.move", request_data_model=MoveRequest)
|
||||||
def move(call: APICall, company_id: str, request: MoveRequest):
|
def move(call: APICall, company_id: str, request: MoveRequest):
|
||||||
if not (request.project or request.project_name):
|
if not ("project" in call.data or request.project_name):
|
||||||
raise errors.bad_request.MissingRequiredFields(
|
raise errors.bad_request.MissingRequiredFields(
|
||||||
"project or project_name is required"
|
"project or project_name is required"
|
||||||
)
|
)
|
||||||
|
@ -252,7 +252,7 @@ def get_task_data(call: APICall, company_id, request: GetTasksDataRequest):
|
|||||||
|
|
||||||
@endpoint("reports.move")
|
@endpoint("reports.move")
|
||||||
def move(call: APICall, company_id: str, request: MoveReportRequest):
|
def move(call: APICall, company_id: str, request: MoveReportRequest):
|
||||||
if not (request.project or request.project_name):
|
if not ("project" in call.data or request.project_name):
|
||||||
raise errors.bad_request.MissingRequiredFields(
|
raise errors.bad_request.MissingRequiredFields(
|
||||||
"project or project_name is required"
|
"project or project_name is required"
|
||||||
)
|
)
|
||||||
@ -263,10 +263,13 @@ def move(call: APICall, company_id: str, request: MoveReportRequest):
|
|||||||
user_id = call.identity.user
|
user_id = call.identity.user
|
||||||
project_name = request.project_name
|
project_name = request.project_name
|
||||||
if not project_name:
|
if not project_name:
|
||||||
project = Project.get_for_writing(
|
if request.project:
|
||||||
company=company_id, id=request.project, _only=("name",)
|
project = Project.get_for_writing(
|
||||||
)
|
company=company_id, id=request.project, _only=("name",)
|
||||||
project_name = project.name
|
)
|
||||||
|
project_name = project.name
|
||||||
|
else:
|
||||||
|
project_name = ""
|
||||||
|
|
||||||
project_id = _ensure_reports_project(
|
project_id = _ensure_reports_project(
|
||||||
company=company_id, user=user_id, name=project_name
|
company=company_id, user=user_id, name=project_name
|
||||||
|
@ -1300,7 +1300,7 @@ def make_public(call: APICall, company_id, request: MakePublicRequest):
|
|||||||
|
|
||||||
@endpoint("tasks.move", request_data_model=MoveRequest)
|
@endpoint("tasks.move", request_data_model=MoveRequest)
|
||||||
def move(call: APICall, company_id: str, request: MoveRequest):
|
def move(call: APICall, company_id: str, request: MoveRequest):
|
||||||
if not (request.project or request.project_name):
|
if not ("project" in call.data or request.project_name):
|
||||||
raise errors.bad_request.MissingRequiredFields(
|
raise errors.bad_request.MissingRequiredFields(
|
||||||
"project or project_name is required"
|
"project or project_name is required"
|
||||||
)
|
)
|
||||||
|
@ -30,6 +30,11 @@ class TestMoveUnderProject(TestService):
|
|||||||
self.assertEqual(p2_name, projects[0].name)
|
self.assertEqual(p2_name, projects[0].name)
|
||||||
self.api.projects.delete(project=project2, force=True)
|
self.api.projects.delete(project=project2, force=True)
|
||||||
|
|
||||||
|
# move to the root project
|
||||||
|
self.assertEqual(None, self.api.tasks.move(ids=[task], project=None).project_id)
|
||||||
|
tasks = self.api.tasks.get_all_ex(id=[task]).tasks
|
||||||
|
self.assertEqual(None, tasks[0].get("project"))
|
||||||
|
|
||||||
# model move into existing project referenced by name
|
# model move into existing project referenced by name
|
||||||
model = self._temp_model()
|
model = self._temp_model()
|
||||||
self.api.models.move(ids=[model], project_name=self.entity_name)
|
self.api.models.move(ids=[model], project_name=self.entity_name)
|
||||||
|
@ -76,6 +76,11 @@ class TestReports(TestService):
|
|||||||
).tasks
|
).tasks
|
||||||
self.assertTrue({task_id, task2_id}.issubset({t.id for t in tasks}))
|
self.assertTrue({task_id, task2_id}.issubset({t.id for t in tasks}))
|
||||||
|
|
||||||
|
project_id = self.api.reports.move(task=task2_id, project=None).project_id
|
||||||
|
project = self.api.projects.get_all_ex(id=[project_id]).projects[0]
|
||||||
|
self.assertEqual(project.get("parent"), None)
|
||||||
|
self.assertEqual(project.name, ".reports")
|
||||||
|
|
||||||
def test_reports_search(self):
|
def test_reports_search(self):
|
||||||
report_task = self._temp_report(name="Rep1")
|
report_task = self._temp_report(name="Rep1")
|
||||||
non_report_task = self._temp_task(name="hello")
|
non_report_task = self._temp_task(name="hello")
|
||||||
|
Loading…
Reference in New Issue
Block a user