From b9b823df1f5b1d16d575006fb1cb8c8ec58c1d36 Mon Sep 17 00:00:00 2001 From: cs Date: Thu, 29 Feb 2024 16:13:43 +0000 Subject: [PATCH] Implemented Subtask List & create Example shell script see "create-subtasks.sh" NOT FINISHED! --- .gitignore | 3 +- ActiveCollabAPI/ACClient.py | 9 ++-- ActiveCollabAPI/AcSubtask.py | 46 +++++++++++++++++ ActiveCollabAPI/ActiveCollab.py | 19 +++++-- create-subtasks.sh | 7 +++ main.py | 26 ++++++++++ sub-tasks.txt | 91 ++++++++++++++++++++------------- 7 files changed, 157 insertions(+), 44 deletions(-) create mode 100644 ActiveCollabAPI/AcSubtask.py create mode 100755 create-subtasks.sh diff --git a/.gitignore b/.gitignore index 28dbaf8..4012092 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ config.ini .venv/ __pycache__/ -config-mira.ini +/config-mira.ini +/config-mira.json diff --git a/ActiveCollabAPI/ACClient.py b/ActiveCollabAPI/ACClient.py index 4deaca9..a83ce27 100644 --- a/ActiveCollabAPI/ACClient.py +++ b/ActiveCollabAPI/ACClient.py @@ -4,6 +4,7 @@ import requests from ActiveCollabAPI import AC_USER_AGENT, AC_API_VERSION from ActiveCollabAPI.AcAccount import AcAccount +from ActiveCollabAPI.AcSubtask import AcSubtask from ActiveCollabAPI.AcToken import AcToken @@ -92,12 +93,12 @@ class ACClient: return self._delete('projects/%d/tasks/%s/subtasks/%s' % (project_id, task_id, subtask_id)) - def create_subtask(self, subtask): - project_id = subtask['project_id'] - task_id = subtask['task_id'] + def create_subtask(self, subtask: AcSubtask): + project_id = subtask.project_id + task_id = subtask.task_id return self._post('projects/%d/tasks/%s/subtasks' % (project_id, task_id), - data=subtask) + data=subtask.to_dict()) # find subtask with matching body def find_subtask_with_body(self, task, body, is_completed=False): diff --git a/ActiveCollabAPI/AcSubtask.py b/ActiveCollabAPI/AcSubtask.py new file mode 100644 index 0000000..6fcbbf5 --- /dev/null +++ b/ActiveCollabAPI/AcSubtask.py @@ -0,0 +1,46 @@ +import dataclasses +import json +from dataclasses import dataclass + + +@dataclass +class AcSubtask: + task_id: int + project_id: int + name: str = None + body: str = None + assignee_id: int = 0 + delegated_by_id: int = 0 + created_on: int = None + created_by_id: int = None + created_by_name: str = None + created_by_email: str = None + url_path: str = "" + id: int = 0 + due_on: int = 0 + fake_assignee_name: str = None + fake_assignee_email: str = None + class_: str = "Subtask" + completed_by_id: int = 0 + is_completed: bool = False + is_trashed: bool = False + trashed_on: int = 0 + trashed_by_id: int = 0 + updated_on: int = 0 + position: int = 0 + completed_on: int = 0 + + def to_dict(self): + d = dataclasses.asdict(self) + d["class"] = d["class_"] + del d["class_"] + return d + + def to_json(self): + return json.dumps(self.to_dict()) + + +def subtask_from_json(json_obj: dict) -> AcSubtask: + json_obj["class_"] = json_obj["class"] + del json_obj["class"] + return AcSubtask(**json_obj) diff --git a/ActiveCollabAPI/ActiveCollab.py b/ActiveCollabAPI/ActiveCollab.py index 47a000d..b4323a5 100644 --- a/ActiveCollabAPI/ActiveCollab.py +++ b/ActiveCollabAPI/ActiveCollab.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from pprint import pprint from ActiveCollabAPI import AC_API_VERSION from ActiveCollabAPI.ACAuthenticator import ACAuthenticator @@ -8,13 +9,12 @@ from ActiveCollabAPI.AcAccount import AcAccount, account_from_json from ActiveCollabAPI.AcLoginResponse import AcLoginResponse from ActiveCollabAPI.AcProject import AcProject, project_from_json from ActiveCollabAPI.AcSession import AcSession +from ActiveCollabAPI.AcSubtask import AcSubtask, subtask_from_json from ActiveCollabAPI.AcToken import AcToken from ActiveCollabAPI.AcUser import AcUser - class ActiveCollab: - base_url: str = "" session: AcSession = None @@ -58,7 +58,7 @@ class ActiveCollab: res = client.get_info() return res.json() - def get_projects(self): + def get_projects(self) -> list[AcProject]: client = ACClient(self.session.cur_account, self.session.token) res = client.get_projects() if res.status_code != 200: @@ -66,3 +66,16 @@ class ActiveCollab: res_data = res.json() projects = list(map(lambda p: project_from_json(p), res_data)) return projects + + def get_subtasks(self, project_id: int, task_id: int) -> list[AcSubtask]: + client = ACClient(self.session.cur_account, self.session.token) + res = client.get_project_task(project_id, task_id) + res_data = res.json() + subtasks = list(map(lambda sub: subtask_from_json(sub), res_data["subtasks"])) + return subtasks + + def create_subtask(self, subtask: AcSubtask): + client = ACClient(self.session.cur_account, self.session.token) + res = client.create_subtask(subtask) + res_data = res.json() + return res_data diff --git a/create-subtasks.sh b/create-subtasks.sh new file mode 100755 index 0000000..c214989 --- /dev/null +++ b/create-subtasks.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +while IFS= read -r TEXT + do + python3 main.py -c ./config-mira.json subtask create --project 310 --task 6253 --body "$TEXT" + done + diff --git a/main.py b/main.py index 3d85052..faa054e 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import argparse import json from pprint import pprint +from ActiveCollabAPI.AcSubtask import AcSubtask from ActiveCollabAPI.ActiveCollab import ActiveCollab @@ -16,6 +17,8 @@ def run(args, config): output = run_account(ac, args) if args.object == "project": output = run_project(ac, args, output) + if args.object == "subtask": + output = run_subtask(ac, args) return output @@ -30,6 +33,21 @@ def run_project(ac, args, output): return output +def run_subtask(ac, args): + pprint(args) + output = None + if args.command == "list": + output = list(map(lambda sub: sub.to_dict(), ac.get_subtasks(args.project, args.task))) + if args.command == "create": + subtask = AcSubtask( + project_id=args.project, + task_id=args.task, + body=args.body + ) + output = ac.create_subtask(subtask) + return output + + def run_info(ac, args): output = ac.get_info() return output @@ -73,6 +91,14 @@ def main(): parser_project.set_defaults(object='project') parser_project.add_argument('command', choices=["list"], help='what to do with the account help') + # subtask + parser_subtask = subparsers.add_parser('subtask', help='subtask help') + parser_subtask.set_defaults(object='subtask') + parser_subtask.add_argument('command', choices=["list", "create"], help='what to do with the account help') + parser_subtask.add_argument('--project', type=int, required=True) + parser_subtask.add_argument('--task', type=int, required=True) + parser_subtask.add_argument('--body', type=str) + args = parser.parse_args() config = load_config(args) diff --git a/sub-tasks.txt b/sub-tasks.txt index 8689bc3..2980b30 100644 --- a/sub-tasks.txt +++ b/sub-tasks.txt @@ -1,36 +1,55 @@ -S3 Bucket "320dev-public" is archived -S3 Bucket "320east-acm2-archive" is archived -S3 Bucket "assets-prodeuall1-320east" is archived -S3 Bucket "assets-sdds-01-320east" is archived -S3 Bucket "backups-mattermost" is archived -S3 Bucket "bucket.noc.320east.io" is archived -S3 Bucket "lcmx-master-320east" is archived -S3 Bucket "lcmx-prodeuall1-320east" is archived -S3 Bucket "shop320-backups" is archived -S3 Bucket "320dev-public" is deleted -S3 Bucket "320east-acm2-archive" is deleted -S3 Bucket "assets-prodeuall1-320east" is deleted -S3 Bucket "assets-sdds-01-320east" is deleted -S3 Bucket "backups-mattermost" is deleted -S3 Bucket "backups-prodeuall1-320east" is deleted -S3 Bucket "bigdataioav-idev0052-prodeuall1-320east" is deleted -S3 Bucket "bucket.noc.320east.io" is deleted -S3 Bucket "lcmx-master-320east" is deleted -S3 Bucket "lcmx-prodeuall1-320east" is deleted -S3 Bucket "shop320-backups" is deleted -Cloudfront Distribution "E7R0HGAKU10KT - Production d1w1tdkpk45r2q.cloudfront.net sdds.homeok.io assets-sdds-01-320east.s3.eu-west-1.amazonaws.com" is removed -Cloudfront Distribution "E1YAR9WILYEAOR - Production d283m0l3zuk2cl.cloudfront.net bucket.noc.320east.io.s3.eu-west-1.amazonaws.com" is removed -Cloudfront Distribution "E2HUPIVJFDUSWF - Production dvfi2qvbg5wxw.cloudfront.net www.pds.companyok.io, pds.companyok.io assets-pds-companyok.s3.amazonaws.com" is removed -Cloudfront Distribution "E2Q6TWJX3L3TRS - Production d3gvb7cyihtwwp.cloudfront.net s3-h38-lcm.320east.net.s3.amazonaws.com" is removed -Cloudfront Distribution "E215TJ62TWJBBU - Production d2aseehijcy5it.cloudfront.net assets-sdds.s3.amazonaws.com" is removed -IAM User "320east-ansible" is removed -IAM User "backup" is removed -IAM User "cs" is removed -IAM User "docker-registry" is removed -IAM User "io-bigdataioav-prod320" is removed -IAM User "lcm-h38-prod Active" is removed -IAM User "mattermost-backup" is removed -IAM Usergroup "admin" is removed -IAM Usergroup "ansible" is removed -IAM Usergroup "backup" is removed -IAM Usergroup "lcm" is removed \ No newline at end of file +PDF Export for Space '320EAST Human Resources (HR)' done +PDF Export for Space '320EAST Legal' done +PDF Export for Space '320EAST Management (MGT)' done +PDF Export for Space '320EAST Management (MGT) Leaders' done +PDF Export for Space '320EAST Marketing (MKTG)' done +PDF Export for Space '320EAST Office Management (OM)' done +PDF Export for Space '320EAST Partner Management (PARMGT)' done +PDF Export for Space '320EAST Procurement & Supply (PROSU)' done +PDF Export for Space '320EAST Program Management (PROGMGT)' done +PDF Export for Space '320EAST PROSU Risk Management (PROR)' done +PDF Export for Space '320EAST Research & Development (TELA)' done +PDF Export for Space '320EAST Sales & Business Development (HOKOCOKO)' done +PDF Export for Space 'ak.320east.de' done +PDF Export for Space 'Antonio Sciara' done +PDF Export for Space 'Atlassian 320EAST' done +PDF Export for Space 'calvin.chen.ngstb.com' done +PDF Export for Space 'catherine.tang.tv2next.com' done +PDF Export for Space 'cs.320east.de' done +PDF Export for Space 'dp.320east.de' done +PDF Export for Space 'Emilia Biche' done +PDF Export for Space 'ewe.320east.de' done +PDF Export for Space 'hansen.he.tv2next.com' done +PDF Export for Space 'hap.320east.de' done +PDF Export for Space 'hs.320east.de' done +PDF Export for Space 'jl.320east.de' done +PDF Export for Space 'jle.320east.de' done +PDF Export for Space 'Kaumudi Deshmukh' done +PDF Export for Space 'ks.320east.de' done +PDF Export for Space 'll.320east.de' done +PDF Export for Space 'Myrthe Günther' done +PDF Export for Space 'Pooja Naringrekar' done +PDF Export for Space 'rain.chen.tv2next.com' done +PDF Export for Space 'Robert Uhlmann' done +PDF Export for Space 'sa.320east.de' done +PDF Export for Space 'silke.heim.awpartner.de' done +PDF Export for Space 'tgr.320east.de' done +PDF Export for Space 'thomas.link.awpartner.de' done +PDF Export for Space 'thomas.wei.ngstb.com' done +PDF Export for Space 'tig.320east.de' done +PDF Export for Space 'tiz.320east.de' done +PDF Export for Space 'TNC320 Readme' done +PDF Export for Space 'TNC Accounting (AFI)' done +PDF Export for Space 'TNC Board' done +PDF Export for Space 'TNC Business Unit sprint:bricks' done +PDF Export for Space 'TNC Human Resources (HR)' done +PDF Export for Space 'TNC Marketing (MKTG)' done +PDF Export for Space 'TNC Office Management (OM)' done +PDF Export for Space 'TNC Product Development (PD)' done +PDF Export for Space 'TNC Public' done +PDF Export for Space 'TNC Purchase' done +PDF Export for Space 'TNC Quality Assurance (QA)' done +PDF Export for Space 'TNC Sales' done +PDF Export for Space 'ts.320east.de' done +PDF Export for Space 'zh.320east.de' done +PDF Export for Space 'zhengyi.tv2next.com' done \ No newline at end of file