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
|
||||
.venv/
|
||||
__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.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):
|
||||
|
||||
@@ -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 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
|
||||
|
||||
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
|
||||
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)
|
||||
|
||||
+55
-36
@@ -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
|
||||
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
|
||||
Reference in New Issue
Block a user