diff options
| author | Barad Mahendra <mba@openerp.com> | 2019-11-25 11:24:45 +0000 |
|---|---|---|
| committer | Yannick Tivisse <yti@odoo.com> | 2020-01-16 10:56:05 +0000 |
| commit | d16aa4cd396e13749d12fa8e55f80f0fcc62f686 (patch) | |
| tree | 2c1cd4e89f6c789f3fe7f6c2bebe20955014876f /addons | |
| parent | de4d7e14f8186fd19cd6cb8924957a0a508b0dfb (diff) | |
[IMP] (hr, sale)_timesheet, pad(_project): improve project general UX
Purpose fo the task is to improve the UX of timesheet, project and task.
Done the chages for below point:
- improve the stage demo data to unified the project stage
- on the task timesheet 'sub-tasks hours spent' should be clickable
and on click, it will display the list of subtask timesheet.
- display in warning tasks for which Remaining Hours < 0 if Planned Hours > 0 in task list view
- improve the settings of collabrative pad and planning and project form view
Task-2129052
closes odoo/odoo#41092
Closes: #41092
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/hr_timesheet/models/project.py | 10 | ||||
| -rw-r--r-- | addons/hr_timesheet/views/project_views.xml | 6 | ||||
| -rw-r--r-- | addons/pad/models/res_config_settings.py | 4 | ||||
| -rw-r--r-- | addons/pad/static/src/xml/pad.xml | 2 | ||||
| -rw-r--r-- | addons/pad/views/res_config_settings_views.xml | 34 | ||||
| -rw-r--r-- | addons/pad_project/models/project.py | 2 | ||||
| -rw-r--r-- | addons/pad_project/views/project_views.xml | 16 | ||||
| -rw-r--r-- | addons/pad_project/views/res_config_settings_views.xml | 7 | ||||
| -rw-r--r-- | addons/project/data/project_data.xml | 6 | ||||
| -rw-r--r-- | addons/project/data/project_demo.xml | 4 | ||||
| -rw-r--r-- | addons/project/models/res_config_settings.py | 2 | ||||
| -rw-r--r-- | addons/sale_timesheet/data/sale_service_demo.xml | 51 |
12 files changed, 68 insertions, 76 deletions
diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py index 9f4708eee55..ade6fc66b6b 100644 --- a/addons/hr_timesheet/models/project.py +++ b/addons/hr_timesheet/models/project.py @@ -135,6 +135,16 @@ class Task(models.Model): for task in self: task.display_timesheet_timer = task.allow_timesheets and task.project_id.allow_timesheet_timer and task.analytic_account_active + def action_view_subtask_timesheet(self): + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': _('Timesheets'), + 'res_model': 'account.analytic.line', + 'view_mode': 'list,form', + 'domain': [('project_id', '!=', False), ('task_id', 'in', self.child_ids.ids)], + } + def write(self, values): # a timesheet must have an analytic account (and a project) if 'project_id' in values and self and not values.get('project_id'): diff --git a/addons/hr_timesheet/views/project_views.xml b/addons/hr_timesheet/views/project_views.xml index f5ade504c73..39e156f157e 100644 --- a/addons/hr_timesheet/views/project_views.xml +++ b/addons/hr_timesheet/views/project_views.xml @@ -178,7 +178,8 @@ <group attrs="{'invisible': [('analytic_account_active', '=', False)]}"> <group class="oe_subtotal_footer oe_right" name="project_hours"> <field name="effective_hours" widget="float_time" /> - <field name="subtask_effective_hours" widget="float_time" attrs="{'invisible' : [('subtask_effective_hours', '=', 0.0)]}" /> + <button name="action_view_subtask_timesheet" string="Sub-tasks Hours Spent:" type="object" class="oe_inline oe_link pl-0" attrs="{'invisible' : [('subtask_effective_hours', '=', 0.0)]}"/> + <field name="subtask_effective_hours" widget="float_time" attrs="{'invisible' : [('subtask_effective_hours', '=', 0.0)]}" nolabel="1"/> <field name="total_hours_spent" widget="float_time" class="oe_subtotal_footer_separator" attrs="{'invisible' : [('subtask_effective_hours', '=', 0.0)]}" /> <field name="remaining_hours" widget="float_time" class="oe_subtotal_footer_separator" attrs="{'invisible' : [('planned_hours', '=', 0.0)]}"/> </group> @@ -194,6 +195,9 @@ <field name="inherit_id" ref="project.view_task_tree2" /> <field eval="2" name="priority"/> <field name="arch" type="xml"> + <xpath expr="//tree" position="attributes"> + <attribute name="decoration-warning">planned_hours and (effective_hours>planned_hours)</attribute> + </xpath> <field name="user_id" position="after"> <field name="planned_hours" widget="float_time" sum="Initially Planned Hours" optional="show"/> <field name="effective_hours" widget="float_time" sum="Effective Hours" optional="show"/> diff --git a/addons/pad/models/res_config_settings.py b/addons/pad/models/res_config_settings.py index a89abe3601d..25b3ece40d1 100644 --- a/addons/pad/models/res_config_settings.py +++ b/addons/pad/models/res_config_settings.py @@ -7,5 +7,5 @@ from odoo import fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' - pad_server = fields.Char(related='company_id.pad_server', string="Pad Server *", readonly=False) - pad_key = fields.Char(related='company_id.pad_key', string="Pad Api Key *", readonly=False) + pad_server = fields.Char(related='company_id.pad_server', string="Pad Server", readonly=False) + pad_key = fields.Char(related='company_id.pad_key', string="Pad API Key", readonly=False) diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml index 2eb323558a8..44eb11c8cee 100644 --- a/addons/pad/static/src/xml/pad.xml +++ b/addons/pad/static/src/xml/pad.xml @@ -4,7 +4,7 @@ <t t-name="FieldPad"> <div class="oe_form_field_text oe_pad"> <p class="oe_unconfigured d-none"> - Please enter your Etherpad credentials through the menu 'Settings > General Settings'. + Please, enter your Etherpad credentials through the Settings. </p> <t t-if="widget.mode === 'readonly'"> <div class="oe_pad_content etherpad_readonly oe_configured" /> diff --git a/addons/pad/views/res_config_settings_views.xml b/addons/pad/views/res_config_settings_views.xml index c8e860c51b4..10eb60ab3b8 100644 --- a/addons/pad/views/res_config_settings_views.xml +++ b/addons/pad/views/res_config_settings_views.xml @@ -1,20 +1,20 @@ <?xml version="1.0" encoding="utf-8"?> <odoo> - <record id="res_config_settings_view_form" model="ir.ui.view"> - <field name="name">res.config.settings.view.form.inherit.pad</field> - <field name="model">res.config.settings</field> - <field name="inherit_id" ref="base_setup.res_config_settings_view_form"/> - <field name="arch" type="xml"> - <div id="msg_module_pad" position="replace"> - <div class="content-group" id="pad_configuration_settings" attrs="{'invisible': [('module_pad','=',False)]}"> - <div class="mt16 row"> - <label for="pad_server" string="Server" class="col-3 col-lg-3 o_light_label"/> - <field name="pad_server" placeholder="e.g. beta.primarypad.com"/> - <label for="pad_key" string="API Key" class="col-3 col-lg-3 o_light_label"/> - <field name="pad_key"/> - </div> - </div> - </div> - </field> - </record> + <record id="res_config_settings_view_form" model="ir.ui.view"> + <field name="name">res.config.settings.view.form.inherit.pad</field> + <field name="model">res.config.settings</field> + <field name="inherit_id" ref="base_setup.res_config_settings_view_form"/> + <field name="arch" type="xml"> + <div id="msg_module_pad" position="replace"> + <div class="content-group" id="pad_configuration_settings" attrs="{'invisible': [('module_pad', '=', False)]}"> + <div class="mt16 row"> + <label for="pad_server" string="Server" class="col-3 col-lg-3 o_light_label"/> + <field name="pad_server" placeholder="e.g. beta.primarypad.com" attrs="{'required': [('module_pad', '!=', False)]}"/> + <label for="pad_key" string="API Key" class="col-3 col-lg-3 o_light_label"/> + <field name="pad_key" attrs="{'required': [('module_pad', '!=', False)]}"/> + </div> + </div> + </div> + </field> + </record> </odoo> diff --git a/addons/pad_project/models/project.py b/addons/pad_project/models/project.py index d569106378c..40cfbfdbf10 100644 --- a/addons/pad_project/models/project.py +++ b/addons/pad_project/models/project.py @@ -24,4 +24,4 @@ class ProjectTask(models.Model): class ProjectProject(models.Model): _inherit = "project.project" - use_pads = fields.Boolean("Use collaborative pads", help="Use collaborative pad for the tasks on this project.") + use_pads = fields.Boolean("Use collaborative pads", default=True, help="Use collaborative pad for the tasks on this project.") diff --git a/addons/pad_project/views/project_views.xml b/addons/pad_project/views/project_views.xml index e97514a9859..50320a42831 100644 --- a/addons/pad_project/views/project_views.xml +++ b/addons/pad_project/views/project_views.xml @@ -20,9 +20,19 @@ <field name="model">project.project</field> <field name="inherit_id" ref="project.edit_project"/> <field name="arch" type="xml"> - <field name="partner_id" position="after"> - <field name="use_pads"/> - </field> + <xpath expr="//div[@id='rating_settings']" position="after"> + <div class="col-lg-6 o_setting_box" id="pad_settings"> + <div class="o_setting_left_pane"> + <field name="use_pads"/> + </div> + <div class="o_setting_right_pane"> + <label for="use_pads" string="Collaborative Pads"/> + <div class="text-muted"> + Use collaborative rich text pads on tasks + </div> + </div> + </div> + </xpath> </field> </record> diff --git a/addons/pad_project/views/res_config_settings_views.xml b/addons/pad_project/views/res_config_settings_views.xml index 3efc7af4687..755d1c4d34b 100644 --- a/addons/pad_project/views/res_config_settings_views.xml +++ b/addons/pad_project/views/res_config_settings_views.xml @@ -6,15 +6,14 @@ <field name="inherit_id" ref="project.res_config_settings_view_form"/> <field name="arch" type="xml"> <div name="pad_project_right_pane" position="inside"> - <div class="content-group"> - <field name='company_id' invisible="1"/> + <div class="content-group" attrs="{'invisible': [('module_pad', '=', False)]}"> <div class="row mt16"> <label for="pad_server" class="col-lg-3 o_light_label"/> - <field name="pad_server"/> + <field name="pad_server" attrs="{'required': [('module_pad', '!=', False)]}"/> </div> <div class="row"> <label for="pad_key" class="col-lg-3 o_light_label"/> - <field name="pad_key"/> + <field name="pad_key" attrs="{'required': [('module_pad', '!=', False)]}"/> </div> </div> </div> diff --git a/addons/project/data/project_data.xml b/addons/project/data/project_data.xml index 4f41b6a646a..f0b29fdfa99 100644 --- a/addons/project/data/project_data.xml +++ b/addons/project/data/project_data.xml @@ -103,19 +103,19 @@ <record forcecreate="False" id="project_stage_data_0" model="project.task.type"> <field name="sequence">1</field> - <field name="name">New</field> + <field name="name">Basic</field> <field name="project_ids" eval="[(4, ref('project_project_data'))]"/> </record> <record forcecreate="False" id="project_stage_data_1" model="project.task.type"> <field name="sequence">2</field> - <field name="name">Basic</field> + <field name="name">Advanced</field> <field name="project_ids" eval="[(4, ref('project_project_data'))]"/> </record> <record forcecreate="False" id="project_stage_data_2" model="project.task.type"> <field name="sequence">3</field> - <field name="name">Advanced</field> + <field name="name">Expert</field> <field name="project_ids" eval="[(4, ref('project_project_data'))]"/> </record> diff --git a/addons/project/data/project_demo.xml b/addons/project/data/project_demo.xml index 3254f8f28dd..4451ad198eb 100644 --- a/addons/project/data/project_demo.xml +++ b/addons/project/data/project_demo.xml @@ -24,8 +24,8 @@ <!-- Stages --> <record id="project_stage_0" model="project.task.type"> <field name="sequence">1</field> - <field name="name">To Do</field> - <field name="legend_blocked">Not validated</field> + <field name="name">New</field> + <field name="legend_blocked">Blocked</field> <field name="mail_template_id" ref="project.mail_template_data_project_task"/> </record> <record id="project_stage_1" model="project.task.type"> diff --git a/addons/project/models/res_config_settings.py b/addons/project/models/res_config_settings.py index ff28c566c96..be36ad46d67 100644 --- a/addons/project/models/res_config_settings.py +++ b/addons/project/models/res_config_settings.py @@ -7,7 +7,7 @@ from odoo import api, fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' - module_project_forecast = fields.Boolean(string="Forecasts") + module_project_forecast = fields.Boolean(string="Planning") module_hr_timesheet = fields.Boolean(string="Task Logs") group_subtask_project = fields.Boolean("Sub-tasks", implied_group="project.group_subtask_project") group_project_rating = fields.Boolean("Use Rating on Project", implied_group='project.group_project_rating') diff --git a/addons/sale_timesheet/data/sale_service_demo.xml b/addons/sale_timesheet/data/sale_service_demo.xml index 5f18503a0ff..19e0127b79f 100644 --- a/addons/sale_timesheet/data/sale_service_demo.xml +++ b/addons/sale_timesheet/data/sale_service_demo.xml @@ -11,14 +11,7 @@ <field name="product_uom_qty">5.0</field> </record> - <!-- Projects, Analytic Account and Stages --> - <record id="project_stage_fixed" model="project.task.type"> - <field name="sequence">30</field> - <field name="name">Fixed</field> - <field name="legend_blocked">Need functional or technical help</field> - <field name="legend_done">Done</field> - </record> - + <!-- Projects and Analytic Account --> <record id="account_analytic_account_project_support" model="account.analytic.account"> <field name="name">After-Sales Services</field> <field name="code">INT</field> @@ -29,7 +22,7 @@ <field name="date_start" eval="time.strftime('%Y-%m-01 10:00:00')"/> <field name="name">After-Sales Services</field> <field name="analytic_account_id" ref="account_analytic_account_project_support"/> - <field name="type_ids" eval="[(4, ref('project.project_stage_data_0')), (4, ref('project.project_stage_1')), (4, ref('project_stage_fixed'))]"/> + <field name="type_ids" eval="[(4, ref('project.project_stage_0')), (4, ref('project.project_stage_1')), (4, ref('project.project_stage_2'))]"/> </record> <!-- Project Task --> @@ -418,44 +411,20 @@ <field name="unit_amount">1.00</field> </record> - <!-- task on project generated by sale order 1 --> - <record id="project_from_sale_order_1_to_do" model="project.task.type"> - <field name="sequence">10</field> - <field name="name">To Do</field> - <field name="legend_blocked">Not ready</field> - <field name="legend_done">Ready to be started</field> - <field name="project_ids" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> + <record id="project.project_stage_1" model="project.task.type"> + <field name="project_ids" model="project.project" eval="[(4, obj().search([('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))], limit=1).id)]"/> </record> - <record id="project_from_sale_order_1_in_progress" model="project.task.type"> - <field name="sequence">20</field> - <field name="name">In Progress</field> - <field name="legend_blocked">Need help</field> - <field name="legend_done">Work done</field> - <field name="project_ids" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> + <record id="project.project_stage_2" model="project.task.type"> + <field name="project_ids" model="project.project" eval="[(4, obj().search([('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))], limit=1).id)]"/> </record> - <record id="project_from_sale_order_1_done" model="project.task.type"> - <field name="sequence">30</field> - <field name="name">Done</field> - <field name="legend_blocked">Not done yet</field> - <field name="legend_done">Done</field> - <field name="project_ids" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> - </record> - - <function model="project.task" name="write"> - <value model="project.task" eval="obj().search([('sale_line_id','=',ref('sale_timesheet.sale_line_13')), ('stage_id', '=', False)]).id"/> - <value eval="{ - 'stage_id': ref('sale_timesheet.project_from_sale_order_1_to_do') - }"/> - </function> - <record id="project_task_1" model="project.task"> <field name="name">Decoration</field> <field name="sale_line_id" ref="sale_timesheet.sale_line_13"/> <field name="sale_order_id" ref="sale_timesheet.sale_order_1"/> <field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> - <field name="stage_id" ref="project_from_sale_order_1_in_progress"/> + <field name="stage_id" ref="project.project_stage_2"/> <field name="sale_line_id" ref="sale_timesheet.sale_line_13" /> <field name="sale_order_id" ref="sale_timesheet.sale_order_1" /> <field name="partner_id" ref="base.res_partner_2" /> @@ -466,7 +435,7 @@ <field name="sale_line_id" ref="sale_timesheet.sale_line_13"/> <field name="sale_order_id" ref="sale_timesheet.sale_order_1"/> <field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> - <field name="stage_id" ref="project_from_sale_order_1_done"/> + <field name="stage_id" ref="project.project_stage_2"/> <field name="sale_line_id" ref="sale_timesheet.sale_line_13" /> <field name="sale_order_id" ref="sale_timesheet.sale_order_1" /> <field name="partner_id" ref="base.res_partner_2" /> @@ -477,7 +446,7 @@ <field name="sale_line_id" ref="sale_timesheet.sale_line_13"/> <field name="sale_order_id" ref="sale_timesheet.sale_order_1"/> <field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> - <field name="stage_id" ref="project_from_sale_order_1_in_progress"/> + <field name="stage_id" ref="project.project_stage_2"/> <field name="sale_line_id" ref="sale_timesheet.sale_line_13" /> <field name="sale_order_id" ref="sale_timesheet.sale_order_1" /> <field name="partner_id" ref="base.res_partner_2" /> @@ -486,7 +455,7 @@ <record id="project_task_4" model="project.task"> <field name="name">Furniture Delivery</field> <field name="project_id" search="[('sale_order_id', '=', ref('sale_timesheet.sale_order_1'))]" /> - <field name="stage_id" ref="project_from_sale_order_1_to_do" /> + <field name="stage_id" ref="project.project_stage_1" /> <field name="sale_line_id" ref="sale_timesheet.sale_line_13" /> <field name="sale_order_id" ref="sale_timesheet.sale_order_1" /> <field name="partner_id" ref="base.res_partner_2" /> |
