refactor: replace frame inspection with context-based flag for loyalty membership assignment

This commit is contained in:
Suherdy Yacob 2026-06-03 21:45:58 +07:00
parent a6cb85b6c0
commit 7f667f2855

View File

@ -47,26 +47,21 @@ class ResPartner(models.Model):
def create(self, vals_list):
partners = super().create(vals_list)
# Check context or stack trace to see if we are creating an internal user or employee
import sys
is_internal_creation = False
frame = sys._getframe()
while frame:
filename = frame.f_code.co_filename
if 'res_users.py' in filename or 'hr_employee.py' in filename:
is_internal_creation = True
break
frame = frame.f_back
# Also respect standard Odoo install and import bypass flags
if is_internal_creation or self.env.context.get('install_mode') or self.env.context.get('import_file'):
# Skip auto-Silver assignment for system/internal partner creations.
# Internal callers (res_users, hr_employee, etc.) should pass
# context key 'no_loyalty_auto_assign=True' to suppress this logic.
if (
self.env.context.get('install_mode')
or self.env.context.get('import_file')
or self.env.context.get('no_loyalty_auto_assign')
):
return partners
for partner in partners:
if partner.is_company:
continue
# Find the lowest membership program level (Membership Silver)
# Find Membership Silver first, then fall back to lowest spend program
lowest_program = self.env['loyalty.program'].sudo().search(
[('multi_level_membership', '=', True), ('manual_membership', '=', False), ('name', '=ilike', 'Membership Silver')],
limit=1
@ -89,7 +84,9 @@ class ResPartner(models.Model):
'points': 0,
})
if hasattr(partner, 'membership_level_id') and not partner.membership_level_id:
# Always write membership_level_id if not already set.
# pos_loyalty_multi_level is a hard dependency so the field always exists.
if not partner.membership_level_id:
partner.sudo().write({'membership_level_id': lowest_program.id})
return partners