TIP: You can type at any time to perform a new search.
Products & Pricelists
product · odoo/odoo
Security findings
- Repository
- odoo/odoo · module folder
- Module version
- 1.2
- Category
- Sales/Sales
- Folder size
- 13.98 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- No
- Website
- None
- Last tracking update
- 2026-10-05 00:19:51
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Christophe Matthieu, Nicolas Lempereur, Aaron Bohy, Géry Debongnie, Lucas Perais (lpe), Jorge Pinna Puissant, Arnold Moyaux, Julien Castiaux, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, William Henrotin, Julien Mougenot, svs-odoo, Achraf (abz), David Beguin, Rémy Voet (ryv), Tiffany Chang (tic), Pierre Paridans, Romain Estievenart, Miquel Raïch, Víctor Martínez, Aurelien van Delft (avd), luvi, Hubert Van De Walle, Valentin Chevalier, Pedram (PEBR), Victor Piryns (pivi), amdi-odoo, Levi Siuzdak (sile), Dylan Kiss (dyki), Chong Wang (cwg), Brieuc-brd, SilvioC2C, Sarah Bellefroid, Louis Travaux, Arnaud Sibille, adda-odoo, Andrzej(pian), lase@odoo.com, odoostan, mano-odoo, Harsh Shah, Patricia Daloze (pda), Xavier Luyckx (xlu), Stéphane Diez, dhha-odoo, Abdo Mongy, Arthur Nanson, Mohammad Abdulmoneim (abdu), djameltouati, khsr-odoo, Pierre Lamotte (pila), Pierre Pulinckx, Michaël Mattiello, Shrey Mehta, Carmine, Mahdi Alijani (malj), MaximeNoirhomme, bona-odoo, Krzysztof Magusiak (krma), Florian Malfroid, kukor-odoo, krip-odoo, Hazem Ibrahim, Maeva De Keyser (MDEK), utma-odoo, bhna-odoo, akha, mohannedah, agbr-odoo, Lulu Grimalkin (lugr), felin-odoo, Julien Launois (jula), Laetitia (ldau), Quentin Colla (qucol), Waleed Elgamal, Amr Elkhatieb, Yash Tiwari (Yatiw), Nisarg (nipl), Lionel Piraux (lipi), hossamelgendy1, YoussefM890, maap-odoo, Ravij Parikh, Mohamed Barakat, Merlin Guillaume, Mazen, srap-odoo, Oskar Wielgos, Nguyen Nguyen (ngtpn), jodh-odoo, abhk-odoo, sako-odoo, Youssef (abyo), msho-odoo, Julien Carion, ELCO, jsum-odoo, Przemysław Duryło, Moamen(msho), Khaj-odoo, chpa-odoo, Oussema Heni, stefanorigano (sri), Krishna Patel, Antonio Pimentel, Karim Gamaleldin, jeanschoenlaub, Julien Coppin (jucop), nutav, Julien Piron, Lucas Gvasalia, nby, Jean Schoenlaub, Corentin Deruyck, pusu-odoo, Elisabeth Dickinson (edi), Ahmed Hamila, Cezar Bulancea (cebul), mekot-odoo
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- account, event_product, l10n_pk, loyalty, mrp, point_of_sale, stock, storage_image_product, storage_media_product
- Description
This is the base module for managing products and pricelists in Odoo. ======================================================================== Products support variants, different pricing methods, vendors information, make to stock/order, different units of measure, packaging and properties. Pricelists support: ------------------- * Multiple-level of discount (by product, category, quantities) * Compute price based on different criteria: * Other pricelist * Cost price * List price * Vendor price Pricelists preferences by product and/or partners. Print product labels with barcode.
Code Analysis
Views touched (90)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
attribute_tree_view |
product.attribute.list | product.attribute | list | New |
barcode_2x7_label |
barcode_2x7_label | ir.ui.view | qweb | New |
barcode_4x12_label |
barcode_4x12_label | ir.ui.view | qweb | New |
barcode_4x7_label |
barcode_4x7_label | ir.ui.view | qweb | New |
barcode_alternative_label |
barcode_alternative_label | ir.ui.view | qweb | New |
barcode_dymo_label |
barcode_dymo_label | ir.ui.view | qweb | New |
barcode_jewelry_label |
barcode_jewelry_label | ir.ui.view | qweb | New |
barcode_normal_label |
barcode_normal_label | ir.ui.view | qweb | New |
barcode_small_label |
barcode_small_label | ir.ui.view | qweb | New |
inherits_website_sale_country_group_form |
res.country.group.form.inherit.product | res.country.group | form | Inherits base.view_country_group_form |
product.product_combo_view_form |
product.combo.form | product.combo | form | New |
product.product_combo_view_tree |
product.combo.list | product.combo | list | New |
product_attribute_search |
product.attribute.view.search | product.attribute | search | New |
product_attribute_value_form |
product.attribute.value.form | product.attribute.value | form | New |
product_attribute_value_list |
product.attribute.value.list | product.attribute.value | list | New |
product_attribute_view_form |
product.attribute.form | product.attribute | form | New |
product_category_form_view |
product.category.form | product.category | form | New |
product_category_list_view |
product.category.list | product.category | list | New |
product_category_search_view |
product.category.search | product.category | search | New |
product_document_form |
product.document.form | product.document | form | New |
product_document_kanban |
product.document.kanban | product.document | kanban | New |
product_document_list |
product.document.list | product.document | list | New |
product_document_search |
product.document.search | product.document | search | New |
product_kanban_view |
Product Kanban | product.product | kanban | New |
product_label_layout_form |
product.label.layout.form | product.label.layout | form | New |
product_normal_form_view |
product.product.form | product.product | form | Inherits product.product_template_form_view |
product_pricelist_item_calendar |
product.pricelist.item.calendar | product.pricelist.item | calendar | New |
product_pricelist_item_form_multi_create |
product.pricelist.item.multi.create | product.pricelist.item | form | Inherits product.product_pricelist_item_form_view |
product_pricelist_item_form_view |
product.pricelist.item.form | product.pricelist.item | form | New |
product_pricelist_item_product_product_form_view |
product.pricelist.item.product.product.form.inherit | product.pricelist.item | form | Inherits product.product_pricelist_item_product_template_form_view |
product_pricelist_item_product_template_form_view |
product.pricelist.item.product.template.form.inherit | product.pricelist.item | form | Inherits product.product_pricelist_item_form_view |
product_pricelist_item_tree_view |
product.pricelist.item.list | product.pricelist.item | list | New |
product_pricelist_item_tree_view_from_product |
product.pricelist.item.list | product.pricelist.item | list | New |
product_pricelist_item_view_search |
product.pricelist.item.search | product.pricelist.item | search | New |
product_pricelist_view |
product.pricelist.form | product.pricelist | form | New |
product_pricelist_view_kanban |
product.pricelist.kanban | product.pricelist | kanban | New |
product_pricelist_view_search |
product.pricelist.search | product.pricelist | search | New |
product_pricelist_view_tree |
product.pricelist.list | product.pricelist | list | New |
product_product_tree_view |
product.product.list | product.product | list | New |
product_product_view_activity |
product.product.activity | product.product | activity | New |
product_product_view_form_normalized |
product.product.view.form.normalized | product.product | form | New |
product_search_form_view |
product.product.search | product.product | search | Inherits product.product_template_search_view |
product_supplierinfo_form_view |
product.supplierinfo.form.view | product.supplierinfo | form | New |
product_supplierinfo_search_view |
product.supplierinfo.search.view | product.supplierinfo | search | New |
product_supplierinfo_tree_view |
product.supplierinfo.list.view | product.supplierinfo | list | New |
product_supplierinfo_view_kanban |
product.supplierinfo.kanban | product.supplierinfo | kanban | New |
product_tag_form_view |
product.tag.form | product.tag | form | New |
product_tag_tree_view |
product.tag.list | product.tag | list | New |
product_template_attribute_line_form |
product.template.attribute.line.form | product.template.attribute.line | form | New |
product_template_attribute_line_view_tree |
product.template.attribute.line.view.list | product.template.attribute.line | list | New |
product_template_attribute_value_view_form |
product.template.attribute.value.view.form. | product.template.attribute.value | form | New |
product_template_attribute_value_view_search |
product.template.attribute.value | search | New | |
product_template_attribute_value_view_tree |
product.template.attribute.value.view.list | product.template.attribute.value | list | New |
product_template_form_view |
product.template.common.form | product.template | form | New |
product_template_kanban_view |
Product.template.product.kanban | product.template | kanban | New |
product_template_list_view_purchasable |
product.template.list.purchasable | product.template | list | Inherits product.product_template_tree_view |
product_template_list_view_sellable |
product.template.list.sellable | product.template | list | Inherits product.product_template_tree_view |
product_template_only_form_view |
product.template.product.form | product.template | form | Inherits product.product_template_form_view |
product_template_search_view |
product.template.search | product.template | search | New |
product_template_tree_view |
product.template.product.list | product.template | list | New |
product_template_view_activity |
product.template.activity | product.template | activity | New |
product_template_view_tree_tag |
product.template.view.list.tag | product.template | list | New |
product_uom_list_view |
product.uom.list | product.uom | list | New |
product_uom_view_form |
product.uom.form | product.uom | form | New |
product_view_kanban_catalog |
product.view.kanban.catalog | product.product | kanban | New |
product_view_list_qty |
product.product.view.list.qty | product.product | list | New |
product_view_search_catalog |
product.view.search.catalog | product.product | search | New |
qr_2x7_label |
qr_2x7_label | ir.ui.view | qweb | New |
qr_4x12_label |
qr_4x12_label | ir.ui.view | qweb | New |
qr_4x7_label |
qr_4x7_label | ir.ui.view | qweb | New |
qr_alternative_label |
qr_alternative_label | ir.ui.view | qweb | New |
qr_dymo_label |
qr_dymo_label | ir.ui.view | qweb | New |
qr_jewelry_label |
qr_jewelry_label | ir.ui.view | qweb | New |
qr_normal_label |
qr_normal_label | ir.ui.view | qweb | New |
qr_small_label |
qr_small_label | ir.ui.view | qweb | New |
report_label_barcode |
report_label_barcode | ir.ui.view | qweb | New |
report_label_contour_marks |
report_label_contour_marks | ir.ui.view | qweb | New |
report_label_value_block |
report_label_value_block | ir.ui.view | qweb | New |
report_pricelist |
report_pricelist | ir.ui.view | qweb | New |
report_pricelist_page |
report_pricelist_page | ir.ui.view | qweb | New |
report_product_label_dymo |
report_product_label_dymo | ir.ui.view | qweb | New |
report_product_label_pdf |
report_product_label_pdf | ir.ui.view | qweb | New |
report_product_label_zpl |
report_product_label_zpl | ir.ui.view | qweb | New |
report_productlabel_dymo |
report_productlabel_dymo | ir.ui.view | qweb | New |
report_productlabel_pdf |
report_productlabel_pdf | ir.ui.view | qweb | New |
report_productlabel_zpl |
report_productlabel_zpl | ir.ui.view | qweb | New |
res_config_settings_view_form |
res.config.settings.view.form.inherit.product | res.config.settings | form | Inherits base_setup.res_config_settings_view_form |
uom_uom_view_form |
uom.uom.view.form.inherit.product | uom.uom | form | Inherits uom.uom_uom_view_form |
update_product_attribute_value_form |
update.product.attribute.value.form | update.product.attribute.value | form | New |
view_partner_property_form |
res.partner.product.property.form.inherit | res.partner | form | Inherits base.view_partner_form |
HTTP endpoints (4)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/product/catalog/order_lines_info |
ProductCatalogController.product_catalog_get_order_lines_info |
user | jsonrpc | ALL | |
/product/catalog/update_order_line_info |
ProductCatalogController.product_catalog_update_order_line_info |
user | jsonrpc | ALL | |
/product/document/upload |
ProductDocumentController.upload_document |
user | http | POST | |
/product/export/pricelist/ |
ProductPricelistExportController.export_pricelist |
user | http | ALL |
Models touched (34)
New fields (0)
No new fields.
Public methods (1)-
create(self, vals_list)@api.model_create_multiCreate product.document for attachments added in products chatters
New fields (10)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the attribute without removing it.' -
attribute_line_idsOne2many → product.template.attribute.linecomodel_name='product.template.attribute.line'inverse_name='attribute_id'string='Lines' -
create_variantSelectiondefault='always'help='- Instantly: All possible variants are created as soon as the attribute and its values are added to a product.\n - Dynamically: Each variant is created only when its corresponding attributes and values are added to a sales order.\n - Never: Variants are never created for the attribute.\n Note: this cannot be changed once the attribute is used on a product.'required=Trueselection=[('always', 'Instantly'), ('dynamic', 'Dynamically'), ('no_variant', 'Never')]string='Variant Creation' -
display_typeSelectiondefault='radio'help='The display type used in the Product Configurator.'required=Trueselection=[('radio', 'Radio'), ('pills', 'Pills'), ('select', 'Select'), ('color', 'Color'), ('multi', 'Multi-checkbox'), ('image', 'Image'), ('range', 'Range')] -
nameCharrequired=Truestring='Attribute'translate=True -
number_related_productsIntegercompute='_compute_number_related_products' -
product_tmpl_idsMany2many → product.templatecomodel_name='product.template'compute='_compute_products'store=Truestring='Related Products' -
sequenceIntegerdefault=20help='Determine the display order'index=Truestring='Sequence' -
template_value_idsOne2many → product.template.attribute.valuecomodel_name='product.template.attribute.value'inverse_name='attribute_id'string='Template Values' -
value_idsOne2many → product.attribute.valuecomodel_name='product.attribute.value'copy=Trueinverse_name='attribute_id'string='Values'
-
action_archive(self) -
action_open_product_template_attribute_lines(self)@api.readonly -
write(self, vals)Override to make sure attribute type can't be changed if it's used on a product template. This is important to prevent because changing the type would make existing combinations invalid without recomputing them, and recomputing them might take too long and we don't want to change products without the user knowing about it.
New fields (3)
-
custom_product_template_attribute_value_idMany2one → product.template.attribute.valuecomodel_name='product.template.attribute.value'ondelete='restrict'required=Truestring='Attribute Value' -
custom_valueCharstring='Custom Value' -
nameCharcompute='_compute_name'string='Name'
No public methods.
New fields (13)
-
activeBooleandefault=True -
attribute_idMany2one → product.attributecomodel_name='product.attribute'help='The attribute cannot be changed once the value is used on at least one product.'index=Trueondelete='cascade'required=Truestring='Attribute' -
colorIntegerdefault=_get_default_colorstring='Color Index' -
default_extra_priceFloat -
default_extra_price_changedBooleancompute='_compute_default_extra_price_changed' -
display_typeSelectionrelated='attribute_id.display_type' -
html_colorCharhelp="Here you can set a specific HTML color index (e.g. #ff0000) to display the color if the attribute type is 'Color'."string='Color' -
imageImagehelp='You can upload an image that will be used as the color of the attribute value.'max_height=70max_width=70string='Image' -
is_customBooleanhelp='Allow customers to set their own value'string='Free text' -
is_used_on_productsBooleancompute='_compute_is_used_on_products'string='Used on Products' -
nameCharrequired=Truestring='Value'translate=True -
pav_attribute_line_idsMany2many → product.template.attribute.linecomodel_name='product.template.attribute.line'copy=Falserelation='product_attribute_value_product_template_attribute_line_rel'string='Lines' -
sequenceIntegerhelp='Determine the display order'index=Truestring='Sequence'
-
action_add_to_products(self)@api.readonly -
action_update_prices(self)@api.readonly -
check_is_used_on_products(self) -
unlink(self) -
write(self, vals)
New fields (1)
-
nameCharhelp='Define a custom unit to display in the price per unit of measure field.'required=Truetranslate=True
No public methods.
New fields (1)
-
product_idMany2one → product.productcomodel_name='product.product'
No public methods.
New fields (0)
No new fields.
Public methods (1)-
action_add_from_catalog(self) -> dict@api.readonly
New fields (8)
-
child_idOne2many → product.categoryargs: 'product.category', 'parent_id', 'Child Categories' -
company_idMany2one → res.companycomodel_name='res.company'tracking=True -
complete_nameCharcompute='_compute_complete_name'recursive=Truesearch='_search_complete_name'string='Complete Name' -
nameCharindex='trigram'required=Truetranslate=True args: 'Name' -
parent_idMany2one → product.categoryindex=Trueondelete='cascade' args: 'product.category', 'Parent Category' -
parent_pathCharindex=True -
product_countIntegercompute='_compute_product_count'help='The number of products under this category (Does not consider the children categories)' args: '# Products' -
product_properties_definitionPropertiesDefinitionargs: 'Product Properties'
-
name_create(self, name)@api.model
New fields (7)
-
base_priceFloatcompute='_compute_base_price'help='The minimum price among the products in this combo. This value will be used to prorate the price of this combo with respect to the other combos in a combo product. This heuristic ensures that whatever product the user chooses in a combo, it will always be the same price.'min_display_digits='Product Price'string='Combo Price' -
combo_item_countIntegercompute='_compute_combo_item_count'string='Product Count' -
combo_item_idsOne2many → product.combo.itemcomodel_name='product.combo.item'copy=Trueinverse_name='combo_id' -
company_idMany2one → res.companycomodel_name='res.company'index=Truestring='Company' -
currency_idMany2one → res.currencycomodel_name='res.currency'compute='_compute_currency_id'compute_sql='_compute_sql_currency_id'compute_sudo=True -
nameCharrequired=Truestring='Name'translate=True -
sequenceIntegercopy=Falsedefault=10
No public methods.
New fields (6)
-
combo_idMany2one → product.combocomodel_name='product.combo'index=Trueondelete='cascade'required=True -
company_idMany2oneprecompute=Truerelated='combo_id.company_id'store=True -
currency_idMany2one → res.currencycomodel_name='res.currency'related='product_id.currency_id' -
extra_priceFloatdefault=0.0min_display_digits='Product Price'string='Extra Price' -
lst_priceFloatmin_display_digits='Product Price'related='product_id.lst_price'string='Original Price' -
product_idMany2one → product.productcheck_company=Truecomodel_name='product.product'domain=[('type', '!=', 'combo')]index=Trueondelete='restrict'required=Truestring='Options'
No public methods.
New fields (4)
-
activeBooleandefault=True -
ir_attachment_idMany2one → ir.attachmentindex=Trueondelete='cascade'required=Truestring='Related attachment' args: 'ir.attachment' -
sequenceIntegerdefault=10 -
variant_attribute_value_idsMany2many → product.template.attribute.valuecompute='_compute_variant_attribute_value_ids' args: 'product.template.attribute.value'
-
copy_data(self, default=None) -
create(self, vals_list)@api.model_create_multi -
unlink(self)
New fields (15)
-
available_packaging_idsMany2many → uom.uomcompute='_compute_available_packaging_ids' args: 'uom.uom' -
barcode_formatSelectiondefault='barcode'string='Type' args: [('barcode', 'Barcode 1D'), ('qr', 'QR Code')] -
columnsIntegercompute='_compute_dimensions' -
custom_quantityIntegerdefault=1required=True args: 'Copies' -
extra_htmlHtmldefault='' args: 'Extra Content' -
packaging_idMany2one → uom.uomdomain="[('id', 'in', available_packaging_ids)]"string='Packaging' args: 'uom.uom' -
pricelist_idMany2one → product.priceliststring='Pricelist' args: 'product.pricelist' -
print_formatSelectiondefault='2x7'required=Truestring='Format' args: [('dymo', 'Dymo'), ('2x7', '2 x 7'), ('4x7', '4 x 7'), ('4x12', '4 x 12'), ('zpl', 'ZPL Labels')] -
product_idsMany2many → product.productargs: 'product.product' -
product_tmpl_idsMany2many → product.templateargs: 'product.template' -
product_uom_idsMany2many → product.uomargs: 'product.uom' -
rowsIntegercompute='_compute_dimensions' -
with_priceBooleandefault=True args: 'Print With Price' -
zpl_previewImagedefault=_get_zpl_label_placeholderreadonly=True args: 'ZPL Preview' -
zpl_templateSelectiondefault='normal'required=Truestring='ZPL Template' args: [('normal', 'Normal (2.25" x 1.25")'), ('small', 'Small (1.25" x 1.00")'), ('alternative', 'Alternative (2.00" x 1.00")'), ('jewelry', 'Jewelry (2.20" x 0.50")')]
-
process(self)
New fields (7)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the pricelist without removing it.'string='Active' -
company_idMany2one → res.companycomodel_name='res.company'default=<expr>tracking=5 -
country_group_idsMany2many → res.country.groupcolumn1='pricelist_id'column2='res_country_group_id'comodel_name='res.country.group'relation='res_country_group_pricelist_rel'string='Country Groups'tracking=10 -
currency_idMany2one → res.currencycomodel_name='res.currency'default=_default_currency_idrequired=Truetracking=1 -
item_idsOne2many → product.pricelist.itemcomodel_name='product.pricelist.item'copy=Truedomain=<expr>inverse_name='pricelist_id'string='Pricelist Rules' -
nameCharrequired=Truestring='Pricelist Name'translate=True -
sequenceIntegerdefault=16
-
action_open_daily_rates(self) -
action_open_pricelist_report(self)@api.readonly -
get_import_templates(self)@api.model -
write(self, vals)
New fields (29)
-
allowed_uom_idsMany2many → uom.uomcompute='_compute_allowed_uom_ids' args: 'uom.uom' -
applied_onSelectioncompute='_compute_applied_on'help='Pricelist Item applicable on selected option'precompute=Truerequired=Trueselection=[('0_product_variant', 'Product Variant'), ('1_product', 'Product'), ('2_product_category', 'Product Category'), ('3_global', 'All Products')]store=Truestring='Apply On' -
baseSelectiondefault='list_price'help='Base price for computation.\nSales Price: The base price will be the Sales Price.\nCost Price: The base price will be the cost price.\nOther Pricelist: Computation of the base price based on another Pricelist.'required=Trueselection=[('list_price', 'Sales Price'), ('standard_price', 'Cost'), ('pricelist', 'Other Pricelist')]string='Based on' -
base_pricelist_idMany2one → product.pricelistcheck_company=True args: 'product.pricelist', 'Other Pricelist' -
categ_idMany2one → product.categorycheck_company=Truecomodel_name='product.category'help='Specify a product category if this rule only applies to products belonging to this category or its children categories. Keep empty otherwise.'ondelete='cascade'string='Category' -
company_idMany2one → res.companycomodel_name='res.company'compute='_compute_company_id'store=True -
compute_priceSelectiondefault='fixed'help='How the price is derived from the base price.\nDiscount: a percentage taken off it.\nSurcharge: a percentage added on top of it.\nFixed Price: a set amount, ignoring the base price entirely.\nActivate the discount settings to show the discount to the customer.'index=Truerequired=Trueselection=[('discount', 'Discount'), ('markup', 'Surcharge'), ('fixed', 'Fixed Price')] -
currency_idMany2one → res.currencycomodel_name='res.currency'compute='_compute_currency_id'store=True -
date_endDatetimehelp='Ending datetime for the pricelist item validation\nThe displayed value depends on the timezone set in your preferences.'string='End Date' -
date_startDatetimehelp='Starting datetime for the pricelist item validation\nThe displayed value depends on the timezone set in your preferences.'string='Start Date' -
fixed_priceFloatmin_display_digits='Product Price'string='Fixed Price' -
is_plain_discountBooleancompute='_compute_is_plain_discount'help='Whether the rule lowers the price by exactly its discount percentage.'search='_search_is_plain_discount'string='Plain Discount' -
is_pricelist_requiredBooleancompute='_compute_is_pricelist_required' -
min_quantityFloatdefault=0digits='Product Unit'help='For the rule to apply, bought/sold quantity must be greater than or equal to the minimum quantity specified in this field.\nExpressed in the default unit of measure of the product.'string='Min. Quantity' -
nameCharcompute='_compute_name'help='Explicit rule name for this pricelist line.'string='Name' -
priceCharcompute='_compute_price_label'help='Explicit rule name for this pricelist line.'string='Price' -
price_discountFloatdefault=0digits=(16, 2)string='Price Discount' -
price_markupFloatcompute='_compute_price_markup'digits=(16, 2)inverse='_inverse_price_markup'string='Surcharge' -
price_max_marginFloathelp='Specify the maximum amount of margin over the base price.'min_display_digits='Product Price'string='Max. Price Margin' -
price_min_marginFloathelp='Specify the minimum amount of margin over the base price.'min_display_digits='Product Price'string='Min. Price Margin' -
price_roundFloathelp='Sets the price so that it is a multiple of this value.\nRounding is applied after the discount and before the surcharge.\nTo have prices that end in 9.99, round off to 10.00 and set an extra at -0.01'min_display_digits='Product Price'string='Price Rounding' -
price_surchargeFloathelp='Specify the fixed amount to add or subtract (if negative) to the amount calculated with the discount.'min_display_digits='Product Price'string='Extra Fee' -
pricelist_idMany2one → product.pricelistcomodel_name='product.pricelist'default=_default_pricelist_idindex=Trueondelete='cascade'required=Falsestring='Pricelist' -
product_idMany2one → product.productcheck_company=Truecomodel_name='product.product'domain="[('product_tmpl_id', '=', product_tmpl_id)]"help='Specify a product if this rule only applies to one product. Keep empty otherwise.'index='btree_not_null'ondelete='cascade'string='Variant' -
product_tmpl_idMany2one → product.templatecheck_company=Truecomodel_name='product.template'help='Specify a template if this rule only applies to one product template. Keep empty otherwise.'index='btree_not_null'ondelete='cascade'string='Product' -
product_uom_nameCharrelated='product_tmpl_id.uom_name' -
product_variant_countIntegerrelated='product_tmpl_id.product_variant_count' -
rule_tipCharcompute='_compute_rule_tip' -
uom_idMany2one → uom.uomcomodel_name='uom.uom'string='Packaging'
-
create(self, vals_list)@api.model_create_multi
New fields (47)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the product without removing it.' args: 'Active' -
additional_product_tag_idsMany2many → product.tagcomodel_name='product.tag'domain="[('id', 'not in', product_tag_ids)]"relation='product_tag_product_product_rel'string='Variant Tags' -
all_product_tag_idsMany2many → product.tagcompute='_compute_all_product_tag_ids'search='_search_all_product_tag_ids' args: 'product.tag' -
barcodeCharcopy=Falsehelp='International Article Number used for product identification.'index='btree_not_null' args: 'Barcode' -
base_unit_countFloatdefault=1digits=0help='Display base unit price. Set to 0 to hide it for this product.'required=Truestring='Reference Unit' -
base_unit_idMany2one → product.base.unitcomodel_name='product.base.unit'help='Define a custom unit to display in the price per unit of measure field.'string='Custom Unit of Measure' -
base_unit_nameCharcompute='_compute_base_unit_name'help='Displays the custom unit for the products if defined or the selected unit of measure otherwise.' -
base_unit_priceMonetarycompute='_compute_base_unit_price'string='Price Per Unit' -
can_image_1024_be_zoomedBooleancompute='_compute_can_image_1024_be_zoomed' args: 'Can Image 1024 be zoomed' -
can_image_variant_1024_be_zoomedBooleancompute='_compute_can_image_variant_1024_be_zoomed'store=True args: 'Can Variant Image 1024 be zoomed' -
catalog_is_in_orderBooleansearch='_search_is_in_catalog_order'store=False -
codeCharcompute='_compute_product_code' args: 'Reference' -
combination_indicesCharcompute='_compute_combination_indices'index=Truestore=True -
default_codeCharindex=True args: 'Internal Reference' -
extra_uom_idsMany2many → uom.uomdomain="[('id', '!=', uom_id)]"help='Variant-specific additional packagings for this product which can be used for sales'string='Extra Packagings' args: 'uom.uom' -
free_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'help='Quantity on hand minus outgoing quantity.' args: 'Free To Use' -
image_1024Imagecompute='_compute_image_1024' args: 'Image 1024' -
image_128Imagecompute='_compute_image_128' args: 'Image 128' -
image_1920Imagecompute='_compute_image_1920'inverse='_set_image_1920' args: 'Image' -
image_256Imagecompute='_compute_image_256' args: 'Image 256' -
image_512Imagecompute='_compute_image_512' args: 'Image 512' -
image_variant_1024Imagemax_height=1024max_width=1024related='image_variant_1920'store=True args: 'Variant Image 1024' -
image_variant_128Imagemax_height=128max_width=128related='image_variant_1920'store=True args: 'Variant Image 128' -
image_variant_1920Imagemax_height=1920max_width=1920 args: 'Variant Image' -
image_variant_256Imagemax_height=256max_width=256related='image_variant_1920'store=True args: 'Variant Image 256' -
image_variant_512Imagemax_height=512max_width=512related='image_variant_1920'store=True args: 'Variant Image 512' -
import_attribute_valuesCharcompute='_compute_import_attribute_values'copy=Falseinverse='_inverse_import_attribute_values'store=Falsestring='Product Values' -
incoming_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'help='Quantity of planned incoming quantities from all confirmed purchase orders not received.'search='_search_incoming_qty' args: 'Incoming' -
is_favoriteBooleanreadonly=Falserelated='product_tmpl_id.is_favorite'store=True -
is_product_variantBooleancompute='_compute_is_product_variant' -
lst_priceFloatcompute='_compute_product_lst_price'help="The sale price can be set manually or computed from the product template. Click on the 'Configure Variants' button to set the extra attribute prices."inverse='_inverse_product_lst_price'min_display_digits='Product Price'readonly=Falsestore=True args: 'Sales\xa0Price' -
outgoing_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'help='Quantity of planned outgoing quantities from all confirmed sale orders not delivered.'search='_search_outgoing_qty' args: 'Outgoing' -
partner_refCharcompute='_compute_partner_ref' args: 'Customer Ref' -
price_extraFloatcompute='_compute_product_price_extra'help='This is the sum of the extra price of all attributes'min_display_digits='Product Price' args: 'Variant Price Extra' -
pricelist_rule_idsOne2many → product.pricelist.itemcomodel_name='product.pricelist.item'compute='_compute_pricelist_rule_ids'inverse='_inverse_pricelist_rule_ids'inverse_name='product_id'readonly=Falsestring='Pricelist Rules' -
product_document_countIntegercompute='_compute_product_document_count'string='Documents Count' -
product_document_idsOne2many → product.documentcomodel_name='product.document'domain=<expr>inverse_name='res_id'string='Documents' -
product_template_attribute_value_idsMany2many → product.template.attribute.valuecomodel_name='product.template.attribute.value'context={'display_attribute_name': False}ondelete='restrict'relation='product_variant_combination'string='Attribute Values' -
product_template_variant_value_idsMany2many → product.template.attribute.valuecomodel_name='product.template.attribute.value'domain=[('attribute_line_id.value_count', '>', 1)]ondelete='restrict'relation='product_variant_combination'string='Attributes' -
product_tmpl_idMany2one → product.templatebypass_search_access=Trueindex=Trueondelete='cascade'required=True args: 'product.template', 'Product Template' -
product_uom_idsOne2many → product.uomstore=True args: 'product.uom', 'product_id', 'Unit Barcode' -
qty_availableFloatcompany_dependent=Truedigits='Product Unit' args: 'Quantity On Hand' -
standard_priceFloatcompany_dependent=Truegroups='base.group_user'help='Value of the product (automatically computed in AVCO).\n Used to value the product when the purchase cost is not known (e.g. inventory adjustment).\n Used to compute margins on sale orders.'min_display_digits='Product Price'tracking=True args: 'Cost' -
virtual_availableFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'help='Forecasted quantity if all confirmed sales and purchase orders were delivered.'search='_search_virtual_available' args: 'Forecasted Quantity' -
volumeFloatdigits='Volume' args: 'Volume' -
weightFloatdigits='Stock Weight' args: 'Weight' -
write_dateDatetimecompute='_compute_write_date'store=True
-
action_archive(self) -
action_open_documents(self)@api.readonly -
action_open_label_layout(self)@api.readonly -
action_open_packaging_barcodes(self) -
action_unarchive(self) -
copy(self, default=None)Variants are generated depending on the configuration of attributes and values on the template, so copying them does not make sense. For convenience the template is copied instead and its first variant is returned. -
create(self, vals_list)@api.model_create_multi -
get_contextual_price(self) -
get_empty_list_help(self, help_message)@api.model -
get_product_multiline_description_sale(self, with_display_name=True)Compute a multiline description of this product, in the context of sales (do not use for purchases or other display reasons that don't intend to use "description_sale"). It will often be used as the default description of a sale order line referencing this product. -
load(self, fields, data)@api.model -
name_search(self, name='', domain=None, operator='ilike', limit=100)@api.model -
open_product_template(self)Utility method used to add an "Open Template" button in product views -
unlink(self) -
view_header_get(self, view_id, view_type)@api.model -
write(self, vals)
New fields (17)
-
company_idMany2one → res.companydefault=<expr>index=1 args: 'res.company', 'Company' -
currency_idMany2one → res.currencydefault=<expr>required=True args: 'res.currency', 'Currency' -
date_endDatehelp='End date for this vendor price' args: 'End Date' -
date_startDatehelp='Start date for this vendor price' args: 'Start Date' -
delayIntegerdefault=1help='Lead time in days between the confirmation of the purchase order and the receipt of the products in your warehouse. Used by the scheduler for automatic computation of the purchase order planning.'required=True args: 'Lead Time' -
discountFloatdigits='Discount'readonly=Falsestring='Discount (%)' -
min_qtyFloatdefault=1.0digits='Product Unit'help='The quantity to purchase from this vendor to benefit from the unit price. If a vendor unit is set, quantity should be specified in this unit, otherwise it should be specified in the default unit of the product.'required=True args: 'Quantity' -
partner_idMany2one → res.partnercheck_company=Trueondelete='cascade'required=True args: 'res.partner', 'Vendor' -
priceFloatdefault=0.0help='The price to purchase a product'min_display_digits='Product Price' args: 'Unit Price' -
price_discountedFloatcompute='_compute_price_discounted' args: 'Discounted Price' -
product_codeCharhelp="This vendor's product code will be used when printing a request for quotation. Keep empty to use the internal one." args: 'Vendor Product Code' -
product_idMany2one → product.productcheck_company=Truecompute='_compute_product_id'domain="[('product_tmpl_id', '=', product_tmpl_id)] if product_tmpl_id else []"help='If not set, the vendor price will apply to all variants of this product.'precompute=Truereadonly=Falsestore=True args: 'product.product', 'Product Variant' -
product_nameCharhelp="This vendor's product name will be used when printing a request for quotation. Keep empty to use the internal one." args: 'Vendor Product Name' -
product_tmpl_idMany2one → product.templatecheck_company=Truecompute='_compute_product_tmpl_id'index=Trueondelete='cascade'precompute=Truereadonly=Falserequired=Truestore=True args: 'product.template', 'Product Template' -
product_variant_countIntegerrelated='product_tmpl_id.product_variant_count' args: 'Variant Count' -
sequenceIntegerdefault=1help='Assigns the priority to the list of product vendor.' args: 'Sequence' -
uom_idMany2one → uom.uomcompute='_compute_uom_id'precompute=Truereadonly=Falserequired=Truestore=True args: 'uom.uom', 'Unit'
-
create(self, vals_list)@api.model_create_multi -
get_import_templates(self)@api.model -
write(self, vals)
New fields (8)
-
colorChardefault='#3C3C3C'string='Color' -
imageImagemax_height=200max_width=200string='Image' -
nameCharrequired=Truestring='Name'translate=True -
product_idsMany2many → product.productcompute='_compute_product_ids'search='_search_product_ids'string='All Product Variants using this Tag' args: 'product.product' -
product_product_idsMany2many → product.productcomodel_name='product.product'default=_get_default_variant_iddomain="[('attribute_line_ids', '!=', False), ('product_tmpl_id', 'not in', product_template_ids)]"relation='product_tag_product_product_rel'string='Product Variants' -
product_template_idsMany2many → product.templatecomodel_name='product.template'default=_get_default_template_idrelation='product_tag_product_template_rel'string='Product Templates' -
sequenceIntegerdefault=10 -
visible_to_customersBooleandefault=Truehelp='Whether the tag is displayed to customers.'string='Visible to customers'
No public methods.
New fields (59)
-
activeBooleandefault=Truehelp='If unchecked, it will allow you to hide the product without removing it.' args: 'Active' -
attribute_line_idsOne2many → product.template.attribute.linecopy=True args: 'product.template.attribute.line', 'product_tmpl_id', 'Product Attributes' -
barcodeCharcompute='_compute_barcode'inverse='_set_barcode'store=Truestring='Barcode' -
base_unit_countFloatcompute='_compute_base_unit_count'default=0digits=0help='Display base unit price. Set to 0 to hide it for this product.'inverse='_set_base_unit_count'required=Truestore=Truestring='Reference Unit' -
base_unit_idMany2one → product.base.unitcomodel_name='product.base.unit'compute='_compute_base_unit_id'help='Define a custom unit to display in the price per unit of measure field.'inverse='_set_base_unit_id'store=Truestring='Custom Unit of Measure' -
base_unit_nameCharcompute='_compute_base_unit_name'help='Displays the custom unit for the products if defined or the selected unit of measure otherwise.' -
base_unit_priceMonetarycompute='_compute_base_unit_price'string='Price Per Unit' -
can_image_1024_be_zoomedBooleancompute='_compute_can_image_1024_be_zoomed'store=True args: 'Can Image 1024 be zoomed' -
categ_idMany2one → product.categorycheck_company=Truecomodel_name='product.category'group_expand='_read_group_categ_id'index='btree_not_null'string='Product Category'tracking=True -
colorIntegerargs: 'Color Index' -
combo_idsMany2many → product.combocheck_company=Truecomodel_name='product.combo'string='Combo Choices' -
company_idMany2one → res.companyindex=True args: 'res.company', 'Company' -
cost_currency_idMany2one → res.currencycompute='_compute_cost_currency_id'compute_sql='_compute_sql_cost_currency_id'compute_sudo=True args: 'res.currency', 'Cost Currency' -
currency_idMany2one → res.currencycompute='_compute_currency_id'compute_sql='_compute_sql_currency_id'compute_sudo=True args: 'res.currency', 'Currency' -
default_codeCharcompute='_compute_default_code'inverse='_set_default_code'store=True args: 'Internal Reference' -
descriptionHtmltranslate=True args: 'Description' -
description_purchaseTexttranslate=True args: 'Purchase Description' -
description_saleTexthelp='A description of the Product that you want to communicate to your customers. This description will be copied to every Sales Order, Delivery Order and Customer Invoice/Credit Note'translate=True args: 'Sales Description' -
fixed_pricelist_rule_idsOne2many → product.pricelist.itemcomodel_name='product.pricelist.item'copy=Falsedomain=_domain_fixed_pricelist_rule_idsinverse_name='product_tmpl_id' -
free_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'help='Quantity on hand minus outgoing quantity.' args: 'Free To Use' -
has_configurable_attributesBooleancompute='_compute_has_configurable_attributes'store=True args: 'Is a configurable product' -
import_attribute_valuesCharcompute='_compute_import_attribute_values'copy=Falseinverse='_inverse_import_attribute_values'store=Falsestring='Product Values' -
incoming_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'search='_search_incoming_qty' args: 'Incoming' -
is_dynamically_createdBooleancompute='_compute_is_dynamically_created' args: 'Is Dynamically Created' -
is_favoriteBooleanstring='Favorite' -
is_product_variantBooleancompute='_compute_is_product_variant'string='Is a product variant' -
is_storableBooleancompute='_compute_is_storable'default=Falsehelp='A storable product is a product for which you manage stock.'precompute=Truereadonly=Falsestore=Truetracking=True args: 'Track Inventory' -
list_priceFloatdefault=1.0help='Price at which the product is sold to customers.'min_display_digits='Product Price'tracking=True args: 'Sales Price' -
nameCharindex='trigram'required=Truetranslate=True args: 'Name' -
outgoing_qtyFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'search='_search_outgoing_qty' args: 'Outgoing' -
pricelist_rule_idsOne2many → product.pricelist.itemcomodel_name='product.pricelist.item'domain=_domain_pricelist_rule_idsinverse_name='product_tmpl_id'string='Pricelist Rules' -
product_document_countIntegercompute='_compute_product_document_count'string='Documents Count' -
product_document_idsOne2many → product.documentcomodel_name='product.document'domain=<expr>inverse_name='res_id'string='Documents' -
product_propertiesPropertiescopy=Truedefinition='categ_id.product_properties_definition' args: 'Properties' -
product_tag_idsMany2many → product.tagcomodel_name='product.tag'relation='product_tag_product_template_rel'string='Tags' -
product_tooltipCharcompute='_compute_product_tooltip' -
product_variant_countIntegercompute='_compute_product_variant_count' args: '# Product Variants' -
product_variant_idMany2one → product.productcompute='_compute_product_variant_id' args: 'product.product', 'Product' -
product_variant_idsOne2many → product.productrequired=True args: 'product.product', 'product_tmpl_id', 'Products' -
purchase_okBooleancompute='_compute_purchase_ok'default=Truereadonly=Falsestore=True args: 'Purchase' -
qty_availableFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'inverse='_set_qty_available'search='_search_qty_available' args: 'Quantity On Hand' -
sale_okBooleandefault=True args: 'Sales' -
seller_idsOne2many → product.supplierinfoargs: 'product.supplierinfo', 'product_tmpl_id', 'Vendors' -
sequenceIntegerdefault=1help='Gives the sequence order when displaying a product list' args: 'Sequence' -
service_trackingSelectioncompute='_compute_service_tracking'default='no'readonly=Falserequired=Trueselection=[('no', 'Nothing')]store=Truestring='Create on Order' -
show_qty_update_buttonBooleancompute='_compute_show_qty_update_button' -
show_sales_price_pageBooleancompute='_compute_show_sales_price_page' -
standard_priceFloatcompute='_compute_standard_price'groups='base.group_user'help='Value of the product (automatically computed in AVCO).\n Used to value the product when the purchase cost is not known (e.g. inventory adjustment).\n Used to compute margins on sale orders.'inverse='_set_standard_price'min_display_digits='Product Price'search='_search_standard_price' args: 'Cost' -
typeSelectiondefault='consu'help='Goods are tangible materials and merchandise you provide.\nA service is a non-material product you provide.'required=Trueselection=[('consu', 'Goods'), ('service', 'Service'), ('combo', 'Combo')]string='Product Type' -
uom_idMany2one → uom.uomdefault=_default_uom_idhelp='Default unit of measure used for all stock operations.'index=Truerequired=Truetracking=True args: 'uom.uom', 'Unit' -
uom_idsMany2many → uom.uomdomain="[('id', '!=', uom_id)]"help='Additional packagings for this product which can be used for sales'string='Packagings' args: 'uom.uom' -
uom_nameCharreadonly=Truerelated='uom_id.name'string='Unit Name' -
valid_product_template_attribute_line_idsMany2many → product.template.attribute.linecompute='_compute_valid_product_template_attribute_line_ids'string='Valid Product Attribute Lines' args: 'product.template.attribute.line' -
variant_seller_idsOne2many → product.supplierinfoargs: 'product.supplierinfo', 'product_tmpl_id' -
virtual_availableFloatcompute='_compute_quantities'compute_sudo=Falsedigits='Product Unit'search='_search_virtual_available' args: 'Forecasted Quantity' -
volumeFloatcompute='_compute_volume'digits='Volume'inverse='_set_volume'store=True args: 'Volume' -
volume_uom_nameCharcompute='_compute_volume_uom_name'string='Volume unit of measure label' -
weightFloatcompute='_compute_weight'digits='Stock Weight'inverse='_set_weight'store=True args: 'Weight' -
weight_uom_nameCharcompute='_compute_weight_uom_name'string='Weight unit of measure label'
-
action_archive(self) -
action_open_documents(self)@api.readonly -
action_open_label_layout(self) -
action_open_packaging_barcodes(self) -
copy(self, default=None) -
create(self, vals_list)@api.model_create_multiStore the initial standard price in order to be able to retrieve the cost of a product template for a given date -
default_get(self, fields)@api.model -
get_contextual_price(self, product=None) -
get_empty_list_help(self, help_message)@api.model -
get_import_templates(self)@api.model -
get_single_product_variant(self)Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products (method is extended in sale to return optional products info) Note: self.ensure_one() -
has_dynamic_attributes(self)Return whether this `product.template` has at least one dynamic attribute. :return: True if at least one dynamic attribute, False otherwise :rtype: bool -
load(self, fields, data)@api.modelData import for products depends on the presence of variants. If 'import_attribute_values' is present, then the product.template files will be created, followed by the product.product files. Everything is done from the same file. The required fields are always imported; however, other fields are imported when the product.product files are created. -
name_search(self, name='', domain=None, operator='ilike', limit=100)@api.model -
write(self, vals)
New fields (7)
-
activeBooleandefault=True -
attribute_idMany2one → product.attributecomodel_name='product.attribute'index=Trueondelete='restrict'required=Truestring='Attribute' -
product_template_value_idsOne2many → product.template.attribute.valuecomodel_name='product.template.attribute.value'inverse_name='attribute_line_id'string='Product Attribute Values' -
product_tmpl_idMany2one → product.templatecomodel_name='product.template'index=Trueondelete='cascade'required=Truestring='Product Template' -
sequenceIntegerdefault=10 args: 'Sequence' -
value_countIntegercompute='_compute_value_count'store=True -
value_idsMany2many → product.attribute.valuecomodel_name='product.attribute.value'domain="[('attribute_id', '=', attribute_id)]"ondelete='restrict'relation='product_attribute_value_product_template_attribute_line_rel'string='Values'
-
action_open_attribute_values(self)@api.readonly -
create(self, vals_list)@api.model_create_multiOverride to: - Activate archived lines having the same configuration (if they exist) instead of creating new lines. - Set up related values and related variants. Reactivating existing lines allows to re-use existing variants when possible, keeping their configuration and avoiding duplication. -
unlink(self)Override to: - Archive the line if unlink is not possible. - Clean up related values and related variants. Archiving is typically needed when the line has values that can't be deleted because they are referenced elsewhere (on a variant that can't be deleted, on a sales order line, ...). -
write(self, vals)Override to: - Add constraints to prevent doing changes that are not supported such as modifying the template or the attribute of existing lines. - Clean up related values and related variants when archiving or when updating `value_ids`.
New fields (17)
-
attribute_idMany2oneindex=Truerelated='attribute_line_id.attribute_id'store=True -
attribute_line_idMany2one → product.template.attribute.linecomodel_name='product.template.attribute.line'index=Trueondelete='cascade'required=True -
colorIntegerdefault=_get_default_colorstring='Color' -
currency_idMany2onerelated='attribute_line_id.product_tmpl_id.currency_id' -
display_typeSelectionrelated='product_attribute_value_id.display_type' -
excluded_value_idsMany2many → product.template.attribute.valuecolumn1='product_template_attribute_value_id'column2='excluded_product_template_attribute_value_id'comodel_name='product.template.attribute.value'domain="[('product_tmpl_id', '=', product_tmpl_id), ('attribute_line_id', '!=', attribute_line_id), ('ptav_active', '=', True)]"help='Make this attribute value not compatible with other values of the product.'relation='product_template_attribute_excluded_value_ids_rel'string='Exclude For' -
html_colorCharrelated='product_attribute_value_id.html_color'string='HTML Color Index' -
imageImagerelated='product_attribute_value_id.image' -
is_customBooleanrelated='product_attribute_value_id.is_custom' -
nameCharrelated='product_attribute_value_id.name'string='Value' -
price_extraFloatdefault=0.0help='Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.'min_display_digits='Product Price'string='Extra Price' -
product_attribute_value_idMany2one → product.attribute.valuecomodel_name='product.attribute.value'index=Trueondelete='cascade'required=Truestring='Attribute Value' -
product_tmpl_idMany2oneindex=Truerelated='attribute_line_id.product_tmpl_id'store=True -
ptav_activeBooleandefault=Truestring='Active' -
ptav_product_variant_idsMany2many → product.productcomodel_name='product.product'readonly=Truerelation='product_variant_combination'string='Related Variants' -
sequenceIntegerhelp='Determine the display order'string='Sequence' -
show_price_extraBooleanhelp='Show separately the extra price for this attribute value.'string='Show Extra Price'
-
action_edit_product_attribute_value(self)@api.readonly -
create(self, vals_list)@api.model_create_multi -
unlink(self)Override to: - Clean up the variants that use any of the values in self: - Remove the value from the variant if the value belonged to an attribute line with only one value. - Unlink or archive all related variants. - Archive the value if unlink is not possible. Archiving is typically needed when the value is referenced elsewhere (on a variant that can't be deleted, on a sales order line, ...). -
write(self, vals)
New fields (5)
-
allowed_uom_idsMany2many → uom.uomcompute='_compute_allowed_uom_ids' args: 'uom.uom' -
barcodeCharcopy=Falseindex='btree_not_null'required=True -
company_idMany2one → res.companydefault=<expr> args: 'res.company', 'Company' -
product_idMany2one → product.productindex=Trueondelete='cascade'required=True args: 'product.product', 'Product' -
uom_idMany2one → uom.uomindex=Trueondelete='cascade'required=True args: 'uom.uom', 'Unit'
-
action_open_label_layout(self)
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (1)-
get_html(self, data)@api.readonly@api.model
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (0)
No new fields.
Public methods (2)-
create(self, vals_list)@api.model_create_multi -
write(self, vals)Delay the automatic creation of pricelists post-company update. This makes sure that the pricelist(s) automatically created are created with the right currency.
New fields (8)
-
group_product_pricelistBooleanimplied_group='product.group_product_pricelist' args: 'Pricelists' -
group_product_variantBooleanimplied_group='product.group_product_variant' args: 'Variants' -
group_show_uom_priceBooleangroup='base.group_user'implied_group='product.group_show_uom_price' args: 'Base Unit Price' -
group_uomBooleanimplied_group='uom.group_uom' args: 'Units of Measure & Packagings' -
module_loyaltyBooleanargs: 'Promotions, Coupons, Gift Card & Loyalty Program' -
module_product_barcodelookupBooleanargs: 'Barcode Database' -
product_volume_volume_in_cubic_feetSelectionconfig_parameter='product.volume_in_cubic_feet'default='0' args: [('0', 'Cubic Meters (m³)'), ('1', 'Cubic Feet (ft³)')], 'Volume unit of measure' -
product_weight_in_lbsSelectionconfig_parameter='product.weight_in_lbs'default='0' args: [('0', 'Kilograms (kg)'), ('1', 'Pounds (lb)')], 'Weight unit of measure'
-
set_values(self)
New fields (1)
-
pricelist_idsMany2many → product.pricelistcolumn1='res_country_group_id'column2='pricelist_id'comodel_name='product.pricelist'relation='res_country_group_pricelist_rel'string='Pricelists'
No public methods.
New fields (0)
No new fields.
Public methods (1)-
write(self, vals)Archive pricelist when the linked currency is archived.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (3)
-
is_pricelist_manually_setBooleancompute='_compute_is_pricelist_manually_set'string='Is Pricelist Manually Set' -
property_product_pricelistMany2one → product.pricelistcomodel_name='product.pricelist'company_dependent=Falsecompute='_compute_product_pricelist'domain=<expr>help='Used for sales to the current partner'inverse='_inverse_product_pricelist'string='Pricelist'tracking=True -
specific_property_product_pricelistMany2one → product.pricelistcomodel_name='product.pricelist'company_dependent=Truestring='Assigned Pricelist'
No public methods.
New fields (1)
-
product_uom_idsOne2many → product.uomdomain=_domain_product_uomsstring='Barcodes' args: 'product.uom', 'uom_id'
-
action_open_packaging_barcodes(self)
New fields (4)
-
attribute_value_idMany2one → product.attribute.valuerequired=True args: 'product.attribute.value' -
messageCharcompute='_compute_message' -
modeSelectionselection=[('add', 'Add to existing products'), ('update_extra_price', 'Update the extra price on existing products')] -
product_countIntegercompute='_compute_product_count'
-
action_confirm(self)
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…