Переглянути джерело

fix: export() did not export submission entities when the submit_id is the scenario

trgiangdo 1 рік тому
батько
коміт
0b8e9412c5

+ 1 - 1
taipy/core/scenario/_scenario_manager.py

@@ -416,7 +416,7 @@ class _ScenarioManager(_Manager[Scenario], _VersionMixin):
         submissions = _SubmissionManagerFactory._build_manager()._get_all()
         submissions = _SubmissionManagerFactory._build_manager()._get_all()
         submitted_entity_ids = list(entity_ids.scenario_ids.union(entity_ids.sequence_ids, entity_ids.task_ids))
         submitted_entity_ids = list(entity_ids.scenario_ids.union(entity_ids.sequence_ids, entity_ids.task_ids))
         for submission in submissions:
         for submission in submissions:
-            if submission.entity_id in submitted_entity_ids:
+            if submission.entity_id in submitted_entity_ids or submission.entity_id == scenario.id:
                 entity_ids.submission_ids.add(submission.id)
                 entity_ids.submission_ids.add(submission.id)
 
 
         return entity_ids
         return entity_ids

+ 9 - 2
taipy/core/taipy.py

@@ -15,7 +15,7 @@ import shutil
 from datetime import datetime
 from datetime import datetime
 from typing import Any, Callable, Dict, List, Optional, Set, Union, overload
 from typing import Any, Callable, Dict, List, Optional, Set, Union, overload
 
 
-from taipy.config.common.scope import Scope
+from taipy.config import Config, Scope
 from taipy.logger._taipy_logger import _TaipyLogger
 from taipy.logger._taipy_logger import _TaipyLogger
 
 
 from ._core import Core
 from ._core import Core
@@ -42,6 +42,7 @@ from .data.data_node_id import DataNodeId
 from .exceptions.exceptions import (
 from .exceptions.exceptions import (
     DataNodeConfigIsNotGlobal,
     DataNodeConfigIsNotGlobal,
     ExportFolderAlreadyExists,
     ExportFolderAlreadyExists,
+    InvalidExportPath,
     ModelNotFound,
     ModelNotFound,
     NonExistingVersion,
     NonExistingVersion,
     VersionIsNotProductionVersion,
     VersionIsNotProductionVersion,
@@ -972,9 +973,12 @@ def export_scenario(
     if scenario.cycle:
     if scenario.cycle:
         entity_ids.cycle_ids = {scenario.cycle.id}
         entity_ids.cycle_ids = {scenario.cycle.id}
 
 
+    if folder_path == Config.core.taipy_storage_folder:
+        raise InvalidExportPath("The export folder must not be the storage folder.")
+
     if os.path.exists(folder_path):
     if os.path.exists(folder_path):
         if override:
         if override:
-            __logger.warn(f"Override the existing folder '{folder_path}'")
+            __logger.warning(f"Override the existing folder '{folder_path}'")
             shutil.rmtree(folder_path, ignore_errors=True)
             shutil.rmtree(folder_path, ignore_errors=True)
         else:
         else:
             raise ExportFolderAlreadyExists(str(folder_path), scenario_id)
             raise ExportFolderAlreadyExists(str(folder_path), scenario_id)
@@ -991,6 +995,9 @@ def export_scenario(
         _ScenarioManagerFactory._build_manager()._export(scenario_id, folder_path)
         _ScenarioManagerFactory._build_manager()._export(scenario_id, folder_path)
     for job_id in entity_ids.job_ids:
     for job_id in entity_ids.job_ids:
         _JobManagerFactory._build_manager()._export(job_id, folder_path)
         _JobManagerFactory._build_manager()._export(job_id, folder_path)
+    for submission_id in entity_ids.submission_ids:
+        _SubmissionManagerFactory._build_manager()._export(submission_id, folder_path)
+    _VersionManagerFactory._build_manager()._export(scenario.version, folder_path)
 
 
 
 
 def get_parents(
 def get_parents(

+ 8 - 2
tests/core/test_taipy/test_export.py

@@ -69,7 +69,8 @@ def test_export_scenario_with_cycle():
     scenario_cfg = configure_test_scenario(1, frequency=Frequency.DAILY)
     scenario_cfg = configure_test_scenario(1, frequency=Frequency.DAILY)
 
 
     scenario = tp.create_scenario(scenario_cfg)
     scenario = tp.create_scenario(scenario_cfg)
-    jobs = tp.submit(scenario).jobs
+    submission = tp.submit(scenario)
+    jobs = submission.jobs
 
 
     # Export the submitted scenario
     # Export the submitted scenario
     tp.export_scenario(scenario.id, "./tmp/exp_scenario")
     tp.export_scenario(scenario.id, "./tmp/exp_scenario")
@@ -95,6 +96,7 @@ def test_export_scenario_with_cycle():
     assert sorted(os.listdir("./tmp/exp_scenario/jobs")) == sorted(
     assert sorted(os.listdir("./tmp/exp_scenario/jobs")) == sorted(
         [f"{jobs[0].id}.json", f"{jobs[1].id}.json", f"{jobs[2].id}.json", f"{jobs[3].id}.json"]
         [f"{jobs[0].id}.json", f"{jobs[1].id}.json", f"{jobs[2].id}.json", f"{jobs[3].id}.json"]
     )
     )
+    assert os.listdir("./tmp/exp_scenario/submission") == [f"{submission.id}.json"]
     assert sorted(os.listdir("./tmp/exp_scenario/cycles")) == sorted([f"{scenario.cycle.id}.json"])
     assert sorted(os.listdir("./tmp/exp_scenario/cycles")) == sorted([f"{scenario.cycle.id}.json"])
 
 
 
 
@@ -111,6 +113,7 @@ def test_export_scenario_without_cycle():
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/jobs")
     assert os.path.exists("./tmp/exp_scenario/jobs")
+    assert os.path.exists("./tmp/exp_scenario/submission")
     assert not os.path.exists("./tmp/exp_scenario/cycles")  # No cycle
     assert not os.path.exists("./tmp/exp_scenario/cycles")  # No cycle
 
 
 
 
@@ -127,6 +130,7 @@ def test_export_scenario_override_existing_files():
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/jobs")
     assert os.path.exists("./tmp/exp_scenario/jobs")
+    assert os.path.exists("./tmp/exp_scenario/submission")
     assert os.path.exists("./tmp/exp_scenario/cycles")
     assert os.path.exists("./tmp/exp_scenario/cycles")
 
 
     scenario_2 = tp.create_scenario(scenario_2_cfg)
     scenario_2 = tp.create_scenario(scenario_2_cfg)
@@ -142,6 +146,7 @@ def test_export_scenario_override_existing_files():
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/tasks")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/scenarios")
     assert os.path.exists("./tmp/exp_scenario/jobs")
     assert os.path.exists("./tmp/exp_scenario/jobs")
+    assert os.path.exists("./tmp/exp_scenario/submission")
     # The cycles folder should be removed when overriding
     # The cycles folder should be removed when overriding
     assert not os.path.exists("./tmp/exp_scenario/cycles")
     assert not os.path.exists("./tmp/exp_scenario/cycles")
 
 
@@ -158,7 +163,8 @@ def test_export_scenario_filesystem_with_data():
     # Export scenario with data
     # Export scenario with data
     tp.export_scenario(scenario.id, "./tmp/exp_scenario", include_data=True, override=True)
     tp.export_scenario(scenario.id, "./tmp/exp_scenario", include_data=True, override=True)
     assert os.path.exists("./tmp/exp_scenario/user_data")
     assert os.path.exists("./tmp/exp_scenario/user_data")
-    assert sorted(os.listdir("./tmp/exp_scenario/user_data")) == sorted(
+    data_files = [f for _, _, files in os.walk("./tmp/exp_scenario/user_data") for f in files]
+    assert sorted(data_files) == sorted(
         [
         [
             f"{scenario.i_1.id}.p",
             f"{scenario.i_1.id}.p",
             f"{scenario.o_1_csv.id}.csv",
             f"{scenario.o_1_csv.id}.csv",