From de720b170d1c64c8a9a23e879996ba5b9cb7d4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kalinowski?= Date: Thu, 17 Oct 2024 16:38:00 +0200 Subject: [PATCH 1/4] fixing bug with getting days of current week --- main.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index d21b367..fcb92e7 100755 --- a/main.py +++ b/main.py @@ -69,12 +69,16 @@ def get_days(day, weeks_back=WEEKS_BACK): if WEEKS_BACK: day = day - datetime.timedelta(weeks=weeks_back) year, weeknum, day_of_week = day.isocalendar() - days = [] - days.append(str(day)) - while day_of_week > 1: + # start at monday + while day_of_week != 1: day = day - datetime.timedelta(days=1) day_of_week -= 1 + days = [] + # end at sunday + while day_of_week <= 7: days.append(str(day)) + day = day + datetime.timedelta(days=1) + day_of_week += 1 return days # NOT FUNCTIONAL @@ -130,6 +134,8 @@ def main(): print(json.dumps(issues, indent=4)) print(f"Worklogs for the current week:") print(json.dumps(worklogs, indent=4)) + print("Days:") + print(days) print(f"Omnimat string:") print(omnimat_string) if __name__ == '__main__': -- 2.51.0 From 137fe1a0fe7c8b27d3d8eb2c57bc891b663e9f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kalinowski?= Date: Thu, 17 Oct 2024 16:39:00 +0200 Subject: [PATCH 2/4] fixing bug --- main.py | 15 --------------- 1 file changed, 15 deletions(-) mode change 100755 => 100644 main.py diff --git a/main.py b/main.py old mode 100755 new mode 100644 index fcb92e7..933dadf --- a/main.py +++ b/main.py @@ -81,21 +81,6 @@ def get_days(day, weeks_back=WEEKS_BACK): day_of_week += 1 return days -# NOT FUNCTIONAL -def get_weeks(day, worklogs, weeks=list()): - year, weeknum, day_of_week = day.isocalendar() - days = get_days(day, weeks_back=0) - tickets = get_week_tickets(worklogs, days) - weeks.append(tickets) - if weeknum != 0: - days = get_days(day, weeks_back=1) - get_weeks(days[0], worklogs, weeks) - return weeks - -# TODO: implement this -def get_days_range(date_from, date_to): - pass - def get_week_tickets(worklogs, days): this_week_tickets = [] for worklog in worklogs: -- 2.51.0 From 5e80a8426b0389bb2753d85feaa65e871d92b28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kalinowski?= Date: Thu, 17 Oct 2024 18:02:41 +0200 Subject: [PATCH 3/4] fixing bugs with 2-different-month weeks --- main.py | 64 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 24 deletions(-) mode change 100644 => 100755 main.py diff --git a/main.py b/main.py old mode 100644 new mode 100755 index 933dadf..5201d87 --- a/main.py +++ b/main.py @@ -65,40 +65,41 @@ def get_worklogs(issues): worklogs.append(worklog) return worklogs -def get_days(day, weeks_back=WEEKS_BACK): +def get_days(day): if WEEKS_BACK: - day = day - datetime.timedelta(weeks=weeks_back) + day = day - datetime.timedelta(weeks=WEEKS_BACK) + year, weeknum, day_of_week = day.isocalendar() - # start at monday while day_of_week != 1: day = day - datetime.timedelta(days=1) - day_of_week -= 1 + year, weeknum, day_of_week = day.isocalendar() days = [] - # end at sunday + current_month = day.month while day_of_week <= 7: + if day.month != current_month: + break # Stop collecting if month changes days.append(str(day)) day = day + datetime.timedelta(days=1) day_of_week += 1 - return days + + days_second_part = [] + if day_of_week <= 7: # This condition means the loop ended because the month changed + next_month = day.month + while day_of_week <= 7 and day.month == next_month: + days_second_part.append(str(day)) + day = day + datetime.timedelta(days=1) + day_of_week += 1 + + return days, days_second_part 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: + if str(worklog_date) in days: 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(): print('The script starts its work...') @@ -106,22 +107,37 @@ def main(): issues = get_issues(username) worklogs = get_worklogs(issues) today = datetime.date.today() - days = get_days(today) - worklogs = get_week_tickets(worklogs, days) + days, days_second_part = get_days(today) + week_worklogs = get_week_tickets(worklogs, days) omnimat_string = "" - for worklog in worklogs: + for worklog in week_worklogs: if worklog["ticket_id"] not in omnimat_string: omnimat_string += worklog["ticket_id"] + '\n' + if days_second_part: + second_omnimat_string = "" + worklogs_second_part = get_week_tickets(worklogs, days_second_part) + for worklog in week_worklogs: + if worklog["ticket_id"] not in second_omnimat_string: + second_omnimat_string += worklog["ticket_id"] + '\n' + if VERBOSE: print('Issues of the user:') print(json.dumps(issues, indent=4)) - print(f"Worklogs for the current week:") - print(json.dumps(worklogs, indent=4)) - print("Days:") - print(days) + print(f"Worklogs for the week:") + print(json.dumps(week_worklogs, indent=4)) + print("Days:") + print(days) print(f"Omnimat string:") print(omnimat_string) + if days_second_part: + if VERBOSE: + print(f"Worklogs for the weeks 2nd part:") + print(json.dumps(worklogs_second_part, indent=4)) + print("Days:") + print(days_second_part) + print(f"Omnimat string:") + print(omnimat_string) if __name__ == '__main__': main() \ No newline at end of file -- 2.51.0 From b4ef99350a97ae6ef731586f42355d96535fded8 Mon Sep 17 00:00:00 2001 From: litneri Date: Fri, 18 Oct 2024 16:54:46 +0200 Subject: [PATCH 4/4] month solution --- main.py | 180 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 139 insertions(+), 41 deletions(-) diff --git a/main.py b/main.py index 5201d87..87ba718 100755 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -import requests +import pip._vendor.requests as requests import json import datetime from dotenv import load_dotenv @@ -6,32 +6,39 @@ from os import getenv load_dotenv() ACCESS_TOKEN = getenv("TOKEN") -USERNAMES = ["kalinom6"] # Modify +USERNAMES = ["litneri"] # Modify URL = "https://globaljira.roche.com/rest/api/2" CERT = getenv("CERT_LOCATION") WEEKS_BACK = 1 VERBOSE = True +MONTH_VIEW = True +CHECK_MONTH_BACK = False + headers = { "Authorization": f"Bearer {ACCESS_TOKEN}", "Content-Type": "application/json" } + def send_request(url, method, payload=None): if method == "GET": - response = requests.get(url, headers=headers, data=json.dumps(payload), verify=CERT) + 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) + 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}") + def get_issues(username): jql = f"assignee WAS '{username}'" payload = { "jql": jql, "startAt": 0, - "maxResults": 50, + "maxResults": 15, "fields": [ "key", "summary" ] @@ -43,11 +50,12 @@ def get_issues(username): task = { "task_id": issue["key"], "summary": issue["fields"]["summary"], - "task_link": f"https://globaljira.roche.com/browse/{issue['key']}" + "task_link": f"https://globaljira.roche.com/browse/{issue['key']}" } tasks.append(task) return tasks + def get_worklogs(issues): worklogs = [] for issue in issues: @@ -62,13 +70,20 @@ def get_worklogs(issues): "author": log["author"]["name"] } if worklog["author"] in USERNAMES: - worklogs.append(worklog) + worklogs.append(worklog) + + worklogs.sort(key=date_sort) return worklogs + +def date_sort(worklog): + return worklog['date'] + + def get_days(day): if WEEKS_BACK: day = day - datetime.timedelta(weeks=WEEKS_BACK) - + year, weeknum, day_of_week = day.isocalendar() while day_of_week != 1: day = day - datetime.timedelta(days=1) @@ -81,7 +96,7 @@ def get_days(day): days.append(str(day)) day = day + datetime.timedelta(days=1) day_of_week += 1 - + days_second_part = [] if day_of_week <= 7: # This condition means the loop ended because the month changed next_month = day.month @@ -89,55 +104,138 @@ def get_days(day): days_second_part.append(str(day)) day = day + datetime.timedelta(days=1) day_of_week += 1 - + return days, days_second_part + 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() + worklog_date = datetime.datetime.strptime( + worklog["date"].split('T')[0], '%Y-%m-%d').date() if str(worklog_date) in days: this_week_tickets.append(worklog) return this_week_tickets +#code of month branch +def get_days_of_month(previous_month=False): + today = datetime.date.today() + start_of_month = today.replace(day=1) + end_of_month = today.replace(day=28)+datetime.timedelta(days=4) + end_of_month -= datetime.timedelta(days=end_of_month.day) + days = [] + + # minus one month + if previous_month == True: + start_of_month -= datetime.timedelta(days=1) + start_of_month = start_of_month.replace(day=1) + end_of_month = start_of_month + end_of_month = today.replace(day=28)+datetime.timedelta(days=4) + end_of_month -= datetime.timedelta(days=end_of_month.day) + + days.append(str(start_of_month)) + while start_of_month != end_of_month: + start_of_month += datetime.timedelta(days=1) + days.append(str(start_of_month)) + + # returns all days of current month + return days + +def get_month_tickets(worklogs, days, previous_month=False): + this_month_tickets = [] + for worklog in worklogs: + worklog_date = datetime.datetime.strptime( + worklog["date"].split('T')[0], '%Y-%m-%d').date() + current_month = datetime.date.today().month + # minus one month + if previous_month == True: + current_month -= 1 + worklog_month = str(worklog_date).split('-')[1] + if str(worklog_date) in days and int(worklog_month) == current_month: + this_month_tickets.append(worklog) + return this_month_tickets + + +def get_omnimat_string(worklogs): + + week = datetime.datetime.strptime( + worklogs[0]["date"][0:10], '%Y-%m-%d').date() + + week_number_start = week + to_monday = week_number_start.weekday() + week_number_start -= datetime.timedelta(days=to_monday) + week_number_end = week_number_start+datetime.timedelta(days=6) + + week_iso = week.isocalendar().week + omnimat_string = worklogs[0]["author"] + + for worklog in worklogs: + ticket = worklog["ticket_id"] + date = worklog["date"][0:10] + timespent = worklog["time_spent"] + + week_day = datetime.datetime.strptime(date, '%Y-%m-%d').date() + if (week_day.isocalendar().week == week_iso): + omnimat_string += "\nWeek " + str(week_iso)+"\tfrom "+week_number_start.__str__() + \ + "\tto "+week_number_end.__str__()+"\n\n" + week_iso += 1 + week_number_start += datetime.timedelta(days=7) + week_number_end += datetime.timedelta(days=7) + + omnimat_string += ticket+'\tdate '+date+'\ttime '+timespent + '\n' + + return omnimat_string +#end of code month branch + def main(): print('The script starts its work...') - for username in USERNAMES: - issues = get_issues(username) - worklogs = get_worklogs(issues) - today = datetime.date.today() - days, days_second_part = get_days(today) - week_worklogs = get_week_tickets(worklogs, days) - omnimat_string = "" + if MONTH_VIEW: + for username in USERNAMES: + issues = get_issues(username) + worklogs = get_worklogs(issues) + days = get_days_of_month(CHECK_MONTH_BACK) + worklogs = get_month_tickets(worklogs, days, CHECK_MONTH_BACK) + omnimat_string = get_omnimat_string(worklogs) + print(omnimat_string) + else: + for username in USERNAMES: + issues = get_issues(username) + worklogs = get_worklogs(issues) + today = datetime.date.today() + days, days_second_part = get_days(today) + week_worklogs = get_week_tickets(worklogs, days) + omnimat_string = "" - for worklog in week_worklogs: - if worklog["ticket_id"] not in omnimat_string: - omnimat_string += worklog["ticket_id"] + '\n' - - if days_second_part: - second_omnimat_string = "" - worklogs_second_part = get_week_tickets(worklogs, days_second_part) for worklog in week_worklogs: - if worklog["ticket_id"] not in second_omnimat_string: - second_omnimat_string += worklog["ticket_id"] + '\n' + if worklog["ticket_id"] not in omnimat_string: + omnimat_string += worklog["ticket_id"] + '\n' + + if days_second_part: + second_omnimat_string = "" + worklogs_second_part = get_week_tickets(worklogs, days_second_part) + for worklog in week_worklogs: + if worklog["ticket_id"] not in second_omnimat_string: + second_omnimat_string += worklog["ticket_id"] + '\n' - if VERBOSE: - print('Issues of the user:') - print(json.dumps(issues, indent=4)) - print(f"Worklogs for the week:") - print(json.dumps(week_worklogs, indent=4)) - print("Days:") - print(days) - print(f"Omnimat string:") - print(omnimat_string) - if days_second_part: if VERBOSE: - print(f"Worklogs for the weeks 2nd part:") - print(json.dumps(worklogs_second_part, indent=4)) + print('Issues of the user:') + print(json.dumps(issues, indent=4)) + print(f"Worklogs for the week:") + print(json.dumps(week_worklogs, indent=4)) print("Days:") - print(days_second_part) + print(days) print(f"Omnimat string:") print(omnimat_string) + if days_second_part: + if VERBOSE: + print(f"Worklogs for the weeks 2nd part:") + print(json.dumps(worklogs_second_part, indent=4)) + print("Days:") + print(days_second_part) + print(f"Omnimat string:") + print(omnimat_string) + + if __name__ == '__main__': - main() \ No newline at end of file + main() -- 2.51.0