Added total hours on work types.

This commit is contained in:
Bertrand Chenal
2008-06-03 01:57:48 +02:00
parent 5dd2b286bb
commit cde965c8fc
2 changed files with 127 additions and 0 deletions
+92
View File
@@ -15,6 +15,7 @@ class WorkType(OSV):
active = fields.Boolean('Active')
parent = fields.Many2One('timesheet.work_type', 'Parent', select=2)
childs = fields.One2Many('timesheet.work_type', 'parent', 'Childs')
hours = fields.Function('get_hours', digits=(16, 2), string='Hours')
type = fields.Selection([
('view', 'View'),
('normal', 'Normal'),
@@ -37,6 +38,45 @@ class WorkType(OSV):
res = self.name_get(cursor, user, ids, context=context)
return dict(res)
def _tree_qty(self, hours_by_wt, childs, ids, to_compute):
res = 0
for h in ids:
if (not childs.get(h)) or (not to_compute[h]):
res += hours_by_wt.setdefault(h, 0)
else:
sub_qty = self._tree_qty(
hours_by_wt, childs, childs[h], to_compute)
hours_by_wt.setdefault(h, 0)
hours_by_wt[h] += sub_qty
res += hours_by_wt[h]
to_compute[h] = False
return res
def get_hours(self, cursor, user, ids, name, arg, context=None):
all_ids = self.search(cursor, user, [('parent', 'child_of', ids)])
clause = "SELECT work_type, sum(hours) FROM timesheet_line "\
"WHERE work_type IN (%s) "\
% ",".join(["%s" for id in all_ids])
date_cond = ""
if context.get('from_date'):
date_cond = " AND date >= '%s'"% str(context.get('from_date'))
if context.get('to_date'):
date_cond += " AND date <= '%s'"% str(context.get('to_date'))
clause += date_cond + " GROUP BY work_type"
cursor.execute(clause, all_ids)
hours_by_wt = dict([(i[0], i[1]) for i in cursor.fetchall()])
to_compute = dict.fromkeys(all_ids, True)
work_types = self.browse(cursor, user, all_ids, context=context)
childs = {}
for work_type in work_types:
if work_type.parent:
childs.setdefault(work_type.parent.id, []).append(work_type.id)
self._tree_qty(hours_by_wt, childs, ids, to_compute)
return hours_by_wt
def name_get(self, cursor, user, ids, context=None):
if not ids:
return []
@@ -67,3 +107,55 @@ class WorkType(OSV):
return res
WorkType()
class OpenWorkTypeInit(WizardOSV):
_name = 'timesheet.work_type.open.init'
from_date = fields.Date('From Date')
to_date = fields.Date('To Date')
OpenWorkTypeInit()
class OpenWorkType(Wizard):
'Open Work Types'
_name = 'timesheet.work_type.open'
states = {
'init': {
'result': {
'type': 'form',
'object': 'timesheet.work_type.open.init',
'state': [
('end', 'Cancel', 'gtk-cancel'),
('open', 'Open', 'gtk-ok', True),
],
},
},
'open': {
'result': {
'type': 'action',
'action': '_action_open_work_type',
'state': 'end',
},
},
}
def _action_open_work_type(self, cursor, user, data, context=None):
model_data_obj = self.pool.get('ir.model.data')
act_window_obj = self.pool.get('ir.action.act_window')
model_data_ids = model_data_obj.search(cursor, user, [
('fs_id', '=', 'act_work_type_tree2'),
('module', '=', 'timesheet'),
], limit=1, context=context)
model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
context=context)
res = act_window_obj.read(cursor, user, model_data.db_id, context=context)
res['context'] = str({
'from_date': data['form']['from_date'],
'to_date': data['form']['to_date'],
})
return res
OpenWorkType()
+35
View File
@@ -80,6 +80,41 @@
</record>
<menuitem parent="menu_work_type_form" action="act_work_type_tree"
id="menu_work_type_tree"/>
<record model="ir.ui.view" id="work_type_view_tree3">
<field name="model">timesheet.work_type</field>
<field name="type">tree</field>
<field name="priority" eval="16"/>
<field name="field_childs">childs</field>
<field name="arch" type="xml">
<![CDATA[
<tree string="Work Types">
<field name="name" select="1"/>
<field name="type" select="1"/>
<field name="hours"/>
</tree>
]]>
</field>
</record>
<record model="ir.action.act_window" id="act_work_type_tree2">
<field name="name">Work Types</field>
<field name="res_model">timesheet.work_type</field>
<field name="view_type">tree</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view"
id="act_work_type_tree_view2">
<field name="sequence" eval="10"/>
<field name="view" ref="work_type_view_tree3"/>
<field name="act_window" ref="act_work_type_tree2"/>
</record>
<record model="ir.action.wizard" id="act_open_work_type">
<field name="name">Open Work Types</field>
<field name="wiz_name">timesheet.work_type.open</field>
</record>
<menuitem parent="menu_timesheet" action="act_open_work_type"
id="menu_work_type_tree2" icon="STOCK_INDENT" sequence="40"/>
<record model="ir.model.access" id="access_work_type">
<field name="model" search="[('model', '=', 'timesheet.work_type')]"/>
<field name="perm_read" eval="True"/>