view_mode="kanban,tree,form,calendar,graph"
view_type="form"/>
+ <!-- Project Read/Unread actions -->
+ <record id="actions_server_project_unread" model="ir.actions.server">
+ <field name="name">Mark unread</field>
+ <field name="condition">True</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_project_project"/>
+ <field name="state">code</field>
+ <field name="code">self.message_check_and_set_unread(cr, uid, context.get('active_ids'), context=context)</field>
+ </record>
+ <record id="action_project_unread" model="ir.values">
+ <field name="name">action_project_unread</field>
+ <field name="action_id" ref="actions_server_project_unread"/>
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_project_unread'))" />
+ <field name="key">action</field>
+ <field name="model_id" ref="model_project_project" />
+ <field name="model">project.project</field>
+ <field name="key2">client_action_multi</field>
+ </record>
+
+ <record id="actions_server_project_read" model="ir.actions.server">
+ <field name="name">Mark read</field>
+ <field name="condition">True</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_project_project"/>
+ <field name="state">code</field>
+ <field name="code">self.message_check_and_set_read(cr, uid, context.get('active_ids'), context=context)</field>
+ </record>
+ <record id="action_project_read" model="ir.values">
+ <field name="name">action_project_read</field>
+ <field name="action_id" ref="actions_server_project_read"/>
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_project_read'))" />
+ <field name="key">action</field>
+ <field name="model_id" ref="model_project_project" />
+ <field name="model">project.project</field>
+ <field name="key2">client_action_multi</field>
+ </record>
+
<!-- Project -->
<record id="edit_project" model="ir.ui.view">
<field name="name">project.project.form</field>
<form string="Project" version="7.0">
<header>
<button name="set_done" string="Done" type="object" states="open,pending"/>
- <button name="set_open" string="Re-open project" type="object" states="pending,cancelled,close"/>
+ <button name="set_open" string="Re-open project" type="object" states="pending" class="oe_highlight"/>
+ <button name="set_open" string="Re-open project" type="object" states="cancelled,close"/>
<button name="set_pending" string="Pending" type="object" states="open"/>
<button name="set_template" string="Set as Template" type="object" states="open"/>
- <button string="New Project Based on Template" name="duplicate_template" type="object" states="template" context="{'parent_id':parent_id}"/>
- <button name="reset_project" string="Reset as Project" type="object" states="template"/>
+ <button string="New Project Based on Template" name="duplicate_template" type="object" states="template" context="{'parent_id':parent_id}" class="oe_highlight"/>
+ <button name="reset_project" string="Reset as Project" type="object" states="template" class="oe_highlight"/>
<button name="set_cancel" string="Cancel" type="object" states="open,pending"/>
<field name="state" widget="statusbar" statusbar_visible="open,close" statusbar_colors='{"pending":"blue"}' readonly="1"/>
</header>
- <sheet string="Project" >
+ <sheet string="Project">
<field name="analytic_account_id" invisible="1" required="0"/>
<label for="name" class="oe_edit_only" string="Project Name"/>
<h1>
<field name="name" string="Project Name"/>
</h1>
- <label for="parent_id" class="oe_edit_only" string="Parent Project"/>
- <h2>
- <field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
- </h2>
<group>
<group>
- <field name="partner_id" on_change="onchange_partner_id(partner_id)" />
<field name="user_id" string="Project Manager" attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"/>
- <field name="analytic_account_id" invisible="1" required="0"/>
- <field name="parent_id" invisible="1" string="Parent" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
+ <field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="privacy_visibility"/>
+ <field name="analytic_account_id" invisible="1" required="0"/>
</group>
<group>
<table>
<group>
<group string="Administration">
<field name="planned_hours" widget="float_time"/>
- <field name="effective_hours" widget="float_time" />
+ <field name="effective_hours" widget="float_time"/>
<field name="resource_calendar_id"/>
</group>
<group string="Miscellaneous" name="misc">
- <field name="company_id" groups="base.group_multi_company" widget="selection" required="1"/>
+ <field name="company_id" groups="base.group_multi_company" widget="selection" required="1"/>
<field name="priority"/>
<field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
- <field name="currency_id" groups="base.group_multi_company" required="1"/>
+ <field name="currency_id" groups="base.group_multi_company" required="1"/>
+ <field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
</group>
</group>
</page>
</page>
</notebook>
</sheet>
- <footer>
- <field name="message_ids" widget="ThreadView"/>
- </footer>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
</form>
</field>
</record>
<group>
<field name="complete_name" string="Project Name"/>
<separator orientation="vertical"/>
+ <filter icon="terp-mail-message-new"
+ string="Inbox" help="Unread messages"
+ name="needaction_pending"
+ domain="[('needaction_pending','=',True)]"/>
+ <separator orientation="vertical"/>
<filter icon="terp-check" string="Open" name="Current" domain="[('state', '=','open')]" help="Open Projects"/>
<filter icon="gtk-media-pause" string="Pending" name="Pending" domain="[('state', '=','pending')]" help="Pending Projects"/>
<filter icon="gtk-media-pause" string="Template" name="Template" domain="[('state', '=','template')]" help="Templates of Projects"/>
</group>
<newline />
<group expand="0" string="Group By...">
- <filter string="Manager" name="Manager" icon="terp-personal" domain = "[]" context="{'group_by':'user_id'}"/>
- <filter string="Partner" name="Partner" icon="terp-partner" domain = "[]" context="{'group_by':'partner_id'}"/>
+ <filter string="Manager" name="Manager" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
+ <filter string="Partner" name="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
<separator orientation="vertical"/>
- <filter string="Parent" name="Parent" help="Parent" icon="terp-folder-blue" domain = "[]" context="{'group_by':'parent_id'}"/>
+ <filter string="Parent" name="Parent" help="Parent" icon="terp-folder-blue" domain = "[]" context="{'group_by':'parent_id'}"/>
</group>
</search>
</field>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_project oe_kanban_auto_height oe_kanban_global_click">
<div class="oe_dropdown_toggle oe_dropdown_kanban">
- <span class="oe_e">i</span>
+ <span class="oe_e">í</span>
<ul class="oe_dropdown_menu">
<li><a type="edit">Edit...</a></li>
<li><a type="delete">Delete</a></li>
</record>
<!-- Task -->
+
+ <!-- Task Read/Unread actions -->
+ <record id="actions_server_project_task_unread" model="ir.actions.server">
+ <field name="name">Mark unread</field>
+ <field name="condition">True</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_project_task"/>
+ <field name="state">code</field>
+ <field name="code">self.message_check_and_set_unread(cr, uid, context.get('active_ids'), context=context)</field>
+ </record>
+ <record id="action_project_task_unread" model="ir.values">
+ <field name="name">action_project_task_unread</field>
+ <field name="action_id" ref="actions_server_project_task_unread"/>
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_project_task_unread'))" />
+ <field name="key">action</field>
+ <field name="model_id" ref="model_project_task" />
+ <field name="model">project.task</field>
+ <field name="key2">client_action_multi</field>
+ </record>
+
+ <record id="actions_server_project_task_read" model="ir.actions.server">
+ <field name="name">Mark read</field>
+ <field name="condition">True</field>
+ <field name="type">ir.actions.server</field>
+ <field name="model_id" ref="model_project_task"/>
+ <field name="state">code</field>
+ <field name="code">self.message_check_and_set_read(cr, uid, context.get('active_ids'), context=context)</field>
+ </record>
+ <record id="action_project_task_read" model="ir.values">
+ <field name="name">action_project_task_read</field>
+ <field name="action_id" ref="actions_server_project_task_read"/>
+ <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_project_task_read'))" />
+ <field name="key">action</field>
+ <field name="model_id" ref="model_project_task" />
+ <field name="model">project.task</field>
+ <field name="key2">client_action_multi</field>
+ </record>
+
<record id="view_task_form2" model="ir.ui.view">
<field name="name">project.task.form</field>
<field name="model">project.task</field>
<field name="arch" type="xml">
<form string="Project" version="7.0">
<header>
- <!--
- <button name="do_open" string="Start Task" type="object"
- states="draft,pending"/>
- <button name="do_draft" string="Draft" type="object"
- states="cancel,done"/>
- -->
- <button name="%(action_project_task_reevaluate)d" string="Reactivate" type="action"
- states="done,cancelled" context="{'button_reactivate':True}"/>
- <button name="action_close" string="Done" type="object"
- states="draft,open,pending"/>
- <button name="do_pending" string="Pending" type="object"
- states="open"/>
- <button name="%(action_project_task_delegate)d" string="Delegate" type="action"
- states="pending,open,draft" groups="project.group_delegate_task"/>
- <button name="do_cancel" string="Cancel" type="object"
- states="draft,open,pending" />
- <button name="stage_previous" string="Previous Stage" type="object"
- states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/>
- <button name="stage_next" string="Next Stage" type="object"
- states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/>
+ <span groups="base.group_user">
+ <!--
+ <button name="do_open" string="Start Task" type="object"
+ states="draft,pending" class="oe_highlight"/>
+ <button name="do_draft" string="Draft" type="object"
+ states="cancel,done"/>
+ -->
+ <button name="%(action_project_task_reevaluate)d" string="Reactivate" type="action"
+ states="cancelled,done" context="{'button_reactivate':True}"/>
+ <button name="action_close" string="Done" type="object"
+ states="draft,open,pending" class="oe_highlight"/>
+ <button name="do_pending" string="Pending" type="object"
+ states="open"/>
+ <button name="%(action_project_task_delegate)d" string="Delegate" type="action"
+ states="pending,open,draft" groups="project.group_delegate_task"/>
+ <button name="do_cancel" string="Cancel" type="object"
+ states="draft,open,pending"/>
+ <button name="stage_previous" string="Previous Stage" type="object"
+ states="open,pending" icon="gtk-go-back" attrs="{'invisible': [('stage_id','=', False)]}"/>
+ <button name="stage_next" string="Next Stage" type="object" class="oe_highlight"
+ states="open,pending" icon="gtk-go-forward" attrs="{'invisible': [('stage_id','=', False)]}"/>
+ </span>
<field name="stage_id" widget="statusbar"/>
</header>
<sheet string="Task">
<h1>
<field name="name"/>
</h1>
- <label for="project_id" class="oe_edit_only"/>
- <h2>
- <field name="project_id" on_change="onchange_project(project_id)"/>
- </h2>
<group>
<group>
+ <field name="project_id" on_change="onchange_project(project_id)"/>
<field name="user_id" attrs="{'readonly':[('state','in',['done', 'cancelled'])]}"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</group>
<group>
<field name="date_deadline" attrs="{'readonly':[('state','in',['done', 'cancelled'])]}"/>
- <field name="planned_hours" widget="float_time" attrs="{'readonly':[('state','!=','draft')]}"
- groups="project.group_time_work_estimation_tasks"
- on_change="onchange_planned(planned_hours, effective_hours)"/>
<field name="progress" widget="progressbar"
- groups="project.group_time_work_estimation_tasks"
- invisible="1"/>
+ groups="project.group_time_work_estimation_tasks"/>
</group>
</group>
<notebook>
<page string="Description">
- <field name="description" attrs="{'readonly':[('state','=','done')]}" placeholder="Add a Description..." />
+ <field name="description" attrs="{'readonly':[('state','=','done')]}" placeholder="Add a Description..."/>
<field name="work_ids" groups="project.group_tasks_work_on_tasks">
<tree string="Task Work" editable="top">
<field name="date"/>
<field name="hours" widget="float_time" sum="Spent Hours"/>
</tree>
</field>
- <group class="oe_subtotal_footer oe_right" name="project_hours" groups="project.group_time_work_estimation_tasks">
+ <group>
+ <group class="oe_subtotal_footer oe_right" name="project_hours" groups="project.group_time_work_estimation_tasks">
<field name="effective_hours" widget="float_time"/>
<label for="remaining_hours" string="Remaining" groups="project.group_time_work_estimation_tasks"/>
<div>
- <button name="%(action_project_task_reevaluate)d" string="Reevaluate" type="action" target="new" states="open,pending" icon="gtk-edit"/>
- <field name="remaining_hours" widget="float_time" attrs="{'readonly':[('state','!=','draft')]}" groups="project.group_time_work_estimation_tasks"/>
+ <field name="remaining_hours" widget="float_time" attrs="{'readonly':[('state','in',('done','cancelled'))]}" groups="project.group_time_work_estimation_tasks"/>
</div>
<field name="total_hours" widget="float_time" class="oe_subtotal_footer_separator"/>
+ </group>
</group>
<div class="oe_clear"/>
</page>
</page>
<page string="Extra Info" attrs="{'readonly':[('state','=','done')]}">
<group col="4">
- <field name="priority"/>
+ <field name="priority" groups="base.group_user"/>
<field name="sequence"/>
- <field name="partner_id" />
+ <field name="partner_id"/>
+ <field name="planned_hours" widget="float_time" attrs="{'readonly':[('state','!=','draft')]}"
+ groups="project.group_time_work_estimation_tasks"
+ on_change="onchange_planned(planned_hours, effective_hours)"/>
<field name="state" groups="base.group_no_one"/>
</group>
</page>
</notebook>
</sheet>
- <footer>
- <field name="message_ids" widget="ThreadView"/>
- </footer>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
</form>
</field>
</record>
<field name="arch" type="xml">
<kanban default_group_by="stage_id" >
<field name="color"/>
- <field name="priority"/>
+ <field name="priority" groups="base.group_user"/>
<field name="stage_id"/>
<field name="user_id"/>
<field name="user_email"/>
<field name="kanban_state"/>
<field name="remaining_hours" sum="Remaining Time" groups="project.group_time_work_estimation_tasks"/>
<field name="date_deadline"/>
+ <field name="message_summary"/>
+ <field name="needaction_pending"/>
<templates>
- <t t-name="task_details">
- <ul class="oe_kanban_tooltip" t-if="record.project_id.raw_value">
- <li><b>Project:</b> <field name="project_id"/></li>
- </ul>
- </t>
- <t t-name="kanban-box">
- <t t-set="pad_url">http://pad.openerp.com/<t t-raw="_.str.underscored(_.str.trim(record.name.raw_value))"/></t>
- <t t-if="record.kanban_state.raw_value === 'blocked'" t-set="border">oe_kanban_color_red</t>
- <t t-if="record.kanban_state.raw_value === 'done'" t-set="border">oe_kanban_color_green</t>
- <div t-attf-class="#{kanban_color(record.color.raw_value)} #{border || ''}">
- <div class="oe_kanban_box oe_kanban_color_border">
- <table class="oe_kanban_table oe_kanban_box_header oe_kanban_color_bgdark oe_kanban_color_border oe_kanban_draghandle">
- <tr>
- <td align="left" valign="middle" width="16">
- <a t-if="record.priority.raw_value == 1" icon="star-on" type="object" name="set_normal_priority"/>
- <a t-if="record.priority.raw_value != 1" icon="star-off" type="object" name="set_high_priority" style="opacity:0.6; filter:alpha(opacity=60);"/>
- </td>
- <td align="left" valign="middle" class="oe_kanban_title" tooltip="task_details">
- <field name="name"/>
- </td>
- <td valign="top" width="22">
- <img t-att-src="kanban_image('res.users', 'avatar', record.user_id.raw_value[0])" t-att-title="record.user_id.value"
- width="22" height="22" class="oe_kanban_gravatar"/>
- </td>
- </tr>
- </table>
- <div class="oe_kanban_box_content oe_kanban_color_bglight oe_kanban_box_show_onclick_trigger">
- <div class="oe_kanban_description">
- <t t-esc="kanban_text_ellipsis(record.description.value, 160)"/>
- <i t-if="record.date_deadline.raw_value">
- <t t-if="record.description.raw_value">, </t>
- <field name="date_deadline"/>
- </i>
- <span class="oe_kanban_project_times" style="white-space: nowrap; padding-left: 5px;">
- <t t-set="hours" t-value="record.remaining_hours.raw_value"/>
- <t t-set="times" t-value="[
- [1, (hours gte 1 and hours lt 2)]
- ,[2, (hours gte 2 and hours lt 5)]
- ,[5, (hours gte 5 and hours lt 10)]
- ,[10, (hours gte 10)]
- ]"/>
- <t t-foreach="times" t-as="time"
- ><a t-if="!time[1]" t-attf-data-name="set_remaining_time_#{time[0]}"
- type="object" class="oe_kanban_button"><t t-esc="time[0]"/></a
- ><b t-if="time[1]" class="oe_kanban_button oe_kanban_button_active"><t t-esc="Math.round(hours)"/></b
- ></t>
- <a name="do_open" states="draft" string="Validate planned time and open task" type="object" class="oe_kanban_button oe_kanban_button_active">!</a>
- </span>
- </div>
- <div class="oe_kanban_clear"/>
- </div>
- <div class="oe_kanban_buttons_set oe_kanban_color_border oe_kanban_color_bglight oe_kanban_box_show_onclick">
- <div class="oe_kanban_left">
- <a string="Edit" icon="gtk-edit" type="edit"/>
- <a string="Change Color" icon="color-picker" type="color" name="color"/>
- <a name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="terp-personal"/>
- <a name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close"/>
- </div>
- <div class="oe_kanban_right">
- <a name="set_kanban_state_blocked" string="Mark as Blocked" attrs="{'invisible' : [('kanban_state', 'not in', ('normal', 'done'))]}" type="object" icon="kanban-stop"/>
- <a name="set_kanban_state_normal" string="Normal" attrs="{'invisible' : [('kanban_state', 'not in', ('blocked', 'done'))]}" type="object" icon="gtk-media-play"/>
- <a name="set_kanban_state_done" string="Done" attrs="{'invisible' : [('kanban_state', 'not in', ('blocked', 'normal'))]}" type="object" icon="kanban-apply"/>
- </div>
- <div class="oe_kanban_clear"/>
- </div>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
+ <div class="oe_dropdown_toggle oe_dropdown_kanban">
+ <span class="oe_e">í</span>
+ <ul class="oe_dropdown_menu">
+ <li><a type="edit" >Edit...</a></li>
+ <li><a type="delete">Delete</a></li>
+ <li>
+ <ul class="oe_kanban_project_times">
+ <li><a name="set_remaining_time_1" type="object" class="oe_kanban_button">1</a></li>
+ <li><a name="set_remaining_time_2" type="object" class="oe_kanban_button">2</a></li>
+ <li><a name="set_remaining_time_5" type="object" class="oe_kanban_button">5</a></li>
+ <li><a name="set_remaining_time_10" type="object" class="oe_kanban_button">10</a></li>
+ <li><a name="do_open" states="draft" string="Validate planned time" type="object" class="oe_kanban_button oe_kanban_button_active">!</a></li>
+ </ul>
+ </li>
+ <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+ </ul>
+ </div>
+
+ <div class="oe_kanban_content">
+ <div><b><field name="name"/></b></div>
+ <div>
+ <field name="project_id"/>
+ <t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/>
+ <i><field name="date_deadline"/></i>
+ </div>
+
+ <div class="oe_kanban_bottom_right">
+ <a t-if="record.kanban_state.raw_value === 'normal'" type="object" string="" name="set_kanban_state_done" class="oe_kanban_status"> </a>
+ <a t-if="record.kanban_state.raw_value === 'done'" type="object" string="Ready" name="set_kanban_state_blocked" class="oe_kanban_status oe_kanban_status_green"> </a>
+ <a t-if="record.kanban_state.raw_value === 'blocked'" type="object" string="Blocked" name="set_kanban_state_normal" class="oe_kanban_status oe_kanban_status_red"> </a>
+ <a t-if="record.priority.raw_value == 1" type="object" name="set_normal_priority" class="oe_e oe_star_on">7</a>
+ <a t-if="record.priority.raw_value != 1" type="object" name="set_high_priority" class="oe_e oe_star_off">7</a>
+ <img t-att-src="kanban_image('res.users', 'avatar', record.user_id.raw_value[0])" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+ </div>
+ <div class="oe_kanban_footer_left">
+ <span>
+ <span class="oe_e">N</span>
+ <t t-esc="Math.round(record.remaining_hours.raw_value)"/>
+ </span>
</div>
</div>
- </t>
+ <div class="oe_clear"></div>
+ </div>
+ </t>
</templates>
</kanban>
</field>
<group>
<field name="name" string="Tasks"/>
<separator orientation="vertical"/>
+ <filter icon="terp-mail-message-new"
+ string="Inbox" help="Unread messages"
+ name="needaction_pending"
+ domain="[('needaction_pending','=',True)]"/>
+ <separator orientation="vertical"/>
<filter name="draft" string="New" domain="[('state','=','draft')]" help="New Tasks" icon="terp-check"/>
<filter name="open" string="In Progress" domain="[('state','=','open')]" help="In Progress Tasks" icon="terp-camera_test"/>
<filter string="Pending" domain="[('state','=','pending')]" context="{'show_delegated':False}" help="Pending Tasks" icon="terp-gtk-media-pause"/>