Source code for langchain_community.utilities.jira
"""Util that calls Jira."""fromtypingimportAny,Dict,List,Optional,Unionfromlangchain_core.utilsimportget_from_dict_or_envfrompydanticimportBaseModel,ConfigDict,model_validatorfromtyping_extensionsimportTypedDict
[docs]classJiraOauth2Token(TypedDict):"""Jira OAuth2 token."""access_token:str"""Jira OAuth2 access token."""token_type:str"""Jira OAuth2 token type ('bearer' or other)."""
# TODO: think about error handling, more specific api specs, and jql/project limits
[docs]classJiraAPIWrapper(BaseModel):""" Wrapper for Jira API. You can connect to Jira with either an API token or OAuth2. - with API token, you need to provide the JIRA_USERNAME and JIRA_API_TOKEN environment variables or arguments. ex: JIRA_USERNAME=your_username JIRA_API_TOKEN=your_api_token - with OAuth2, you need to provide the JIRA_OAUTH2 environment variable or argument as a dict having as fields "client_id" and "token" which is a dict containing at least "access_token" and "token_type". ex: JIRA_OAUTH2='{"client_id": "your_client_id", "token": {"access_token": "your_access_token","token_type": "bearer"}}' """jira:Any=None#: :meta private:confluence:Any=Nonejira_username:Optional[str]=Nonejira_api_token:Optional[str]=None"""Jira API token when you choose to connect to Jira with api token."""jira_oauth2:Optional[Union[JiraOauth2,str]]=None"""Jira OAuth2 token when you choose to connect to Jira with oauth2."""jira_instance_url:Optional[str]=Nonejira_cloud:Optional[bool]=Nonemodel_config=ConfigDict(extra="forbid",)@model_validator(mode="before")@classmethoddefvalidate_environment(cls,values:Dict)->Any:"""Validate that api key and python package exists in environment."""jira_username=get_from_dict_or_env(values,"jira_username","JIRA_USERNAME",default="")values["jira_username"]=jira_usernamejira_api_token=get_from_dict_or_env(values,"jira_api_token","JIRA_API_TOKEN",default="")values["jira_api_token"]=jira_api_tokenjira_oauth2=get_from_dict_or_env(values,"jira_oauth2","JIRA_OAUTH2",default="")values["jira_oauth2"]=jira_oauth2ifjira_oauth2andisinstance(jira_oauth2,str):try:importjsonjira_oauth2=json.loads(jira_oauth2)exceptImportError:raiseImportError("json is not installed. Please install it with `pip install json`")exceptjson.decoder.JSONDecodeErrorase:raiseValueError(f"The format of the JIRA_OAUTH2 string is "f"not a valid dictionary: {e}")jira_instance_url=get_from_dict_or_env(values,"jira_instance_url","JIRA_INSTANCE_URL")values["jira_instance_url"]=jira_instance_urlif"jira_cloud"invaluesandvalues["jira_cloud"]isnotNone:values["jira_cloud"]=str(values["jira_cloud"])jira_cloud_str=get_from_dict_or_env(values,"jira_cloud","JIRA_CLOUD")jira_cloud=jira_cloud_str.lower()=="true"values["jira_cloud"]=jira_cloudifjira_api_tokenandjira_oauth2:raiseValueError("You have to provide either a jira_api_token or a jira_oauth2. ""Not both.")try:fromatlassianimportConfluence,JiraexceptImportError:raiseImportError("atlassian-python-api is not installed. ""Please install it with `pip install atlassian-python-api`")ifjira_api_token:ifjira_username=="":jira=Jira(url=jira_instance_url,token=jira_api_token,cloud=jira_cloud,)else:jira=Jira(url=jira_instance_url,username=jira_username,password=jira_api_token,cloud=jira_cloud,)confluence=Confluence(url=jira_instance_url,username=jira_username,password=jira_api_token,cloud=jira_cloud,)elifjira_oauth2:jira=Jira(url=jira_instance_url,oauth2=jira_oauth2,cloud=jira_cloud,)confluence=Confluence(url=jira_instance_url,oauth2=jira_oauth2,cloud=jira_cloud,)values["jira"]=jiravalues["confluence"]=confluencereturnvalues
[docs]defissue_create(self,query:str)->str:try:importjsonexceptImportError:raiseImportError("json is not installed. Please install it with `pip install json`")params=json.loads(query)returnself.jira.issue_create(fields=dict(params))
[docs]defpage_create(self,query:str)->str:try:importjsonexceptImportError:raiseImportError("json is not installed. Please install it with `pip install json`")params=json.loads(query)returnself.confluence.create_page(**dict(params))
[docs]defother(self,query:str)->str:try:importjsonexceptImportError:raiseImportError("json is not installed. Please install it with `pip install json`")params=json.loads(query)jira_function=getattr(self.jira,params["function"])returnjira_function(*params.get("args",[]),**params.get("kwargs",{}))