I can have different types of JIRA query
This commit is contained in:
@@ -14,6 +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.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
|
||||||
|
|
||||||
@@ -443,13 +444,24 @@ class WorkflowDesigner(BaseComponent):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _mk_jira_processor_details(component):
|
def _mk_jira_processor_details(component):
|
||||||
|
def _mk_option(name):
|
||||||
|
return Option(name.name,
|
||||||
|
value=name.value,
|
||||||
|
selected="selected" if name.value == component.properties.get("request_type",
|
||||||
|
JiraRequestTypes.Issues) else None)
|
||||||
|
|
||||||
return Div(
|
return Div(
|
||||||
Fieldset(
|
Fieldset(
|
||||||
Legend("JQL", cls="fieldset-legend"),
|
Legend("JQL", cls="fieldset-legend"),
|
||||||
|
Select(
|
||||||
|
*[_mk_option(enum) for enum in JiraRequestTypes],
|
||||||
|
cls="select w-xs",
|
||||||
|
name="request_type",
|
||||||
|
),
|
||||||
Input(type="text",
|
Input(type="text",
|
||||||
name="jira_jql",
|
name="request",
|
||||||
value=component.properties.get("jira_jql", ""),
|
value=component.properties.get("request", ""),
|
||||||
placeholder="Enter JQL",
|
placeholder="Enter Request (JQL, Issue ID...)",
|
||||||
cls="input w-full"),
|
cls="input w-full"),
|
||||||
P("Write your jsl code"),
|
P("Write your jsl code"),
|
||||||
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"
|
||||||
|
|||||||
@@ -195,8 +195,8 @@ class WorkflowPlayer(BaseComponent):
|
|||||||
JiraDataProducer(self._session,
|
JiraDataProducer(self._session,
|
||||||
self._settings_manager,
|
self._settings_manager,
|
||||||
component.id,
|
component.id,
|
||||||
'issues',
|
component.properties["request_type"],
|
||||||
component.properties["jira_jql"]))
|
component.properties["request"]))
|
||||||
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"):
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.auth import HTTPBasicAuth
|
from requests.auth import HTTPBasicAuth
|
||||||
|
|
||||||
from core.Expando import Expando
|
from core.Expando import Expando
|
||||||
|
|
||||||
JIRA_ROOT = "https://altares.atlassian.net/rest/api/2"
|
JIRA_ROOT = "https://altares.atlassian.net/rest/api/3"
|
||||||
DEFAULT_HEADERS = {"Accept": "application/json"}
|
DEFAULT_HEADERS = {"Accept": "application/json"}
|
||||||
|
|
||||||
logger = logging.getLogger("jql")
|
logger = logging.getLogger("jql")
|
||||||
@@ -16,6 +17,11 @@ class NotFound(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class JiraRequestTypes(Enum):
|
||||||
|
Issues = "issues"
|
||||||
|
Comments = "comments"
|
||||||
|
|
||||||
|
|
||||||
class Jira:
|
class Jira:
|
||||||
"""Manage default operation to JIRA"""
|
"""Manage default operation to JIRA"""
|
||||||
|
|
||||||
@@ -67,7 +73,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 jql(self, jql: str, fields="summary,status,assignee") -> list[Expando]:
|
def issues(self, jql: str, fields="summary,status,assignee") -> list[Expando]:
|
||||||
"""
|
"""
|
||||||
Executes a JQL and returns the list of issues
|
Executes a JQL and returns the list of issues
|
||||||
:param jql:
|
:param jql:
|
||||||
@@ -91,13 +97,11 @@ class Jira:
|
|||||||
result = []
|
result = []
|
||||||
while True:
|
while True:
|
||||||
logger.debug(f"Request startAt '{payload['startAt']}'")
|
logger.debug(f"Request startAt '{payload['startAt']}'")
|
||||||
response = requests.request(
|
response = requests.request("POST",
|
||||||
"POST",
|
url,
|
||||||
url,
|
data=json.dumps(payload),
|
||||||
data=json.dumps(payload),
|
headers=headers,
|
||||||
headers=headers,
|
auth=self.auth)
|
||||||
auth=self.auth
|
|
||||||
)
|
|
||||||
|
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
raise Exception(self._format_error(response))
|
raise Exception(self._format_error(response))
|
||||||
@@ -113,6 +117,25 @@ class Jira:
|
|||||||
|
|
||||||
return [Expando(issue) for issue in result]
|
return [Expando(issue) for issue in result]
|
||||||
|
|
||||||
|
def comments(self, issue_id: str) -> list[Expando]:
|
||||||
|
"""
|
||||||
|
Retrieve the list of comments for an issue
|
||||||
|
:param issue_id:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
url = f"{JIRA_ROOT}/issue/{issue_id}/comment"
|
||||||
|
|
||||||
|
response = requests.request("GET",
|
||||||
|
url,
|
||||||
|
headers=DEFAULT_HEADERS,
|
||||||
|
auth=self.auth)
|
||||||
|
if response.status_code != 200:
|
||||||
|
raise Exception(self._format_error(response))
|
||||||
|
|
||||||
|
as_dict = json.loads(response.text)
|
||||||
|
result = as_dict["comments"]
|
||||||
|
return [Expando(issue) for issue in result]
|
||||||
|
|
||||||
def extract(self, jql, mappings, updates=None) -> list[dict]:
|
def extract(self, jql, mappings, updates=None) -> list[dict]:
|
||||||
"""
|
"""
|
||||||
Executes a jql and returns list of dict
|
Executes a jql and returns list of dict
|
||||||
@@ -134,7 +157,7 @@ class Jira:
|
|||||||
# retrieve the list of requested fields from what was asked in the mapping
|
# retrieve the list of requested fields from what was asked in the mapping
|
||||||
jira_fields = [_get_field(mapping) for mapping in mappings]
|
jira_fields = [_get_field(mapping) for mapping in mappings]
|
||||||
as_string = ", ".join(jira_fields)
|
as_string = ", ".join(jira_fields)
|
||||||
issues = self.jql(jql, as_string)
|
issues = self.issues(jql, as_string)
|
||||||
|
|
||||||
for issue in issues:
|
for issue in issues:
|
||||||
# apply updates if needed
|
# apply updates if needed
|
||||||
@@ -222,4 +245,4 @@ class Jira:
|
|||||||
error_messages = json.loads(response.text)["errorMessages"]
|
error_messages = json.loads(response.text)["errorMessages"]
|
||||||
else:
|
else:
|
||||||
error_messages = response.text
|
error_messages = response.text
|
||||||
return f"Error {response.status_code} : {response.reason} : {error_messages}"
|
return f"Error {response.status_code} : {response.reason} : {error_messages}"
|
||||||
|
|||||||
@@ -92,17 +92,20 @@ 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, jira_object='issues', jira_query=''):
|
def __init__(self, session, settings_manager, component_id, request_type='issues', request=''):
|
||||||
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.jira_object = jira_object
|
self.request_type = request_type
|
||||||
self.jira_query = jira_query
|
self.request = request
|
||||||
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)
|
||||||
yield from jira.jql(self.jira_query)
|
if not hasattr(jira, self.request_type):
|
||||||
|
raise ValueError(f"Invalid request type: {self.request_type}")
|
||||||
|
|
||||||
|
yield from getattr(jira, self.request_type)(self.request)
|
||||||
|
|
||||||
|
|
||||||
class DefaultDataFilter(DataFilter):
|
class DefaultDataFilter(DataFilter):
|
||||||
|
|||||||
Reference in New Issue
Block a user