refactor: replace frame inspection with context-based flag for loyalty membership assignment
This commit is contained in:
parent
a6cb85b6c0
commit
7f667f2855
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user