From 34f959812b8b97cb0fe0a92e759998761eb331f9 Mon Sep 17 00:00:00 2001 From: Kodjo Sossouvi Date: Thu, 24 Jul 2025 17:52:42 +0200 Subject: [PATCH] Added extra fields management for Jira search --- .../workflows/components/WorkflowDesigner.py | 52 ++++++++++++------- .../workflows/components/WorkflowPlayer.py | 3 +- src/core/jira.py | 14 +++-- src/workflow/engine.py | 5 +- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/components/workflows/components/WorkflowDesigner.py b/src/components/workflows/components/WorkflowDesigner.py index 664cbd8..17ea7c1 100644 --- a/src/components/workflows/components/WorkflowDesigner.py +++ b/src/components/workflows/components/WorkflowDesigner.py @@ -14,7 +14,7 @@ from components.workflows.db_management import WorkflowsDesignerSettings, Workfl Connection, WorkflowsDesignerDbManager, ComponentState from components_helpers import apply_boundaries, mk_tooltip, mk_dialog_buttons, mk_icon from core.instance_manager import InstanceManager -from core.jira import JiraRequestTypes +from core.jira import JiraRequestTypes, DEFAULT_SEARCH_FIELDS from core.utils import get_unique_id, make_safe_id from utils.DbManagementHelper import DbManagementHelper @@ -453,34 +453,46 @@ class WorkflowDesigner(BaseComponent): def _mk_input_group(): if request_type == JiraRequestTypes.Issues.value: return Div( - Input(type="text", - name="request", - value=component.properties.get("request", ""), - placeholder="Enter JQL", - cls="input w-full"), - P("Write your jql code"), + Input(type="text", + name="request", + value=component.properties.get("request", ""), + placeholder="Enter JQL", + cls="input w-full"), + P("Write your jql code"), ) elif request_type == JiraRequestTypes.Comments.value: return Div( - Input(type="text", - name="request", - value=component.properties.get("request", ""), - placeholder="Issue id", - cls="input w-full"), - P("Put the issue id here"), + Input(type="text", + name="request", + value=component.properties.get("request", ""), + placeholder="Issue id", + cls="input w-full"), + P("Put the issue id here"), ) - + + def _mk_extra_parameters(): + if request_type == JiraRequestTypes.Issues.value: + return Input(type="text", + name="fields", + value=component.properties.get("fields", DEFAULT_SEARCH_FIELDS), + placeholder="default fields", + cls="input w-full ml-2") + else: + return None request_type = component.properties.get("request_type", JiraRequestTypes.Issues.value) return Div( Fieldset( Legend("JQL", cls="fieldset-legend"), - Select( - *[_mk_option(enum) for enum in JiraRequestTypes], - cls="select w-xs", - name="request_type", - **self.commands.on_processor_details_event(component.id, "OnJiraRequestTypeChanged"), - ), + Div( + Select( + *[_mk_option(enum) for enum in JiraRequestTypes], + cls="select w-xs", + name="request_type", + **self.commands.on_processor_details_event(component.id, "OnJiraRequestTypeChanged"), + ), + _mk_extra_parameters(), + cls="flex"), _mk_input_group(), cls="fieldset bg-base-200 border-base-300 rounded-box border p-4" ), diff --git a/src/components/workflows/components/WorkflowPlayer.py b/src/components/workflows/components/WorkflowPlayer.py index f86c0d9..d5d385c 100644 --- a/src/components/workflows/components/WorkflowPlayer.py +++ b/src/components/workflows/components/WorkflowPlayer.py @@ -196,7 +196,8 @@ class WorkflowPlayer(BaseComponent): self._settings_manager, component.id, component.properties["request_type"], - component.properties["request"])) + component.properties["request"], + component.properties["fields"])) elif key == (ProcessorTypes.Filter, "Default"): engine.add_processor(DefaultDataFilter(component.id, component.properties["filter"])) elif key == (ProcessorTypes.Presenter, "Default"): diff --git a/src/core/jira.py b/src/core/jira.py index 10923b2..c053b0c 100644 --- a/src/core/jira.py +++ b/src/core/jira.py @@ -9,7 +9,7 @@ from core.Expando import Expando JIRA_ROOT = "https://altares.atlassian.net/rest/api/3" DEFAULT_HEADERS = {"Accept": "application/json"} - +DEFAULT_SEARCH_FIELDS = "summary,status,assignee" logger = logging.getLogger("jql") @@ -25,7 +25,7 @@ class JiraRequestTypes(Enum): class Jira: """Manage default operation to JIRA""" - def __init__(self, user_name: str, api_token: str): + def __init__(self, user_name: str, api_token: str, fields=DEFAULT_SEARCH_FIELDS): """ Prepare a connection to JIRA The initialisation do not to anything, @@ -38,6 +38,7 @@ class Jira: self.user_name = user_name self.api_token = api_token self.auth = HTTPBasicAuth(self.user_name, self.api_token) + self.fields = fields def test(self): url = f"{JIRA_ROOT}/myself" @@ -85,7 +86,7 @@ class Jira: as_dict = json.loads(response.text) return [Expando(field) for field in as_dict] - def issues(self, jql: str, fields="summary,status,assignee") -> list[Expando]: + def issues(self, jql: str, fields=None) -> list[Expando]: """ Executes a JQL and returns the list of issues :param jql: @@ -93,6 +94,13 @@ class Jira: :return: """ logger.debug(f"Processing jql '{jql}'") + + if not jql: + raise ValueError("Jql cannot be empty.") + + if not fields: + fields = self.fields + url = f"{JIRA_ROOT}/search" headers = DEFAULT_HEADERS.copy() diff --git a/src/workflow/engine.py b/src/workflow/engine.py index cd3d386..ce60a71 100644 --- a/src/workflow/engine.py +++ b/src/workflow/engine.py @@ -92,16 +92,17 @@ class TableDataProducer(DataProducer): class JiraDataProducer(DataProducer): """Base class for data producers that emit data from Jira.""" - def __init__(self, session, settings_manager, component_id, request_type='issues', request=''): + def __init__(self, session, settings_manager, component_id, request_type='issues', request='', fields=None): super().__init__(component_id) self._session = session self.settings_manager = settings_manager self.request_type = request_type self.request = request + self.fields = fields self.db = AdminDbManager(session, settings_manager).jira def emit(self, data: Any = None) -> Generator[Any, None, None]: - jira = Jira(self.db.user_name, self.db.api_token) + jira = Jira(self.db.user_name, self.db.api_token, fields=self.fields) if not hasattr(jira, self.request_type): raise ValueError(f"Invalid request type: {self.request_type}")