From c4fbab5475c1182104e2167b975b95286926d753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kalinowski?= Date: Fri, 4 Oct 2024 18:03:47 +0200 Subject: [PATCH] working script --- main.py | 146 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 97 insertions(+), 49 deletions(-) diff --git a/main.py b/main.py index 21e8182..af75dd9 100755 --- a/main.py +++ b/main.py @@ -1,59 +1,107 @@ -from ssl import SSLCertVerificationError import requests -from requests.auth import HTTPBasicAuth import json -from dotenv import load_dotenv -import os +import datetime -# Before running the script make sure the following: -# 1. The correct root certificate is in the script directory and specified -# under the global variables -# 2. You've created the .env file with the following format: -# JIRA_USER= -# JIRA_PASSWORD= -# 3. You have installed necessary packages from the requirements.txt file - -load_dotenv() - -JIRA_URL = 'https://globaljira.roche.com/rest/api/2/issue/picker' -USERNAME = os.getenv("JIRA_USER") -PASSWORD = os.getenv("JIRA_PASSWORD") -ROOT_CERT = ".\\Roche G3 Root CA.crt" -PRINT_RESPONSE_ON_ERR = False +ACCESS_TOKEN = "" # Modify +USERNAMES = ["kalinom6"] # Modify +URL = "https://globaljira.roche.com/rest/api/2" +CERT = 'Roche G3 Root CA.crt' +CHECK_WEEK_BACK = False headers = { - 'Content-Type': 'application/json' + "Authorization": f"Bearer {ACCESS_TOKEN}", + "Content-Type": "application/json" } -# For this query for user kalinom6 there are 6 results, 5 of them are correct, -# but one is certainly not associated with the user in any way according to -# the web application. The result set is lacking too, there should be way -# more issues assigned to this user -query = { - 'query': f'assignee = {USERNAME} AND status not in (Closed, Done)' -} +def send_request(url, method, payload=None): + if method == "GET": + response = requests.get(url, headers=headers, data=json.dumps(payload), verify=CERT) + if method == "POST": + response = requests.post(url, headers=headers, data=json.dumps(payload), verify=CERT) + if response.status_code == 200: + return response.json() + print(f"Error: {response.status_code}, {response.text}") -print(f'{USERNAME}, {PASSWORD}') +def get_issues(username): + jql = f"assignee = '{username}'" + payload = { + "jql": jql, + "startAt": 0, + "maxResults": 50, + "fields": [ + "key", "summary" + ] + } + data = send_request(f'{URL}/search', "POST", payload) + if data: + tasks = [] + for issue in data.get("issues", []): + task = { + "task_id": issue["key"], + "summary": issue["fields"]["summary"], + "task_link": f"https://globaljira.roche.com/browse/{issue['key']}" + } + tasks.append(task) + return tasks -try: - response = requests.get( - JIRA_URL, - auth=HTTPBasicAuth(USERNAME, PASSWORD), - headers=headers, - params=query, - verify=ROOT_CERT - ) -except SSLCertVerificationError: - print("SSL verification failed. Please make sure you're connected to the VPN and the correct root certificate is included.") +def get_worklogs(issues): + worklogs = [] + for issue in issues: + data = send_request(f'{URL}/issue/{issue["task_id"]}/worklog', "GET") + if data: + for log in data.get("worklogs", []): + worklog = { + "ticket_id": issue["task_id"], + "time_spent": log["timeSpent"], + "date": log["started"], + "author": log["author"]["name"] + } + if worklog["author"] in USERNAMES: + worklogs.append(worklog) + return worklogs -if response.status_code == 200: - print("JQL query executed successfully!") - issues = json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")) - print(issues) -else: - print(f"Failed to execute JQL query. Status code: {response.status_code}") - if response.status_code == 403: - print("If you're sure you've set up the environment variables correctly\n \ - Please login to Jira in the browser to solve a CAPTCHA.") - if PRINT_RESPONSE_ON_ERR: - print("Response:", response.text) \ No newline at end of file +def get_days(): + today = datetime.date.today() + if CHECK_WEEK_BACK: + today = today - datetime.timedelta(weeks=1) + year, weeknum, day_of_week = today.isocalendar() + days = [] + days.append(str(today)) + while day_of_week > 1: + today = today - datetime.timedelta(days=1) + day_of_week -= 1 + days.append(str(today)) + return days + +def get_week_tickets(worklogs, days): + this_week_tickets = [] + for worklog in worklogs: + worklog_date = datetime.datetime.strptime(worklog["date"].split('T')[0], '%Y-%m-%d').date() + current_month = get_max_month(days) + worklog_month = str(worklog_date).split('-')[1] + if str(worklog_date) in days and int(worklog_month) == current_month: + this_week_tickets.append(worklog) + return this_week_tickets + +def get_max_month(days): + max = 0 + for day in days: + month = int(day.split('-')[1]) + if month > max: + max = month + return max + +def main(): + for username in USERNAMES: + issues = get_issues(username) + print('Issues:') + print(json.dumps(issues, indent=4)) + worklogs = get_worklogs(issues) + days = get_days() + worklogs = get_week_tickets(worklogs, days) + omnimat_string = "" + for worklog in worklogs: + omnimat_string += worklog["ticket_id"] + '\n' + print(omnimat_string) +if __name__ == '__main__': + main() \ No newline at end of file