Add support for moving objects to projects root

This commit is contained in:
allegroai 2022-12-21 18:43:45 +02:00
parent 14ff639bb0
commit 9c41124b81
9 changed files with 32 additions and 17 deletions

View File

@ -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")

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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"
) )

View File

@ -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

View File

@ -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"
) )

View File

@ -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)

View File

@ -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")