Implemented Subtask List & create

Example shell script see "create-subtasks.sh"

NOT FINISHED!
This commit is contained in:
2024-02-29 16:13:43 +00:00
parent 88fb3107ce
commit b9b823df1f
7 changed files with 157 additions and 44 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
config.ini config.ini
.venv/ .venv/
__pycache__/ __pycache__/
config-mira.ini /config-mira.ini
/config-mira.json
+5 -4
View File
@@ -4,6 +4,7 @@ import requests
from ActiveCollabAPI import AC_USER_AGENT, AC_API_VERSION from ActiveCollabAPI import AC_USER_AGENT, AC_API_VERSION
from ActiveCollabAPI.AcAccount import AcAccount from ActiveCollabAPI.AcAccount import AcAccount
from ActiveCollabAPI.AcSubtask import AcSubtask
from ActiveCollabAPI.AcToken import AcToken from ActiveCollabAPI.AcToken import AcToken
@@ -92,12 +93,12 @@ class ACClient:
return self._delete('projects/%d/tasks/%s/subtasks/%s' % return self._delete('projects/%d/tasks/%s/subtasks/%s' %
(project_id, task_id, subtask_id)) (project_id, task_id, subtask_id))
def create_subtask(self, subtask): def create_subtask(self, subtask: AcSubtask):
project_id = subtask['project_id'] project_id = subtask.project_id
task_id = subtask['task_id'] task_id = subtask.task_id
return self._post('projects/%d/tasks/%s/subtasks' % return self._post('projects/%d/tasks/%s/subtasks' %
(project_id, task_id), (project_id, task_id),
data=subtask) data=subtask.to_dict())
# find subtask with matching body # find subtask with matching body
def find_subtask_with_body(self, task, body, is_completed=False): def find_subtask_with_body(self, task, body, is_completed=False):
+46
View File
@@ -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)
+16 -3
View File
@@ -1,4 +1,5 @@
from dataclasses import dataclass from dataclasses import dataclass
from pprint import pprint
from ActiveCollabAPI import AC_API_VERSION from ActiveCollabAPI import AC_API_VERSION
from ActiveCollabAPI.ACAuthenticator import ACAuthenticator from ActiveCollabAPI.ACAuthenticator import ACAuthenticator
@@ -8,13 +9,12 @@ from ActiveCollabAPI.AcAccount import AcAccount, account_from_json
from ActiveCollabAPI.AcLoginResponse import AcLoginResponse from ActiveCollabAPI.AcLoginResponse import AcLoginResponse
from ActiveCollabAPI.AcProject import AcProject, project_from_json from ActiveCollabAPI.AcProject import AcProject, project_from_json
from ActiveCollabAPI.AcSession import AcSession from ActiveCollabAPI.AcSession import AcSession
from ActiveCollabAPI.AcSubtask import AcSubtask, subtask_from_json
from ActiveCollabAPI.AcToken import AcToken from ActiveCollabAPI.AcToken import AcToken
from ActiveCollabAPI.AcUser import AcUser from ActiveCollabAPI.AcUser import AcUser
class ActiveCollab: class ActiveCollab:
base_url: str = "" base_url: str = ""
session: AcSession = None session: AcSession = None
@@ -58,7 +58,7 @@ class ActiveCollab:
res = client.get_info() res = client.get_info()
return res.json() return res.json()
def get_projects(self): def get_projects(self) -> list[AcProject]:
client = ACClient(self.session.cur_account, self.session.token) client = ACClient(self.session.cur_account, self.session.token)
res = client.get_projects() res = client.get_projects()
if res.status_code != 200: if res.status_code != 200:
@@ -66,3 +66,16 @@ class ActiveCollab:
res_data = res.json() res_data = res.json()
projects = list(map(lambda p: project_from_json(p), res_data)) projects = list(map(lambda p: project_from_json(p), res_data))
return projects 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
+7
View File
@@ -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
+26
View File
@@ -2,6 +2,7 @@ import argparse
import json import json
from pprint import pprint from pprint import pprint
from ActiveCollabAPI.AcSubtask import AcSubtask
from ActiveCollabAPI.ActiveCollab import ActiveCollab from ActiveCollabAPI.ActiveCollab import ActiveCollab
@@ -16,6 +17,8 @@ def run(args, config):
output = run_account(ac, args) output = run_account(ac, args)
if args.object == "project": if args.object == "project":
output = run_project(ac, args, output) output = run_project(ac, args, output)
if args.object == "subtask":
output = run_subtask(ac, args)
return output return output
@@ -30,6 +33,21 @@ def run_project(ac, args, output):
return 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): def run_info(ac, args):
output = ac.get_info() output = ac.get_info()
return output return output
@@ -73,6 +91,14 @@ def main():
parser_project.set_defaults(object='project') parser_project.set_defaults(object='project')
parser_project.add_argument('command', choices=["list"], help='what to do with the account help') 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() args = parser.parse_args()
config = load_config(args) config = load_config(args)
+55 -36
View File
@@ -1,36 +1,55 @@
S3 Bucket "320dev-public" is archived PDF Export for Space '320EAST Human Resources (HR)' done
S3 Bucket "320east-acm2-archive" is archived PDF Export for Space '320EAST Legal' done
S3 Bucket "assets-prodeuall1-320east" is archived PDF Export for Space '320EAST Management (MGT)' done
S3 Bucket "assets-sdds-01-320east" is archived PDF Export for Space '320EAST Management (MGT) Leaders' done
S3 Bucket "backups-mattermost" is archived PDF Export for Space '320EAST Marketing (MKTG)' done
S3 Bucket "bucket.noc.320east.io" is archived PDF Export for Space '320EAST Office Management (OM)' done
S3 Bucket "lcmx-master-320east" is archived PDF Export for Space '320EAST Partner Management (PARMGT)' done
S3 Bucket "lcmx-prodeuall1-320east" is archived PDF Export for Space '320EAST Procurement & Supply (PROSU)' done
S3 Bucket "shop320-backups" is archived PDF Export for Space '320EAST Program Management (PROGMGT)' done
S3 Bucket "320dev-public" is deleted PDF Export for Space '320EAST PROSU Risk Management (PROR)' done
S3 Bucket "320east-acm2-archive" is deleted PDF Export for Space '320EAST Research & Development (TELA)' done
S3 Bucket "assets-prodeuall1-320east" is deleted PDF Export for Space '320EAST Sales & Business Development (HOKOCOKO)' done
S3 Bucket "assets-sdds-01-320east" is deleted PDF Export for Space 'ak.320east.de' done
S3 Bucket "backups-mattermost" is deleted PDF Export for Space 'Antonio Sciara' done
S3 Bucket "backups-prodeuall1-320east" is deleted PDF Export for Space 'Atlassian 320EAST' done
S3 Bucket "bigdataioav-idev0052-prodeuall1-320east" is deleted PDF Export for Space 'calvin.chen.ngstb.com' done
S3 Bucket "bucket.noc.320east.io" is deleted PDF Export for Space 'catherine.tang.tv2next.com' done
S3 Bucket "lcmx-master-320east" is deleted PDF Export for Space 'cs.320east.de' done
S3 Bucket "lcmx-prodeuall1-320east" is deleted PDF Export for Space 'dp.320east.de' done
S3 Bucket "shop320-backups" is deleted PDF Export for Space 'Emilia Biche' done
Cloudfront Distribution "E7R0HGAKU10KT - Production d1w1tdkpk45r2q.cloudfront.net sdds.homeok.io assets-sdds-01-320east.s3.eu-west-1.amazonaws.com" is removed PDF Export for Space 'ewe.320east.de' done
Cloudfront Distribution "E1YAR9WILYEAOR - Production d283m0l3zuk2cl.cloudfront.net bucket.noc.320east.io.s3.eu-west-1.amazonaws.com" is removed PDF Export for Space 'hansen.he.tv2next.com' done
Cloudfront Distribution "E2HUPIVJFDUSWF - Production dvfi2qvbg5wxw.cloudfront.net www.pds.companyok.io, pds.companyok.io assets-pds-companyok.s3.amazonaws.com" is removed PDF Export for Space 'hap.320east.de' done
Cloudfront Distribution "E2Q6TWJX3L3TRS - Production d3gvb7cyihtwwp.cloudfront.net s3-h38-lcm.320east.net.s3.amazonaws.com" is removed PDF Export for Space 'hs.320east.de' done
Cloudfront Distribution "E215TJ62TWJBBU - Production d2aseehijcy5it.cloudfront.net assets-sdds.s3.amazonaws.com" is removed PDF Export for Space 'jl.320east.de' done
IAM User "320east-ansible" is removed PDF Export for Space 'jle.320east.de' done
IAM User "backup" is removed PDF Export for Space 'Kaumudi Deshmukh' done
IAM User "cs" is removed PDF Export for Space 'ks.320east.de' done
IAM User "docker-registry" is removed PDF Export for Space 'll.320east.de' done
IAM User "io-bigdataioav-prod320" is removed PDF Export for Space 'Myrthe Günther' done
IAM User "lcm-h38-prod Active" is removed PDF Export for Space 'Pooja Naringrekar' done
IAM User "mattermost-backup" is removed PDF Export for Space 'rain.chen.tv2next.com' done
IAM Usergroup "admin" is removed PDF Export for Space 'Robert Uhlmann' done
IAM Usergroup "ansible" is removed PDF Export for Space 'sa.320east.de' done
IAM Usergroup "backup" is removed PDF Export for Space 'silke.heim.awpartner.de' done
IAM Usergroup "lcm" is removed 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