Added extra fields management for Jira search

This commit is contained in:
Kodjo Sossouvi
2025-07-24 17:52:42 +02:00
parent 48b5c057f0
commit 34f959812b
4 changed files with 48 additions and 26 deletions

View File

@@ -14,7 +14,7 @@ from components.workflows.db_management import WorkflowsDesignerSettings, Workfl
Connection, WorkflowsDesignerDbManager, ComponentState Connection, WorkflowsDesignerDbManager, ComponentState
from components_helpers import apply_boundaries, mk_tooltip, mk_dialog_buttons, mk_icon from components_helpers import apply_boundaries, mk_tooltip, mk_dialog_buttons, mk_icon
from core.instance_manager import InstanceManager 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 core.utils import get_unique_id, make_safe_id
from utils.DbManagementHelper import DbManagementHelper from utils.DbManagementHelper import DbManagementHelper
@@ -453,34 +453,46 @@ class WorkflowDesigner(BaseComponent):
def _mk_input_group(): def _mk_input_group():
if request_type == JiraRequestTypes.Issues.value: if request_type == JiraRequestTypes.Issues.value:
return Div( return Div(
Input(type="text", Input(type="text",
name="request", name="request",
value=component.properties.get("request", ""), value=component.properties.get("request", ""),
placeholder="Enter JQL", placeholder="Enter JQL",
cls="input w-full"), cls="input w-full"),
P("Write your jql code"), P("Write your jql code"),
) )
elif request_type == JiraRequestTypes.Comments.value: elif request_type == JiraRequestTypes.Comments.value:
return Div( return Div(
Input(type="text", Input(type="text",
name="request", name="request",
value=component.properties.get("request", ""), value=component.properties.get("request", ""),
placeholder="Issue id", placeholder="Issue id",
cls="input w-full"), cls="input w-full"),
P("Put the issue id here"), 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) request_type = component.properties.get("request_type", JiraRequestTypes.Issues.value)
return Div( return Div(
Fieldset( Fieldset(
Legend("JQL", cls="fieldset-legend"), Legend("JQL", cls="fieldset-legend"),
Select( Div(
*[_mk_option(enum) for enum in JiraRequestTypes], Select(
cls="select w-xs", *[_mk_option(enum) for enum in JiraRequestTypes],
name="request_type", cls="select w-xs",
**self.commands.on_processor_details_event(component.id, "OnJiraRequestTypeChanged"), name="request_type",
), **self.commands.on_processor_details_event(component.id, "OnJiraRequestTypeChanged"),
),
_mk_extra_parameters(),
cls="flex"),
_mk_input_group(), _mk_input_group(),
cls="fieldset bg-base-200 border-base-300 rounded-box border p-4" cls="fieldset bg-base-200 border-base-300 rounded-box border p-4"
), ),

View File

@@ -196,7 +196,8 @@ class WorkflowPlayer(BaseComponent):
self._settings_manager, self._settings_manager,
component.id, component.id,
component.properties["request_type"], component.properties["request_type"],
component.properties["request"])) component.properties["request"],
component.properties["fields"]))
elif key == (ProcessorTypes.Filter, "Default"): elif key == (ProcessorTypes.Filter, "Default"):
engine.add_processor(DefaultDataFilter(component.id, component.properties["filter"])) engine.add_processor(DefaultDataFilter(component.id, component.properties["filter"]))
elif key == (ProcessorTypes.Presenter, "Default"): elif key == (ProcessorTypes.Presenter, "Default"):

View File

@@ -9,7 +9,7 @@ from core.Expando import Expando
JIRA_ROOT = "https://altares.atlassian.net/rest/api/3" JIRA_ROOT = "https://altares.atlassian.net/rest/api/3"
DEFAULT_HEADERS = {"Accept": "application/json"} DEFAULT_HEADERS = {"Accept": "application/json"}
DEFAULT_SEARCH_FIELDS = "summary,status,assignee"
logger = logging.getLogger("jql") logger = logging.getLogger("jql")
@@ -25,7 +25,7 @@ class JiraRequestTypes(Enum):
class Jira: class Jira:
"""Manage default operation to 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 Prepare a connection to JIRA
The initialisation do not to anything, The initialisation do not to anything,
@@ -38,6 +38,7 @@ class Jira:
self.user_name = user_name self.user_name = user_name
self.api_token = api_token self.api_token = api_token
self.auth = HTTPBasicAuth(self.user_name, self.api_token) self.auth = HTTPBasicAuth(self.user_name, self.api_token)
self.fields = fields
def test(self): def test(self):
url = f"{JIRA_ROOT}/myself" url = f"{JIRA_ROOT}/myself"
@@ -85,7 +86,7 @@ class Jira:
as_dict = json.loads(response.text) as_dict = json.loads(response.text)
return [Expando(field) for field in as_dict] 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 Executes a JQL and returns the list of issues
:param jql: :param jql:
@@ -93,6 +94,13 @@ class Jira:
:return: :return:
""" """
logger.debug(f"Processing jql '{jql}'") 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" url = f"{JIRA_ROOT}/search"
headers = DEFAULT_HEADERS.copy() headers = DEFAULT_HEADERS.copy()

View File

@@ -92,16 +92,17 @@ class TableDataProducer(DataProducer):
class JiraDataProducer(DataProducer): class JiraDataProducer(DataProducer):
"""Base class for data producers that emit data from Jira.""" """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) super().__init__(component_id)
self._session = session self._session = session
self.settings_manager = settings_manager self.settings_manager = settings_manager
self.request_type = request_type self.request_type = request_type
self.request = request self.request = request
self.fields = fields
self.db = AdminDbManager(session, settings_manager).jira self.db = AdminDbManager(session, settings_manager).jira
def emit(self, data: Any = None) -> Generator[Any, None, None]: 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): if not hasattr(jira, self.request_type):
raise ValueError(f"Invalid request type: {self.request_type}") raise ValueError(f"Invalid request type: {self.request_type}")