Merge lp:~therp-nl/eficent-openerp-project-management/6.1-mig_project_communications_mailgate into lp:eficent-openerp-project-management/6.1

Proposed by Stefan Rijnhart (Opener)
Status: Work in progress
Proposed branch: lp:~therp-nl/eficent-openerp-project-management/6.1-mig_project_communications_mailgate
Merge into: lp:eficent-openerp-project-management/6.1
Diff against target: 490 lines (+84/-168)
14 files modified
project_category/analytic_account_category.py (+2/-2)
project_communications_mailgate/__init__.py (+2/-2)
project_communications_mailgate/__openerp__.py (+1/-1)
project_communications_mailgate/project.py (+31/-36)
project_communications_mailgate/project_communications_mailgate.py (+20/-100)
project_communications_mailgate/security/ir.model.access.csv (+0/-3)
project_cost/account_analytic_account.py (+8/-4)
project_cost_plan_purchase/account_analytic_line_plan.py (+4/-4)
project_cost_plan_sale/account_analytic_line_plan.py (+4/-4)
project_hr_stakeholder/project_hr_stakeholder.py (+1/-1)
project_invoice/invoice.py (+1/-1)
project_procurement/purchase_requisition.py (+2/-2)
project_scope_wbs/project_scope_wbs.py (+7/-7)
project_time_sequence/project_time_sequence.py (+1/-1)
To merge this branch: bzr merge lp:~therp-nl/eficent-openerp-project-management/6.1-mig_project_communications_mailgate
Reviewer Review Type Date Requested Status
Eficent Pending
Review via email: mp+141932@code.launchpad.net

Description of the change

Work in progress, not yet tested.

To post a comment you must log in.

Unmerged revisions

10. By Stefan Rijnhart (Opener)

[MIG] Adapt project_communications_mailgate to new mail module

9. By Stefan Rijnhart (Opener)

[FIX] Remove mutable defaults from function arguments

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'project_category/analytic_account_category.py'
--- project_category/analytic_account_category.py 2012-10-18 23:30:03 +0000
+++ project_category/analytic_account_category.py 2013-01-04 15:10:41 +0000
@@ -40,7 +40,7 @@
40 def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):40 def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
41 if not args:41 if not args:
42 args=[]42 args=[]
43 if not context:43 if context is None:
44 context={}44 context={}
45 if name:45 if name:
46 # Be sure name_search is symetric to name_get46 # Be sure name_search is symetric to name_get
@@ -77,4 +77,4 @@
77 _parent_order = 'name'77 _parent_order = 'name'
78 _order = 'parent_left'78 _order = 'parent_left'
79 79
80analytic_account_category()
81\ No newline at end of file80\ No newline at end of file
81analytic_account_category()
8282
=== modified file 'project_communications_mailgate/__init__.py'
--- project_communications_mailgate/__init__.py 2012-10-02 20:55:15 +0000
+++ project_communications_mailgate/__init__.py 2013-01-04 15:10:41 +0000
@@ -1,8 +1,8 @@
1# -*- coding: utf-8 -*-1# -*- coding: utf-8 -*-
2##############################################################################2##############################################################################
3#3#
4# OpenERP, Open Source Management Solution4# Copyright (C) 2011 Eficent (<http://www.eficent.com/>)
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).5# Jordi Ballester Alomar <jordi.ballester@eficent.com>
6#6#
7# This program is free software: you can redistribute it and/or modify7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as8# it under the terms of the GNU Affero General Public License as
99
=== modified file 'project_communications_mailgate/__openerp__.py'
--- project_communications_mailgate/__openerp__.py 2012-10-02 20:55:15 +0000
+++ project_communications_mailgate/__openerp__.py 2013-01-04 15:10:41 +0000
@@ -26,7 +26,7 @@
26 "author": "Jordi Ballester (Eficent)",26 "author": "Jordi Ballester (Eficent)",
27 "website": "http://www.eficent.com",27 "website": "http://www.eficent.com",
28 "category": "Generic Modules/Projects & Services",28 "category": "Generic Modules/Projects & Services",
29 "depends": ["project", "mail_gateway"],29 "depends": ["project", "mail"],
30 "description": """This module is an interface that synchronises mails with OpenERP Project.30 "description": """This module is an interface that synchronises mails with OpenERP Project.
3131
32It allows updating projects as soon as a new mail arrives in our configured mail server.32It allows updating projects as soon as a new mail arrives in our configured mail server.
3333
=== modified file 'project_communications_mailgate/project.py'
--- project_communications_mailgate/project.py 2012-10-02 20:55:15 +0000
+++ project_communications_mailgate/project.py 2013-01-04 15:10:41 +0000
@@ -19,45 +19,40 @@
19#19#
20##############################################################################20##############################################################################
2121
22import tools22from openerp.osv import orm
23from osv import fields, osv23from openerp.tools.translate import _
24from tools.translate import _
2524
26 25
27class project(osv.osv):26class project(orm.Model):
28 27
29 _inherit = "project.project"28 _inherit = "project.project"
30 29
31 def set_draft(self, cr, uid, ids, *args, **kwargs):30 def set_draft(self, cr, uid, ids, context=None):
32 res = super(project, self).set_draft(cr, uid, ids, *args, **kwargs)31 res = super(project, self).set_draft(cr, uid, ids, context=context)
33 projects = self.browse(cr, uid, ids)32 projects = self.browse(cr, uid, ids, context=context)
34 self._history(cr, uid, projects, _('Draft'))33 self.message_append(cr, uid, projects, _('Draft'), context=context)
35 return res34 return res
36 35
37 def set_open(self, cr, uid, ids, *args, **kwargs):36 def set_open(self, cr, uid, ids, context=None):
38 res = super(project, self).set_open(cr, uid, ids, *args, **kwargs)37 res = super(project, self).set_open(cr, uid, ids, context=context)
39 projects = self.browse(cr, uid, ids)38 projects = self.browse(cr, uid, ids, context=context)
40 self._history(cr, uid, projects, _('Open'))39 self.message_append(cr, uid, projects, _('Open'), context=context)
41 return res40 return res
42 41
43 def set_pending(self, cr, uid, ids, *args, **kwargs):42 def set_pending(self, cr, uid, ids, context=None):
44 res = super(project, self).set_pending(cr, uid, ids, *args, **kwargs)43 res = super(project, self).set_pending(cr, uid, ids, context=context)
45 projects = self.browse(cr, uid, ids)44 projects = self.browse(cr, uid, ids, context=context)
46 self._history(cr, uid, projects, _('Pending'))45 self.message_append(cr, uid, projects, _('Pending'), context=context)
47 return res46 return res
48 47
49 def set_done(self, cr, uid, ids, *args, **kwargs):48 def set_done(self, cr, uid, ids, context=None):
50 res = super(project, self).set_done(cr, uid, ids, *args, **kwargs)49 res = super(project, self).set_done(cr, uid, ids, context=context)
51 projects = self.browse(cr, uid, ids)50 projects = self.browse(cr, uid, ids, context=context)
52 self._history(cr, uid, projects, _('Done'))51 self.message_append(cr, uid, projects, _('Done'), context=context)
53 return res52 return res
54 53
55 def set_cancel(self, cr, uid, ids, *args, **kwargs):54 def set_cancel(self, cr, uid, ids, context=None):
56 res = super(project, self).set_cancel(cr, uid, ids, *args, **kwargs)55 res = super(project, self).set_cancel(cr, uid, ids, context=context)
57 projects = self.browse(cr, uid, ids)56 projects = self.browse(cr, uid, ids, context=context)
58 self._history(cr, uid, projects, _('Cancel'))57 self.message_append(cr, uid, projects, _('Cancel'), context=context)
59 return res 58 return res
60
61
62project()
63
6459
=== modified file 'project_communications_mailgate/project_communications_mailgate.py'
--- project_communications_mailgate/project_communications_mailgate.py 2012-10-02 20:55:15 +0000
+++ project_communications_mailgate/project_communications_mailgate.py 2013-01-04 15:10:41 +0000
@@ -19,110 +19,30 @@
19#19#
20##############################################################################20##############################################################################
2121
22from osv import fields,osv22from openerp.osv import fields, orm
23from tools.translate import _23
24import binascii24
2525class project_communications_mailgate(orm.Model):
26
27class project_communications_mailgate(osv.osv):
28 _name = "project.project"26 _name = "project.project"
29 _inherit = ['mailgate.thread','project.project']27 _inherit = ['mail.thread','project.project']
30 28
31 _columns={29 _columns={
32 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)], readonly=True),30 'message_ids': fields.one2many(
33 }31 'mail.message', 'res_id', 'Messages',
34 32 domain=[('model','=',_name)], readonly=True),
35 def message_new(self, cr, uid, msg, context=None):33 }
36# """34
37# Automatically calls when new email message arrives35 def message_thread_followers(self, cr, uid, ids, context=None):
38#36 if not ids:
39# @param self: The object pointer37 return {}
40# @param cr: the current row, from the database cursor,38 if isinstance(ids, (int, long)):
41# @param uid: the current user’s ID for security checks39 ids = [ids]
42# """
43 res = {}40 res = {}
44# mailgate_obj = self.pool.get('email.server.tools')41 for project in self.browse(cr, uid, ids, context=context):
45# subject = msg.get('subject')42 user_email = (project.user_id and project.user_id.address_id
46# body = msg.get('body')43 and project.user_id.address_id.email) or False
47# msg_from = msg.get('from')44 if user_email:
48# priority = msg.get('priority')45 res.setdefault(project.id, []).append(user_email)
49
50# data = {
51# 'name': subject,
52# 'description': body,
53# }
54# res = mailgate_obj.get_partner(cr, uid, msg_from)
55# if res:
56# data.update(res)
57# res = self.create(cr, uid, data)
58
59# attachments = msg.get('attachments', [])
60# for attachment in attachments or []:
61# data_attach = {
62# 'name': attachment,
63# 'datas':binascii.b2a_base64(str(attachments.get(attachment))),
64# 'datas_fname': attachment,
65# 'description': 'Mail attachment',
66# 'res_model': self._name,
67# 'res_id': res,
68# }
69# self.pool.get('ir.attachment').create(cr, uid, data_attach)
70#
71 return res
72
73 def message_update(self, cr, uid, id, msg, data={}, context=None):
74 mailgate_obj = self.pool.get('email.server.tools')
75 subject = data.get('subject')
76 body = data.get('body')
77 msg_from = data.get('from')
78 msg_to = data.get('to')
79 priority = data.get('priority')
80 attachments = data.get('attachments', [])
81
82# msg_actions, body_data = mailgate_obj.msg_act_get(msg)
83# data.update({
84# 'description': body_data,
85# })
86# act = 'do_'+default_act
87# if 'state' in msg_actions:
88# if msg_actions['state'] in ['draft','close','cancel','open','pending']:
89# act = 'do_' + msg_actions['state']
90
91# if 'priority' in msg_actions:
92# if msg_actions['priority'] in ('1','2','3','4','5'):
93# data['priority'] = msg_actions['priority']
94#
95# self.write(cr, uid, [id], data)
96 msg_dict = {'new': 'Send', 'reply': 'Reply', 'forward': 'Forward'}
97 self._history(cr, uid, id, _(msg_dict['new']), history=True, subject=subject, email=msg_to, details=body, email_from=msg_from, message_id=None, attach=attachments)
98# getattr(self,act)(cr, uid, [id])
99 return {}
100
101 def message_followers(self, cr, uid, ids, context=None):
102 res = []
103 if isinstance(ids, (str, int, long)):
104 select = [ids]
105 else:
106 select = ids
107 for project in self.browse(cr, uid, select, context=context):
108 user_email = (project.user_id and project.user_id.address_id and project.user_id.address_id.email) or False
109 res += [(user_email, False, False, project.priority)]
110 if isinstance(ids, (str, int, long)):
111 return len(res) and res[0] or False
112 return res46 return res
11347
114 def msg_send(self, cr, uid, id, *args, **argv):
115 return True
116
117 def _history(self, cr, uid, cases, keyword, history=False, subject=None, email=False, details=None, email_from=False, message_id=False, attach=[], context=None):
118 mailgate_pool = self.pool.get('mailgate.thread')
119 return mailgate_pool.history(cr, uid, cases, keyword, history=history,\
120 subject=subject, email=email, \
121 details=details, email_from=email_from,\
122 message_id=message_id, attach=attach, \
123 context=context)
124
125
126project_communications_mailgate()
127
128# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:48# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
12949
=== removed directory 'project_communications_mailgate/security'
=== removed file 'project_communications_mailgate/security/ir.model.access.csv'
--- project_communications_mailgate/security/ir.model.access.csv 2012-10-02 20:55:15 +0000
+++ project_communications_mailgate/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
@@ -1,3 +0,0 @@
1"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
2"access_project_communications_mailgate_message_project_manager","project.mailgate.message.manager","mail_gateway.model_mailgate_message","project.group_project_manager",1,1,1,1
3"access_project_communications_mailgate_message_project_user","project.mailgate.message.user","mail_gateway.model_mailgate_message","project.group_project_user",1,1,1,1
40
=== modified file 'project_cost/account_analytic_account.py'
--- project_cost/account_analytic_account.py 2012-10-02 20:55:15 +0000
+++ project_cost/account_analytic_account.py 2013-01-04 15:10:41 +0000
@@ -33,7 +33,9 @@
33 _inherit = 'account.analytic.account'33 _inherit = 'account.analytic.account'
34 34
35 def _compute_level_tree_plan(self, cr, uid, ids, child_ids, res, field_names, context=None):35 def _compute_level_tree_plan(self, cr, uid, ids, child_ids, res, field_names, context=None):
36 def recursive_computation(account_id, res, repeated_account_ids=[]):36 def recursive_computation(account_id, res, repeated_account_ids=None):
37 if repeated_account_ids is None:
38 repeated_account_ids = []
37 currency_obj = self.pool.get('res.currency')39 currency_obj = self.pool.get('res.currency')
38 account = self.browse(cr, uid, account_id)40 account = self.browse(cr, uid, account_id)
39 for son in account.child_ids:41 for son in account.child_ids:
@@ -54,7 +56,9 @@
54 return res 56 return res
55 57
56 def _compute_level_tree_commit(self, cr, uid, ids, child_ids, res, field_names, context=None):58 def _compute_level_tree_commit(self, cr, uid, ids, child_ids, res, field_names, context=None):
57 def recursive_computation(account_id, res, repeated_account_ids=[]):59 def recursive_computation(account_id, res, repeated_account_ids=None):
60 if repeated_account_ids is None:
61 repeated_account_ids = []
58 currency_obj = self.pool.get('res.currency')62 currency_obj = self.pool.get('res.currency')
59 account = self.browse(cr, uid, account_id)63 account = self.browse(cr, uid, account_id)
60 for son in account.child_ids:64 for son in account.child_ids:
@@ -200,11 +204,11 @@
200 return True204 return True
201 205
202 def copy(self, cr, uid, id, default=None, context=None):206 def copy(self, cr, uid, id, default=None, context=None):
203 if not default:207 if default is None:
204 default = {} 208 default = {}
205 default['plan_line_ids'] = []209 default['plan_line_ids'] = []
206 default['commit_line_ids'] = []210 default['commit_line_ids'] = []
207 return super(account_analytic_account, self).copy(cr, uid, id, default, context=context)211 return super(account_analytic_account, self).copy(cr, uid, id, default, context=context)
208 212
209 213
210account_analytic_account()
211\ No newline at end of file214\ No newline at end of file
215account_analytic_account()
212216
=== modified file 'project_cost_plan_purchase/account_analytic_line_plan.py'
--- project_cost_plan_purchase/account_analytic_line_plan.py 2012-10-02 20:55:15 +0000
+++ project_cost_plan_purchase/account_analytic_line_plan.py 2013-01-04 15:10:41 +0000
@@ -43,23 +43,23 @@
43 }43 }
4444
4545
46 def copy(self, cr, uid, id, default={}, context=None):46 def copy(self, cr, uid, id, default=None, context=None):
47 if context is None:47 if context is None:
48 context = {}48 context = {}
49 49
50 if not default:50 if default is None:
51 default = {} 51 default = {}
52 52
53 default['purchase_line_id'] = False53 default['purchase_line_id'] = False
54 54
55 return super(account_analytic_line_plan, self).copy(cr, uid, id, default, context)55 return super(account_analytic_line_plan, self).copy(cr, uid, id, default, context)
5656
57 def copy_data(self, cr, uid, id, default={}, context=None):57 def copy_data(self, cr, uid, id, default=None, context=None):
5858
59 if context is None:59 if context is None:
60 context = {}60 context = {}
61 61
62 if not default:62 if default is None:
63 default = {} 63 default = {}
64 64
65 default['purchase_line_id'] = False65 default['purchase_line_id'] = False
6666
=== modified file 'project_cost_plan_sale/account_analytic_line_plan.py'
--- project_cost_plan_sale/account_analytic_line_plan.py 2012-10-02 20:55:15 +0000
+++ project_cost_plan_sale/account_analytic_line_plan.py 2013-01-04 15:10:41 +0000
@@ -43,11 +43,11 @@
43 }43 }
4444
45 45
46 def copy(self, cr, uid, id, default={}, context=None):46 def copy(self, cr, uid, id, default=None, context=None):
47 if context is None:47 if context is None:
48 context = {}48 context = {}
49 49
50 if not default:50 if default is None:
51 default = {} 51 default = {}
52 52
53 default['sale_line_id'] = False53 default['sale_line_id'] = False
@@ -55,11 +55,11 @@
55 res = super(account_analytic_line_plan, self).copy(cr, uid, id, default, context)55 res = super(account_analytic_line_plan, self).copy(cr, uid, id, default, context)
56 return res56 return res
57 57
58 def copy_data(self, cr, uid, id, default={}, context=None):58 def copy_data(self, cr, uid, id, default=None, context=None):
5959
60 if context is None:60 if context is None:
61 context = {}61 context = {}
62 if not default:62 if default is None:
63 default = {} 63 default = {}
64 64
65 default['sale_line_id'] = False65 default['sale_line_id'] = False
6666
=== modified file 'project_hr_stakeholder/project_hr_stakeholder.py'
--- project_hr_stakeholder/project_hr_stakeholder.py 2012-10-02 20:55:15 +0000
+++ project_hr_stakeholder/project_hr_stakeholder.py 2013-01-04 15:10:41 +0000
@@ -106,7 +106,7 @@
106 106
107 }107 }
108 108
109 def name_get(self, cr, uid, ids, context={}):109 def name_get(self, cr, uid, ids, context=None):
110 if not ids:110 if not ids:
111 return []111 return []
112 res = []112 res = []
113113
=== modified file 'project_invoice/invoice.py'
--- project_invoice/invoice.py 2012-10-02 20:55:15 +0000
+++ project_invoice/invoice.py 2013-01-04 15:10:41 +0000
@@ -32,7 +32,7 @@
32class account_invoice(osv.osv):32class account_invoice(osv.osv):
33 _inherit = "account.invoice"33 _inherit = "account.invoice"
3434
35 def _line_analytic_accounts_get(self, cr, uid, ids, field_name, arg, context={}):35 def _line_analytic_accounts_get(self, cr, uid, ids, field_name, arg, context=None):
36 result = {}36 result = {}
37 for inv in self.browse(cr, uid, ids, context):37 for inv in self.browse(cr, uid, ids, context):
38 str_data = ''38 str_data = ''
3939
=== modified file 'project_procurement/purchase_requisition.py'
--- project_procurement/purchase_requisition.py 2012-10-02 20:55:15 +0000
+++ project_procurement/purchase_requisition.py 2013-01-04 15:10:41 +0000
@@ -25,8 +25,8 @@
25class purchase_requisition(osv.osv):25class purchase_requisition(osv.osv):
26 _inherit = "purchase.requisition"26 _inherit = "purchase.requisition"
2727
28 def copy_data(self, cr, uid, id, default={}, context=None):28 def copy_data(self, cr, uid, id, default=None, context=None):
29 if not default:29 if default is None:
30 default = {}30 default = {}
31 default.update({31 default.update({
32 'state':'draft',32 'state':'draft',
3333
=== modified file 'project_scope_wbs/project_scope_wbs.py'
--- project_scope_wbs/project_scope_wbs.py 2012-12-13 04:18:54 +0000
+++ project_scope_wbs/project_scope_wbs.py 2013-01-04 15:10:41 +0000
@@ -29,7 +29,7 @@
29class task(osv.osv):29class task(osv.osv):
30 _inherit = 'project.task'30 _inherit = 'project.task'
3131
32 def _project_complete_wbs_name(self, cr, uid, ids, prop, unknow_none, unknow_dict):32 def _project_complete_wbs_name(self, cr, uid, ids, prop, unknow_none, context=None):
33 33
34 if not ids:34 if not ids:
35 return []35 return []
@@ -45,14 +45,14 @@
45 for task in tasks: 45 for task in tasks:
46 if task.project_id:46 if task.project_id:
47 task_project_id = task.project_id.id47 task_project_id = task.project_id.id
48 data_project = project_obj.read(cr, uid, task_project_id, ['complete_wbs_name'], context=[]) 48 data_project = project_obj.read(cr, uid, task_project_id, ['complete_wbs_name'], context=context)
49 if data_project:49 if data_project:
50 res.append((task.id, data_project['complete_wbs_name']))50 res.append((task.id, data_project['complete_wbs_name']))
51 else:51 else:
52 res.append((task.id, ''))52 res.append((task.id, ''))
53 return dict(res) 53 return dict(res)
5454
55 def _project_complete_wbs_code(self, cr, uid, ids, prop, unknow_none, unknow_dict):55 def _project_complete_wbs_code(self, cr, uid, ids, prop, unknow_none, context=None):
56 56
57 if not ids:57 if not ids:
58 return []58 return []
@@ -68,7 +68,7 @@
68 for task in tasks: 68 for task in tasks:
69 if task.project_id:69 if task.project_id:
70 task_project_id = task.project_id.id70 task_project_id = task.project_id.id
71 data_project = project_obj.read(cr, uid, task_project_id, ['complete_wbs_code'], context=[]) 71 data_project = project_obj.read(cr, uid, task_project_id, ['complete_wbs_code'], context=context)
72 if data_project:72 if data_project:
73 res.append((task.id, data_project['complete_wbs_code']))73 res.append((task.id, data_project['complete_wbs_code']))
74 else:74 else:
@@ -81,11 +81,11 @@
81 _columns = {81 _columns = {
82 'project_complete_wbs_name': fields.function(_project_complete_wbs_name, method=True, type='char', string='WBS path name', size=250, help='Project Complete WBS path name',82 'project_complete_wbs_name': fields.function(_project_complete_wbs_name, method=True, type='char', string='WBS path name', size=250, help='Project Complete WBS path name',
83 store={83 store={
84 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['project_id'], 10), 84 'project.task': (lambda self, cr, uid, ids, c=None: ids, ['project_id'], 10),
85 }), 85 }),
86 'project_complete_wbs_code': fields.function(_project_complete_wbs_code, method=True, type='char', string='WBS path code', size=250, help='Project Complete WBS path code',86 'project_complete_wbs_code': fields.function(_project_complete_wbs_code, method=True, type='char', string='WBS path code', size=250, help='Project Complete WBS path code',
87 store={87 store={
88 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['project_id'], 10), 88 'project.task': (lambda self, cr, uid, ids, c=None: ids, ['project_id'], 10),
89 }), 89 }),
90 90
91 } 91 }
@@ -327,4 +327,4 @@
327327
328project()328project()
329329
330
331\ No newline at end of file330\ No newline at end of file
331
332332
=== modified file 'project_time_sequence/project_time_sequence.py'
--- project_time_sequence/project_time_sequence.py 2012-10-02 20:55:15 +0000
+++ project_time_sequence/project_time_sequence.py 2013-01-04 15:10:41 +0000
@@ -112,7 +112,7 @@
112 112
113 }113 }
114 114
115 def do_link_predecessors(self, cr, uid, task_id, link_predecessors_data={}, context=None):115 def do_link_predecessors(self, cr, uid, task_id, link_predecessors_data, context=None):
116 116
117 task_br = self.browse(cr, uid, task_id, context=context)117 task_br = self.browse(cr, uid, task_id, context=context)
118 118

Subscribers

People subscribed via source and target branches

to all changes: