From 13ab1f3d07ce22f9fed67b9f588d9a02e4a95e5a Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Wed, 19 Apr 2017 14:05:48 +0530 Subject: [PATCH] [IMP][BR_deliverable] Added Smart Buttons and Search views for DL and RL (#113) * [Add/IMP] Added Smart Buttons and Search views * [IMP]Fixed Travis * [WIP] Count Rsource lines and Deliverble lines in smartbuttons also improved code as per comments * [IMP]Improved access rules as per #103 matrix * [IMP]Fix Travis * [IMP] Added graph/pivot views inDL/RL and improved code * [IMP] fields_view_get by mistake removed method * [IMP]Improved Code. * [IMP]In DL Added Sales and prices at RL level. * [IMP]Improved Indentation * [IMP]Improved Code. * [IMP]Improved Code. --- .../models/business.py | 104 +++++- .../tests/test_br.py | 25 +- .../views/business_view.xml | 311 +++++++++++++++++- 3 files changed, 426 insertions(+), 14 deletions(-) diff --git a/business_requirement_deliverable/models/business.py b/business_requirement_deliverable/models/business.py index 37f68d012..08436d55a 100644 --- a/business_requirement_deliverable/models/business.py +++ b/business_requirement_deliverable/models/business.py @@ -49,6 +49,23 @@ class BusinessRequirementResource(models.Model): string='Business Requirement Deliverable', ondelete='cascade' ) + business_requirement_id = fields.Many2one( + comodel_name='business.requirement', + string='Business Requirement', + required=True, + ) + business_requirement_partner_id = fields.Many2one( + comodel_name='res.partner', + related='business_requirement_id.partner_id', + string='Business Requirement', + store=True + ) + business_requirement_project_id = fields.Many2one( + comodel_name='project.project', + related='business_requirement_id.project_id', + string='Business Requirement', + store=True + ) @api.multi @api.onchange('product_id') @@ -118,7 +135,8 @@ class BusinessRequirementDeliverable(models.Model): business_requirement_id = fields.Many2one( comodel_name='business.requirement', string='Business Requirement', - ondelete='cascade' + ondelete='cascade', + required=True ) unit_price = fields.Float( string='Sales Price' @@ -133,6 +151,18 @@ class BusinessRequirementDeliverable(models.Model): readonly=True, compute='_compute_get_currency', ) + business_requirement_partner_id = fields.Many2one( + comodel_name='res.partner', + related='business_requirement_id.partner_id', + string='Business Requirement', + store=True + ) + business_requirement_project_id = fields.Many2one( + comodel_name='project.project', + related='business_requirement_id.project_id', + string='Business Requirement', + store=True + ) @api.multi @api.depends('business_requirement_id.partner_id') @@ -233,6 +263,17 @@ class BusinessRequirement(models.Model): states={'draft': [('readonly', False)], 'confirmed': [('readonly', False)]}, ) + + resource_lines = fields.One2many( + comodel_name='business.requirement.resource', + inverse_name='business_requirement_id', + string='Resource Lines', + copy=True, + readonly=True, + states={'draft': [('readonly', False)], + 'confirmed': [('readonly', False)]}, + ) + total_revenue = fields.Float( compute='_compute_deliverable_total', string='Total Revenue', @@ -244,6 +285,67 @@ class BusinessRequirement(models.Model): readonly=True, compute='_compute_get_currency', ) + dl_count = fields.Integer('DL Count', compute='_compute_dl_count') + rl_count = fields.Integer('DL Count', compute='_compute_rl_count') + dl_counta = fields.Integer('DL Count', compute='_compute_dl_count') + rl_counta = fields.Integer('DL Count', compute='_compute_rl_count') + + @api.multi + def _compute_dl_count(self): + for r in self: + r.dl_count = len(r.deliverable_lines.ids) + r.dl_counta = len(r.deliverable_lines.ids) + + @api.multi + def _compute_rl_count(self): + for r in self: + r.rl_count = len(r.resource_lines.ids) + r.rl_counta = len(r.resource_lines.ids) + + @api.multi + def open_deliverable_line(self): + for self in self: + domain = [('business_requirement_id', '=', self.id)] + br_id = 0 + if self.state in ('draft', 'confirmed'): + br_id = self.id + return { + 'name': _('Deliverable Lines'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'tree,form,graph', + 'res_model': 'business.requirement.deliverable', + 'target': 'current', + 'domain': domain, + 'context': { + 'tree_view_ref': 'business_requirement_deliverable.' + + 'view_business_requirement_deliverable_tree', + 'form_view_ref': 'business_requirement_deliverable.' + + 'view_business_requirement_deliverable_form', + 'default_business_requirement_id': br_id + }} + + @api.multi + def open_resource_line(self): + for self in self: + res_lines = self.env['business.requirement.resource'].\ + search([('business_requirement_id', '=', self.id)]) + br_id = 0 + if self.state in ('draft', 'confirmed'): + br_id = self.id + return { + 'name': _('Resource Lines'), + 'view_type': 'form', + 'view_mode': 'tree,graph', + 'res_model': 'business.requirement.resource', + 'type': 'ir.actions.act_window', + 'domain': [('id', 'in', res_lines.ids)], + 'context': { + 'tree_view_ref': 'business_requirement_resource.' + + 'view_business_requirement_resource_tree', + 'default_business_requirement_id': br_id + } + } @api.multi @api.depends('partner_id') diff --git a/business_requirement_deliverable/tests/test_br.py b/business_requirement_deliverable/tests/test_br.py index ed0044db2..fe25faf29 100644 --- a/business_requirement_deliverable/tests/test_br.py +++ b/business_requirement_deliverable/tests/test_br.py @@ -58,9 +58,13 @@ def setUp(self): vals = { 'description': ' test', + } + self.br = self.env['business.requirement'].create(vals) + self.br.write({ 'deliverable_lines': [ (0, 0, {'name': 'deliverable line1', 'qty': 1.0, 'unit_price': 900, 'uom_id': 1, + 'business_requirement_id': self.br.id, 'resource_ids': [ (0, 0, { 'name': 'Resource Line1', @@ -69,6 +73,7 @@ def setUp(self): 'uom_id': self.uom_hours.id, 'resource_type': 'task', 'user_id': self.user.id, + 'business_requirement_id': self.br.id }), (0, 0, { 'name': 'Resource Line1', @@ -77,6 +82,7 @@ def setUp(self): 'uom_id': self.uom_hours.id, 'resource_type': 'task', 'user_id': self.user.id, + 'business_requirement_id': self.br.id }) ] }), @@ -87,9 +93,7 @@ def setUp(self): (0, 0, {'name': 'deliverable line4', 'qty': 1.0, 'unit_price': 1500, 'uom_id': 1, }), - ], - } - self.br = self.env['business.requirement'].create(vals) + ]}) def test_get_cost_total(self): cost_total = self.br.total_revenue @@ -121,7 +125,6 @@ def test_resource_uom_change(self): def test_resource_product_id_change(self): resource = self.env['business.requirement.resource'].search([ ('product_id', '=', self.productA.id)])[0] - resource.write({'product_id': self.productB.id}) resource.product_id_change() @@ -132,6 +135,20 @@ def test_resource_product_id_change(self): self.assertEqual( resource.uom_id.id, self.productB.uom_id.id) + def test_resource_fields_view_get(self): + resource = self.env['business.requirement.resource'].search([ + ('product_id', '=', self.productA.id)])[0] + resource.fields_view_get(False, 'tree') + self.br.deliverable_lines[0].fields_view_get(False, 'form') + + def test_compute_business_requirement_dl_rl(self): + self.br._compute_dl_count() + self.br._compute_rl_count() + + def test_open_business_requirement_dl_rl(self): + self.br.open_deliverable_line() + self.br.open_resource_line() + def test_compute_get_currency(self): self.partner = self.env['res.partner'].create({ 'name': 'Your company test', diff --git a/business_requirement_deliverable/views/business_view.xml b/business_requirement_deliverable/views/business_view.xml index 598cbc7e1..c1c91cfd9 100644 --- a/business_requirement_deliverable/views/business_view.xml +++ b/business_requirement_deliverable/views/business_view.xml @@ -1,16 +1,230 @@ + + business.requirement.search + business.requirement + + + + + + + + + + + business.requirement.resource.search + business.requirement.resource + + + + + + + + + + + + + + + + + + + business.requirement.resource.tree.noedit + business.requirement.resource + + + + + + + + + + + + + + + + + + Requirement Resource + business.requirement.resource + tree,graph + form + { + 'search_default_business_requirement_id': [active_id], + 'default_business_requirement_id': active_id, + } + [('business_requirement_id', '=', active_id)] + + + + + + tree + + + + + + + + business.requirement.deliverable.tree.noedit + business.requirement.deliverable + + + + + + + + + + + + + + + + + business.requirement.deliverable.form.noedit + business.requirement.deliverable + form + 20 + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + business.requirement.deliverable.search + business.requirement.deliverable + + + + + + + + + + + + + + + + + + + Requirement Deliverable + business.requirement.deliverable + tree,form,graph + form + { + 'search_default_business_requirement_id': [active_id], + 'default_business_requirement_id': active_id, + } + [('business_requirement_id', '=', active_id)] + + + + + + + tree + + + + + + + + + form + + + + business.requirement.form business.requirement - - - - + + + + + @@ -31,7 +245,7 @@ business.requirement.deliverable - + @@ -48,6 +262,8 @@ business.requirement.resource + + @@ -59,6 +275,37 @@ + + + + business.requirement.resource.pivot + business.requirement.resource + + + + + + + + + + + + Requirement Resources + business.requirement.resource + tree,graph + form + {} + + + + + business.requirement.deliverable.form business.requirement.deliverable @@ -68,7 +315,7 @@
- + + + + -
+ + + business.requirement.deliverable.pivot + business.requirement.deliverable + + + + + + + + + + + + + Requirement Deliverable + business.requirement.deliverable + tree,form,graph + form + {} + + + + +