113 lines
5.0 KiB
Python
113 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import logging
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.addons.product.models.product_template import PRICE_CONTEXT_KEYS
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class EventBoothCategory(models.Model):
|
|
_inherit = 'event.booth.category'
|
|
|
|
def _default_product_id(self):
|
|
return self.env.ref('event_booth_sale.product_product_event_booth', raise_if_not_found=False)
|
|
|
|
product_id = fields.Many2one(
|
|
'product.product', string='Product', required=True,
|
|
domain=[('detailed_type', '=', 'event_booth')], default=_default_product_id,
|
|
groups="event.group_event_registration_desk")
|
|
price = fields.Float(
|
|
string='Price', compute='_compute_price', digits='Product Price', readonly=False,
|
|
store=True, groups="event.group_event_registration_desk")
|
|
price_incl = fields.Float(
|
|
string='Price incl', compute='_compute_price_incl', digits='Product Price', readonly=False,
|
|
groups="event.group_event_registration_desk")
|
|
currency_id = fields.Many2one(related='product_id.currency_id', groups="event.group_event_registration_desk")
|
|
price_reduce = fields.Float(
|
|
string='Price Reduce', compute='_compute_price_reduce',
|
|
compute_sudo=True, digits='Product Price', groups="event.group_event_registration_desk")
|
|
price_reduce_taxinc = fields.Float(
|
|
string='Price Reduce Tax inc', compute='_compute_price_reduce_taxinc',
|
|
compute_sudo=True
|
|
)
|
|
image_1920 = fields.Image(compute='_compute_image_1920', readonly=False, store=True)
|
|
|
|
@api.depends('product_id')
|
|
def _compute_image_1920(self):
|
|
for category in self:
|
|
category.image_1920 = category.image_1920 if category.image_1920 else category.product_id.image_1920
|
|
|
|
@api.depends('product_id')
|
|
def _compute_price(self):
|
|
""" By default price comes from category but can be changed by event
|
|
people as product may be shared across various categories. """
|
|
for category in self:
|
|
if category.product_id and category.product_id.list_price:
|
|
category.price = category.product_id.list_price + category.product_id.price_extra
|
|
|
|
@api.depends('product_id', 'product_id.taxes_id', 'price')
|
|
def _compute_price_incl(self):
|
|
for category in self:
|
|
if category.product_id and category.price:
|
|
tax_ids = category.product_id.taxes_id
|
|
taxes = tax_ids.compute_all(category.price, category.currency_id, 1.0, product=category.product_id)
|
|
category.price_incl = taxes['total_included']
|
|
else:
|
|
category.price_incl = 0
|
|
|
|
@api.depends_context(*PRICE_CONTEXT_KEYS)
|
|
@api.depends('product_id', 'price')
|
|
def _compute_price_reduce(self):
|
|
for category in self:
|
|
contextual_discount = category.product_id._get_contextual_discount()
|
|
category.price_reduce = (1.0 - contextual_discount) * category.price
|
|
|
|
@api.depends_context(*PRICE_CONTEXT_KEYS)
|
|
@api.depends('product_id', 'price_reduce')
|
|
def _compute_price_reduce_taxinc(self):
|
|
for category in self:
|
|
tax_ids = category.product_id.taxes_id
|
|
taxes = tax_ids.compute_all(category.price_reduce, category.currency_id, 1.0, product=category.product_id)
|
|
category.price_reduce_taxinc = taxes['total_included'] or 0
|
|
|
|
def _init_column(self, column_name):
|
|
""" Initialize product_id for existing columns when installing sale
|
|
bridge, to ensure required attribute is fulfilled. """
|
|
if column_name != "product_id":
|
|
return super(EventBoothCategory, self)._init_column(column_name)
|
|
|
|
# fetch void columns
|
|
self.env.cr.execute("SELECT id FROM %s WHERE product_id IS NULL" % self._table)
|
|
booth_category_ids = self.env.cr.fetchall()
|
|
if not booth_category_ids:
|
|
return
|
|
|
|
# update existing columns
|
|
_logger.debug("Table '%s': setting default value of new column %s to unique values for each row",
|
|
self._table, column_name)
|
|
default_booth_product = self._default_product_id()
|
|
if default_booth_product:
|
|
product_id = default_booth_product.id
|
|
else:
|
|
product_id = self.env['product.product'].create({
|
|
'name': 'Generic Event Booth Product',
|
|
'categ_id': self.env.ref('event_sale.product_category_events').id,
|
|
'list_price': 100,
|
|
'standard_price': 0,
|
|
'detailed_type': 'event_booth',
|
|
'invoice_policy': 'order',
|
|
}).id
|
|
self.env['ir.model.data'].create({
|
|
'name': 'product_product_event_booth',
|
|
'module': 'event_booth_sale',
|
|
'model': 'product.product',
|
|
'res_id': product_id,
|
|
})
|
|
self.env.cr._obj.execute(
|
|
f'UPDATE {self._table} SET product_id = %s WHERE id IN %s;',
|
|
(product_id, tuple(booth_category_ids))
|
|
)
|