64 lines
3.0 KiB
Python
64 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, fields, _
|
|
from odoo.http import request
|
|
|
|
|
|
class ProductProduct(models.Model):
|
|
_inherit = 'product.product'
|
|
|
|
stock_notification_partner_ids = fields.Many2many('res.partner', relation='stock_notification_product_partner_rel', string='Back in stock Notifications')
|
|
|
|
def _has_stock_notification(self, partner):
|
|
self.ensure_one()
|
|
return partner in self.stock_notification_partner_ids
|
|
|
|
def _get_cart_qty(self, website=None):
|
|
if not self.allow_out_of_stock_order:
|
|
website = website or self.env['website'].get_current_website()
|
|
# When the cron is run manually, request has no attribute website, and that would cause a crash
|
|
# so we check for it
|
|
cart = website and request and hasattr(request, 'website') and website.sale_get_order() or None
|
|
if cart:
|
|
return sum(cart._get_common_product_lines(product=self).mapped('product_uom_qty'))
|
|
return 0
|
|
|
|
def _is_sold_out(self):
|
|
self.ensure_one()
|
|
if not self.type == 'product':
|
|
return False
|
|
free_qty = self.env['website'].get_current_website()._get_product_available_qty(self.sudo())
|
|
return free_qty <= 0
|
|
|
|
def _website_show_quick_add(self):
|
|
return (self.allow_out_of_stock_order or not self._is_sold_out()) and super()._website_show_quick_add()
|
|
|
|
def _send_availability_email(self):
|
|
for product in self.search([('stock_notification_partner_ids', '!=', False)]):
|
|
if product._is_sold_out():
|
|
continue
|
|
for partner in product.stock_notification_partner_ids:
|
|
self_ctxt = self.with_context(lang=partner.lang)
|
|
product_ctxt = product.with_context(lang=partner.lang)
|
|
body_html = self_ctxt.env['ir.qweb']._render(
|
|
'website_sale_stock.availability_email_body', {'product': product_ctxt})
|
|
msg = self_ctxt.env['mail.message'].sudo().new(dict(body=body_html, record_name=product_ctxt.name))
|
|
full_mail = self_ctxt.env['mail.render.mixin']._render_encapsulate(
|
|
"mail.mail_notification_light",
|
|
body_html,
|
|
add_context=dict(message=msg, model_description=_("Product")),
|
|
)
|
|
context = {'lang': partner.lang} # Use partner lang to translate mail subject below
|
|
mail_values = {
|
|
"subject": _("The product '%(product_name)s' is now available", product_name=product_ctxt.name),
|
|
"email_from": (product.company_id.partner_id or self.env.user).email_formatted,
|
|
"email_to": partner.email_formatted,
|
|
"body_html": full_mail,
|
|
}
|
|
del context
|
|
|
|
mail = self_ctxt.env['mail.mail'].sudo().create(mail_values)
|
|
mail.send(raise_exception=False)
|
|
product.stock_notification_partner_ids -= partner
|