From 6ed4c5a5e225a661cfd174bc2247d94f7ba2ab14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Taymans?= Date: Fri, 8 May 2020 16:28:05 +0200 Subject: [PATCH] [CHG] b_emc: Eater max is configurable --- beesdoo_easy_my_coop/__manifest__.py | 5 +- beesdoo_easy_my_coop/data/product_share.xml | 23 ------ beesdoo_easy_my_coop/demo/product_share.xml | 74 ++++++++++++++++++ beesdoo_easy_my_coop/models/product.py | 16 +++- beesdoo_easy_my_coop/models/res_partner.py | 50 +++++++----- beesdoo_easy_my_coop/tests/__init__.py | 1 + .../tests/test_res_partner.py | 78 +++++++++++++++++++ beesdoo_easy_my_coop/views/partner.xml | 30 ------- beesdoo_easy_my_coop/views/product.xml | 5 +- 9 files changed, 206 insertions(+), 76 deletions(-) delete mode 100644 beesdoo_easy_my_coop/data/product_share.xml create mode 100644 beesdoo_easy_my_coop/demo/product_share.xml create mode 100644 beesdoo_easy_my_coop/tests/__init__.py create mode 100644 beesdoo_easy_my_coop/tests/test_res_partner.py delete mode 100644 beesdoo_easy_my_coop/views/partner.xml diff --git a/beesdoo_easy_my_coop/__manifest__.py b/beesdoo_easy_my_coop/__manifest__.py index 8a1708a..aa1bc3e 100644 --- a/beesdoo_easy_my_coop/__manifest__.py +++ b/beesdoo_easy_my_coop/__manifest__.py @@ -23,12 +23,13 @@ ], 'data': [ - 'data/product_share.xml', - 'views/partner.xml', 'views/res_company.xml', 'views/subscription_request.xml', 'views/subscription_templates.xml', 'views/product.xml' ], + 'demo': [ + 'demo/product_share.xml', + ], 'auto_install': True, } diff --git a/beesdoo_easy_my_coop/data/product_share.xml b/beesdoo_easy_my_coop/data/product_share.xml deleted file mode 100644 index 50db413..0000000 --- a/beesdoo_easy_my_coop/data/product_share.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - Acquisition de parts A de Beescoop scrl - share_a - - - - - Acquisition de parts B de Beescoop scrl - share_b - - - - - Acquisition de parts C de Beescoop scrl - share_c - - - - - \ No newline at end of file diff --git a/beesdoo_easy_my_coop/demo/product_share.xml b/beesdoo_easy_my_coop/demo/product_share.xml new file mode 100644 index 0000000..cc7eca9 --- /dev/null +++ b/beesdoo_easy_my_coop/demo/product_share.xml @@ -0,0 +1,74 @@ + + + + + Acquisition de parts A de Beescoop scrl + share_a + + + 3 + + + + Acquisition de parts B de Beescoop scrl + share_b + + + 2 + + + + Acquisition de parts C de Beescoop scrl + share_c + + + -1 + + + + + + + 2 + 2020-01-01 + + + + + + + share_a + + + + + 4 + 2020-01-01 + + + + + + + share_b + + + + + 6 + 2020-01-01 + + + + + + + share_c + + diff --git a/beesdoo_easy_my_coop/models/product.py b/beesdoo_easy_my_coop/models/product.py index 35fc68f..91b6800 100644 --- a/beesdoo_easy_my_coop/models/product.py +++ b/beesdoo_easy_my_coop/models/product.py @@ -5,4 +5,18 @@ class ProductTemplate(models.Model): _inherit = 'product.template' - can_shop = fields.Boolean(string="Is share?") + max_nb_eater_allowed = fields.Integer( + string="Max number of eater allowed", + default=-1, + help=( + "Maximum number of eater allowed for the owner of the share. " + "A negative value means no maximum." + ) + ) + allow_working = fields.Boolean( + string="Allow owner to work?", + help=( + "Owner of this type of share are allowed to participate to the " + "shift system." + ) + ) diff --git a/beesdoo_easy_my_coop/models/res_partner.py b/beesdoo_easy_my_coop/models/res_partner.py index 6960c5a..55095f6 100644 --- a/beesdoo_easy_my_coop/models/res_partner.py +++ b/beesdoo_easy_my_coop/models/res_partner.py @@ -1,28 +1,42 @@ -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError class Partner(models.Model): _inherit = 'res.partner' - can_shop = fields.Boolean(compute='_can_shop', store=True) info_session_confirmed = fields.Boolean( string="Confirmed presence to info session", default=False, ) - @api.depends('cooperator_type', - 'cooperative_status_ids', - 'cooperative_status_ids.can_shop') - def _can_shop(self): - product_obj = self.env['product.template'] - can_shop_shares = product_obj.search([('is_share', '=', True), - ('can_shop', '=', True) - ]).mapped('default_code') - for rec in self: - if rec.cooperator_type in can_shop_shares: - rec.can_shop = True - elif (rec.cooperative_status_ids - and rec.cooperative_status_ids[0].can_shop): - rec.can_shop = True - else: - rec.can_shop = False + @api.constrains('child_eater_ids', 'parent_eater_id') + def _check_number_of_eaters(self): + """ + Check the maximum number of eaters that can be assigned to a + share owner. + """ + self.ensure_one() + share_type = None + if self.cooperator_type: + share_type = ( + self.env['product.template'] + .search([('default_code', '=', self.cooperator_type)]) + )[0] + # If the current partner owns no share, check his parent. + if not share_type: + share_type = ( + self.env['product.template'] + .search([ + ('default_code', '=', self.parent_eater_id.cooperator_type) + ]) + )[0] + if ( + share_type + and share_type.max_nb_eater_allowed >= 0 + and len(self.child_eater_ids) > share_type.max_nb_eater_allowed + ): + raise ValidationError( + _('You can only set %d additional eaters per worker') + % share_type.max_nb_eater_allowed + ) diff --git a/beesdoo_easy_my_coop/tests/__init__.py b/beesdoo_easy_my_coop/tests/__init__.py new file mode 100644 index 0000000..d57d215 --- /dev/null +++ b/beesdoo_easy_my_coop/tests/__init__.py @@ -0,0 +1 @@ +from . import test_res_partner diff --git a/beesdoo_easy_my_coop/tests/test_res_partner.py b/beesdoo_easy_my_coop/tests/test_res_partner.py new file mode 100644 index 0000000..3aa292b --- /dev/null +++ b/beesdoo_easy_my_coop/tests/test_res_partner.py @@ -0,0 +1,78 @@ +# Copyright 2020 Coop IT Easy SCRLfs () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import exceptions +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestResPartner(TransactionCase): + def setUp(self): + super().setUp() + self.eater1 = self.env.ref("beesdoo_base.eater1") + self.eater2 = self.env.ref("beesdoo_base.eater2") + self.eater3 = self.env.ref("beesdoo_base.eater3") + self.eater4 = self.env.ref("beesdoo_base.eater4") + + def test_max_eater_assignment_share_a(self): + """ + Test adding eater to a cooperator and raise when max is + reached. + """ + coop1 = self.env.ref( + "beesdoo_base.res_partner_cooperator_1_demo" + ) + coop1.write({"child_eater_ids": [(4, self.eater1.id)]}) + self.assertEqual(len(coop1.child_eater_ids), 1) + coop1.write({"child_eater_ids": [(4, self.eater2.id)]}) + self.assertEqual(len(coop1.child_eater_ids), 2) + coop1.write({"child_eater_ids": [(4, self.eater3.id)]}) + self.assertEqual(len(coop1.child_eater_ids), 3) + with self.assertRaises(ValidationError) as econtext: + coop1.write({"child_eater_ids": [(4, self.eater4.id)]}) + self.assertIn("can only set", str(econtext.exception)) + + def test_max_eater_assignment_share_b(self): + """ + Test adding eater to a cooperator and raise when max is + reached. + """ + coop2 = self.env.ref( + "beesdoo_base.res_partner_cooperator_2_demo" + ) + coop2.write({"child_eater_ids": [(4, self.eater1.id)]}) + self.assertEqual(len(coop2.child_eater_ids), 1) + coop2.write({"child_eater_ids": [(4, self.eater2.id)]}) + self.assertEqual(len(coop2.child_eater_ids), 2) + with self.assertRaises(ValidationError) as econtext: + coop2.write({"child_eater_ids": [(4, self.eater3.id)]}) + self.assertIn("can only set", str(econtext.exception)) + + def test_unlimited_eater_assignment_share_c(self): + """ + Test that share_c can have an unlimited number of eater. + """ + coop3 = self.env.ref( + "beesdoo_base.res_partner_cooperator_3_demo" + ) + coop3.write({"child_eater_ids": [(4, self.eater1.id)]}) + self.assertEqual(len(coop3.child_eater_ids), 1) + coop3.write({"child_eater_ids": [(4, self.eater2.id)]}) + self.assertEqual(len(coop3.child_eater_ids), 2) + coop3.write({"child_eater_ids": [(4, self.eater3.id)]}) + self.assertEqual(len(coop3.child_eater_ids), 3) + coop3.write({"child_eater_ids": [(4, self.eater4.id)]}) + self.assertEqual(len(coop3.child_eater_ids), 4) + + def test_share_with_no_eater_assignment_allowed(self): + """ + Test that share that doesn't allow eater assignment. + """ + share_c = self.env.ref("beesdoo_easy_my_coop.share_c") + share_c.max_nb_eater_allowed = 0 + coop3 = self.env.ref( + "beesdoo_base.res_partner_cooperator_3_demo" + ) + with self.assertRaises(ValidationError) as econtext: + coop3.write({"child_eater_ids": [(4, self.eater3.id)]}) + self.assertIn("can only set", str(econtext.exception)) diff --git a/beesdoo_easy_my_coop/views/partner.xml b/beesdoo_easy_my_coop/views/partner.xml deleted file mode 100644 index b523166..0000000 --- a/beesdoo_easy_my_coop/views/partner.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - beesdoo.partner.form.view.remove_duplicate_cooperator_type - res.partner - - - - - - - - beesdoo.partner.form.view.remove_duplicate_header - res.partner - - - - -