Improved Progress Computation
bzr revid: fp@tinyerp.com-20080904171605-9ytoj3qyp25mkn27
This commit is contained in:
parent
07b1f0b9da
commit
ffa0ca45d6
|
@ -92,38 +92,43 @@ class project(osv.osv):
|
|||
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, cursor, user, ids, name, arg, context=None):
|
||||
res = {}
|
||||
for project in self.browse(cursor, user, ids, context=context):
|
||||
tot = 0.0
|
||||
if project.state not in ('cancelled'):
|
||||
try:
|
||||
tot += project.effective_hours * 100.0 / project.planned_hours
|
||||
except:
|
||||
pass
|
||||
res[project.id] = tot
|
||||
def _progress_rate(self, cr, uid, ids, name, arg, context=None):
|
||||
res = {}.fromkeys(ids, 0.0)
|
||||
if not ids:
|
||||
return res
|
||||
cr.execute('''SELECT
|
||||
project_id, sum(progress*planned_hours), sum(planned_hours)
|
||||
FROM
|
||||
project_task
|
||||
WHERE
|
||||
project_id in ('''+','.join(map(str,ids))+''') AND
|
||||
state<>'cancelled'
|
||||
GROUP BY
|
||||
project_id''')
|
||||
for id,prog,tot in cr.fetchall():
|
||||
if tot:
|
||||
res[id] = prog / tot
|
||||
return res
|
||||
|
||||
|
||||
_columns = {
|
||||
'name': fields.char("Project name", size=128, required=True),
|
||||
'name': fields.char("Project Name", size=128, required=True),
|
||||
'active': fields.boolean('Active'),
|
||||
'category_id': fields.many2one('account.analytic.account','Analytic Account'),
|
||||
'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 ables to connect projects with budgets, plannings, costs and revenues analysis, timesheet on projects, etc."),
|
||||
'priority': fields.integer('Sequence'),
|
||||
'manager': fields.many2one('res.users', 'Project manager'),
|
||||
'warn_manager': fields.boolean('Warn manager'),
|
||||
'members': fields.many2many('res.users', 'project_user_rel', 'project_id', 'uid', 'Project members'),
|
||||
'manager': fields.many2one('res.users', 'Project Manager'),
|
||||
'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'),
|
||||
'tasks': fields.one2many('project.task', 'project_id', "Project tasks"),
|
||||
'parent_id': fields.many2one('project.project', 'Parent project'),
|
||||
'parent_id': fields.many2one('project.project', 'Parent Project'),
|
||||
'child_id': fields.one2many('project.project', 'parent_id', 'Subproject'),
|
||||
'planned_hours': fields.function(_calc_planned, method=True, string='Planned hours'),
|
||||
'effective_hours': fields.function(_calc_effective, method=True, string='Hours spent'),
|
||||
'progress_rate': fields.function(_progress_rate, method=True, string='Progress', type='float'),
|
||||
'date_start': fields.date('Project started on'),
|
||||
'date_end': fields.date('Project should end on'),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer'),
|
||||
'progress_rate': fields.function(_progress_rate, method=True, string='Progress', type='float', help="Percent of tasks closed according to the total of tasks todo."),
|
||||
'date_start': fields.date('Starting Date'),
|
||||
'date_end': fields.date('Expected End'),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'contact_id': fields.many2one('res.partner.address', 'Contact'),
|
||||
'warn_customer': fields.boolean('Warn customer'),
|
||||
'warn_customer': fields.boolean('Warn Partner'),
|
||||
'warn_header': fields.text('Mail header'),
|
||||
'warn_footer': fields.text('Mail footer'),
|
||||
'notes': fields.text('Notes'),
|
||||
|
@ -208,18 +213,6 @@ class task(osv.osv):
|
|||
res[task_id] = sum
|
||||
return res
|
||||
|
||||
def _progress_rate(self, cursor, user, ids, name, arg, context=None):
|
||||
res = {}
|
||||
for task in self.browse(cursor, user, ids, context=context):
|
||||
if task.state in ('cancelled','done'):
|
||||
res[task.id] = 100.0
|
||||
else:
|
||||
if task.planned_hours:
|
||||
res[task.id] = task.effective_hours * 100.0 / task.planned_hours
|
||||
else:
|
||||
res[task.id] = 0.0
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'active': fields.boolean('Active'),
|
||||
'name': fields.char('Task summary', size=128, required=True),
|
||||
|
@ -239,10 +232,9 @@ class task(osv.osv):
|
|||
'start_sequence': fields.boolean('Wait for previous sequences'),
|
||||
'planned_hours': fields.float('Plan. hours'),
|
||||
'effective_hours': fields.function(_hours_effect, method=True, string='Eff. Hours'),
|
||||
'progress_rate': fields.function(_progress_rate, method=True, string='Progress', type='float'),
|
||||
'progress': fields.integer('Progress (0-100)'),
|
||||
'user_id': fields.many2one('res.users', 'Assigned to'),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer'),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'work_ids': fields.one2many('project.task.work', 'task_id', 'Work done'),
|
||||
}
|
||||
_defaults = {
|
||||
|
@ -312,7 +304,7 @@ class task(osv.osv):
|
|||
'ref_doc1': 'project.task,%d' % task.id,
|
||||
'ref_doc2': 'project.project,%d' % project.id,
|
||||
})
|
||||
self.write(cr, uid, [task.id], {'state': 'cancelled'})
|
||||
self.write(cr, uid, [task.id], {'state': 'cancelled', 'progress':100})
|
||||
return True
|
||||
|
||||
def do_open(self, cr, uid, ids, *args):
|
||||
|
|
|
@ -11,20 +11,23 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Project">
|
||||
<notebook>
|
||||
<group colspan="4" col="6">
|
||||
<field name="name" select="1"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="manager" select="1"/>
|
||||
<field name="date_start"/>
|
||||
<field name="date_end"/>
|
||||
<field name="progress_rate" widget="progressbar"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Administration">
|
||||
<field name="name" select="1"/>
|
||||
<field name="priority"/>
|
||||
<group col="3" colspan="2">
|
||||
<field name="active" select="2"/>
|
||||
<button name="toggleActive" string="Toggle activity" type="object"/>
|
||||
</group>
|
||||
<field name="manager" select="1"/>
|
||||
<field name="warn_manager"/>
|
||||
<newline/>
|
||||
<field name="priority"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="date_start"/>
|
||||
<field name="date_end"/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
<field name="timesheet_id"/>
|
||||
|
@ -36,11 +39,12 @@
|
|||
<field colspan="4" name="partner_id" on_change="onchange_partner_id(partner_id)" select="1"/>
|
||||
<field domain="[('partner_id','=',partner_id)]" name="contact_id" select="2"/>
|
||||
<field name="category_id" select="2"/>
|
||||
<field name="pricelist_id"/>
|
||||
<field name="warn_customer"/>
|
||||
<separator colspan="4" string="Mail texts"/>
|
||||
<field name="warn_header"/>
|
||||
<field name="warn_footer"/>
|
||||
<newline/>
|
||||
<separator colspan="2" string="Mail Header"/>
|
||||
<separator colspan="2" string="Mail Footer"/>
|
||||
<field name="warn_header" nolabel="1" colspan="2"/>
|
||||
<field name="warn_footer" nolabel="1" colspan="2"/>
|
||||
<group col="3" colspan="4">
|
||||
<label string="Task: %%(name)s"/>
|
||||
<label string="User: %%(user_id)s"/>
|
||||
|
@ -49,76 +53,6 @@
|
|||
<label string="Date Start: %%(date_start)s"/>
|
||||
<label string="Date Stop: %%(date_stop)s"/>
|
||||
</group>
|
||||
<separator colspan="4" string="Taxes"/>
|
||||
<field colspan="4" name="tax_ids" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Tasks">
|
||||
<field colspan="4" name="tasks" nolabel="1" widget="one2many_list">
|
||||
<form string="Task edition">
|
||||
<notebook>
|
||||
<page string="Task definition">
|
||||
<separator colspan="4" string="Task Information"/>
|
||||
<field name="name" select="1"/>
|
||||
<field name="active" select="1"/>
|
||||
<field name="sequence"/>
|
||||
<field name="priority" select="1"/>
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="date_deadline" select="1"/>
|
||||
<field name="date_start" select="1"/>
|
||||
<field name="date_close" select="1"/>
|
||||
<field name="progress"/>
|
||||
<newline/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
<separator colspan="4" string="Description"/>
|
||||
<field colspan="4" name="description" nolabel="1"/>
|
||||
|
||||
<group col="11" colspan="4">
|
||||
<field name="state" select="1"/>
|
||||
<button name="do_draft" states="open" string="Set Draft" type="object"/>
|
||||
<button name="do_open" states="pending,draft" string="Open task" type="object"/>
|
||||
<button name="do_reopen" states="done,cancelled" string="Re-open" type="object"/>
|
||||
<button name="do_pending" states="open" string="Set pending" type="object"/>
|
||||
<button name="%(wizard_close_task)d" states="pending,open" string="Done" type="action"/>
|
||||
<button groups="base.group_extended" name="%(wizard_delegate_task)d" states="pending,open" string="Delegate" type="action"/>
|
||||
<button name="do_cancel" states="draft,open,pending" string="Cancel" type="object"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Work done">
|
||||
<separator colspan="4" string="Work done"/>
|
||||
<field colspan="4" name="work_ids" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Others">
|
||||
<separator colspan="4" string="Notes"/>
|
||||
<field colspan="4" name="notes" nolabel="1"/>
|
||||
<newline/>
|
||||
<field name="type"/>
|
||||
<field name="start_sequence"/>
|
||||
<field colspan="4" name="child_ids" nolabel="1">
|
||||
<tree string="Delegated tasks">
|
||||
<field name="name"/>
|
||||
<field name="user_id"/>
|
||||
<field name="date_deadline"/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
<field colspan="4" name="parent_id"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
<tree colors="red:date_deadline<current_date and state=='draft';blue:date_deadline==current_date and state=='draft';grey:state=='cancel' or state=='close'" string="All tasks">
|
||||
<field name="sequence"/>
|
||||
<field name="name"/>
|
||||
<field name="user_id"/>
|
||||
<field name="date_deadline"/>
|
||||
<field name="progress_rate" widget="progressbar"/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field colspan="4" name="notes" nolabel="1"/>
|
||||
|
@ -154,6 +88,16 @@
|
|||
</record>
|
||||
<menuitem action="open_view_all_project" id="menu_all_project" parent="project.menu_main"/>
|
||||
|
||||
<record id="open_view_project" model="ir.actions.act_window">
|
||||
<field name="name">New Project</field>
|
||||
<field name="res_model">project.project</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form,tree,calendar</field>
|
||||
<field name="view_id" eval="False"/>
|
||||
</record>
|
||||
<menuitem action="open_view_project" id="menu_open_view_project" parent="menu_all_project"/>
|
||||
|
||||
|
||||
<record id="open_view_all_project_unclosed" model="ir.actions.act_window">
|
||||
<field name="name">Unclosed projects</field>
|
||||
<field name="res_model">project.project</field>
|
||||
|
@ -184,15 +128,6 @@
|
|||
<menuitem id="next_id_54" name="Projects" parent="project.menu_definitions"/><menuitem action="open_view_project_open" id="menu_open_view_project_open" parent="next_id_54"/>
|
||||
|
||||
|
||||
<record id="open_view_project" model="ir.actions.act_window">
|
||||
<field name="name">Projects</field>
|
||||
<field name="res_model">project.project</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="domain">[]</field>
|
||||
<field name="view_id" ref="view_project"/>
|
||||
</record>
|
||||
<menuitem action="open_view_project" id="menu_open_view_project" parent="project.menu_definitions"/>
|
||||
|
||||
<record id="view_task_work_form" model="ir.ui.view">
|
||||
<field name="name">project.task.work.form</field>
|
||||
<field name="model">project.task.work</field>
|
||||
|
@ -274,14 +209,14 @@
|
|||
<field eval="2" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Task edition">
|
||||
<notebook>
|
||||
<field name="name" select="1"/>
|
||||
<field name="project_id" required="1" select="1"/>
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<notebook colspan="4">
|
||||
<page string="Information">
|
||||
<field name="name" select="1"/>
|
||||
<field name="project_id" required="1" select="1"/>
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="priority"/>
|
||||
<field name="date_deadline" select="2"/>
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="priority"/>
|
||||
<separator colspan="4" string="Description"/>
|
||||
<field colspan="4" name="description" nolabel="1" select="2"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
|
@ -341,9 +276,9 @@
|
|||
<field name="project_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="date_deadline"/>
|
||||
<field name="progress_rate" widget="progressbar"/>
|
||||
<field name="planned_hours" sum="Planned hours" widget="float_time"/>
|
||||
<field name="effective_hours" sum="Effective hours" widget="float_time"/>
|
||||
<field name="progress" widget="progressbar"/>
|
||||
<field name="priority"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
|
@ -491,7 +426,23 @@
|
|||
|
||||
<act_window domain="[('manager', '=', active_id)]" id="act_res_users_2_project_project" name="User's projects" res_model="project.project" src_model="res.users" view_mode="tree,form" view_type="form"/>
|
||||
|
||||
<act_window domain="[('project_id', '=', active_id),('state', '<>', 'cancelled'),('state', '<>', 'done')]" id="act_project_project_2_project_task_opened" name="Opened tasks" res_model="project.task" src_model="project.project" view_mode="tree,form" view_type="form"/>
|
||||
<act_window
|
||||
domain="[('project_id', '=', active_id)]"
|
||||
id="act_project_project_2_project_task_all"
|
||||
name="All Tasks"
|
||||
res_model="project.task"
|
||||
src_model="project.project"
|
||||
view_mode="tree,form,calendar"
|
||||
view_type="form"/>
|
||||
|
||||
<act_window
|
||||
domain="[('project_id', '=', active_id),('state', '<>', 'cancelled'),('state', '<>', 'done')]"
|
||||
id="act_project_project_2_project_task_opened"
|
||||
name="Open Tasks"
|
||||
res_model="project.task"
|
||||
src_model="project.project"
|
||||
view_mode="tree,form,calendar"
|
||||
view_type="form"/>
|
||||
|
||||
<act_window domain="[('user_id', '=', active_id),('state', '<>', 'cancelled'),('state', '<>', 'done')]" id="act_res_users_2_project_task_opened" name="Assigned tasks" res_model="project.task" src_model="res.users" view_mode="tree,form" view_type="form"/>
|
||||
|
||||
|
|
Loading…
Reference in New Issue