summaryrefslogtreecommitdiff
path: root/addons/project
diff options
context:
space:
mode:
Diffstat (limited to 'addons/project')
-rw-r--r--addons/project/project.py38
-rw-r--r--addons/project/project_data.xml6
-rw-r--r--addons/project/project_demo.xml2
-rw-r--r--addons/project/project_view.xml14
-rw-r--r--addons/project/report/project_report.py7
-rw-r--r--addons/project/report/project_report.xml1
6 files changed, 40 insertions, 28 deletions
diff --git a/addons/project/project.py b/addons/project/project.py
index 4e2b6c6b17b..ea9c4492fa4 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -41,14 +41,13 @@ class project_task_type(osv.osv):
'case_default': fields.boolean('Default for New Projects',
help="If you check this field, this stage will be proposed by default on each new project. It will not assign this stage to existing projects."),
'project_ids': fields.many2many('project.project', 'project_task_type_rel', 'type_id', 'project_id', 'Projects'),
- 'fold': fields.boolean('Folded by Default',
- help="This stage is not visible, for example in status bar or kanban view, when there are no records in that stage to display."),
+ 'fold': fields.boolean('Folded in Kanban View',
+ help='This stage is folded in the kanban view when'
+ 'there are no records in that stage to display.'),
}
_defaults = {
'sequence': 1,
- 'fold': False,
- 'case_default': False,
'project_ids': lambda self, cr, uid, ctx=None: self.pool['project.task']._get_default_project_id(cr, uid, context=ctx),
}
_order = 'sequence'
@@ -189,6 +188,8 @@ class project(osv.osv):
return res
def _task_count(self, cr, uid, ids, field_name, arg, context=None):
+ """ :deprecated: this method will be removed with OpenERP v8. Use task_ids
+ fields instead. """
if context is None:
context = {}
res = dict.fromkeys(ids, 0)
@@ -265,7 +266,10 @@ class project(osv.osv):
}),
'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report", states={'close':[('readonly',True)]} ),
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}),
- 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"),
+ 'task_count': fields.function(_task_count, type='integer', string="Open Tasks",
+ deprecated="This field will be removed in OpenERP v8. Use task_ids one2many field instead."),
+ 'task_ids': fields.one2many('project.task', 'project_id',
+ domain=[('stage_id.fold', '=', False)]),
'color': fields.integer('Color Index'),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="restrict", required=True,
help="Internal email associated with this project. Incoming emails are automatically synchronized"
@@ -556,8 +560,9 @@ class task(osv.osv):
_mail_post_access = 'read'
_track = {
'stage_id': {
- 'project.mt_task_new': lambda self, cr, uid, obj, ctx=None: obj.stage_id and obj.stage_id.sequence == 1,
- 'project.mt_task_stage': lambda self, cr, uid, obj, ctx=None: obj.stage_id.sequence != 1,
+ # this is only an heuristics; depending on your particular stage configuration it may not match all 'new' stages
+ 'project.mt_task_new': lambda self, cr, uid, obj, ctx=None: obj.stage_id and obj.stage_id.sequence <= 1,
+ 'project.mt_task_stage': lambda self, cr, uid, obj, ctx=None: obj.stage_id.sequence > 1,
},
'user_id': {
'project.mt_task_assigned': lambda self, cr, uid, obj, ctx=None: obj.user_id and obj.user_id.id,
@@ -582,7 +587,7 @@ class task(osv.osv):
def _get_default_stage_id(self, cr, uid, context=None):
""" Gives default stage_id """
project_id = self._get_default_project_id(cr, uid, context=context)
- return self.stage_find(cr, uid, [], project_id, [('sequence', '=', '1')], context=context)
+ return self.stage_find(cr, uid, [], project_id, [('fold', '=', False)], context=context)
def _resolve_project_id_from_context(self, cr, uid, context=None):
""" Returns ID of project based on the value of 'default_project_id'
@@ -994,7 +999,7 @@ class task(osv.osv):
def set_remaining_time(self, cr, uid, ids, remaining_time=1.0, context=None):
for task in self.browse(cr, uid, ids, context=context):
- if (task.stage_id and task.stage_id.sequence == 1) or (task.planned_hours == 0.0):
+ if (task.stage_id and task.stage_id.sequence <= 1) or (task.planned_hours == 0.0):
self.write(cr, uid, [task.id], {'planned_hours': remaining_time}, context=context)
self.write(cr, uid, ids, {'remaining_hours': remaining_time}, context=context)
return True
@@ -1127,7 +1132,8 @@ class task(osv.osv):
def message_new(self, cr, uid, msg, custom_values=None, context=None):
""" Override to updates the document according to the email. """
- if custom_values is None: custom_values = {}
+ if custom_values is None:
+ custom_values = {}
defaults = {
'name': msg.get('subject'),
'planned_hours': 0.0,
@@ -1137,10 +1143,10 @@ class task(osv.osv):
def message_update(self, cr, uid, ids, msg, update_vals=None, context=None):
""" Override to update the task according to the email. """
- if update_vals is None: update_vals = {}
- act = False
+ if update_vals is None:
+ update_vals = {}
maps = {
- 'cost':'planned_hours',
+ 'cost': 'planned_hours',
}
for line in msg['body'].split('\n'):
line = line.strip()
@@ -1153,9 +1159,7 @@ class task(osv.osv):
update_vals[field] = float(res.group(2).lower())
except (ValueError, TypeError):
pass
- if act:
- getattr(self,act)(cr, uid, ids, context=context)
- return super(task,self).message_update(cr, uid, ids, msg, update_vals=update_vals, context=context)
+ return super(task, self).message_update(cr, uid, ids, msg, update_vals=update_vals, context=context)
class project_work(osv.osv):
_name = "project.task.work"
@@ -1243,6 +1247,8 @@ class account_analytic_account(osv.osv):
return analytic_account_id
def write(self, cr, uid, ids, vals, context=None):
+ if isinstance(ids, (int, long)):
+ ids = [ids]
vals_for_project = vals.copy()
for account in self.browse(cr, uid, ids, context=context):
if not vals.get('name'):
diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml
index 0f48dfe9a2b..bc53c4a436f 100644
--- a/addons/project/project_data.xml
+++ b/addons/project/project_data.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
- <data>
+ <data noupdate="1">
<!-- This will set the unit of measure used in projects and tasks.-->
<record id="base.main_company" model="res.company">
<field name="project_time_mode_id" ref="product.product_uom_hour"></field>
@@ -63,14 +63,18 @@
<field name="name">Done</field>
<field name="case_default" eval="True"/>
<field name="fold" eval="True"/>
+ <field name="closed" eval="True"/>
</record>
<record id="project_tt_cancel" model="project.task.type">
<field name="sequence">30</field>
<field name="name">Cancelled</field>
<field name="case_default" eval="True"/>
<field name="fold" eval="True"/>
+ <field name="closed" eval="True"/>
</record>
+ </data>
+ <data>
<!-- Task-related subtypes for messaging / Chatter -->
<record id="mt_task_new" model="mail.message.subtype">
<field name="name">Task Created</field>
diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml
index c58c61448c2..ff225c46e10 100644
--- a/addons/project/project_demo.xml
+++ b/addons/project/project_demo.xml
@@ -4,7 +4,7 @@
<!-- Users -->
<record id="base.user_demo" model="res.users">
- <field name="groups_id" eval="[(4, ref('base.group_sale_salesman')),(4, ref('group_project_user'))]"/>
+ <field name="groups_id" eval="[(4, ref('base.group_sale_salesman')),(4, ref('group_project_manager'))]"/>
</record>
<!-- Categories -->
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 5015d80e01f..0f507c604f2 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -19,7 +19,7 @@
<field name="name" string="Tasks"/>
<field name="categ_ids"/>
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
- <filter string="New" name="draft" domain="[('stage_id.sequence', '=', 1)]"/>
+ <filter string="New" name="draft" domain="[('stage_id.sequence', '&lt;=', 1)]"/>
<separator/>
<filter string="My Tasks" domain="[('user_id','=',uid)]"/>
<separator/>
@@ -239,6 +239,7 @@
<field name="date"/>
<field name="color"/>
<field name="task_count"/>
+ <field name="task_ids"/>
<field name="alias_id"/>
<field name="doc_count"/>
<templates>
@@ -258,9 +259,10 @@
<span class="oe_e oe_e_alias">%%</span><small><field name="alias_id"/></small>
</div>
<div class="oe_kanban_project_list">
- <a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action" style="margin-right: 10px">
- <span t-if="record.task_count.raw_value gt 1"><field name="task_count"/> Tasks</span>
- <span t-if="record.task_count.raw_value lt 2"><field name="task_count"/> Task</span>
+ <a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action" style="margin-right: 10px">
+ <t t-raw="record.task_ids.raw_value.length"/>
+ <span t-if="record.task_ids.raw_value.length == 1">Task</span>
+ <span t-if="record.task_ids.raw_value.length > 1">Tasks</span>
</a>
</div>
<div class="oe_kanban_project_list">
@@ -683,10 +685,10 @@
<group>
<group>
<field name="name"/>
- <field name="case_default"/>
+ <field name="sequence"/>
</group>
<group>
- <field name="sequence"/>
+ <field name="case_default"/>
<field name="fold"/>
</group>
</group>
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index 15b26507ff3..ed086b4318d 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -75,7 +75,7 @@ class report_project_task_user(osv.osv):
date_trunc('day',t.date_last_stage_update) as date_last_stage_update,
to_date(to_char(t.date_deadline, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_deadline,
-- sum(cast(to_char(date_trunc('day',t.date_end) - date_trunc('day',t.date_start),'DD') as int)) as no_of_days,
- abs((extract('epoch' from (t.date_end-t.date_start)))/(3600*24)) as no_of_days,
+ abs((extract('epoch' from (t.write_date-t.date_start)))/(3600*24)) as no_of_days,
t.user_id,
progress as progress,
t.project_id,
@@ -89,9 +89,9 @@ class report_project_task_user(osv.osv):
total_hours as total_hours,
t.delay_hours as hours_delay,
planned_hours as hours_planned,
- (extract('epoch' from (t.date_end-t.create_date)))/(3600*24) as closing_days,
+ (extract('epoch' from (t.write_date-t.create_date)))/(3600*24) as closing_days,
(extract('epoch' from (t.date_start-t.create_date)))/(3600*24) as opening_days,
- abs((extract('epoch' from (t.date_deadline-t.date_end)))/(3600*24)) as delay_endings_days
+ abs((extract('epoch' from (t.date_deadline-t.write_date)))/(3600*24)) as delay_endings_days
FROM project_task t
WHERE t.active = 'true'
GROUP BY
@@ -106,6 +106,7 @@ class report_project_task_user(osv.osv):
month,
day,
create_date,
+ write_date,
date_start,
date_end,
date_deadline,
diff --git a/addons/project/report/project_report.xml b/addons/project/report/project_report.xml
index 59d0fd28220..4ff7e852620 100644
--- a/addons/project/report/project_report.xml
+++ b/addons/project/report/project_report.xml
@@ -17,7 +17,6 @@
<tasks>
<task type="zoom" name="tasks">
<task_name type="field" name="name"/>
- <task_status type="field" name="state" />
<task_descritpion type="field" name="description"/>
<task_sequence type="field" name="sequence"/>
<task_priority type="field" name="priority"/>