Rémy Taymans
5 years ago
9 changed files with 206 additions and 76 deletions
-
5beesdoo_easy_my_coop/__manifest__.py
-
23beesdoo_easy_my_coop/data/product_share.xml
-
74beesdoo_easy_my_coop/demo/product_share.xml
-
16beesdoo_easy_my_coop/models/product.py
-
50beesdoo_easy_my_coop/models/res_partner.py
-
1beesdoo_easy_my_coop/tests/__init__.py
-
78beesdoo_easy_my_coop/tests/test_res_partner.py
-
30beesdoo_easy_my_coop/views/partner.xml
-
3beesdoo_easy_my_coop/views/product.xml
@ -1,23 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="share_a" model="product.template" > |
|||
<field name="name">Acquisition de parts A de Beescoop scrl</field> |
|||
<field name="default_code">share_a</field> |
|||
<field name="customer" eval="True" /> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
<record id="share_b" model="product.template" > |
|||
<field name="name">Acquisition de parts B de Beescoop scrl</field> |
|||
<field name="default_code">share_b</field> |
|||
<field name="customer" eval="True" /> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
<record id="share_c" model="product.template" > |
|||
<field name="name">Acquisition de parts C de Beescoop scrl</field> |
|||
<field name="default_code">share_c</field> |
|||
<field name="customer" eval="False" /> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,74 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Share products --> |
|||
<record id="share_a" model="product.product" > |
|||
<field name="name">Acquisition de parts A de Beescoop scrl</field> |
|||
<field name="default_code">share_a</field> |
|||
<field name="customer" eval="True" /> |
|||
<field name="allow_working" eval="True" /> |
|||
<field name="max_nb_eater_allowed">3</field> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
<record id="share_b" model="product.product" > |
|||
<field name="name">Acquisition de parts B de Beescoop scrl</field> |
|||
<field name="default_code">share_b</field> |
|||
<field name="customer" eval="True" /> |
|||
<field name="allow_working" eval="False" /> |
|||
<field name="max_nb_eater_allowed">2</field> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
<record id="share_c" model="product.product" > |
|||
<field name="name">Acquisition de parts C de Beescoop scrl</field> |
|||
<field name="default_code">share_c</field> |
|||
<field name="customer" eval="False" /> |
|||
<field name="allow_working" eval="False" /> |
|||
<field name="max_nb_eater_allowed">-1</field> |
|||
<field name="is_share" eval="True" /> |
|||
</record> |
|||
|
|||
<!-- Share lines --> |
|||
<record id="shareline_coop_1" model="share.line"> |
|||
<field name="share_product_id" ref="share_a"/> |
|||
<field name="share_number">2</field> |
|||
<field name="effective_date">2020-01-01</field> |
|||
<field name="partner_id" |
|||
ref="beesdoo_base.res_partner_cooperator_1_demo"/> |
|||
</record> |
|||
<record id="beesdoo_base.res_partner_cooperator_1_demo" |
|||
model="res.partner"> |
|||
<field name="cooperator" eval="True"/> |
|||
<field name="member" eval="True"/> |
|||
<field name="share_ids" eval="[(4, ref('shareline_coop_1'))]"/> |
|||
<field name="cooperator_type">share_a</field> |
|||
</record> |
|||
|
|||
<record id="shareline_coop_2" model="share.line"> |
|||
<field name="share_product_id" ref="share_b"/> |
|||
<field name="share_number">4</field> |
|||
<field name="effective_date">2020-01-01</field> |
|||
<field name="partner_id" |
|||
ref="beesdoo_base.res_partner_cooperator_2_demo"/> |
|||
</record> |
|||
<record id="beesdoo_base.res_partner_cooperator_2_demo" |
|||
model="res.partner"> |
|||
<field name="cooperator" eval="True"/> |
|||
<field name="member" eval="True"/> |
|||
<field name="share_ids" eval="[(4, ref('shareline_coop_2'))]"/> |
|||
<field name="cooperator_type">share_b</field> |
|||
</record> |
|||
|
|||
<record id="shareline_coop_3" model="share.line"> |
|||
<field name="share_product_id" ref="share_c"/> |
|||
<field name="share_number">6</field> |
|||
<field name="effective_date">2020-01-01</field> |
|||
<field name="partner_id" |
|||
ref="beesdoo_base.res_partner_cooperator_3_demo"/> |
|||
</record> |
|||
<record id="beesdoo_base.res_partner_cooperator_3_demo" |
|||
model="res.partner"> |
|||
<field name="cooperator" eval="True"/> |
|||
<field name="member" eval="True"/> |
|||
<field name="share_ids" eval="[(4, ref('shareline_coop_3'))]"/> |
|||
<field name="cooperator_type">share_c</field> |
|||
</record> |
|||
</odoo> |
@ -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 |
|||
) |
@ -0,0 +1 @@ |
|||
from . import test_res_partner |
@ -0,0 +1,78 @@ |
|||
# Copyright 2020 Coop IT Easy SCRLfs (<http://www.coopiteasy.be>) |
|||
# 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)) |
@ -1,30 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<record model="ir.ui.view" id="beesdoo_partner_form_view_remove_duplicate_cooperator_type"> |
|||
<field name="name">beesdoo.partner.form.view.remove_duplicate_cooperator_type</field> |
|||
<field name="model">res.partner</field> |
|||
<field name="inherit_id" ref="beesdoo_base.beesdoo_partner_form_view" /> |
|||
<field name="arch" type="xml"> |
|||
<field name="cooperator_type" position="replace" /> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.ui.view" id="beesdoo_partner_form_view_remove_duplicate_header"> |
|||
<field name="name">beesdoo.partner.form.view.remove_duplicate_header</field> |
|||
<field name="model">res.partner</field> |
|||
<field name="inherit_id" ref="beesdoo_shift.super_coop_partner_inherited_view_form" /> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="header" position="replace" /> |
|||
<xpath expr="//field[@name='state']" position="before"> |
|||
<button string="Create Subscription" name="%(easy_my_coop.action_view_create_subscription)d" |
|||
type="action" context="{'default_active_id': active_id}" groups="easy_my_coop.group_easy_my_coop_manager"/> |
|||
<button string="Update info" name="%(easy_my_coop.action_view_update_partner_info)d" |
|||
type="action" context="{'default_active_id': active_id}" groups="easy_my_coop.group_easy_my_coop_manager"/> |
|||
</xpath> |
|||
<xpath expr="//field[@name='info_session']" position="before"> |
|||
<field name="can_shop" /> |
|||
</xpath> |
|||
</field> |
|||
<field name="priority">99</field> |
|||
</record> |
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue