91 lines
3.3 KiB
Python
Raw Normal View History

from typing import List
from llama_index.readers.base import BaseReader
from llama_index.readers.schema.base import Document
def safe_value_dict(dict_obj):
for key, value in dict_obj.items():
if isinstance(value, (str, int, float)):
dict_obj[key] = value
elif isinstance(value, list):
# Convert lists to strings
dict_obj[key] = ', '.join(map(str, value))
elif value is None:
# Replace None with a default string
dict_obj[key] = ''
else:
# Convert other types to strings
dict_obj[key] = str(value)
return dict_obj
class JiraReader(BaseReader):
"""Jira reader. Reads data from Jira issues from passed query.
Args:
email (str): Jira email.
api_token (str): Jira API token.
server_url (str): Jira server url.
"""
def __init__(self, email: str, api_token: str, server_url: str) -> None:
from jira import JIRA
self.jira = JIRA(
basic_auth=(email, api_token),
server=f'https://{server_url}'
)
def load_data(self, query: str) -> List[Document]:
relevant_issues = self.jira.search_issues(query)
issues = []
for issue in relevant_issues:
2023-04-24 03:42:39 +05:30
# Iterates through only issues and not epics
if 'parent' in (issue.raw['fields']):
assignee = ''
reporter = ''
epic_key = ''
epic_summary = ''
epic_descripton = ''
2023-04-24 03:42:39 +05:30
if issue.fields.assignee:
assignee = issue.fields.assignee.displayName
2023-04-24 03:42:39 +05:30
if issue.fields.reporter:
reporter = issue.fields.reporter.displayName
2023-04-24 03:42:39 +05:30
if issue.raw['fields']['parent']['key']:
epic_key = issue.raw['fields']['parent']['key']
2023-04-24 03:42:39 +05:30
if issue.raw['fields']['parent']['fields']['summary']:
epic_summary = issue.raw['fields']['parent']['fields']['summary']
2023-04-24 03:42:39 +05:30
if issue.raw['fields']['parent']['fields']['status']['description']:
epic_descripton = issue.raw['fields']['parent']['fields']['status']['description']
2023-04-24 03:42:39 +05:30
issues.append(
Document(
f"{issue.fields.summary} \n {issue.fields.description}",
extra_info = safe_value_dict({
2023-04-24 03:42:39 +05:30
'id': issue.id,
'title': issue.fields.summary,
'url': issue.permalink(),
'created_at': issue.fields.created,
'updated_at': issue.fields.updated,
'labels': issue.fields.labels,
'status': issue.fields.status.name,
'assignee': assignee,
'reporter': reporter,
'project': issue.fields.project.name,
'issue_type': issue.fields.issuetype.name,
'priority': issue.fields.priority.name,
'epic_key': epic_key,
'epic_summary': epic_summary,
'epic_description': epic_descripton})
2023-04-24 03:42:39 +05:30
)
)
return issues