diff --git a/CHANGELOG b/CHANGELOG index bca10c5ece..ac2d009e34 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Split duration into simple and total duration + Version 3.6.0 - 2015-04-20 * Bug fixes (see mercurial logs for details) * Add support for PyPy diff --git a/view/work_graph.xml b/view/work_graph.xml index 0e598ba90c..8195458fbf 100644 --- a/view/work_graph.xml +++ b/view/work_graph.xml @@ -6,6 +6,6 @@ this repository contains the full copyright notices and license terms. --> - + diff --git a/view/work_tree2.xml b/view/work_tree2.xml index 81e9d02e2f..9cc87c0b98 100644 --- a/view/work_tree2.xml +++ b/view/work_tree2.xml @@ -3,5 +3,5 @@ this repository contains the full copyright notices and license terms. --> - + diff --git a/work.py b/work.py index a1109c9025..bc803da76e 100644 --- a/work.py +++ b/work.py @@ -38,6 +38,10 @@ class Work(ModelSQL, ModelView): duration = fields.Function(fields.TimeDelta('Timesheet Duration', 'company_work_time', help="Total time spent on this work"), 'get_duration') + total_duration = fields.Function(fields.TimeDelta( + 'Total Timesheet Duration', 'company_work_time', + help='Total time spent on this work and the sub-works'), + 'get_duration') timesheet_available = fields.Boolean('Available on timesheets', help="Allow to fill in timesheets with this work") timesheet_start_date = fields.Date('Timesheet Start', @@ -103,7 +107,6 @@ class Work(ModelSQL, ModelView): context = transaction.context table_w = cls.__table__() - table_c = cls.__table__() line = Line.__table__() ids = [w.id for w in works] durations = dict.fromkeys(ids, None) @@ -114,13 +117,20 @@ class Work(ModelSQL, ModelView): where &= line.date <= context['to_date'] if context.get('employees'): where &= line.employee.in_(context['employees']) + + if name == 'duration': + query_table = table_w.join(line, 'LEFT', + condition=line.work == table_w.id) + else: + table_c = cls.__table__() + query_table = table_w.join(table_c, + condition=(table_c.left >= table_w.left) + & (table_c.right <= table_w.right) + ).join(line, 'LEFT', condition=line.work == table_c.id) + for sub_ids in grouped_slice(ids): red_sql = reduce_ids(table_w.id, sub_ids) - cursor.execute(*table_w.join(table_c, - condition=(table_c.left >= table_w.left) - & (table_c.right <= table_w.right) - ).join(line, 'LEFT', condition=line.work == table_c.id - ).select(table_w.id, Sum(line.duration), + cursor.execute(*query_table.select(table_w.id, Sum(line.duration), where=red_sql & where, group_by=table_w.id)) for work_id, duration in cursor.fetchall():