-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathodootask.py
More file actions
138 lines (114 loc) · 3.98 KB
/
odootask.py
File metadata and controls
138 lines (114 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python3
"""
odootask -p <project> or odootask -> List open tasks
odootask -t <task_number> -> display task description
odootask -c <task_number> -> Close a task
odootask -t <task_number> -m <message> -> Log a message on a task TODO
~/.odoorpcrc
...
[projectdb]
type = ODOO
protocol = jsonrpc
host = your server
port = 8069
database = database name
user = your user
timeout = 120.0
passwd = password
...
"""
import argparse
import os
import odoorpc
from bs4 import BeautifulSoup
ODOORPCRC_PATH = os.path.expanduser("~/.odoorpcrc")
SESSION_NAME = "projectdb"
def main(project_name, my_only, task_number,close):
odoo = odoorpc.ODOO.load('projectdb')
if task_number:
tasks = odoo.env['project.task'].search([('number', '=', task_number)], limit=1)
if not tasks:
print("No task found with that number.")
return
task = odoo.env['project.task'].browse(tasks[0])
print(f"{task.number} {task.name} {task.user_id.name}\n{BeautifulSoup(task.description or '', 'html.parser').get_text()}")
return
if not project_name:
project_name = os.path.basename(os.getcwd())
project_ids = odoo.env['project.project'].search([('name', 'ilike', project_name)])
if not project_ids:
print("No project found with that name.")
return
if close:
tasks = odoo.env['project.task'].search([('number', '=', close)], limit=1)
if not tasks:
print("No task found with that number.")
return
task = odoo.env['project.task'].browse(tasks[0])
stage_ids = odoo.env['project.task.type'].search([('project_ids', 'in', project_ids[0]), ('name', 'ilike', 'Klar')])
if not stage_ids:
print("No 'Klar' stage found for this project.")
return
task.write({'stage_id': stage_ids[0]})
print(f"Task [{task.number}] {task.name} closed")
return
# Find the 'Analys' stage for this project
stage_ids = odoo.env['project.task.type'].search([('project_ids', 'in', project_ids[0]), ('name', '=', 'Analys')])
if not stage_ids:
print("No 'Analys' stage found for this project.")
return
stage_id = stage_ids[0]
domain = [
('project_id', '=', project_ids[0]),
('stage_id', '=', stage_id)
]
if my_only:
user = odoo.env.user # Only fetch here!
domain.append(('user_id', '=', user.id))
tasks = odoo.env['project.task'].search(domain)
if not tasks:
print("No tasks found.")
return
for t in tasks:
task = odoo.env['project.task'].browse(t)
print(f"{task.number} {task.name} {task.user_id.name or 'No-one-yet'}")
if __name__ == "__main__":
if not os.path.exists(ODOORPCRC_PATH):
print(f"""Error: File '{ODOORPCRC_PATH}' missing. Create session projectdb with database credentials.
~/.odoorpcrc
...
[projectdb]
type = ODOO
protocol = jsonrpc
host = your server
port = 8069
database = database name
user = your user
timeout = 120.0
passwd = password
...
""", file=sys.stderr)
sys.exit(1)
if SESSION_NAME not in odoorpc.ODOO.list(ODOORPCRC_PATH):
print(f"""Error: Session '{SESSION_NAME}' missing in {ODOORPCRC_PATH}. Create this with database credentials
~/.odoorpcrc
...
[projectdb]
type = ODOO
protocol = jsonrpc
host = your server
port = 8069
database = database name
user = your user
timeout = 120.0
passwd = password
...
""", file=sys.stderr)
sys.exit(1)
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("-p", "--project", default=None, help="Project name (defaults to current directory)")
parser.add_argument("--my", action="store_true", help="Filter to my tasks")
parser.add_argument('-t', "--task", default=None, help="Get this task number")
parser.add_argument('-c', "--close", default=None, help="Close this task number")
args = parser.parse_args()
main(args.project, args.my, args.task,args.close)