Browse Source

pass job as metadata for event

Toan Quach 1 year ago
parent
commit
7d1d241579
3 changed files with 31 additions and 12 deletions
  1. 6 6
      taipy/core/_entity/_reload.py
  2. 19 3
      taipy/core/submission/submission.py
  3. 6 3
      taipy/gui_core/_context.py

+ 6 - 6
taipy/core/_entity/_reload.py

@@ -60,7 +60,7 @@ def _self_reload(manager: str):
     return __reload
 
 
-def _self_setter(manager):
+def _self_setter(manager, publish=True):
     def __set_entity(fct):
         @functools.wraps(fct)
         def _do_set_entity(self, *args, **kwargs):
@@ -77,9 +77,11 @@ def _self_setter(manager):
                 entity = _Reloader()._reload(manager, self)
                 fct(entity, *args, **kwargs)
                 entity_manager._set(entity)
-                Notifier.publish(event)
+                if publish:
+                    Notifier.publish(event)
             else:
-                self._in_context_attributes_changed_collector.append(event)
+                if publish:
+                    self._in_context_attributes_changed_collector.append(event)
 
         return _do_set_entity
 
@@ -104,6 +106,4 @@ def _get_manager(manager: str) -> _Manager:
         "job": _JobManagerFactory._build_manager(),
         "task": _TaskManagerFactory._build_manager(),
         "submission": _SubmissionManagerFactory._build_manager(),
-    }[
-        manager
-    ]  # type: ignore
+    }[manager]  # type: ignore

+ 19 - 3
taipy/core/submission/submission.py

@@ -22,7 +22,7 @@ from .._entity._properties import _Properties
 from .._entity._reload import _Reloader, _self_reload, _self_setter
 from .._version._version_manager_factory import _VersionManagerFactory
 from ..job.job import Job, JobId, Status
-from ..notification.event import Event, EventEntityType, EventOperation, _make_event
+from ..notification import Event, EventEntityType, EventOperation, Notifier, _make_event
 from .submission_id import SubmissionId
 from .submission_status import SubmissionStatus
 
@@ -146,7 +146,7 @@ class Submission(_Entity, _Labeled):
         return self._submission_status
 
     @submission_status.setter  # type: ignore
-    @_self_setter(_MANAGER_NAME)
+    @_self_setter(_MANAGER_NAME, False)
     def submission_status(self, submission_status):
         self._submission_status = submission_status
 
@@ -198,6 +198,8 @@ class Submission(_Entity, _Labeled):
         with self.lock:
             submission_manager = _SubmissionManagerFactory._build_manager()
             submission = submission_manager._get(self)
+            _current_submission_status = submission._submission_status
+
             if submission._submission_status == SubmissionStatus.FAILED:
                 return
 
@@ -249,9 +251,23 @@ class Submission(_Entity, _Labeled):
             else:
                 submission.submission_status = SubmissionStatus.UNDEFINED  # type: ignore
             self.__logger.debug(
-                f"{job.id} status is {job_status}. Submission status set to " f"{submission._submission_status}"
+                f"{job.id} status is {job_status}. Submission status set to `{submission._submission_status}`"
             )
 
+            if _current_submission_status != submission._submission_status:
+                event = Event(
+                    entity_type=EventEntityType.SUBMISSION,
+                    entity_id=submission.id,
+                    operation=EventOperation.UPDATE,
+                    attribute_name="submission_status",
+                    attribute_value=submission._submission_status,
+                    metadata={"job": job.id},
+                )
+                if not self._is_in_context:
+                    Notifier.publish(event)
+                else:
+                    self._in_context_attributes_changed_collector.append(event)
+
     def is_finished(self) -> bool:
         """Indicate if the submission is finished.
 

+ 6 - 3
taipy/gui_core/_context.py

@@ -120,7 +120,7 @@ class _GuiCoreContext(CoreEventConsumerBase):
             with self.lock:
                 self.jobs_list = None
         elif event.entity_type == EventEntityType.SUBMISSION:
-            self.submission_status_callback(event.entity_id)
+            self.submission_status_callback(event.entity_id, event)
         elif event.entity_type == EventEntityType.DATA_NODE:
             with self.lock:
                 self.data_nodes_by_owner = None
@@ -138,7 +138,7 @@ class _GuiCoreContext(CoreEventConsumerBase):
             {"scenario": scenario_id or True},
         )
 
-    def submission_status_callback(self, submission_id: t.Optional[str]):
+    def submission_status_callback(self, submission_id: t.Optional[str] = None, event: t.Optional[Event] = None):
         if not submission_id or not is_readable(t.cast(SubmissionId, submission_id)):
             return
         try:
@@ -174,7 +174,10 @@ class _GuiCoreContext(CoreEventConsumerBase):
                             self.gui._call_user_callback(
                                 client_id,
                                 submission_name,
-                                [core_get(submission.entity_id), {"submission_status": new_status.name}],
+                                [
+                                    core_get(submission.entity_id),
+                                    {"submission_status": new_status.name, **(event.metadata if event else {})},
+                                ],
                                 submission.properties.get("module_context"),
                             )