From b805979e924692d975ce7da4d92c3b5b20ef2dc3 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 May 2012 12:31:57 +0530 Subject: [IMP]project: set one selection field and and some methods for followers or members bzr revid: dbr@tinyerp.com-20120528070157-8lo7c1d3owzbmhaq --- addons/project/project.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 0b23196a67f..cc5da2c15dc 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -67,6 +67,35 @@ class project(osv.osv): return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) + def write(self, cr, uid, ids, vals, context=None): + if context is None: + context = {} + list = [] + project_ids = self.browse(cr, uid, ids) + groups = self.pool.get('res.groups') + group_id = groups.search(cr, uid, [('name', '=', 'Followers')], context=context) + groups_users = groups.browse(cr, uid, group_id)[0].users + for project_id in project_ids: + select = vals.get('privacy_visility') or project_id.privacy_visility or False + members = vals.get('members') or project_id.members or False + if select=='follower': + if members: + for member in members: + list.append(member.id) + followers = self.find_followers(cr, uid, ids, context) + for member_id in list: + if not member_id in followers: + self.message_subscribe(cr, uid, ids, [member_id], context=context) + return super(project, self).write(cr, uid, ids, vals, context=context) + + def find_followers(self, cr, uid, ids, context=None): + user=[] + sub_obj = self.pool.get('mail.subscription') + sub_id = sub_obj.search(cr, uid, [('res_model','=','project.project'),('res_id','in',ids)], context=context) + for follower_id in sub_obj.browse(cr, uid, sub_id): + user.append(follower_id.user_id.id) + return user + def _complete_name(self, cr, uid, ids, name, args, context=None): res = {} for m in self.browse(cr, uid, ids, context=context): @@ -202,11 +231,20 @@ class project(osv.osv): 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), + 'privacy_visility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visility', select=True), } def dummy(self, cr, uid, ids, context): return True - + + def message_thread_followers(self, cr, uid, ids, context=None): + followers = super(project,self).message_thread_followers(cr, uid, ids, context=context) + for project in self.browse(cr, uid, followers.keys(), context=context): + project_followers = set(followers[project.id]) + project_followers.add(project.user_id.user_email) + followers[project.id] = filter(None, project_followers) + return followers + def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('project_default','=',1)], context=context) return ids -- cgit v1.2.3 From 707ece42609d2d10252f0f686f52e629e7bcea1e Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 May 2012 15:14:10 +0530 Subject: [IMP]project: codr improvements bzr revid: dbr@tinyerp.com-20120528094410-2ohyzscyqh51gxt9 --- addons/project/project.py | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index cc5da2c15dc..aab101d62a3 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -70,32 +70,23 @@ class project(osv.osv): def write(self, cr, uid, ids, vals, context=None): if context is None: context = {} - list = [] - project_ids = self.browse(cr, uid, ids) - groups = self.pool.get('res.groups') - group_id = groups.search(cr, uid, [('name', '=', 'Followers')], context=context) - groups_users = groups.browse(cr, uid, group_id)[0].users - for project_id in project_ids: + groups_pool = self.pool.get('res.groups') + group_id = groups_pool.search(cr, uid, [('name', '=', 'Followers')], context=context) + groups_users = groups_pool.browse(cr, uid, group_id, context)[0].users + for project_id in self.browse(cr, uid, ids, context): + if vals.get('members'): + members = self.pool.get('res.users').browse(cr, uid, vals.get('members')[0][-1], context) + else: + members = project_id.members or False select = vals.get('privacy_visility') or project_id.privacy_visility or False - members = vals.get('members') or project_id.members or False - if select=='follower': - if members: - for member in members: - list.append(member.id) - followers = self.find_followers(cr, uid, ids, context) - for member_id in list: + if select=='follower' and members: + member_list = [member.id for member in members] + followers = self.message_get_subscribers_ids(cr, uid, ids, context=context) + for member_id in member_list: if not member_id in followers: self.message_subscribe(cr, uid, ids, [member_id], context=context) return super(project, self).write(cr, uid, ids, vals, context=context) - def find_followers(self, cr, uid, ids, context=None): - user=[] - sub_obj = self.pool.get('mail.subscription') - sub_id = sub_obj.search(cr, uid, [('res_model','=','project.project'),('res_id','in',ids)], context=context) - for follower_id in sub_obj.browse(cr, uid, sub_id): - user.append(follower_id.user_id.id) - return user - def _complete_name(self, cr, uid, ids, name, args, context=None): res = {} for m in self.browse(cr, uid, ids, context=context): -- cgit v1.2.3 From c81dcd768aba95c6f478df8f6344bd1aee773897 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 May 2012 15:40:35 +0530 Subject: [IMP]project:Remove extra code bzr revid: dbr@tinyerp.com-20120528101035-itsr2upflvx71n2e --- addons/project/project.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index aab101d62a3..47dc840e3c7 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -70,9 +70,6 @@ class project(osv.osv): def write(self, cr, uid, ids, vals, context=None): if context is None: context = {} - groups_pool = self.pool.get('res.groups') - group_id = groups_pool.search(cr, uid, [('name', '=', 'Followers')], context=context) - groups_users = groups_pool.browse(cr, uid, group_id, context)[0].users for project_id in self.browse(cr, uid, ids, context): if vals.get('members'): members = self.pool.get('res.users').browse(cr, uid, vals.get('members')[0][-1], context) -- cgit v1.2.3 From 0e90703ad0d1727c7a4511e30f335c0a3667357c Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 28 May 2012 18:00:54 +0530 Subject: [IMP]add boolean of project,projec_longterm,and project issue and create related project bzr revid: sgo@tinyerp.com-20120528123054-ntp1u33q1iavwtej --- addons/project/project.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 0b23196a67f..51d254756f4 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -198,10 +198,8 @@ class project(osv.osv): 'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'use_tasks': fields.boolean('Use Tasks', help="Check this field if this project is aimed at managing tasks"), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), - 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } def dummy(self, cr, uid, ids, context): @@ -217,7 +215,6 @@ class project(osv.osv): 'priority': 1, 'sequence': 10, 'type_ids': _get_type_common, - 'use_tasks': True, } # TODO: Why not using a SQL contraints ? @@ -1234,16 +1231,35 @@ class project_work(osv.osv): project_work() class account_analytic_account(osv.osv): - _inherit = 'account.analytic.account' _description = 'Analytic Account' + _columns = { + 'use_tasks': fields.boolean('Tasks Management'), + 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), + } +# _defaults = { +# 'use_tasks': True, +# } + + def project_create(self,cr,uid,analytic_account_id,vals,context=None): + res = {} + project_pool = self.pool.get('project.project') + project_id = project_pool.name_search(cr, uid, name=vals.get('name')) + if not project_id: + res['name'] = vals.get('name') + res['analytic_account_id'] = analytic_account_id + project_pool.create(cr, uid, res, context=context) + return True def create(self, cr, uid, vals, context=None): if context is None: context = {} if vals.get('child_ids', False) and context.get('analytic_project_copy', False): vals['child_ids'] = [] - return super(account_analytic_account, self).create(cr, uid, vals, context=context) + analytic_account_id = super(account_analytic_account, self).create(cr, uid, vals, context=context) + if vals.get('use_tasks', False): + self.project_create(cr, uid, analytic_account_id, vals, context) + return analytic_account_id def unlink(self, cr, uid, ids, *args, **kwargs): project_obj = self.pool.get('project.project') -- cgit v1.2.3 From 41161a904c7c7ecb6872759d8c979e8a8a466c66 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 30 May 2012 16:01:59 +0530 Subject: [IMP]analytic: Add members field bzr revid: dbr@tinyerp.com-20120530103159-n9yw01h99ap56yfw --- addons/project/project.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 51d254756f4..0dbbfcfd689 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -170,8 +170,8 @@ class project(osv.osv): 'priority': fields.integer('Sequence', help="Gives the sequence order when displaying the list of projects"), 'warn_manager': fields.boolean('Notify Manager', help="If you check this field, the project manager will receive an email each time a task is completed by his team.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', - help="Project's members are users who can have an access to the tasks related to this project.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), + #'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', + # help="Project's members are users who can have an access to the tasks related to this project.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'tasks': fields.one2many('project.task', 'project_id', "Task Activities"), 'planned_hours': fields.function(_progress_rate, multi="progress", string='Planned Time', help="Sum of planned hours of all tasks related to this project and its child projects.", store = { -- cgit v1.2.3 From 3b7f1698d9856eba10e46acacd5ab8bb7e0237e7 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 30 May 2012 18:09:13 +0530 Subject: [IMP]project: Set members field in proper module bzr revid: dbr@tinyerp.com-20120530123913-e7u4m3m3u6lgiop6 --- addons/project/project.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 0dbbfcfd689..3bda5ad128e 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1236,6 +1236,8 @@ class account_analytic_account(osv.osv): _columns = { 'use_tasks': fields.boolean('Tasks Management'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), + 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', + states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), } # _defaults = { # 'use_tasks': True, -- cgit v1.2.3 From 6de57c1fbfcef6cf30208bd879918549775da106 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 4 Jun 2012 14:15:43 +0530 Subject: [IMP]remove name search and add search on account_analytic_id bzr revid: sgo@tinyerp.com-20120604084543-fty7cqq3isr0fakq --- addons/project/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index dc80897f8c8..19275fa073c 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1272,7 +1272,7 @@ class account_analytic_account(osv.osv): def project_create(self,cr,uid,analytic_account_id,vals,context=None): res = {} project_pool = self.pool.get('project.project') - project_id = project_pool.name_search(cr, uid, name=vals.get('name')) + project_id = project_pool.search(cr, uid, [('analytic_account_id','=',analytic_account_id)]) if not project_id: res['name'] = vals.get('name') res['analytic_account_id'] = analytic_account_id -- cgit v1.2.3 From e7f5c1088bbdcaee6a48fe534ec7501ff858c3d5 Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 4 Jun 2012 16:03:42 +0530 Subject: [IMP]type invible when type is contract and template and project related issues solved bzr revid: sgo@tinyerp.com-20120604103342-g0pnstp5cexttdb7 --- addons/project/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 19275fa073c..2e86c79bddc 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1272,7 +1272,7 @@ class account_analytic_account(osv.osv): def project_create(self,cr,uid,analytic_account_id,vals,context=None): res = {} project_pool = self.pool.get('project.project') - project_id = project_pool.search(cr, uid, [('analytic_account_id','=',analytic_account_id)]) + project_id = project_pool.search(cr, uid, [('name','=',vals.get('name'))]) if not project_id: res['name'] = vals.get('name') res['analytic_account_id'] = analytic_account_id -- cgit v1.2.3 From 0125e320c98705ec412daf0d154ca84466262687 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 6 Jun 2012 17:36:29 +0200 Subject: [IMP] analytic: misc imp related to project and contract mangement task bzr revid: qdp-launchpad@openerp.com-20120606153629-jlk1k0ze09b7pu6s --- addons/project/project.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 95c4e6b7813..25997b1a91e 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -190,8 +190,8 @@ class project(osv.osv): 'priority': fields.integer('Sequence', help="Gives the sequence order when displaying the list of projects"), 'warn_manager': fields.boolean('Notify Manager', help="If you check this field, the project manager will receive an email each time a task is completed by his team.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - #'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', - # help="Project's members are users who can have an access to the tasks related to this project.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', + help="Project's members are users who can have an access to the tasks related to this project.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'tasks': fields.one2many('project.task', 'project_id', "Task Activities"), 'planned_hours': fields.function(_progress_rate, multi="progress", string='Planned Time', help="Sum of planned hours of all tasks related to this project and its child projects.", store = { @@ -1247,8 +1247,6 @@ class account_analytic_account(osv.osv): _columns = { 'use_tasks': fields.boolean('Tasks Management'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), - 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', - states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), } # _defaults = { # 'use_tasks': True, -- cgit v1.2.3 From 1918bb0a069617d0cd8470bdd5d98e6ba363ab7d Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Thu, 7 Jun 2012 11:15:29 +0530 Subject: [IMP]project: Set privacy_visibility instead of privacy_visility. bzr revid: dbr@tinyerp.com-20120607054529-n7sigtg2a5y6zg1i --- addons/project/project.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 25997b1a91e..cd274f1cc5c 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -78,7 +78,7 @@ class project(osv.osv): members = self.pool.get('res.users').browse(cr, uid, vals.get('members')[0][-1], context) else: members = project_id.members or False - select = vals.get('privacy_visility') or project_id.privacy_visility or False + select = vals.get('privacy_visibility') or project_id.privacy_visibility or False if select=='follower' and members: member_list = [member.id for member in members] followers = self.message_get_subscribers_ids(cr, uid, ids, context=context) @@ -220,7 +220,7 @@ class project(osv.osv): 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), - 'privacy_visility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visility', select=True), + 'privacy_visibility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visibility', select=True), } def dummy(self, cr, uid, ids, context): -- cgit v1.2.3 From 547f036aa3e5eb40c211128990df39f04d3ffb61 Mon Sep 17 00:00:00 2001 From: "Amit Patel (OpenERP)" Date: Fri, 8 Jun 2012 14:35:37 +0530 Subject: [IMP]:project:overwrit state field to display 'pending' in project and 'To Renew' in contract. bzr revid: apa@tinyerp.com-20120608090537-mtftf3jqc6d286y8 --- addons/project/project.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index cd274f1cc5c..07229e35b76 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -221,6 +221,7 @@ class project(osv.osv): 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), 'privacy_visibility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visibility', select=True), + 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), } def dummy(self, cr, uid, ids, context): @@ -241,6 +242,7 @@ class project(osv.osv): _order = "sequence" _defaults = { 'active': True, + 'state': 'open', 'priority': 1, 'sequence': 10, 'type_ids': _get_type_common, -- cgit v1.2.3 From b2a5ab368d64559375a861de6270f0d9ef3e5667 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 13 Jun 2012 12:07:31 +0200 Subject: [IMP] account_analytic_analysis: code improved for automation of project creation bzr revid: qdp-launchpad@openerp.com-20120613100731-9so4m41fz7yrtb5w --- addons/project/project.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 038c260d84e..f7ccf0fdeb8 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1248,19 +1248,26 @@ class account_analytic_account(osv.osv): 'use_tasks': fields.boolean('Tasks Management'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } -# _defaults = { -# 'use_tasks': True, -# } - - def project_create(self,cr,uid,analytic_account_id,vals,context=None): - res = {} + + def _trigger_project_creation(self, cr, uid, vals, context=None): + ''' + This function is used to decide if a project needs to be automatically created or not when an analytic account is created. It returns True if it needs to be so, False otherwise. + ''' + return vals.get('use_tasks') + + def project_create(self, cr, uid, analytic_account_id, vals, context=None): + ''' + This function is called at the time of analytic account creation and is used to create a project automatically linked to it if the conditions are meet. + ''' project_pool = self.pool.get('project.project') project_id = project_pool.search(cr, uid, [('name','=',vals.get('name'))]) - if not project_id: - res['name'] = vals.get('name') - res['analytic_account_id'] = analytic_account_id - project_pool.create(cr, uid, res, context=context) - return True + if not project_id and self._trigger_project_creation(vals): + project_values = { + 'name': vals.get('name'), + 'analytic_account_id': analytic_account_id, + } + return project_pool.create(cr, uid, project_values, context=context) + return False def create(self, cr, uid, vals, context=None): if context is None: @@ -1268,8 +1275,7 @@ class account_analytic_account(osv.osv): if vals.get('child_ids', False) and context.get('analytic_project_copy', False): vals['child_ids'] = [] analytic_account_id = super(account_analytic_account, self).create(cr, uid, vals, context=context) - if vals.get('use_tasks', False): - self.project_create(cr, uid, analytic_account_id, vals, context) + self.project_create(cr, uid, analytic_account_id, vals, context=context) return analytic_account_id def unlink(self, cr, uid, ids, *args, **kwargs): -- cgit v1.2.3 From dc1edf44be5593f9048f442a8aec68ae5250d953 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 14 Jun 2012 12:09:22 +0200 Subject: [IMP] project: implemented the privacy/visibility record rule in a cleaner way + some cleanup and bug fixing related to contract management bzr revid: qdp-launchpad@openerp.com-20120614100922-5g29ui88nhqojon2 --- addons/project/project.py | 48 +++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index f7ccf0fdeb8..d68e5ab589d 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -70,23 +70,6 @@ class project(osv.osv): return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) - def write(self, cr, uid, ids, vals, context=None): - if context is None: - context = {} - for project_id in self.browse(cr, uid, ids, context): - if vals.get('members'): - members = self.pool.get('res.users').browse(cr, uid, vals.get('members')[0][-1], context) - else: - members = project_id.members or False - select = vals.get('privacy_visibility') or project_id.privacy_visibility or False - if select=='follower' and members: - member_list = [member.id for member in members] - followers = self.message_get_subscribers_ids(cr, uid, ids, context=context) - for member_id in member_list: - if not member_id in followers: - self.message_subscribe(cr, uid, ids, [member_id], context=context) - return super(project, self).write(cr, uid, ids, vals, context=context) - def _complete_name(self, cr, uid, ids, name, args, context=None): res = {} for m in self.browse(cr, uid, ids, context=context): @@ -182,6 +165,23 @@ class project(osv.osv): res[task.project_id.id] += 1 return res + def _get_followers(self, cr, uid, ids, name, arg, context=None): + ''' + Functional field that computes the users that are 'following' a thread. + ''' + res = {} + for project in self.browse(cr, uid, ids, context=context): + l = set() + for message in project.message_ids: + l.add(message.user_id and message.user_id.id or False) + res[project.id] = list(filter(None, l)) + return res + + def _search_followers(self, cr, uid, obj, name, args, context=None): + project_obj = self.pool.get('project.project') + project_ids = project_obj.search(cr, uid, [('message_ids.user_id.id', 'in', args[0][2])], context=context) + return [('id', 'in', project_ids)] + _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."), @@ -220,21 +220,15 @@ class project(osv.osv): 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), - 'privacy_visibility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visibility', select=True), + 'privacy_visibility': fields.selection([('public','Public'), ('followers','Followers Only')], 'Privacy / Visibility'), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), + 'followers': fields.function(_get_followers, method=True, fnct_search=_search_followers, + type='many2many', relation='res.users', string='Followers'), } def dummy(self, cr, uid, ids, context): return True - def message_thread_followers(self, cr, uid, ids, context=None): - followers = super(project,self).message_thread_followers(cr, uid, ids, context=context) - for project in self.browse(cr, uid, followers.keys(), context=context): - project_followers = set(followers[project.id]) - project_followers.add(project.user_id.user_email) - followers[project.id] = filter(None, project_followers) - return followers - def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('case_default','=',1)], context=context) return ids @@ -1261,7 +1255,7 @@ class account_analytic_account(osv.osv): ''' project_pool = self.pool.get('project.project') project_id = project_pool.search(cr, uid, [('name','=',vals.get('name'))]) - if not project_id and self._trigger_project_creation(vals): + if not project_id and self._trigger_project_creation(cr, uid, vals, context=context): project_values = { 'name': vals.get('name'), 'analytic_account_id': analytic_account_id, -- cgit v1.2.3 From 66c3093feef8df9c21f34fa1aea402087dd3c7ea Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jun 2012 10:12:54 +0200 Subject: [IMP] contract management: misc improvements bzr revid: qdp-launchpad@openerp.com-20120615081254-rhh9nwmz3bqn7e9d --- addons/project/project.py | 1 + 1 file changed, 1 insertion(+) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index d68e5ab589d..812542cf768 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -236,6 +236,7 @@ class project(osv.osv): _order = "sequence" _defaults = { 'active': True, + 'type': 'contract', 'state': 'open', 'priority': 1, 'sequence': 10, -- cgit v1.2.3 From bde7606b5b531526bde11e0124975f1836aec0b0 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Fri, 15 Jun 2012 14:59:18 +0200 Subject: [REM] project: removal of warn_manager and warn_customer features that are now handled by the chatter bzr revid: qdp-launchpad@openerp.com-20120615125918-zaiickzw4yuudqkj --- addons/project/project.py | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 812542cf768..fa27595196c 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -188,8 +188,6 @@ class project(osv.osv): 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of Projects."), 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', help="Link this project to an analytic account if you need financial management on projects. It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc.", ondelete="cascade", required=True), 'priority': fields.integer('Sequence', help="Gives the sequence order when displaying the list of projects"), - 'warn_manager': fields.boolean('Notify Manager', help="If you check this field, the project manager will receive an email each time a task is completed by his team.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', help="Project's members are users who can have an access to the tasks related to this project.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'tasks': fields.one2many('project.task', 'project_id', "Task Activities"), @@ -214,9 +212,6 @@ class project(osv.osv): 'project.task': (_get_projects_from_tasks, ['planned_hours', 'remaining_hours', 'work_ids', 'state'], 20), }), 'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report", states={'close':[('readonly',True)]} ), - 'warn_customer': fields.boolean('Warn Partner', help="If you check this, the user will have a popup when closing a task that propose a message to send by email to the customer.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed.", states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), @@ -914,28 +909,12 @@ class task(base_stage, osv.osv): return True def action_close(self, cr, uid, ids, context=None): - """ This action closes the task, then opens the wizard to send an - email to the partner or the project manager. + """ This action closes the task """ task_id = len(ids) and ids[0] or False self._check_child_task(cr, uid, ids, context=context) if not task_id: return False - task = self.browse(cr, uid, task_id, context=context) - project = task.project_id - res = self.do_close(cr, uid, [task_id], context=context) - if project.warn_manager or project.warn_customer: - return { - 'name': _('Send Email after close task'), - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'mail.compose.message', - 'type': 'ir.actions.act_window', - 'target': 'new', - 'nodestroy': True, - 'context': {'active_id': task.id, - 'active_model': 'project.task'} - } - return res + return self.do_close(cr, uid, [task_id], context=context) def do_close(self, cr, uid, ids, context=None): """ Compatibility when changing to case_close. """ -- cgit v1.2.3 From c0f54153c7250356f785b1c25e42396ca24a0a76 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 18 Jun 2012 13:56:34 +0200 Subject: [FIX] project, hr_timesheet_invoice, project_timesheet: fixed flow to invoice on timesheets + some code cleaning bzr revid: qdp-launchpad@openerp.com-20120618115634-eos7eq6gdvxqoyn6 --- addons/project/project.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index fa27595196c..a6626aae5d1 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1234,7 +1234,7 @@ class account_analytic_account(osv.osv): This function is called at the time of analytic account creation and is used to create a project automatically linked to it if the conditions are meet. ''' project_pool = self.pool.get('project.project') - project_id = project_pool.search(cr, uid, [('name','=',vals.get('name'))]) + project_id = project_pool.search(cr, uid, [('analytic_account_id','=', analytic_account_id)]) if not project_id and self._trigger_project_creation(cr, uid, vals, context=context): project_values = { 'name': vals.get('name'), @@ -1252,6 +1252,14 @@ class account_analytic_account(osv.osv): self.project_create(cr, uid, analytic_account_id, vals, context=context) return analytic_account_id + def write(self, cr, uid, ids, vals, context=None): + name = vals.get('name') + for account in self.browse(cr, uid, ids, context=context): + if not name: + vals['name'] = account.name + self.project_create(cr, uid, account.id, vals, context=context) + return super(account_analytic_account, self).write(cr, uid, ids, vals, context=context) + def unlink(self, cr, uid, ids, *args, **kwargs): project_obj = self.pool.get('project.project') analytic_ids = project_obj.search(cr, uid, [('analytic_account_id','in',ids)]) -- cgit v1.2.3 From fdc196343fea5f14eed500c93999bddb009871ba Mon Sep 17 00:00:00 2001 From: "Sanjay Gohel (Open ERP)" Date: Mon, 25 Jun 2012 12:02:33 +0530 Subject: [IMP]improve code and add tooltip on task_management bzr revid: sgo@tinyerp.com-20120625063233-9w7pf3eg16ok4kyj --- addons/project/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index a6626aae5d1..ab02cc870bb 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1219,7 +1219,7 @@ class account_analytic_account(osv.osv): _inherit = 'account.analytic.account' _description = 'Analytic Account' _columns = { - 'use_tasks': fields.boolean('Tasks Management'), + 'use_tasks': fields.boolean('Tasks Management',help="If check,this contract will be available in the project menu and you will be able to manage tasks or track issues"), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } -- cgit v1.2.3