From 4ba5a7d30d86160a74e709a5f2f9b97853bc96e1 Mon Sep 17 00:00:00 2001 From: "psi (Open ERP)" Date: Tue, 16 Mar 2010 18:21:46 +0530 Subject: [PATCH] [IMP] project: reactivate button work now same like review button on task form , clean code and improve bzr revid: psi@tinyerp.co.in-20100316125146-qfyoqcqcyzxklf4r --- addons/project/company.py | 10 ++-- addons/project/project.py | 91 ++++++++++++++++++++------------- addons/project/project_view.xml | 6 +-- 3 files changed, 63 insertions(+), 44 deletions(-) diff --git a/addons/project/company.py b/addons/project/company.py index 52b037b5890..f745739bf60 100644 --- a/addons/project/company.py +++ b/addons/project/company.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). # @@ -15,12 +15,11 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## -from osv import fields -from osv import osv +from osv import fields, osv class res_company(osv.osv): _inherit = 'res.company' @@ -29,10 +28,9 @@ class res_company(osv.osv): help='This will set the unit of measure used in projects and tasks.\n' \ "If you use the timesheet linked to projects (project_timesheet module), don't " \ "forget to setup the right unit of measure in your employees.", - + ), } - res_company() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project.py b/addons/project/project.py index e9c11cc605c..0c6cc839f6d 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -18,14 +18,13 @@ # along with this program. If not, see . # ############################################################################## - from lxml import etree import mx.DateTime import datetime import time + from tools.translate import _ from osv import fields, osv -from tools.translate import _ class project_task_type(osv.osv): _name = 'project.task.type' @@ -47,11 +46,9 @@ class project(osv.osv): _description = "Project" _inherits = {'account.analytic.account':"category_id"} - def search(self, cr, user, args, offset=0, limit=None, order=None, - context=None, count=False): + def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False): if user == 1: - return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, - context=context, count=count) + return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) if context and context.has_key('user_prefence') and context['user_prefence']: cr.execute("""SELECT project.id FROM project_project project LEFT JOIN account_analytic_account account ON account.id = project.category_id @@ -62,7 +59,7 @@ class project(osv.osv): return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) - def _complete_name(self, cr, uid, ids, name, args, context): + def _complete_name(self, cr, uid, ids, name, args, context={}): res = {} for m in self.browse(cr, uid, ids, context=context): res[m.id] = (m.parent_id and (m.parent_id.name + '/') or '') + m.name @@ -72,20 +69,21 @@ class project(osv.osv): return super(project, self).check_recursion(cursor, user, ids, parent=parent) - def onchange_partner_id(self, cr, uid, ids, part): + def onchange_partner_id(self, cr, uid, ids, part, context={}): + partner_obj = self.pool.get('res.partner') if not part: return {'value':{'contact_id': False, 'pricelist_id': False}} - addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact']) + addr = partner_obj.address_get(cr, uid, [part], ['contact']) + pricelist = partner_obj.read(cr, uid, part, ['property_product_pricelist'], context=context) + pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False + return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist_id}} - pricelist = self.pool.get('res.partner').browse(cr, uid, part).property_product_pricelist.id - return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist}} - - def _progress_rate(self, cr, uid, ids, names, arg, context=None): + def _progress_rate(self, cr, uid, ids, names, arg, context={}): res = {}.fromkeys(ids, 0.0) progress = {} if not ids: return res - ids2 = self.search(cr, uid, [('parent_id','child_of',ids)]) + ids2 = self.search(cr, uid, [('parent_id','child_of',ids)], context=context) if ids2: cr.execute('''SELECT project_id, sum(planned_hours), sum(total_hours), sum(effective_hours) @@ -96,15 +94,15 @@ class project(osv.osv): state<>'cancelled' GROUP BY project_id''',(ids2,)) - progress = dict(map(lambda x: (x[0], (x[1],x[2],x[3])), cr.fetchall())) + progress = dict(map(lambda x: (x[0], (x[1], x[2], x[3])), cr.fetchall())) for project in self.browse(cr, uid, ids, context=context): - s = [0.0,0.0,0.0] + s = [0.0, 0.0, 0.0] tocompute = [project] while tocompute: p = tocompute.pop() tocompute += p.child_ids for i in range(3): - s[i] += progress.get(p.id, (0.0,0.0,0.0))[i] + s[i] += progress.get(p.id, (0.0, 0.0, 0.0))[i] res[project.id] = { 'planned_hours': s[0], 'effective_hours': s[2], @@ -177,7 +175,7 @@ class project(osv.osv): res = self.setActive(cr, uid, ids,value=True, context=context) return res - def copy(self, cr, uid, id, default={},context={}): + def copy(self, cr, uid, id, default={}, context={}): proj = self.browse(cr, uid, id, context=context) default = default or {} context['active_test'] = False @@ -190,34 +188,37 @@ class project(osv.osv): cr.execute('update project_task set active=True where project_id =ANY(%s)',(ids,)) return res - def duplicate_template(self, cr, uid, ids,context={}): + def duplicate_template(self, cr, uid, ids, context={}): + project_obj = self.pool.get('project.project') + task_obj = self.pool.get('project.task') result = [] - for proj in self.browse(cr, uid, ids): + for proj in self.browse(cr, uid, ids, context=context): parent_id = context.get('parent_id',False) - new_id = self.pool.get('project.project').copy(cr, uid, proj.id, default = { + new_id = project_obj.copy(cr, uid, proj.id, default = { 'name': proj.name +_(' (copy)'), 'state':'open', - 'parent_id':parent_id}) + 'parent_id':parent_id}, context=context) result.append(new_id) cr.execute('select id from project_task where project_id=%s', (proj.id,)) res = cr.fetchall() for (tasks_id,) in res: - self.pool.get('project.task').copy(cr, uid, tasks_id, default = { + task_obj.copy(cr, uid, tasks_id, default = { 'project_id': new_id, 'active':True}, context=context) - child_ids = self.search(cr, uid, [('parent_id','=', proj.id)]) + child_ids = self.search(cr, uid, [('parent_id','=', proj.id)], context=context) if child_ids: - self.duplicate_template(cr, uid, child_ids, context={'parent_id':new_id}) + self.duplicate_template(cr, uid, child_ids, context={'parent_id': new_id}) return result # set active value for a project, its sub projects and its tasks def setActive(self, cr, uid, ids, value=True, context={}): + task_obj = self.pool.get('project.task') for proj in self.browse(cr, uid, ids, context): self.write(cr, uid, [proj.id], {'state': value and 'open' or 'template'}, context) cr.execute('select id from project_task where project_id=%s', (proj.id,)) tasks_id = [x[0] for x in cr.fetchall()] if tasks_id: - self.pool.get('project.task').write(cr, uid, tasks_id, {'active': value}, context) + task_obj.write(cr, uid, tasks_id, {'active': value}, context=context) child_ids = self.search(cr, uid, [('parent_id','=', proj.id)]) if child_ids: self.setActive(cr, uid, child_ids, value, context) @@ -253,7 +254,7 @@ class task(osv.osv): return res def onchange_planned(self, cr, uid, ids, planned = 0.0, effective = 0.0): - return {'value':{'remaining_hours' : planned - effective}} + return {'value':{'remaining_hours' : planned - effective}} def _default_project(self, cr, uid, context={}): if 'project_id' in context and context['project_id']: @@ -269,8 +270,8 @@ class task(osv.osv): default['work_ids'] = [] return super(task, self).copy_data(cr, uid, id, default, context) - def _check_dates(self, cr, uid, ids): - task = self.read(cr, uid, ids[0],['date_start','date_end']) + def _check_dates(self, cr, uid, ids, context={}): + task = self.read(cr, uid, ids[0],['date_start', 'date_end']) if task['date_start'] and task['date_end']: if task['date_start'] > task['date_end']: return False @@ -309,7 +310,7 @@ class task(osv.osv): 'company_id': fields.many2one('res.company', 'Company'), } _defaults = { - 'user_id': lambda obj,cr,uid,context: uid, + 'user_id': lambda obj, cr, uid, context: uid, 'state': lambda *a: 'draft', 'priority': lambda *a: '2', 'progress': lambda *a: 0, @@ -317,7 +318,7 @@ class task(osv.osv): 'active': lambda *a: True, 'date_start': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'), 'project_id': _default_project, - 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c) + 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c) } _order = "sequence, priority, date_start, id" @@ -328,7 +329,8 @@ class task(osv.osv): # Override view according to the company definition # def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - obj_tm = self.pool.get('res.users').browse(cr, uid, uid, context).company_id.project_time_mode_id + users_obj = self.pool.get('res.users') + obj_tm = users_obj.browse(cr, uid, uid, context).company_id.project_time_mode_id tm = obj_tm and obj_tm.name or 'Hours' res = super(task, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu=submenu) @@ -470,7 +472,7 @@ class project_work(osv.osv): 'company_id': fields.related('task_id','company_id',type='many2one',relation='res.company',string='Company',store=True) } _defaults = { - 'user_id': lambda obj,cr,uid,context: uid, + 'user_id': lambda obj, cr, uid, context: uid, 'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S') } _order = "date desc" @@ -498,8 +500,9 @@ project_work() class config_compute_remaining(osv.osv_memory): _name='config.compute.remaining' def _get_remaining(self,cr, uid, ctx): + task_obj = self.pool.get('project.task') if 'active_id' in ctx: - return self.pool.get('project.task').browse(cr,uid,ctx['active_id']).remaining_hours + return task_obj.browse(cr,uid,ctx['active_id'],context=ctx).remaining_hours return False _columns = { @@ -511,12 +514,30 @@ class config_compute_remaining(osv.osv_memory): } def compute_hours(self, cr, uid, ids, context=None): + task_obj = self.pool.get('project.task') + request = self.pool.get('res.request') if 'active_id' in context: remaining_hrs=self.browse(cr,uid,ids)[0].remaining_hours - self.pool.get('project.task').write(cr,uid,context['active_id'],{'remaining_hours':remaining_hrs}) + task_obj.write(cr,uid,context['active_id'],{'remaining_hours':remaining_hrs}) + if context.get('button_reactivate', False): + tasks = task_obj.browse(cr, uid, [context['active_id']], context=context) + for task in tasks: + project = task.project_id + if project and project.warn_manager and project.user_id.id and (project.user_id.id != uid): + request.create(cr, uid, { + 'name': _("Task '%s' set in progress") % task.name, + 'state': 'waiting', + 'act_from': uid, + 'act_to': project.user_id.id, + 'ref_partner_id': task.partner_id.id, + 'ref_doc1': 'project.task,%d' % task.id, + 'ref_doc2': 'project.project,%d' % project.id, + }) + task_obj.write(cr, uid, [task.id], {'state': 'open'}) return { 'type': 'ir.actions.act_window_close', } + config_compute_remaining() class message(osv.osv): diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 460e74a4cc3..02d0bbdd288 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -268,7 +268,7 @@