refactor: replace frame inspection with context-based flag for loyalty membership assignment
This commit is contained in:
parent
a6cb85b6c0
commit
7f667f2855
@ -46,27 +46,22 @@ class ResPartner(models.Model):
|
||||
@api.model_create_multi
|
||||
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
|
||||
@ -88,8 +83,10 @@ class ResPartner(models.Model):
|
||||
'program_id': lowest_program.id,
|
||||
'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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user