From 26f266785ec39b4d58b481a203e9e86a0ff30892 Mon Sep 17 00:00:00 2001 From: Mustufa Rangwala Date: Fri, 2 Jul 2010 20:07:06 +0530 Subject: [PATCH] [IMP] clean project_* code (DHS) bzr revid: mra@mra-laptop-20100702143706-k5zeko7e9n7ikvk1 --- addons/project/__openerp__.py | 12 +- addons/project/board_project_manager_view.xml | 2 - addons/project/company.py | 2 +- addons/project/installer.py | 20 +-- addons/project/project.py | 137 +++++++++++------- addons/project/project_data.xml | 2 + addons/project/project_installer.xml | 5 +- addons/project/project_mailgate.py | 4 +- addons/project/project_resource.py | 7 +- addons/project/project_view.xml | 3 +- addons/project/report/project_report.py | 77 +++++----- addons/project/report/project_report_view.xml | 10 +- addons/project/res_partner.py | 2 + addons/project/security/project_security.xml | 2 + addons/project/wizard/project_close_task.py | 16 +- .../wizard/project_close_task_view.xml | 10 +- .../project/wizard/project_task_delegate.py | 25 ++-- .../wizard/project_task_delegate_view.xml | 4 +- addons/project_caldav/__openerp__.py | 16 +- addons/project_caldav/project_caldav.py | 15 +- addons/project_caldav/project_caldav_data.xml | 10 +- addons/project_caldav/project_caldav_view.xml | 74 ++++------ addons/project_gtd/project_gtd.py | 15 +- addons/project_gtd/project_gtd_demo.xml | 4 +- addons/project_gtd/project_gtd_view.xml | 3 + .../project_gtd/wizard/project_gtd_empty.py | 2 +- addons/project_gtd/wizard/project_gtd_fill.py | 6 +- addons/project_issue/__openerp__.py | 6 +- .../board_project_issue_view.xml | 4 +- addons/project_issue/project_issue.py | 84 +++++------ addons/project_issue/project_issue_data.xml | 6 +- addons/project_issue/project_issue_demo.xml | 1 + addons/project_issue/project_issue_menu.xml | 6 +- addons/project_issue/project_issue_view.xml | 129 +++++++---------- .../report/project_issue_report.py | 4 +- .../security/project_issue_security.xml | 2 +- addons/project_issue_sheet/__openerp__.py | 14 +- .../project_issue_sheet.py | 13 +- .../project_issue_sheet_view.xml | 1 - .../project_long_term_demo.xml | 26 ---- 40 files changed, 392 insertions(+), 389 deletions(-) diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index 03b72e09e38..c3784c457b1 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -21,12 +21,12 @@ { - "name" : "Project Management", + "name": "Project Management", "version": "1.1", - "author" : "Tiny", - "website" : "http://www.openerp.com", - "category" : "Generic Modules/Projects & Services", - "depends" : ["product", "analytic", "process", "mail_gateway","board"], + "author": "Tiny", + "website": "http://www.openerp.com", + "category": "Generic Modules/Projects & Services", + "depends": ["product", "analytic", "process", "mail_gateway","board"], "description": """Project management module that track multi-level projects, tasks, work done on tasks, eso. It is able to render planning, order tasks, eso. Dashboard for project members that includes: @@ -35,7 +35,7 @@ work done on tasks, eso. It is able to render planning, order tasks, eso. * Members list of project * Issues """, - "init_xml" : [], + "init_xml": [], "update_xml": [ "security/project_security.xml", "wizard/project_task_delegate_view.xml", diff --git a/addons/project/board_project_manager_view.xml b/addons/project/board_project_manager_view.xml index 3c32361e5ec..f62c292e779 100644 --- a/addons/project/board_project_manager_view.xml +++ b/addons/project/board_project_manager_view.xml @@ -21,8 +21,6 @@ - - board.project.manager.form board.board diff --git a/addons/project/company.py b/addons/project/company.py index f745739bf60..f0e66e468b4 100644 --- a/addons/project/company.py +++ b/addons/project/company.py @@ -28,9 +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/installer.py b/addons/project/installer.py index dd18a2937a2..e35e1b72a6c 100644 --- a/addons/project/installer.py +++ b/addons/project/installer.py @@ -26,29 +26,29 @@ class project_installer(osv.osv_memory): _columns = { # Project Management - 'project_long_term':fields.boolean('Long Term Planning', + 'project_long_term': fields.boolean('Long Term Planning', help="Enables long-term projects tracking, including " "multiple-phase projects and resource allocation handling."), - 'project_wiki':fields.boolean('Specifications in a Wiki', + 'project_wiki': fields.boolean('Specifications in a Wiki', help=""), - 'hr_timesheet_sheet':fields.boolean('Timesheets', + 'hr_timesheet_sheet': fields.boolean('Timesheets', help="Tracks and helps employees encode and validate timesheets " "and attendance."), - 'hr_timesheet_invoice':fields.boolean('Invoice Based on Hours', + 'hr_timesheet_invoice': fields.boolean('Invoice Based on Hours', help="Helps generate invoice based on based on human resources " "costs and general expenses."), - 'account_budget':fields.boolean('Budgets', + 'account_budget': fields.boolean('Budgets', help="Helps accountants manage analytic and crossover budgets."), - 'project_messages':fields.boolean('Project Messages', + 'project_messages': fields.boolean('Project Messages', help="Lets employees send messages to other members of the " "projects they're working on."), - 'project_crm':fields.boolean('Issues Tracker', + 'project_crm': fields.boolean('Issues Tracker', help="Automatically synchronizes project tasks and crm cases."), # Methodologies - 'scrum':fields.boolean('SCRUM', + 'scrum': fields.boolean('SCRUM', help="Implements and tracks the concepts and task types defined " "in the SCRUM methodology."), - 'project_gtd':fields.boolean('Getting Things Done', + 'project_gtd': fields.boolean('Getting Things Done', help="Embeds the Getting Things Done concepts into OpenERP's " "project management."), } @@ -56,3 +56,5 @@ class project_installer(osv.osv_memory): 'project_crm': True, } project_installer() + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/project/project.py b/addons/project/project.py index 07349e81c4d..169a2043b20 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -19,7 +19,6 @@ # ############################################################################## from lxml import etree -import mx.DateTime import datetime import time @@ -37,7 +36,7 @@ class project_task_type(osv.osv): _order = 'sequence' _defaults = { - 'sequence': lambda *args: 1 + 'sequence': 1 } project_task_type() @@ -61,7 +60,9 @@ 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=None): + if context is None: + 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 @@ -71,7 +72,9 @@ class project(osv.osv): return super(project, self).check_recursion(cursor, user, ids, parent=parent) - def onchange_partner_id(self, cr, uid, ids, part, context={}): + def onchange_partner_id(self, cr, uid, ids, part=False, context=None): + if context is None: + context = {} partner_obj = self.pool.get('res.partner') if not part: return {'value':{'contact_id': False, 'pricelist_id': False}} @@ -80,7 +83,9 @@ class project(osv.osv): 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}} - def _progress_rate(self, cr, uid, ids, names, arg, context={}): + def _progress_rate(self, cr, uid, ids, names, arg, context=None): + if context is None: + context = {} res = {}.fromkeys(ids, 0.0) progress = {} if not ids: @@ -118,11 +123,12 @@ class project(osv.osv): if proj.tasks: raise osv.except_osv(_('Operation Not Permitted !'), _('You can not delete a project with tasks. I suggest you to deactivate it.')) return super(project, self).unlink(cr, uid, ids, *args, **kwargs) + _columns = { 'complete_name': fields.function(_complete_name, method=True, string="Project Name", type='char', size=250), 'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the project without removing it."), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of Projects."), - 'category_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."), + 'category_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."), 'priority': fields.integer('Sequence', help="Gives the sequence order when displaying a list of task"), 'warn_manager': fields.boolean('Warn Manager', help="If you check this field, the project manager will receive a request each time a task is completed by his team."), 'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project Members', help="Project's member. Not used in any computation, just for information purpose."), @@ -135,17 +141,17 @@ 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."), '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."), 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages'), - 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.'), + 'project_escalation_id': fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.'), } _order = "sequence" _defaults = { - 'active': lambda *a: True, - 'priority': lambda *a: 1, - 'sequence': lambda *a: 10, - 'warn_manager': lambda *a: True, + 'active': True, + 'priority': 1, + 'sequence': 10, + 'warn_manager': True, } def _check_dates(self, cr, uid, ids): - leave = self.read(cr, uid, ids[0],['date_start','date']) + leave = self.read(cr, uid, ids[0], ['date_start', 'date']) if leave['date_start'] and leave['date']: if leave['date_start'] > leave['date']: return False @@ -162,31 +168,33 @@ class project(osv.osv): (_check_dates, 'Error! project start-date must be lower then project end-date.', ['date_start', 'date']), (_check_escalation, 'Error! You cannot assign escalation to the same project!', ['project_escalation_id']) ] - def set_template(self, cr, uid, ids, context={}): + def set_template(self, cr, uid, ids, context=None): res = self.setActive(cr, uid, ids, value=False, context=context) return res - def set_done(self, cr, uid, ids, context={}): + def set_done(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'close'}, context=context) return True - def set_cancel(self, cr, uid, ids, context={}): + def set_cancel(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'cancelled'}, context=context) return True - def set_pending(self, cr, uid, ids, context={}): + def set_pending(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'pending'}, context=context) return True - def set_open(self, cr, uid, ids, context={}): + def set_open(self, cr, uid, ids, context=None): self.write(cr, uid, ids, {'state':'open'}, context=context) return True - def reset_project(self, cr, uid, ids, context={}): - res = self.setActive(cr, uid, ids,value=True, context=context) + def reset_project(self, cr, uid, ids, context=None): + 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=None): + if context is None: + context = {} proj = self.browse(cr, uid, id, context=context) default = default or {} context['active_test'] = False @@ -199,13 +207,15 @@ class project(osv.osv): cr.execute('update project_task set active=True where project_id IN %s',(tuple(ids),)) return res - def duplicate_template(self, cr, uid, ids, context={}): + def duplicate_template(self, cr, uid, ids, context=None): + if context is None: + context = {} project_obj = self.pool.get('project.project') data_obj = self.pool.get('ir.model.data') task_obj = self.pool.get('project.task') result = [] for proj in self.browse(cr, uid, ids, context=context): - parent_id = context.get('parent_id',False) # check me where to pass context for parent id ?? + parent_id = context.get('parent_id', False) # check me where to pass context for parent id ?? context.update({'analytic_project_copy': True}) new_id = project_obj.copy(cr, uid, proj.id, default = { 'name': proj.name +_(' (copy)'), @@ -233,7 +243,7 @@ class project(osv.osv): 'view_mode': 'form,tree', 'res_model': 'project.project', 'view_id': False, - 'res_id' : res_id, + 'res_id': res_id, 'views': [(form_view['res_id'],'form'),(tree_view['res_id'],'tree')], 'type': 'ir.actions.act_window', 'search_view_id': search_view['res_id'], @@ -242,9 +252,13 @@ class project(osv.osv): # return result # set active value for a project, its sub projects and its tasks - def setActive(self, cr, uid, ids, value=True, context={}): + def setActive(self, cr, uid, ids, value=True, context=None): + if context is None: + context = {} task_obj = self.pool.get('project.task') - for proj in self.browse(cr, uid, ids, context): + for proj in self.browse(cr, uid, ids, context=None): + if context is None: + 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()] @@ -252,7 +266,9 @@ class project(osv.osv): 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) + self.setActive(cr, uid, child_ids, value, context=None) + if context is None: + context = {} return True project() @@ -262,13 +278,17 @@ class task(osv.osv): _log_create = True _date_name = "date_start" - def _str_get(self, task, level=0, border='***', context={}): + def _str_get(self, task, level=0, border='***', context=None): + if context is None: + context = {} return border+' '+(task.user_id and task.user_id.name.upper() or '')+(level and (': L'+str(level)) or '')+(' - %.1fh / %.1fh'%(task.effective_hours or 0.0,task.planned_hours))+' '+border+'\n'+ \ border[0]+' '+(task.name or '')+'\n'+ \ (task.description or '')+'\n\n' # Compute: effective_hours, total_hours, progress def _hours_get(self, cr, uid, ids, field_names, args, context=None): + if context is None: + context = {} res = {} cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),)) hours = dict(cr.fetchall()) @@ -277,17 +297,17 @@ class task(osv.osv): res[task.id]['progress'] = 0.0 if (task.remaining_hours + hours.get(task.id, 0.0)): if task.state != 'done': - res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 99.99),2) + res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 99.99), 2) - if task.state in ('done','cancel'): + if task.state in ('done', 'cancel'): res[task.id]['progress'] = 100.0 res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours 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={}): + def _default_project(self, cr, uid, context=None): if 'project_id' in context and context['project_id']: return int(context['project_id']) return False @@ -296,17 +316,21 @@ class task(osv.osv): # ('remaining_hours', 'CHECK (remaining_hours>=0)', 'Please increase and review remaining hours ! It can not be smaller than 0.'), #] - def copy_data(self, cr, uid, id, default={},context={}): + def copy_data(self, cr, uid, id, default={}, context=None): + if context is None: + context = {} default = default or {} default['work_ids'] = [] return super(task, self).copy_data(cr, uid, id, default, context) - 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']: + def _check_dates(self, cr, uid, ids, context=None): + if context is None: + 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 - return True + return True _columns = { 'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the task without removing it."), @@ -334,19 +358,19 @@ class task(osv.osv): 'delay_hours': fields.function(_hours_get, method=True, string='Delay Hours', multi='hours', store=True, help="Computed as difference of the time estimated by the project manager and the real time to close the task."), 'user_id': fields.many2one('res.users', 'Assigned to'), - 'delegated_user_id': fields.related('child_ids','user_id',type='many2one', relation='res.users', string='Delegated To'), + 'delegated_user_id': fields.related('child_ids', 'user_id', type='many2one', relation='res.users', string='Delegated To'), 'partner_id': fields.many2one('res.partner', 'Partner'), 'work_ids': fields.one2many('project.task.work', 'task_id', 'Work done'), - 'manager_id': fields.related('project_id','category_id','user_id', type='many2one', relation='res.users', string='Project Manager'), + 'manager_id': fields.related('project_id', 'category_id', 'user_id', type='many2one', relation='res.users', string='Project Manager'), 'company_id': fields.many2one('res.company', 'Company'), } _defaults = { - 'state': lambda *a: 'draft', - 'priority': lambda *a: '2', - 'progress': lambda *a: 0, - 'sequence': lambda *a: 10, - 'active': lambda *a: True, - 'date_start': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'), + 'state': 'draft', + 'priority': '2', + 'progress': 0, + 'sequence': 10, + 'active': True, + 'date_start': 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) } @@ -360,6 +384,8 @@ class task(osv.osv): # def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): users_obj = self.pool.get('res.users') + if context is None: + context = {} obj_tm = users_obj.browse(cr, uid, uid, context).company_id.project_time_mode_id tm = obj_tm and obj_tm.name or 'Hours' @@ -519,11 +545,11 @@ class project_work(osv.osv): 'task_id': fields.many2one('project.task', 'Task', ondelete='cascade', required=True), 'hours': fields.float('Time Spent'), 'user_id': fields.many2one('res.users', 'Done by', required=True), - 'company_id': fields.related('task_id','company_id',type='many2one',relation='res.company',string='Company',store=True) + '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, - 'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S') + 'date': time.strftime('%Y-%m-%d %H:%M:%S') } _order = "date desc" def create(self, cr, uid, vals, *args, **kwargs): @@ -533,7 +559,9 @@ class project_work(osv.osv): cr.execute('update project_task set remaining_hours=remaining_hours - %s where id=%s', (vals.get('hours',0.0), vals['task_id'])) return super(project_work,self).create(cr, uid, vals, *args, **kwargs) - def write(self, cr, uid, ids,vals,context={}): + def write(self, cr, uid, ids, vals, context=None): + if context is None: + context = {} if 'hours' in vals and (not vals['hours']): vals['hours'] = 0.00 if 'hours' in vals: @@ -544,7 +572,7 @@ class project_work(osv.osv): def unlink(self, cr, uid, ids, *args, **kwargs): for work in self.browse(cr, uid, ids): cr.execute('update project_task set remaining_hours=remaining_hours + %s where id=%s', (work.hours, work.task_id.id)) - return super(project_work,self).unlink(cr, uid, ids,*args, **kwargs) + return super(project_work,self).unlink(cr, uid, ids, *args, **kwargs) project_work() class config_compute_remaining(osv.osv_memory): @@ -552,7 +580,7 @@ class config_compute_remaining(osv.osv_memory): def _get_remaining(self,cr, uid, ctx): task_obj = self.pool.get('project.task') if 'active_id' in ctx: - return task_obj.browse(cr,uid,ctx['active_id'],context=ctx).remaining_hours + return task_obj.browse(cr, uid, ctx['active_id'], context=ctx).remaining_hours return False _columns = { @@ -603,15 +631,17 @@ class message(osv.osv): 'description': fields.text('Description'), } - def _default_project(self, cr, uid, context={}): + def _default_project(self, cr, uid, context=None): + if context is None: + context = {} if 'project_id' in context and context['project_id']: return int(context['project_id']) return False _defaults = { - 'user_id' : lambda self,cr,uid,ctx : uid, - 'date' : lambda self,cr,uid,ctx : time.strftime('%Y-%m-%d'), - 'project_id':_default_project + 'user_id': lambda self,cr,uid,ctx: uid, + 'date': lambda self,cr,uid,ctx: time.strftime('%Y-%m-%d'), + 'project_id': _default_project } message() @@ -637,4 +667,5 @@ class account_analytic_account(osv.osv): return super(account_analytic_account, self).create(cr, uid, vals, context=context) account_analytic_account() + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index 2addd68fa19..a931c96f635 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -8,9 +8,11 @@ Project project.project + Project task project.task + diff --git a/addons/project/project_installer.xml b/addons/project/project_installer.xml index f7c46066178..12510f8b944 100644 --- a/addons/project/project_installer.xml +++ b/addons/project/project_installer.xml @@ -10,10 +10,8 @@
Project Modules Installation
- - Project Management + Project Management @@ -55,6 +53,7 @@ 3 + ir.actions.todo project_installer_action_replace diff --git a/addons/project/project_mailgate.py b/addons/project/project_mailgate.py index 5409aa4e752..b057c98b03d 100644 --- a/addons/project/project_mailgate.py +++ b/addons/project/project_mailgate.py @@ -77,7 +77,9 @@ class project_tasks(osv.osv): getattr(self,act)(cr, uid, [id]) return True - def message_followers(self, cr, uid, ids, context={}): + def message_followers(self, cr, uid, ids, context=None): + if context is None: + context = {} res = [] if isinstance(ids, (str, int, long)): select = [ids] diff --git a/addons/project/project_resource.py b/addons/project/project_resource.py index 478fd4316bc..8ff68c94ea8 100644 --- a/addons/project/project_resource.py +++ b/addons/project/project_resource.py @@ -1,9 +1,10 @@ import pooler import datetime -def timeformat_convert(cr, uid, time_string, context={}): +def timeformat_convert(cr, uid, time_string, context=None): # Function to convert input time string:: 8.5 to output time string 8:30 - + if context is None: + context = {} split_list = str(time_string).split('.') hour_part = split_list[0] mins_part = split_list[1] @@ -78,4 +79,4 @@ def compute_working_calendar(cr,uid,calendar_id): if non_working: wktime_cal.append((non_working[:-1],time_range)) - return wktime_cal \ No newline at end of file + return wktime_cal diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index ef7bb92d1d6..ad28bda6d6a 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -42,7 +42,6 @@ - @@ -517,6 +516,7 @@ form + @@ -545,7 +545,6 @@ - res.users.project.form1 diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index ff8d2b2dfc1..fec1052b28b 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -29,14 +29,14 @@ class report_project_task_user(osv.osv): _columns = { 'name': fields.char('Task Summary', size=128, readonly=True), 'day': fields.char('Day', size=128, readonly=True), - 'year': fields.char('Year',size=64,required=False, readonly=True), - 'user_id':fields.many2one('res.users', 'Assigned To', readonly=True), + 'year': fields.char('Year', size=64, required=False, readonly=True), + 'user_id': fields.many2one('res.users', 'Assigned To', readonly=True), 'date_start': fields.date('Starting Date',readonly=True), 'no_of_days': fields.integer('# of Days', size=128, readonly=True), - 'description': fields.text('Description',readonly=True), - 'date_end': fields.date('Ending Date',readonly=True), - 'date_deadline': fields.date('Deadline',readonly=True), - 'project_id':fields.many2one('project.project', 'Project', readonly=True), + 'description': fields.text('Description', readonly=True), + 'date_end': fields.date('Ending Date', readonly=True), + 'date_deadline': fields.date('Deadline', readonly=True), + 'project_id': fields.many2one('project.project', 'Project', readonly=True), 'hours_planned': fields.float('Planned Hours', readonly=True), 'hours_effective': fields.float('Effective Hours', readonly=True), 'hours_delay': fields.float('Avg. Plan.-Eff.', readonly=True), @@ -49,32 +49,21 @@ class report_project_task_user(osv.osv): help="Number of Days to Open the task"), 'delay_endings_days': fields.float('Overpassed Deadline', digits=(16,2), readonly=True), 'nbr': fields.integer('# of tasks', readonly=True), - 'priority' : fields.selection([('4','Very Low'), - ('3','Low'), - ('2','Medium'), - ('1','Urgent'), - ('0','Very urgent')], - 'Importance',readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), - ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True), - 'state': fields.selection([ - ('draft', 'Draft'), - ('open', 'In Progress'), - ('pending', 'Pending'), - ('cancelled', 'Cancelled'), - ('done', 'Done')], - 'State', readonly=True), - 'company_id': fields.many2one('res.company', 'Company',readonly=True, groups="base.group_multi_company"), - 'partner_id': fields.many2one('res.partner', 'Partner',readonly=True), - 'type': fields.many2one('project.task.type', 'Stage',readonly=True), - + 'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), +('0','Very urgent')], 'Importance', readonly=True), + 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True), + 'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')],'State', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', readonly=True, groups="base.group_multi_company"), + 'partner_id': fields.many2one('res.partner', 'Partner', readonly=True), + 'type': fields.many2one('project.task.type', 'Stage', readonly=True), } _order = 'name desc, project_id' + def init(self, cr): tools.sql.drop_view_if_exists(cr, 'report_project_task_user') cr.execute(""" - create view report_project_task_user as - select + CREATE view report_project_task_user as + SELECT (select 1 ) AS nbr, t.id as id, to_char(date_start, 'YYYY') as year, @@ -102,9 +91,9 @@ class report_project_task_user(osv.osv): (extract('epoch' from (t.date_end-t.create_date)))/(3600*24) as closing_days, (extract('epoch' from (t.date_start-t.create_date)))/(3600*24) as opening_days, (extract('epoch' from (t.date_deadline-t.date_end)))/(3600*24) as delay_endings_days - from project_task t + FROM project_task t - group by + GROUP BY t.id, remaining_hours, t.effective_hours, @@ -139,37 +128,38 @@ class project_vs_remaining_hours(osv.osv): _columns = { 'project': fields.char('Project', size=128, required=True), 'remaining_hours': fields.float('Remaining Hours', readonly=True), - 'state': fields.selection([('draft','Draft'),('open','Open'), ('pending','Pending'),('cancelled', 'Cancelled'),('close','Close'),('template', 'Template')], 'State', required=True,readonly=True) + 'state': fields.selection([('draft','Draft'),('open','Open'), ('pending','Pending'),('cancelled', 'Cancelled'),('close','Close'),('template', 'Template')], 'State', required=True, readonly=True) } _order = 'project desc' + def init(self, cr): tools.sql.drop_view_if_exists(cr, 'project_vs_remaining_hours') cr.execute(""" - create or replace view project_vs_remaining_hours as ( + CREATE or REPLACE view project_vs_remaining_hours as ( select min(pt.id) as id, aaa.user_id as uid, aaa.name as project, aaa.state, sum(pt.remaining_hours) as remaining_hours - from project_project as pp, + FROM project_project as pp, account_analytic_account as aaa, project_task as pt - where aaa.id=pp.category_id and pt.project_id=pp.id and pp.category_id=aaa.id - group by aaa.user_id,aaa.state,aaa.name + WHERE aaa.id=pp.category_id and pt.project_id=pp.id and pp.category_id=aaa.id + GROUP BY aaa.user_id,aaa.state,aaa.name UNION All - select + SELECT min(pt.id) as id, pur.uid as uid, aaa.name as project, aaa.state, sum(pt.remaining_hours) as remaining_hours - from project_project as pp, + FROM project_project as pp, project_user_rel as pur, account_analytic_account as aaa, project_task as pt - where pur.project_id=pp.id and pt.project_id=pp.id and pp.category_id=aaa.id - group by pur.uid,aaa.state,aaa.name + WHERE pur.project_id=pp.id and pt.project_id=pp.id and pp.category_id=aaa.id + GROUP BY pur.uid,aaa.state,aaa.name ) """) project_vs_remaining_hours() @@ -182,22 +172,23 @@ class task_by_days(osv.osv): 'day': fields.char('Day', size=128, required=True), 'state': fields.selection([('draft', 'Draft'),('open', 'In Progress'),('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True), 'total_task': fields.float('Total tasks', readonly=True), - 'project_id':fields.many2one('project.project','Project') + 'project_id':fields.many2one('project.project', 'Project') } _order = 'day desc' + def init(self, cr): tools.sql.drop_view_if_exists(cr, 'task_by_days') cr.execute(""" - create or replace view task_by_days as ( - select + CREATE or REPLACE view task_by_days as ( + SELECT min(pt.id) as id, to_char(pt.create_date, 'YYYY-MM-DD') as day, count(*) as total_task, pt.state as state, pt.project_id - from + FROM project_task as pt - group by + GROUP BY to_char(pt.create_date, 'YYYY-MM-DD'),pt.state,pt.project_id ) """) diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 48119f307e0..9df6bd1f8ab 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -86,13 +86,13 @@ icon="terp-dialog-close" name="done" domain="[('state','=','done')]"/> - + - + help="My Projects" domain="[('project_id','=',uid)]"/> + - + @@ -144,6 +144,7 @@ {'search_default_month':1,'search_default_project':1,'group_by_no_leaf':1,'group_by':[]} + @@ -181,6 +182,7 @@ [('uid','=',uid)] + task.by.days.tree diff --git a/addons/project/res_partner.py b/addons/project/res_partner.py index f0297cf6a72..351f28cb283 100644 --- a/addons/project/res_partner.py +++ b/addons/project/res_partner.py @@ -22,11 +22,13 @@ from osv import fields,osv class res_partner(osv.osv): + """ Inherits partner and adds CRM information in the partner form """ _inherit = 'res.partner' _columns = { 'task_ids': fields.one2many('project.task', 'partner_id', 'Tasks'), } + res_partner() diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml index dbb28db165e..6071e644f34 100644 --- a/addons/project/security/project_security.xml +++ b/addons/project/security/project_security.xml @@ -5,9 +5,11 @@ Project / Financial Manager + Project / Manager + Project / User diff --git a/addons/project/wizard/project_close_task.py b/addons/project/wizard/project_close_task.py index 00752606bd0..b1cd933a4f7 100644 --- a/addons/project/wizard/project_close_task.py +++ b/addons/project/wizard/project_close_task.py @@ -33,9 +33,11 @@ class project_close_task(osv.osv_memory): _columns = { 'email': fields.char('E-Mail', size=64, help="Email Address"), 'description': fields.text('Description'), - } + } - def _get_email(self, cr, uid, context={}): + def _get_email(self, cr, uid, context=None): + if context is None: + context = {} email = '' if 'task_id' in context: task = self.pool.get('project.task').browse(cr, uid, context['task_id']) @@ -44,7 +46,9 @@ class project_close_task(osv.osv_memory): email = partner_id.address[0].email return email - def _get_desc(self, cr, uid, context={}): + def _get_desc(self, cr, uid, context=None): + if context is None: + context = {} if 'task_id' in context: task = self.pool.get('project.task').browse(cr, uid, context['task_id']) return task.description or task.name @@ -55,7 +59,9 @@ class project_close_task(osv.osv_memory): 'description': _get_desc, } - def confirm(self, cr, uid, ids, context={}): + def confirm(self, cr, uid, ids, context=None): + if context is None: + context = {} if not 'task_id' in context: return {} close_task = self.read(cr, uid, ids[0], []) @@ -88,4 +94,4 @@ class project_close_task(osv.osv_memory): return {} project_close_task() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project/wizard/project_close_task_view.xml b/addons/project/wizard/project_close_task_view.xml index b9bace0aaef..f9206152b25 100644 --- a/addons/project/wizard/project_close_task_view.xml +++ b/addons/project/wizard/project_close_task_view.xml @@ -11,10 +11,10 @@