[FIX] *_coupon: introduce total_order_count as replacement to get_total_order_count()

closes odoo/odoo#40325

Related: odoo/upgrade#1869
Signed-off-by: pimodoo <pimodoo@users.noreply.github.com>
This commit is contained in:
Joseph Caburnay
2020-11-04 10:34:34 +00:00
parent e9583cccdd
commit 0f50dd33d0
5 changed files with 25 additions and 19 deletions
+4 -4
View File
@@ -51,6 +51,7 @@ class CouponProgram(models.Model):
currency_id = fields.Many2one(string="Currency", related='company_id.currency_id', readonly=True)
validity_duration = fields.Integer(default=30,
help="Validity duration for a coupon after its generation")
total_order_count = fields.Integer("Total Order Count", compute="_compute_total_order_count")
@api.constrains('promo_code')
def _check_promo_code_constraint(self):
@@ -155,7 +156,6 @@ class CouponProgram(models.Model):
})
return generated_coupons
def get_total_order_count(self):
'''This returns the total number of usage of this program.'''
self.ensure_one()
return 0
def _compute_total_order_count(self):
for program in self:
program.total_order_count = 0
+5 -3
View File
@@ -79,6 +79,8 @@ class CouponProgram(models.Model):
domain = ast.literal_eval(program.rule_partners_domain) if program.rule_partners_domain else []
program.valid_partner_ids = self.env["res.partner"].search(domain).ids
def get_total_order_count(self):
res = super(CouponProgram, self).get_total_order_count()
return res + self.pos_order_count
@api.depends('pos_order_ids')
def _compute_total_order_count(self):
super(CouponProgram, self)._compute_total_order_count()
for program in self:
program.total_order_count += len(program.pos_order_ids)
+6 -6
View File
@@ -810,20 +810,20 @@ odoo.define('pos_coupon.pos', function (require) {
// Check max number usage
if (program.maximum_use_number !== 0) {
const numberUse = await rpc
const [result] = await rpc
.query({
model: 'coupon.program',
method: 'get_total_order_count',
args: [program.id],
method: 'read',
args: [program.id, ['total_order_count']],
kwargs: { context: session.user_context },
})
.catch(() => Promise.resolve(null)); // may happen because offline
if (numberUse === null) {
.catch(() => Promise.resolve([false])); // may happen because offline
if (!result) {
return {
successful: false,
reason: 'Unable to get the number of usage of the program.',
};
} else if (!(numberUse < program.maximum_use_number)) {
} else if (!(result.total_order_count < program.maximum_use_number)) {
return {
successful: false,
reason: "Program's maximum number of usage has been reached.",
+7 -5
View File
@@ -28,7 +28,7 @@ class CouponProgram(models.Model):
def _check_promo_code(self, order, coupon_code):
message = {}
if self.maximum_use_number != 0 and self.get_total_order_count() >= self.maximum_use_number:
if self.maximum_use_number != 0 and self.total_order_count >= self.maximum_use_number:
message = {'error': _('Promo code %s has been expired.') % (coupon_code)}
elif not self._filter_on_mimimum_amount(order):
message = {'error': _(
@@ -100,7 +100,7 @@ class CouponProgram(models.Model):
return self.filtered(lambda program: program.promo_code_usage == 'code_needed' and program.promo_code != order.promo_code)
def _filter_unexpired_programs(self, order):
return self.filtered(lambda program: program.maximum_use_number == 0 or program.get_total_order_count() <= program.maximum_use_number)
return self.filtered(lambda program: program.maximum_use_number == 0 or program.total_order_count <= program.maximum_use_number)
def _filter_programs_on_partners(self, order):
return self.filtered(lambda program: program._is_valid_partner(order.partner_id))
@@ -193,6 +193,8 @@ class CouponProgram(models.Model):
# remove least interesting programs
return self - (programs - most_interesting_program)
def get_total_order_count(self):
res = super(CouponProgram, self).get_total_order_count()
return res + self.order_count
# The api.depends is handled in `def modified` of `sale_coupon/models/sale_order.py`
def _compute_total_order_count(self):
super(CouponProgram, self)._compute_total_order_count()
for program in self:
program.total_order_count += program.order_count
+3 -1
View File
@@ -474,9 +474,11 @@ class SaleOrderLine(models.Model):
if 'product_id' in fnames:
Program = self.env['coupon.program'].sudo()
field_order_count = Program._fields['order_count']
field_total_order_count = Program._fields['total_order_count']
programs = self.env.cache.get_records(Program, field_order_count)
programs |= self.env.cache.get_records(Program, field_total_order_count)
if programs:
products = self.filtered('is_reward_line').mapped('product_id')
for program in programs:
if program.discount_line_product_id in products:
self.env.cache.invalidate([(field_order_count, program.ids)])
self.env.cache.invalidate([(field_order_count, program.ids), (field_total_order_count, program.ids)])