From 9c41124b813a4e5a313b8ee2b992aa446447f099 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Wed, 21 Dec 2022 18:43:45 +0200 Subject: [PATCH] Add support for moving objects to projects root --- apiserver/bll/project/project_bll.py | 16 +++++++++------- apiserver/schema/services/models.conf | 2 +- apiserver/schema/services/reports.conf | 2 +- apiserver/schema/services/tasks.conf | 2 +- apiserver/services/models.py | 2 +- apiserver/services/reports.py | 13 ++++++++----- apiserver/services/tasks.py | 2 +- .../tests/automated/test_move_under_project.py | 5 +++++ apiserver/tests/automated/test_reports.py | 5 +++++ 9 files changed, 32 insertions(+), 17 deletions(-) diff --git a/apiserver/bll/project/project_bll.py b/apiserver/bll/project/project_bll.py index b1d037f..b623a7b 100644 --- a/apiserver/bll/project/project_bll.py +++ b/apiserver/bll/project/project_bll.py @@ -297,13 +297,15 @@ class ProjectBLL: """ Move a batch of entities to `project` or a project named `project_name` (create if does not exist) """ - project = cls.find_or_create( - user=user, - company=company, - project_id=project, - project_name=project_name, - description="", - ) + if project_name or project: + project = cls.find_or_create( + user=user, + company=company, + project_id=project, + project_name=project_name, + description="", + ) + extra = ( {"set__last_change": datetime.utcnow()} if hasattr(entity_cls, "last_change") diff --git a/apiserver/schema/services/models.conf b/apiserver/schema/services/models.conf index 6aae3ab..15dad7d 100644 --- a/apiserver/schema/services/models.conf +++ b/apiserver/schema/services/models.conf @@ -985,7 +985,7 @@ move { items { type: string } } 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 } project_name { diff --git a/apiserver/schema/services/reports.conf b/apiserver/schema/services/reports.conf index 681f71c..76a4617 100644 --- a/apiserver/schema/services/reports.conf +++ b/apiserver/schema/services/reports.conf @@ -194,7 +194,7 @@ move { type: string } 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 } project_name { diff --git a/apiserver/schema/services/tasks.conf b/apiserver/schema/services/tasks.conf index ce5f9dd..c5ef060 100644 --- a/apiserver/schema/services/tasks.conf +++ b/apiserver/schema/services/tasks.conf @@ -1998,7 +1998,7 @@ move { items { type: string } } 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 } project_name { diff --git a/apiserver/services/models.py b/apiserver/services/models.py index d91ba4c..1a3983a 100644 --- a/apiserver/services/models.py +++ b/apiserver/services/models.py @@ -608,7 +608,7 @@ def make_public(call: APICall, company_id, request: MakePublicRequest): @endpoint("models.move", request_data_model=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( "project or project_name is required" ) diff --git a/apiserver/services/reports.py b/apiserver/services/reports.py index a0bc694..716b62e 100644 --- a/apiserver/services/reports.py +++ b/apiserver/services/reports.py @@ -252,7 +252,7 @@ def get_task_data(call: APICall, company_id, request: GetTasksDataRequest): @endpoint("reports.move") 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( "project or project_name is required" ) @@ -263,10 +263,13 @@ def move(call: APICall, company_id: str, request: MoveReportRequest): user_id = call.identity.user project_name = request.project_name if not project_name: - project = Project.get_for_writing( - company=company_id, id=request.project, _only=("name",) - ) - project_name = project.name + if request.project: + project = Project.get_for_writing( + company=company_id, id=request.project, _only=("name",) + ) + project_name = project.name + else: + project_name = "" project_id = _ensure_reports_project( company=company_id, user=user_id, name=project_name diff --git a/apiserver/services/tasks.py b/apiserver/services/tasks.py index e39fb41..45fa6f2 100644 --- a/apiserver/services/tasks.py +++ b/apiserver/services/tasks.py @@ -1300,7 +1300,7 @@ def make_public(call: APICall, company_id, request: MakePublicRequest): @endpoint("tasks.move", request_data_model=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( "project or project_name is required" ) diff --git a/apiserver/tests/automated/test_move_under_project.py b/apiserver/tests/automated/test_move_under_project.py index 7c2d83c..a2e742d 100644 --- a/apiserver/tests/automated/test_move_under_project.py +++ b/apiserver/tests/automated/test_move_under_project.py @@ -30,6 +30,11 @@ class TestMoveUnderProject(TestService): self.assertEqual(p2_name, projects[0].name) 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 = self._temp_model() self.api.models.move(ids=[model], project_name=self.entity_name) diff --git a/apiserver/tests/automated/test_reports.py b/apiserver/tests/automated/test_reports.py index c9fddba..37957a7 100644 --- a/apiserver/tests/automated/test_reports.py +++ b/apiserver/tests/automated/test_reports.py @@ -76,6 +76,11 @@ class TestReports(TestService): ).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): report_task = self._temp_report(name="Rep1") non_report_task = self._temp_task(name="hello")