TIP: You can type at any time to perform a new search.
Products & Pricelists
product · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 1.2
- Category
- Sales/Sales
- Folder size
- 12.94 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- No
- Website
- None
- Last tracking update
- 2026-08-17 10:14:40
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, odoo, Odoo Translation Bot, Aaron Bohy, Arnold Moyaux, Julien Castiaux, Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, svs-odoo, Achraf (abz), Rémy Voet (ryv), Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Miquel Raïch, Ahmad Khanalizadeh, Víctor Martínez, JF Aubert, Aurelien van Delft (avd), Hubert Van De Walle, Valentin Chevalier, Renaud Thiry, niyasraphy, David, alsh-odoo, Adrien Widart (awt), Maximilien (malb), Victor Piryns (pivi), Mahamadasif Ansari, Gauthier Wala (gawa), Andrew Gavgavian, Levi Siuzdak (sile), Dylan Kiss (dyki), Valeriya(vchu), tanghulu0608, Anita (anko), SilvioC2C, Nguyễn Đại Dương, Sarah Bellefroid, Arnaud Sibille, omra-odoo, stefanorigano (SRI), Adam Heinz, Louis (loti), reka-odoo, kcv-odoo, odoostan, dere-odoo, Lina (liew), manv-afk, Patricia Daloze (pda), Xavier Luyckx (xlu), yagp-odoo, Sanchit Gupta, Mohammad Abdulmoneim, Stéphane Diez, Aungkokolin1997, gteboul, sabr, Julien Schwanen, Victor Miguel Armenta Carrillo, sben-odoo, Arthur Nanson, Christopher Maloney (cmal), David Van Droogenbroeck (DROD), Mohammad Abdulmoneim (abdu), djameltouati, khsr-odoo, Pierre Lamotte (pila), wt, Michaël Mattiello, kasm, Shrey Mehta, Carmine, Mahdi Alijani (malj), MaximeNoirhomme, chha-odoo, bona-odoo, Vincent Sevestre, plha-odoo, Krzysztof Magusiak (krma), kkuj-odoo, nipl-odoo, kukor-odoo, krip-odoo, bhna-odoo, temo-odoo, mohannedah, agbr-odoo, Lulu Grimalkin (lugr), rare-odoo, felin-odoo, igbe, Quentin Colla (qucol), path-odoo, Waleed Elgamal, Amr Elkhatieb, Nisarg (nipl), hossamelgendy1, Samiul Hoque, Merlin Guillaume, Mazen, srap-odoo, saurabh, Nguyen Nguyen (ngtpn), Stephane Vanmeerhaeghe (stva), Youssef (abyo), ELCO, Przemysław Duryło, chpa-odoo, panj-odoo, Oussema Heni, Krishna Patel, Mathias Mathy, jeanschoenlaub, Abhishek Yadav
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- account, barcodes_generator_product, base_global_discount, commission_oca, contract, edi_product_oca, event_product, helpdesk_product, hotel_housekeeping, hotel_restaurant, l10n_br_fiscal, l10n_mx_cfdi, l10n_mx_cfdi_account_addenda_audi, loyalty, maintenance_product, mrp, partner_pricelist_search, partner_supplierinfo_smartbutton, pim, pms_base, product_attribute_archive, product_attribute_set, product_attribute_value_avoid_auto_fill, product_category_active, product_category_code, product_category_type, product_category_uom, product_class, product_code_mandatory, product_code_unique, product_company_default, product_customerinfo, product_dimension, product_harmonized_system, product_logistics_uom, product_manufacturer, product_operating_unit, product_origin, product_pack, product_pricelist_simulation, product_pricelist_supplierinfo, product_sale_team, product_secondary_unit, product_sequence, product_set, product_state, product_supplierinfo_indirect_cost, product_usability, product_variant_attribute_tax, product_variant_configurator, product_variant_default_code, project_task_product, quality_control_oca, sale_partner_company_group, stock, storage_image_product, storage_media_product, tms_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 (75)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
attribute_tree_view |
product.attribute.list | product.attribute | list | 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_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_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_product_view_tree_tag |
product.product.view.list.tag | product.product | list | 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_variant_easy_edit_view |
product.product.view.form.easy | product.product | form | New |
product_view_kanban_catalog |
product.view.kanban.catalog | product.product | kanban | New |
product_view_search_catalog |
product.view.search.catalog | product.product | search | New |
report_packagingbarcode |
report_packagingbarcode | 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_productlabel |
report_productlabel | ir.ui.view | qweb | New |
report_productlabel_dymo |
report_productlabel_dymo | ir.ui.view | qweb | New |
report_producttemplatelabel2x7 |
report_producttemplatelabel2x7 | ir.ui.view | qweb | New |
report_producttemplatelabel4x12 |
report_producttemplatelabel4x12 | ir.ui.view | qweb | New |
report_producttemplatelabel4x12noprice |
report_producttemplatelabel4x12noprice | ir.ui.view | qweb | New |
report_producttemplatelabel4x7 |
report_producttemplatelabel4x7 | ir.ui.view | qweb | New |
report_producttemplatelabel_dymo |
report_producttemplatelabel_dymo | ir.ui.view | qweb | New |
report_simple_label2x7 |
report_simple_label2x7 | ir.ui.view | qweb | New |
report_simple_label4x12 |
report_simple_label4x12 | ir.ui.view | qweb | New |
report_simple_label4x12_no_price |
report_simple_label4x12_no_price | ir.ui.view | qweb | New |
report_simple_label4x7 |
report_simple_label4x7 | ir.ui.view | qweb | New |
report_simple_label_dymo |
report_simple_label_dymo | 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_form_view_inherit |
uom.uom.form.inherit | uom.uom | form | Inherits uom.product_uom_form_view |
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 (33)
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')] -
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 (0)
No new fields.
Public methods (1)-
action_add_from_catalog(self)@api.readonly
New fields (7)
-
child_idOne2many → product.categoryargs: 'product.category', 'parent_id', 'Child Categories' -
complete_nameCharcompute='_compute_complete_name'recursive=Truestore=True args: 'Complete Name' -
nameCharindex='trigram'required=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'
-
copy_data(self, default=None) -
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' -
nameCharrequired=Truestring='Name' -
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')]ondelete='restrict'required=Truestring='Options'
No public methods.
New fields (3)
-
activeBooleandefault=True -
ir_attachment_idMany2one → ir.attachmentondelete='cascade'required=Truestring='Related attachment' args: 'ir.attachment' -
sequenceIntegerdefault=10
-
copy_data(self, default=None) -
create(self, vals_list)@api.model_create_multi -
unlink(self)
New fields (8)
-
columnsIntegercompute='_compute_dimensions' -
custom_quantityIntegerdefault=1required=True args: 'Copies' -
extra_htmlHtmldefault='' args: 'Extra Content' -
pricelist_idMany2one → product.priceliststring='Pricelist' args: 'product.pricelist' -
print_formatSelectiondefault='2x7xprice'required=Truestring='Format' args: [('dymo', 'Dymo'), ('2x7xprice', '2 x 7 with price'), ('4x7xprice', '4 x 7 with price'), ('4x12', '4 x 12'), ('4x12xprice', '4 x 12 with price')] -
product_idsMany2many → product.productargs: 'product.product' -
product_tmpl_idsMany2many → product.templateargs: 'product.template' -
rowsIntegercompute='_compute_dimensions'
-
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_pricelist_report(self)@api.readonly -
copy_data(self, default=None) -
get_import_templates(self)@api.model -
write(self, vals)
New fields (28)
-
applied_onSelectiondefault='3_global'help='Pricelist Item applicable on selected option'required=Trueselection=[('3_global', 'All Products'), ('2_product_category', 'Product Category'), ('1_product', 'Product'), ('0_product_variant', 'Product Variant')]string='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.categorycomodel_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='Use the discount rules and activate the discount settings in order to show discount to customer.'index=Truerequired=Trueselection=[('percentage', 'Discount'), ('formula', 'Formula'), ('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' -
display_applied_onSelectiondefault='1_product'help='Pricelist Item applicable on selected option'required=Trueselection=[('1_product', 'Product'), ('2_product_category', 'Category')] -
fixed_priceFloatmin_display_digits='Product Price'string='Fixed Price' -
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' -
percent_priceFloathelp='You can apply a mark-up by setting a negative discount.'string='Percentage Price' -
priceCharcompute='_compute_price_label'help='Explicit rule name for this pricelist line.'string='Price' -
price_discountFloatdefault=0digits=(16, 2)help='You can apply a mark-up by setting a negative discount.'string='Price Discount' -
price_markupFloatcompute='_compute_price_markup'digits=(16, 2)help='You can apply a mark-up on the cost'inverse='_inverse_price_markup'store=Truestring='Markup' -
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'
-
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (37)
-
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' -
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' -
codeCharcompute='_compute_product_code' args: 'Reference' -
combination_indicesCharcompute='_compute_combination_indices'index=Truestore=True -
default_codeCharindex=True args: 'Internal Reference' -
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' -
is_favoriteBooleanreadonly=Falserelated='product_tmpl_id.is_favorite'store=True -
is_in_selected_section_of_orderBooleansearch='_search_is_in_selected_section_of_order' -
is_product_variantBooleancompute='_compute_is_product_variant' -
lst_priceFloatcompute='_compute_product_lst_price'help="The sale price is managed from the product template. Click on the 'Configure Variants' button to set the extra attribute prices."inverse='_set_product_lst_price'min_display_digits='Product Price' args: 'Sales\xa0Price' -
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.valueondelete='restrict'relation='product_variant_combination'string='Attribute Values' args: 'product.template.attribute.value' -
product_template_variant_value_idsMany2many → product.template.attribute.valuedomain=[('attribute_line_id.value_count', '>', 1)]ondelete='restrict'relation='product_variant_combination'string='Variant Values' args: 'product.template.attribute.value' -
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' -
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' args: 'Cost' -
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_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)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=0.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_uom_idMany2one → uom.uomcompute='_compute_product_uom_id'precompute=Truereadonly=Falserequired=Truestore=True args: 'uom.uom', 'Unit' -
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'
-
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'
-
copy_data(self, default=None)
New fields (46)
-
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'search='_search_barcode' args: 'Barcode' -
can_image_1024_be_zoomedBooleancompute='_compute_can_image_1024_be_zoomed'store=True args: 'Can Image 1024 be zoomed' -
categ_idMany2one → product.categorycomodel_name='product.category'group_expand='_read_group_categ_id'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' args: 'res.currency', 'Cost Currency' -
currency_idMany2one → res.currencycompute='_compute_currency_id' 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' -
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' -
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' -
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' -
pricelist_rule_idsOne2many → product.pricelist.itemcomodel_name='product.pricelist.item'domain=<expr>inverse_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' -
sale_okBooleandefault=True args: 'Sales' -
seller_idsOne2many → product.supplierinfodepends_context=('company') args: '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' -
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=_get_default_uom_idhelp='Default unit of measure used for all stock operations.'required=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' -
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_open_documents(self)@api.readonly -
action_open_label_layout(self) -
copy(self, default=None) -
copy_data(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 (3)
-
product_template_attribute_value_idMany2one → product.template.attribute.valuecomodel_name='product.template.attribute.value'index=Trueondelete='cascade'string='Attribute Value' -
product_tmpl_idMany2one → product.templatecomodel_name='product.template'index=Trueondelete='cascade'required=Truestring='Product Template' -
value_idsMany2many → product.template.attribute.valuecomodel_name='product.template.attribute.value'domain="[('product_tmpl_id', '=', product_tmpl_id), ('ptav_active', '=', True)]"relation='product_attr_exclusion_value_ids_rel'string='Attribute Values'
-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
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 (15)
-
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' -
exclude_forOne2many → product.template.attribute.exclusioncomodel_name='product.template.attribute.exclusion'help='Make this attribute value not compatible with other values of the product or some attribute values of optional and accessory products.'inverse_name='product_template_attribute_value_id'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'
-
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 (4)
-
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'
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 (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 (6)
-
group_product_pricelistBooleanimplied_group='product.group_product_pricelist' args: 'Pricelists' -
group_product_variantBooleanimplied_group='product.group_product_variant' args: 'Variants' -
group_uomBooleanimplied_group='uom.group_uom' args: 'Units of Measure & Packagings' -
module_loyaltyBooleanargs: 'Promotions, Coupons, Gift Card & Loyalty Program' -
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 (2)
-
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' -
specific_property_product_pricelistMany2one → product.pricelistcomodel_name='product.pricelist'company_dependent=True
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…