Files
tryton/product.py
T

150 lines
5.0 KiB
Python

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Not, Bool, Eval
from trytond.transaction import Transaction
STATES = {
'readonly': Not(Bool(Eval('active'))),
}
class Template(ModelSQL, ModelView):
"Product Template"
_name = "product.template"
_description = __doc__
name = fields.Char('Name', size=None, required=True, translate=True,
select=1, states=STATES)
type = fields.Selection([
('stockable', 'Stockable'),
('consumable', 'Consumable'),
('service', 'Service')
], 'Type', required=True, states=STATES)
category = fields.Many2One('product.category', 'Category', required=True,
states=STATES)
list_price = fields.Property(fields.Numeric('List Price', states=STATES,
digits=(16, 4)))
list_price_uom = fields.Function(fields.Numeric('List Price',
digits=(16, 4)), 'get_price_uom')
cost_price = fields.Property(fields.Numeric('Cost Price',
states=STATES, digits=(16, 4)))
cost_price_uom = fields.Function(fields.Numeric('Cost Price',
digits=(16, 4)), 'get_price_uom')
cost_price_method = fields.Property(fields.Selection([
("fixed", "Fixed"),
("average", "Average")
], 'Cost Method', required=True, states=STATES))
default_uom = fields.Many2One('product.uom', 'Default UOM', required=True,
states=STATES)
active = fields.Boolean('Active', select=1)
products = fields.One2Many('product.product', 'template', 'Products',
states=STATES)
def default_active(self):
return True
def default_type(self):
return 'stockable'
def default_cost_price_method(self):
return 'fixed'
def get_price_uom(self, ids, name):
product_uom_obj = self.pool.get('product.uom')
res = {}
field = name[:-4]
if Transaction().context.get('uom'):
to_uom = self.pool.get('product.uom').browse(
Transaction().context['uom'])
for product in self.browse(ids):
res[product.id] = product_uom_obj.compute_price(
product.default_uom, product[field], to_uom)
else:
for product in self.browse(ids):
res[product.id] = product[field]
return res
def copy(self, ids, default=None):
if default is None:
default = {}
default = default.copy()
default['products'] = False
return super(Template, self).copy(ids, default=default)
Template()
class Product(ModelSQL, ModelView):
"Product"
_name = "product.product"
_description = __doc__
_inherits = {'product.template': 'template'}
template = fields.Many2One('product.template', 'Product Template',
required=True, ondelete='CASCADE', select=1)
code = fields.Char("Code", size=None, select=1)
description = fields.Text("Description", translate=True)
def get_rec_name(self, ids, name):
if not ids:
return {}
res = {}
for product in self.browse(ids):
name = product.name
if product.code:
name = '[' + product.code + '] ' + product.name
res[product.id] = name
return res
def search_rec_name(self, name, clause):
ids = self.search([('code',) + clause[1:]], order=[])
if ids:
ids += self.search([('name',) + clause[1:]], order=[])
return [('id', 'in', ids)]
return [('name',) + clause[1:]]
def delete(self, ids):
template_obj = self.pool.get('product.template')
if isinstance(ids, (int, long)):
ids = [ids]
# Get the templates before we delete the products.
products = self.browse(ids)
template_ids = [product.template.id for product in products]
res = super(Product, self).delete(ids)
# Get templates that are still linked after delete.
templates = template_obj.browse(template_ids)
unlinked_template_ids = [template.id for template in templates \
if not template.products]
if unlinked_template_ids:
template_obj.delete(unlinked_template_ids)
return res
def copy(self, ids, default=None):
template_obj = self.pool.get('product.template')
int_id = False
if isinstance(ids, (int, long)):
int_id = True
ids = [ids]
if default is None:
default = {}
default = default.copy()
default['products'] = False
new_ids = []
for product in self.browse(ids):
default['template'] = template_obj.copy(product.template.id)
new_id = super(Product, self).copy(product.id, default=default)
new_ids.append(new_id)
if int_id:
return new_ids[0]
return new_ids
Product()