Implemented Subtask List & create
Example shell script see "create-subtasks.sh" NOT FINISHED!
This commit is contained in:
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
config.ini
|
config.ini
|
||||||
.venv/
|
.venv/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
config-mira.ini
|
/config-mira.ini
|
||||||
|
/config-mira.json
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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
|
||||||
|
|||||||
Executable
+7
@@ -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
|
||||||
|
|
||||||
@@ -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
@@ -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
|
||||||
Reference in New Issue
Block a user