Now we can translate name and description field in lunch.product object and we want that translation in kanban view of 'lunch.product.report'. So we set related field in 'lunch.product.report' and remove those fields from init(). Due to related field it will affect on performace of lunch.product.report kanban view loading. Task-2068989 closes odoo/odoo#41206 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
104 lines
4.9 KiB
Python
104 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
|
|
from odoo.tools import formatLang
|
|
|
|
|
|
class LunchProductCategory(models.Model):
|
|
""" Category of the product such as pizza, sandwich, pasta, chinese, burger... """
|
|
_name = 'lunch.product.category'
|
|
_inherit = 'image.mixin'
|
|
_description = 'Lunch Product Category'
|
|
|
|
name = fields.Char('Product Category', required=True, translate=True)
|
|
company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
|
|
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
|
|
topping_label_1 = fields.Char('Extra 1 Label', required=True, default='Extras')
|
|
topping_label_2 = fields.Char('Extra 2 Label', required=True, default='Beverages')
|
|
topping_label_3 = fields.Char('Extra 3 Label', required=True, default='Extra Label 3')
|
|
topping_ids_1 = fields.One2many('lunch.topping', 'category_id', domain=[('topping_category', '=', 1)], ondelete='cascade')
|
|
topping_ids_2 = fields.One2many('lunch.topping', 'category_id', domain=[('topping_category', '=', 2)], ondelete='cascade')
|
|
topping_ids_3 = fields.One2many('lunch.topping', 'category_id', domain=[('topping_category', '=', 3)], ondelete='cascade')
|
|
topping_quantity_1 = fields.Selection([
|
|
('0_more', 'None or More'),
|
|
('1_more', 'One or More'),
|
|
('1', 'Only One')], 'Extra 1 Quantity', default='0_more', required=True)
|
|
topping_quantity_2 = fields.Selection([
|
|
('0_more', 'None or More'),
|
|
('1_more', 'One or More'),
|
|
('1', 'Only One')], 'Extra 2 Quantity', default='0_more', required=True)
|
|
topping_quantity_3 = fields.Selection([
|
|
('0_more', 'None or More'),
|
|
('1_more', 'One or More'),
|
|
('1', 'Only One')], 'Extra 3 Quantity', default='0_more', required=True)
|
|
product_count = fields.Integer(compute='_compute_product_count', help="The number of products related to this category")
|
|
|
|
def _compute_product_count(self):
|
|
product_data = self.env['lunch.product'].read_group([('category_id', 'in', self.ids)], ['category_id'], ['category_id'])
|
|
data = {product['category_id'][0]: product['category_id_count'] for product in product_data}
|
|
for category in self:
|
|
category.product_count = data.get(category.id, 0)
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
for topping in vals.get('topping_ids_2', []):
|
|
topping[2].update({'topping_category': 2})
|
|
for topping in vals.get('topping_ids_3', []):
|
|
topping[2].update({'topping_category': 3})
|
|
return super(LunchProductCategory, self).create(vals)
|
|
|
|
def write(self, vals):
|
|
for topping in vals.get('topping_ids_2', []):
|
|
topping_values = topping[2]
|
|
if topping_values:
|
|
topping_values.update({'topping_category': 2})
|
|
for topping in vals.get('topping_ids_3', []):
|
|
topping_values = topping[2]
|
|
if topping_values:
|
|
topping_values.update({'topping_category': 3})
|
|
return super(LunchProductCategory, self).write(vals)
|
|
|
|
|
|
class LunchTopping(models.Model):
|
|
""""""
|
|
_name = 'lunch.topping'
|
|
_description = 'Lunch Extras'
|
|
|
|
name = fields.Char('Name', required=True)
|
|
company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
|
|
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
|
|
price = fields.Float('Price', digits='Account', required=True)
|
|
category_id = fields.Many2one('lunch.product.category')
|
|
topping_category = fields.Integer('Topping Category', help="This field is a technical field", required=True, default=1)
|
|
|
|
def name_get(self):
|
|
currency_id = self.env.company.currency_id
|
|
res = dict(super(LunchTopping, self).name_get())
|
|
for topping in self:
|
|
price = formatLang(self.env, topping.price, currency_obj=currency_id)
|
|
res[topping.id] = '%s %s' % (topping.name, price)
|
|
return list(res.items())
|
|
|
|
|
|
class LunchProduct(models.Model):
|
|
""" Products available to order. A product is linked to a specific vendor. """
|
|
_name = 'lunch.product'
|
|
_description = 'Lunch Product'
|
|
_inherit = 'image.mixin'
|
|
_order = 'name'
|
|
|
|
name = fields.Char('Product Name', required=True, translate=True)
|
|
category_id = fields.Many2one('lunch.product.category', 'Product Category', required=True)
|
|
description = fields.Text('Description', translate=True)
|
|
price = fields.Float('Price', digits='Account', required=True)
|
|
supplier_id = fields.Many2one('lunch.supplier', 'Vendor', required=True)
|
|
active = fields.Boolean(default=True)
|
|
|
|
company_id = fields.Many2one('res.company', related='supplier_id.company_id', store=True)
|
|
currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
|
|
|
|
new_until = fields.Date('New Until')
|
|
favorite_user_ids = fields.Many2many('res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id')
|