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 6aa0ca7a7e2f03edcd614cfa48831f67f83d58d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 5 Jun 2012 14:22:21 +0200 Subject: [IMP] mail_thread: cleaned message_get_subscribers and related methods; propagated change so that project_issue, mrp, crm_lead, project, project_task, hr_recruitment and hr_holidays now cleanly override message_get_subscribers. bzr revid: tde@openerp.com-20120605122221-nvxfxfcx5o82vkvx --- addons/project/project.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index e7af9f49b7d..1760e8d6aa3 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -475,11 +475,12 @@ def Project(): return result def message_get_subscribers(self, cr, uid, ids, context=None): - sub_ids = self.message_get_subscribers_ids(cr, uid, ids, context=context); + """ Override to add responsible user. """ + user_ids = super(project, self).message_get_subscribers(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id: - sub_ids.append(obj.user_id.id) - return self.pool.get('res.users').read(cr, uid, sub_ids, context=context) + if obj.user_id and not obj.user_id.id in user_ids: + user_ids.append(obj.user_id.id) + return user_ids def create(self, cr, uid, vals, context=None): obj_id = super(project, self).create(cr, uid, vals, context=context) @@ -1152,13 +1153,14 @@ class task(base_stage, osv.osv): return result def message_get_subscribers(self, cr, uid, ids, context=None): - sub_ids = self.message_get_subscribers_ids(cr, uid, ids, context=context); + """ Override to add responsible user and project manager. """ + user_ids = super(project_task, self).message_get_subscribers(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id: - sub_ids.append(obj.user_id.id) - if obj.manager_id: - sub_ids.append(obj.manager_id.id) - return self.pool.get('res.users').read(cr, uid, sub_ids, context=context) + if obj.user_id and not obj.user_id.id in user_ids: + user_ids.append(obj.user_id.id) + if obj.manager_id and not obj.manager_id.id in user_ids: + user_ids.append(obj.manager_id.id) + return user_ids def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ -- cgit v1.2.3 From e407e7380c3a6c65e6be9d26cacfa9f7ce1181a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 5 Jun 2012 14:54:01 +0200 Subject: [FIX] Still fixing wrong class names in super. bzr revid: tde@openerp.com-20120605125401-1v8c4wytp9jw6ryg --- 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 1760e8d6aa3..804b725e6fa 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1154,7 +1154,7 @@ class task(base_stage, osv.osv): def message_get_subscribers(self, cr, uid, ids, context=None): """ Override to add responsible user and project manager. """ - user_ids = super(project_task, self).message_get_subscribers(cr, uid, ids, context=context) + user_ids = super(task, self).message_get_subscribers(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): if obj.user_id and not obj.user_id.id in user_ids: user_ids.append(obj.user_id.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 06c234a6c1589f84f452a287f1699918296554fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 7 Jun 2012 17:25:36 +0200 Subject: [REM] project_oissue, crm_meeting, project, hr_recruitment: removed get_needaction_user_ids definition, as the default behavior of mail.thread is sufficient. bzr revid: tde@openerp.com-20120607152536-h9vwg2t4ser8f3v2 --- addons/project/project.py | 8 -------- 1 file changed, 8 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 804b725e6fa..d5ffdd4f5d6 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -465,14 +465,6 @@ def Project(): # ------------------------------------------------ # OpenChatter methods and notifications # ------------------------------------------------ - - def get_needaction_user_ids(self, cr, uid, ids, context=None): - result = dict.fromkeys(ids) - for obj in self.browse(cr, uid, ids, context=context): - result[obj.id] = [] - if obj.state == 'draft' and obj.user_id: - result[obj.id] = [obj.user_id.id] - return result def message_get_subscribers(self, cr, uid, ids, context=None): """ Override to add responsible user. """ -- 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 From 6c879adbaebe0817cc1fac6edef699aa96539a0e Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Tue, 26 Jun 2012 17:27:00 +0530 Subject: [IMP] kanban project.task bzr revid: tta@openerp.com-20120626115700-2ssby2yt15oaodmx --- 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 429672d3269..79523dcc23e 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -753,7 +753,7 @@ class task(base_stage, osv.osv): _order = "priority, sequence, date_start, name, id" - def set_priority(self, cr, uid, ids, priority): + def set_priority(self, cr, uid, ids, priority, *args): """Set task priority """ return self.write(cr, uid, ids, {'priority' : priority}) -- cgit v1.2.3 From 077de5e43d1dfd34edac2c633634be2cd9f0544c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 27 Jun 2012 16:25:52 +0200 Subject: [IMP] crm_phonecall: now has default inbox behavior for needaction_pending; project_task: updated needaction. bzr revid: tde@openerp.com-20120627142552-zjkhc79ytlqrsp1i --- addons/project/project.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index aadebe04ecd..b93b45f1840 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1135,10 +1135,15 @@ class task(base_stage, osv.osv): return 'Task' def get_needaction_user_ids(self, cr, uid, ids, context=None): - result = dict.fromkeys(ids, []) + """ Returns the user_ids that have to perform an action + :return: dict { record_id: [user_ids], } + """ + result = super(project_task, self).get_needaction_user_ids(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): if obj.state == 'draft' and obj.user_id: - result[obj.id] = [obj.user_id.id] + result[obj.id].add(obj.user_id.id) + elif obj.state == 'draft': + result[obj.id].add(uid) return result def message_get_subscribers(self, cr, uid, ids, context=None): -- cgit v1.2.3 From 2269c81cf8cbf6302c301387342d7ed445ea4b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 28 Jun 2012 14:30:48 +0200 Subject: [FIX] project_task: fixed typo in class name. bzr revid: tde@openerp.com-20120628123048-cfs1zmzyub8l1a0l --- 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 b93b45f1840..31f7706b575 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1138,7 +1138,7 @@ class task(base_stage, osv.osv): """ Returns the user_ids that have to perform an action :return: dict { record_id: [user_ids], } """ - result = super(project_task, self).get_needaction_user_ids(cr, uid, ids, context=context) + result = super(task, self).get_needaction_user_ids(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): if obj.state == 'draft' and obj.user_id: result[obj.id].add(obj.user_id.id) -- cgit v1.2.3 From 37a06585213bb8f88890e1dae188730cb81c5c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 2 Jul 2012 16:57:47 +0200 Subject: [IMP] needaction: cleaned definitions in addons. bzr revid: tde@openerp.com-20120702145747-3m3s78tfmavjj61k --- addons/project/project.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index 46af30f77a8..f614d257594 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1144,9 +1144,7 @@ class task(base_stage, osv.osv): result = super(task, self).get_needaction_user_ids(cr, uid, ids, context=context) for obj in self.browse(cr, uid, ids, context=context): if obj.state == 'draft' and obj.user_id: - result[obj.id].add(obj.user_id.id) - elif obj.state == 'draft': - result[obj.id].add(uid) + result[obj.id].append(obj.user_id.id) return result def message_get_subscribers(self, cr, uid, ids, context=None): -- cgit v1.2.3 From 1ac5f6fa99fb15a1f58c1f7232ef9e0a803a63c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 2 Jul 2012 18:13:23 +0200 Subject: [REVIEW] Some cleaning after review and before merging. bzr revid: tde@openerp.com-20120702161323-wvd0j6ng3dz56ifj --- addons/project/project.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'addons/project/project.py') diff --git a/addons/project/project.py b/addons/project/project.py index f614d257594..487daa834bb 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1138,7 +1138,9 @@ class task(base_stage, osv.osv): return 'Task' def get_needaction_user_ids(self, cr, uid, ids, context=None): - """ Returns the user_ids that have to perform an action + """ Returns the user_ids that have to perform an action. + Add to the previous results given by super the document responsible + when in draft mode. :return: dict { record_id: [user_ids], } """ result = super(task, self).get_needaction_user_ids(cr, uid, ids, context=context) -- cgit v1.2.3