Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions spp_farmer_registry_base/models/group_membership.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@ class G2PGroupMembership(models.Model):
individual_gender = fields.Many2one("gender.type", related="individual.gender", readonly=True)

def unlink(self):
for rec in self:
group_id = rec.group
res = super(G2PGroupMembership, rec).unlink()
if self.env.context.get("skip_head_check"):
return res
# Skip head check if specified in context
if self.env.context.get("skip_head_check"):
return super().unlink()

# Group records by their group to check head members
groups_to_check = self.mapped("group")

# Perform the unlink operation
result = super().unlink()

# Check if any group lost its head member
for group in groups_to_check:
if (
self.env.ref("g2p_registry_membership.group_membership_kind_head").id
not in group_id.group_membership_ids.mapped("kind").ids
not in group.group_membership_ids.mapped("kind").ids
):
raise UserError(_("Farm must have a head member."))
return res

return result
1 change: 1 addition & 0 deletions spp_farmer_registry_base/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from . import test_farm
from . import test_farm_season
from . import test_group_membership
77 changes: 77 additions & 0 deletions spp_farmer_registry_base/tests/test_group_membership.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from odoo.exceptions import UserError
from odoo.tests import tagged
from odoo.tests.common import TransactionCase


@tagged("post_install", "-at_install")
class TestG2PGroupMembership(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Set context to avoid job queue delay
cls.env = cls.env(
context=dict(
cls.env.context,
test_queue_job_no_delay=True,
)
)

# Create test data
cls.individual_1 = cls.env["res.partner"].create(
{
"name": "Test Individual 1",
"is_group": False,
"is_registrant": True,
}
)
cls.individual_2 = cls.env["res.partner"].create(
{
"name": "Test Individual 2",
"is_group": False,
"is_registrant": True,
}
)
cls.group = cls.env["res.partner"].create(
{
"name": "Test Group",
"is_group": True,
"is_registrant": True,
}
)

# Get the head membership kind
cls.head_kind = cls.env.ref("g2p_registry_membership.group_membership_kind_head")

# Create memberships
cls.membership_1 = cls.env["g2p.group.membership"].create(
{
"group": cls.group.id,
"individual": cls.individual_1.id,
"kind": [(4, cls.head_kind.id)],
}
)
cls.membership_2 = cls.env["g2p.group.membership"].create(
{
"group": cls.group.id,
"individual": cls.individual_2.id,
}
)

def test_01_unlink_non_head_member(self):
"""Test unlink of a non-head member"""
# Should be able to unlink non-head member
self.membership_2.unlink()
self.assertFalse(self.membership_2.exists())

def test_02_unlink_head_member_with_skip_context(self):
"""Test unlink of head member with skip_head_check context"""
# Should be able to unlink head member with skip context
self.membership_1.with_context(skip_head_check=True).unlink()
self.assertFalse(self.membership_1.exists())

def test_03_unlink_head_member_without_skip_context(self):
"""Test unlink of head member without skip_head_check context"""
# Should raise error when trying to unlink head member
with self.assertRaises(UserError):
self.membership_1.unlink()
self.assertTrue(self.membership_1.exists())
Loading