from jira import JIRA import sched import time import datetime import echo_bot import config class JIRA_Wapper(): def __init__(self, user, password, server_url='http://jira.tidbcloud.com', **kwargs): self.jira = JIRA(basic_auth=(user, password), server=server_url, **kwargs) def _list_projects(self): return sorted([pro.key for pro in self.jira.projects()]) def _get_a_issue(self, issue_id): return self.jira.issue(issue_id) def search_issues_by_jql(self, jql, **kwargs): return self.jira.search_issues(jql, **kwargs) def get_assignee(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['assignee']['emailAddress'] def get_issue_link(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['votes']['self'].replace('rest/api/2/issue', 'browse').replace('/votes', '') def get_issue_title(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['summary'] def get_reporter(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['reporter']['emailAddress'] def get_issue_type(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['issuetype']['name'] def get_priority(self, issue_id): return self._get_a_issue(issue_id).raw['fields']['priority']['name'] def add_comment(self, issue_id, comment): self.jira.add_comment(issue_id, comment) def update_issue(self, issue_id, **kwargs): self._get_a_issue(issue_id).update(**kwargs) def delete_issue(self, issue): issue.delete() def add_watcher(self, issue_id, watcher): self.jira.add_watcher(issue_id,watcher) # Initialize the scheduler class of the sched module schedule = sched.scheduler(time.time, time.sleep) #search issues which assignee updated in the duration def search_issues_in_configured_time_zone(jira,jqlBeginTimeStr,jqlEndTimeStr): jql = 'project = DM AND assignee IS NOT empty ' \ 'AND ((created < "'+jqlBeginTimeStr+'" AND assignee changed during("'+jqlBeginTimeStr+'","'+jqlEndTimeStr+'")) ' \ 'or (created >="'+jqlBeginTimeStr+'" AND created <="'+jqlEndTimeStr+'" )) ' print("JQL search at " + jqlEndTimeStr+" : "+jql ) result = [] if not jira.search_issues_by_jql(jql): print("EEROR: No issues found!") else: for i in jira.search_issues_by_jql(jql): # print i, jira.get_reporter(i), jira.get_issue_link(i), jira.get_issue_title(i) result.append( {'id': i.key, 'assignee': jira.get_assignee(i), 'link': jira.get_issue_link(i), 'issue_type': jira.get_issue_type(i), 'priority': jira.get_priority(i), 'summary': jira.get_issue_title(i) } ) print("the length of result is :", len(result)) return result # Function triggered by periodic schedule to search issue def search_issues_periodical(inc,jqlBeginTimeStr): jqlEndTime = datetime.datetime.utcnow() jqlEndTimeStr = jqlEndTime.strftime("%Y-%m-%d %H:%M") print("search issues time:"+jqlEndTimeStr) jira = JIRA_Wapper(config.JIRA_USER, config.JIRA_PASSWORD) result=search_issues_in_configured_time_zone(jira, jqlBeginTimeStr, jqlEndTimeStr) for issue in result: print(issue) echo_bot.jiraReminder(issue['assignee'], issue['link']) jqlEndTime +=datetime.timedelta(seconds=1) jqlEndTimeStr = jqlEndTime.strftime("%Y-%m-%d %H:%M") schedule.enter(inc, 0,search_issues_periodical,(inc,jqlEndTimeStr,)) # The default is polling jira every 900s def begin_to_poll(inc=900): jqlBeginTimeStr = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M") #jqlBeginTimeStr = "2021-09-14 09:24" schedule.enter(0, 0, search_issues_periodical, (inc,jqlBeginTimeStr,)) schedule.run() if __name__ == '__main__': # Execute once in n seconds begin_to_poll(config.POLL_CYCLE)