İçereği Atla
Odoo Menü
  • Portal
  • Ücretsiz deneyin
  • Uygulamalar
    Finans
    • Muhasebe
    • Faturalama
    • Masraf Yönetimi
    • Elektronik Çizelge (BI)
    • Belgeler
    • İmza
    Satış
    • Müşteri İlişkileri Yönetimi (CRM)
    • Satış
    • Satış Noktası Mağaza
    • Satış Noktası Restoran
    • Abonelikler
    • Kiralama
    Web Sitesi
    • Web Sitesi Oluşturucu
    • eTicaret
    • Blog
    • Forum
    • Canlı Sohbet
    • eÖğrenme
    Tedarik Zinciri
    • Envanter
    • Üretim
    • Ürün Yaşam Döngüsü Yönetimi
    • Satın Alma
    • Bakım
    • Kalite
    İnsan Kaynakları
    • Çalışanlar
    • İşe Alım
    • İzin
    • Değerlendirme
    • Referans
    • Filo Yönetimi
    Pazarlama
    • Sosyal Medyada Pazarlama
    • E-posta ile Pazarlama
    • SMS ile Pazarlama
    • Etkinlikler
    • Pazarlama Otomasyonu
    • Anket
    Hizmetler
    • Proje Yönetimi
    • Çalışma Çizelgeleri
    • Saha Hizmeti
    • Yardım Masası
    • Planlama
    • Randevular
    Verimlilik
    • Sohbet
    • Onay
    • Nesnelerin İnterneti
    • VoIP
    • Bilgi Bankası
    • WhatsApp
    Üçüncü taraf uygulamalar Odoo Stüdyo Odoo Bulut Platformu
  • Sektörler
    Perakende satış
    • Kitapçı
    • Giyim Mağazası
    • Mobilya Mağazası
    • Gıda Marketi
    • Hırdavat Dükkanı
    • Oyuncak Dükkanı
    Gıda ve Konaklama
    • Bar ve Pub
    • Restoran
    • Fast Food Restoranı
    • Konuk Evi
    • İçecek Distribütörü
    • Otel
    Gayrimenkul
    • Emlak Acentesi
    • Mimarlık Firması
    • İnşaat
    • Emlak Yönetimi
    • Bahçe Tasarımı
    • Mülk Sahipleri Derneği
    Uzmanlık
    • Muhasebe Firması
    • Odoo Partner
    • Pazarlama Ajansı
    • Hukuk Firması
    • Yetenek Kazanımı
    • Denetim ve Belgelendirme
    Üretim
    • Tekstil
    • Metal
    • Mobilyalar
    • Gıda
    • Bira fabrikası
    • Kurumsal Hediye
    Sağlık ve Spor
    • Spor Kulübü
    • Optik Mağazası
    • Fitness Merkezi
    • Sağlıklı Yaşam Merkezi
    • Eczane
    • Kuaför Salonu
    Ticaret
    • Tamirci
    • BT Donanım & Destek
    • Güneş Enerjisi Sistemleri
    • Ayakkabı İmalatçısı
    • Temizlik Hizmetleri
    • HVAC Hizmetleri
    Diğerleri
    • Kar Amacı Gütmeyen Kuruluş
    • Çevre Ajansı
    • Reklam Panosu Kiralama
    • Fotoğrafçılık
    • Bisiklet Kiralama
    • Yazılım Bayisi
    Tüm Sektörlere Göz Atın
  • Topluluk
    Öğrenim
    • Eğitim Araçları
    • Dokümantasyon
    • Sertifikasyonlar
    • Eğitim Etkinlikleri
    • Blog
    • Podcast
    Eğitim ve Gelişim
    • Eğitim Programı
    • Scale Up! İşletme Oyunu
    • Odoo'yu Ziyaret Edin
    Yazılım
    • İndirin
    • Sürümleri Kıyaslayın
    • Sürümler
    İş Birliği
    • Github
    • Forum
    • Etkinlikler
    • Çeviriler
    • Partner Olun
    • Partnerler için Hizmetler
    • Muhasebe Firmanızı Kaydettirin
    Hizmetler
    • Partner Bulun
    • Muhasebeci Bulun
    • Bir danışmanla görüşün
    • Kurulum Hizmetleri
    • Müşteri Referansları
    • Destek
    • Sürüm Yükseltme
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Demo randevusu alın
  • Fiyatlandırma
  • Yardım

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

  • Müşteri İlişkileri Yönetimi
  • e-Commerce
  • Muhasebe
  • Envanter
  • PoS
  • Proje Yönetimi
  • MRP
All apps
You need to be registered to interact with the community.
All Posts People Badges
Etiketler (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
Etiketler (View all)
odoo accounting v14 pos v15
About this forum
Yardım

Odoo 15 - compute method triggered twice every time?

Abone Ol

Get notified when there's activity on this post

Bu soru işaretlendi
computecomputedcomputed-fieldsv15
2 Cevaplar
8049 Görünümler
Avatar
Fred Nunes

Hi all,


I have noticed a behavior on some of my computed fields that I can't understand. I have the following field (toy example):

field_x = fields.Boolean(string="Field X", compute="_compute_field_x", store=True)


Then function  _compute_field_x is as follows:


@api.depends("field_y", "field_z") # none of these are computed def  _compute_field_x(self):
    for record in self:
        print('hi')
        if record.field_y = 'Something':
            record.field_x = "A"
        elif record.field_z = 'Something Else':
            record.field_x = "B"
        else:
            record.field_x = "C"
    

For some reason, whenever I change either field_y or field_z on the model's form view, the message "hi" is printed twice: once before the write() method is called (to update field_y or field_z), and then once again after the write method is concluded. And even stranger, is that when the method is called AFTER the write method, it record.field_y or record.field_z still show the values pre-write.

In my case, this is a problem, because I wanted to send an email warning when field_x changes, but if I do it on the compute method it will end up sending the email twice.

If someone could clarify this behavior for me, I'd really appreciate it!

1
Avatar
Vazgeç
Avatar
Fred Nunes
Üretici En İyi Yanıt

In case this might help someone in the future - I was able to "fix" the problem of sending the email twice by checking if we are working in the local cache. I noticed the first time the compute function ran, the record being modified had an ID of type "odoo.models.NewId", which I assume is a temporary object Odoo uses  while the form is open, before actually writing to the database. So I simply check this and prevent the email functionality from running:

if not isinstance(record.id, models.NewId):

    send_email(...)

else:

    pass


3
Avatar
Vazgeç
Avatar
Waleed Ali Mohsen
En İyi Yanıt

Hi, Regardless of the code you posted as the code has some syntax errors and will not work and I think you provided it as example.

The computed method  (if store = True) is called once one of the dependencies fields changes so it will be called once you change the value in the form and it will be invoked on a pseudo-record that contains the values present in the form and not yet saved to the DB (  pseudo-record ) so you will get the first message and once you save the record the write method called and the value of field_y or fieldz changes in DB so the computed  will be called again. 

BTW, if computed field is not stored the computed method will be called every time when the field is accessed.

To send your email I prefer to override write method and send your email whenever the field_x changes.


0
Avatar
Vazgeç
Fred Nunes
Üretici

Hi Waleed, thanks for your comment, it clarified the situation.
Overwriting the "write" method was my initial approach, as I am already doing it with other fields. However, it seems that the write method is not invoked when a computed field is changed.
To explain better: when I changed field_y (to "Something", for example), field_x is recomputed, but the write method is only called once with values = {"field_y": "Something"}. The field_x does not show up. I am not sure how Odoo is writing field_x to the database in the backend, but it does not go through Model.write!

Waleed Ali Mohsen

The computed method called every time if there is changes in the field and depend on your condition the field_x will be recomputed but the field_x will not shown in write method values. I'm not diving deep on how the computed field calculated and updated in DB but I think they update field_x using SQL Command. Will try to search and let you know

Fred Nunes
Üretici

Thanks Waleed :) if the write method was called with the updated values, it would indeed fix my problem. For now I haven't found a solution but it's not critical.
Thanks for your effort!

Waleed Ali Mohsen

The computed field is not shown in write method and it's save in cache and then set to the DB from cache. So you don't the calculated field you can check your condition directly from overrided write and create method.

Fred Nunes
Üretici

Sorry, I don't understand what you mean by "So you don't the calculated field you can check your condition directly from overrided write and create method."!
But thanks for clarifying the cache thing, makes sense!

Waleed Ali Mohsen

Sorry I mean if the field_x is only flag to send email, you don't want it just put the same condition you did in computed field in write method and send the email.

Fred Nunes
Üretici

That was a good suggestion, unfortunately field_x is not a flag but rather a value. I want to send an email updating of the new value. I can probably hack some way to infer if the value changed or not during the write method :) I'll have to see if the additional complexity is worth it.
Thanks a lot!

Enjoying the discussion? Don't just read, join in!

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

Üye Ol
İlgili Gönderiler Cevaplar Görünümler Aktivite
Compute field to store in DB
computed-fields v15
Avatar
Avatar
1
Haz 23
4044
computed field doesnt work with a domain
fleet computed-fields v15
Avatar
0
Nis 24
2343
Why this computed field doest not work? Please Need Help
computed computed-fields solution
Avatar
Avatar
1
May 23
3182
Compute if time is Between 00:00 and 07:00. Çözüldü
datetime compute v15
Avatar
1
Oca 23
2919
odoo 15 compute days differance Çözüldü
attributeerror computed-fields v15
Avatar
Avatar
Avatar
2
Eyl 22
3403
Topluluk
  • Eğitim Araçları
  • Dokümantasyon
  • Forum
Açık Kaynak
  • İndirin
  • Github
  • Runbot
  • Çeviriler
Hizmetler
  • Odoo.sh Hosting
  • Destek
  • Sürüm Yükseltme
  • Özel Geliştirmeler
  • Eğitim
  • Muhasebeci Bulun
  • Partner Bulun
  • Partner Olun
Hakkında
  • Şirketimiz
  • Pazarlama Gereçleri
  • İletişim
  • Kariyer
  • Etkinlikler
  • Podcast
  • Blog
  • Müşteriler
  • Hukuki • Gizlilik
  • Güvenlik
الْعَرَبيّة 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, müşteri ilişkileri yönetimi, eTicaret, muhasebe, envanter, satış noktası, proje yönetimi gibi şirketinizin tüm ihtiyaçlarını karşılayan bir açık kaynak işletme uygulamaları paketidir.

Odoo’nun eşsiz değer önermesi, aynı anda hem kullanımının çok kolay olup hem de tamamen entegre olmasıdır.

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