pos_loyalty_marketing_access/models/loyalty_program.py
2026-05-28 10:07:53 +07:00

71 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class LoyaltyProgram(models.Model):
_name = 'loyalty.program'
_inherit = ['loyalty.program', 'mail.thread', 'mail.activity.mixin']
state = fields.Selection([
('draft', 'Draft'),
('pending', 'Pending Approval'),
('approved', 'Approved')
], default='draft', string='Status', tracking=True)
def action_request_approval(self):
for program in self:
if program.state != 'draft':
continue
program.write({'state': 'pending'})
program.message_post(body=_("Approval requested for this marketing program."))
def action_approve(self):
for program in self:
if program.state != 'pending':
continue
# Check authorization
target_company = program.company_id or self.env.company
approver = target_company._get_marketing_program_approver()
if approver:
if self.env.user.id != approver.id:
raise UserError(_("Only the designated Marketing Program Approver (%s) can approve this program.") % approver.name)
else:
is_manager = self.env.user.has_group('pos_loyalty_marketing_access.group_marketing_manager')
if not is_manager:
raise UserError(_("Only a Marketing Manager can approve this program as no designated approver is configured."))
program.write({'state': 'approved'})
program.message_post(body=_("Marketing program has been approved and is now active."))
def action_reset_draft(self):
for program in self:
program.write({'state': 'draft'})
program.message_post(body=_("Marketing program reset to Draft."))
def write(self, vals):
# If we are only modifying state, skip the write reset checks
if len(vals) == 1 and 'state' in vals:
return super().write(vals)
# For modifications, check if they are in pending/approved state
for program in self:
if program.state in ['pending', 'approved']:
target_company = program.company_id or self.env.company
approver = target_company._get_marketing_program_approver()
if approver:
if self.env.user.id != approver.id:
vals['state'] = 'draft'
program.message_post(body=_("The approved marketing program was modified by a standard user and has been reset to Draft status for re-approval."))
else:
is_manager = self.env.user.has_group('pos_loyalty_marketing_access.group_marketing_manager')
if not is_manager:
vals['state'] = 'draft'
program.message_post(body=_("The approved marketing program was modified by a standard user and has been reset to Draft status for re-approval."))
return super().write(vals)