Skip to Content
Odoo Меню
  • Увійти
  • Спробуйте це безкоштовно
  • Додатки
    Фінанси
    • Бухоблік
    • Виставлення рахунку
    • Витрати
    • Електронні таблиці (BI)
    • Документи
    • Підпис
    Продажі
    • CRM
    • Продажі
    • POS Магазин
    • POS Ресторан
    • Підписки
    • Оренда
    Веб-сайти
    • Конструктор веб-сайту
    • Електронна комерція
    • Блог
    • Форум
    • Живий чат
    • Електронне навчання
    Ланцюг поставок
    • Склад
    • Виробництво
    • PLM
    • Купівлі
    • Технічне обслуговування
    • Якість
    Кадри
    • Співробітники
    • Рекрутинг
    • Відпустки
    • Оцінювання
    • Рекомендації
    • Автотранспорт
    Маркетинг
    • Маркетинг соцмереж
    • Email-маркетинг
    • SMS-маркетинг
    • Події
    • Автом. маркетингу
    • Опитування
    Послуги
    • Проект
    • Табелі
    • Виїзне обслуговування
    • Служба підтримки
    • Планування
    • Призначення
    Продуктивність
    • Обговорення
    • Схвалення
    • IoT
    • IP-телефонія
    • База знань
    • WhatsApp
    Сторонні модулі Odoo Studio Платформа Odoo Cloud
  • Сфери
    Роздрібна торгівля
    • Книжковий магазин
    • Магазин одягу
    • Магазин меблів
    • Продуктовий магазин
    • Магазин будівельних матеріалів
    • Магазин іграшок
    Food & Hospitality
    • Бар та паб
    • Ресторан
    • Фастфуд
    • Guest House
    • Дистриб'ютор напоїв
    • Hotel
    Нерухомість
    • Real Estate Agency
    • Архітектурна фірма
    • Будівництво
    • Управління нерухомістю
    • Садівництво
    • Асоціація власників нерухомості
    Консалтинг
    • Бухгалтерська компанія
    • Партнер Odoo
    • Агенція маркетингу
    • Юридична фірма
    • Придбання Талантів
    • Аудит та сертифікація
    Виробництво
    • Textile
    • Metal
    • Меблі
    • Їжа
    • Brewery
    • Корпоративні подарунки
    Здоров'я & Фітнес
    • Спортивний клуб
    • Оптика
    • Фітнес-центр
    • Практики здоров'я
    • Аптека
    • Салон краси
    Trades
    • Ремонтник
    • IT-обладнання та Підтримка
    • Системи сонячної енергії
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Інші
    • Nonprofit Organization
    • Екологічна агенція
    • Оренда білбордів
    • Фотографія
    • Лізинг велосипедів
    • Реселлер програмного забезпечення
    Browse all Industries
  • Спільнота
    Навчання
    • Навчальний посібник
    • Документація
    • Сертифікації
    • Тренування
    • Блог
    • Подкаст
    Сприяйте Освіті
    • Програма навчання
    • Бізнес гра Scale Up!
    • Відвідайте Odoo
    Отримайте програмне забезпечення
    • Завантаження
    • Порівняйте версії
    • Релізи
    Співпрацюйте
    • Github
    • Форум
    • Події
    • Переклади
    • Стати партнером
    • Services for Partners
    • Зареєструйте вашу бухгалтерську фірму
    Отримайте послуги
    • Знайдіть партнера
    • Знайдіть бухгалтера
    • Зустріньтеся з консультантом
    • Послуги з впровадження
    • Референси клієнтів
    • Підтримка
    • Оновлення
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Отримати демо
  • Ціни
  • Допомога

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • CRM
  • e-Commerce
  • Бухоблік
  • Склад
  • PoS
  • Проект
  • MRP
All apps
Вам необхідно зареєструватися, щоб взаємодіяти зі спільнотою.
All Posts Люди Значки
Мітки (View all)
odoo accounting v14 pos v15
Про цей форум
Вам необхідно зареєструватися, щоб взаємодіяти зі спільнотою.
All Posts Люди Значки
Мітки (View all)
odoo accounting v14 pos v15
Про цей форум
Допомога

Forbidden Opcode in Server Action when Trying to Update Fields in Odoo 16

Підписатися

Отримуйте сповіщення про активність щодо цієї публікації

Це запитання позначене
purchasedevelopmentaccounting
2 Відповіді
4310 Переглядів
Аватар
AmirAkbari


Hello,

I am facing an issue with Odoo 16 when trying to implement a calculation in a Server Action for the Purchase Order Line model. I have added a custom field called "Currency Exchange Rate" (x_studio_monetary_field_atjMK) where users manually enter the exchange rate. I want to use this exchange rate to multiply the unit price (price_unit) and update the subtotal (price_subtotal) accordingly. The calculation should be:

makefileCopy codeprice_subtotal = price_unit * exchange_rate

However, I am getting the following error:

"forbidden opcode(s) in 'lambda': STORE_ATTR"

I understand that this error occurs because certain actions like direct field updates (record.price_subtotal = ...) are restricted in Server Actions for security reasons.

Here is the code I used for the Server Action:

if record.x_studio_monetary_field_atjMK:
    record.price_subtotal = record.price_unit * record.x_studio_monetary_field_atjMK
else:
    record.price_subtotal = record.price_unit

Is there any workaround or a proper way to perform this calculation and update the price_subtotal using a Server Action in Odoo 16? I would also be open to using a computed field if it helps resolve this issue.

Any help would be greatly appreciated!

Thank you.


0
Аватар
Відмінити
Аватар
LandLogic IT s.n.c.
Найкраща відповідь

Explanation and Solution:

The error occurs because Odoo restricts certain operations, such as direct field assignment (record.price_subtotal = ...), in Server Actions for security reasons. Instead, you should use one of the following approaches:

Solution 1: Use a Computed Field

Computed fields are the best approach for dynamic calculations. Here's how you can implement it:

  1. Add the Computed Field in Your Custom Module: Define a new computed field in your custom module to calculate the subtotal:
    from odoo import models, fields, api
    
    class PurchaseOrderLine(models.Model):
        _inherit = 'purchase.order.line'
    
        x_currency_exchange_rate = fields.Float(string="Currency Exchange Rate")
        x_computed_subtotal = fields.Float(
            string="Computed Subtotal",
            compute="_compute_computed_subtotal",
            store=True
        )
    
        @api.depends('price_unit', 'x_currency_exchange_rate')
        def _compute_computed_subtotal(self):
            for line in self:
                if line.x_currency_exchange_rate:
                    line.x_computed_subtotal = line.price_unit * line.x_currency_exchange_rate
                else:
                    line.x_computed_subtotal = line.price_unit
    
  2. Update the View: Add the new field (x_computed_subtotal) to the Purchase Order Line form/tree view so it is visible to users.

Solution 2: Use a Button Action or Python Script

If you need this calculation as a one-time update (e.g., triggered by a button), create a method in a custom module:

  1. Define the Button Action in Your Model:
    from odoo import models, fields
    
    class PurchaseOrderLine(models.Model):
        _inherit = 'purchase.order.line'
    
        def update_subtotal(self):
            for line in self:
                if line.x_currency_exchange_rate:
                    line.price_subtotal = line.price_unit * line.x_currency_exchange_rate
                else:
                    line.price_subtotal = line.price_unit
    
  2. Add the Button to the View: Add a button to trigger the update:
    <record id="view_purchase_order_line_form_inherit" model="ir.ui.view">
        <field name="name">purchase.order.line.form.inherit</field>
        <field name="model">purchase.order.line</field>
        <field name="inherit_id" ref="purchase.view_order_line_form"/>
        <field name="arch" type="xml">
            <button name="action_view_stock_moves" position="after">
                <button name="update_subtotal"
                        string="Update Subtotal"
                        type="object"
                        class="btn-primary"/>
            </button>
        </field>
    </record>
    

Solution 3: Use a Server Action (with Context/Write Workaround)

If you must use a Server Action, avoid direct field assignment. Use write() instead:

  1. Modify the Server Action Code: Replace direct assignment with the following:
    if record.x_studio_monetary_field_atjMK:
        new_subtotal = record.price_unit * record.x_studio_monetary_field_atjMK
    else:
        new_subtotal = record.price_unit
    record.write({'price_subtotal': new_subtotal})
    
  2. Test the Action: Ensure this action works as expected on the Purchase Order Lines.

Preferred Approach: Computed Field

The computed field approach is recommended because it keeps calculations dynamic and avoids manual intervention. It also respects Odoo's ORM structure and ensures maintainability.

1
Аватар
Відмінити
Аватар
AmirAkbari
Автор Найкраща відповідь

In Solution 3, when an automatic operation is created on the purchase order model and the Python code is registered, this does not happen in the final result (when I create a new invoice and manually fill in the currency conversion rate field created by the studio, multiply it by the unit price and then does not show in total)

0
Аватар
Відмінити
Enjoying the discussion? Don't just read, join in!

Create an account today to enjoy exclusive features and engage with our awesome community!

Реєстрація
Related Posts Відповіді Переглядів Дія
Can I allow user to enter line-item extended price for Vendor Bills? Odoo 19
purchase accounting
Аватар
Аватар
Аватар
2
лист. 25
262
ODOO 18.3 create vendor bill, upload vendor bill Вирішено
purchase accounting
Аватар
Аватар
Аватар
2
жовт. 25
964
Restrict QWeb Report in Print Menu to Vendor Payments Only in Odoo 17
development accounting
Аватар
Аватар
1
жовт. 25
543
odoo18 down payment
purchase accounting
Аватар
Аватар
Аватар
3
жовт. 25
2728
how to restrict the Employee from viewing the customer and vendor bill and payments and they only can do is they can genrate and create the new bills
purchase accounting
Аватар
Аватар
Аватар
4
жовт. 25
1055
Спільнота
  • Навчальний посібник
  • Документація
  • Форум
Open Source
  • Завантаження
  • Github
  • Runbot
  • Переклади
Послуги
  • Хостинг Odoo.sh
  • Підтримка
  • Оновлення
  • Кастомні доробки
  • Навчання
  • Знайдіть бухгалтера
  • Знайдіть партнера
  • Стати партнером
Про нас
  • Наша компанія
  • Торгові активи
  • Зв'яжіться з нами
  • Вакансії
  • Події
  • Подкаст
  • Блог
  • Клієнти
  • Юридичні документи • Конфіденційність
  • Безпека
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo - це набір програм для роботи з відкритим кодом, які охоплюють всі ваші потреби компанії: CRM, електронна комерція, бухгалтерський облік, склад, точка продажу, управління проектами тощо.

Унікальна пропозиція Odoo - це одночасно дуже проста у використанні та повністю інтегрована.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now