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): def create(self, vals_list):
partners = super().create(vals_list) partners = super().create(vals_list)
# Check context or stack trace to see if we are creating an internal user or employee # Skip auto-Silver assignment for system/internal partner creations.
import sys # Internal callers (res_users, hr_employee, etc.) should pass
is_internal_creation = False # context key 'no_loyalty_auto_assign=True' to suppress this logic.
frame = sys._getframe() if (
while frame: self.env.context.get('install_mode')
filename = frame.f_code.co_filename or self.env.context.get('import_file')
if 'res_users.py' in filename or 'hr_employee.py' in filename: or self.env.context.get('no_loyalty_auto_assign')
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'):
return partners return partners
for partner in partners: for partner in partners:
if partner.is_company: if partner.is_company:
continue 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( lowest_program = self.env['loyalty.program'].sudo().search(
[('multi_level_membership', '=', True), ('manual_membership', '=', False), ('name', '=ilike', 'Membership Silver')], [('multi_level_membership', '=', True), ('manual_membership', '=', False), ('name', '=ilike', 'Membership Silver')],
limit=1 limit=1
@ -89,7 +84,9 @@ class ResPartner(models.Model):
'points': 0, '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}) partner.sudo().write({'membership_level_id': lowest_program.id})
return partners return partners