Skip to Content
Odoo मेन्यू
  • Sign in
  • मुफ़्त में आज़माएं
  • ऐप्लिकेशन
    फ़ाइनेंस
    • अकाउंटिंग
    • इनवॉइसिंग
    • एक्सपेंस
    • स्प्रेडशीट (बीआई)
    • डॉक्यूमेंट्स
    • साइन
    सेल्स
    • सीआरएम
    • सेल्स
    • पीओएस शॉप
    • पीओएस रेस्टोरेंट
    • सब्सक्रिप्शन
    • रेंटल
    वेबसाइट
    • वेबसाइट बिल्डर
    • ई-कॉमर्स
    • ब्लॉग
    • फ़ोरम
    • लाइव चैट
    • ई-लर्निंग
    सप्लाई चेन
    • इन्वेंट्री
    • मैन्युफ़ैक्चरिंग
    • पीएलएम
    • परचेज़
    • मेंटेनेंस
    • क्वालिटी
    मानव संसाधन
    • कर्मचारी
    • रिक्रूटमेंट
    • टाइम ऑफ़
    • अप्रेज़ल
    • रेफ़रल
    • फ़्लीट
    मार्केटिंग
    • सोशल मार्केटिंग
    • ईमेल मार्केटिंग
    • एसएमएस मार्केटिंग
    • इवेंट
    • मार्केटिंग ऑटोमेशन
    • सर्वे
    सेवाएं
    • प्रोजेक्ट
    • टाइमशीट
    • फ़ील्ड सर्विस
    • हेल्पडेस्क
    • प्लानिंग
    • अपॉइंटमेंट
    प्रॉडक्टिविटी
    • डिस्कस
    • अप्रूवल
    • आईओटी
    • वीओआईपी
    • नॉलेज
    • WhatsApp
    तीसरे पक्ष के ऐप्लिकेशन Odoo स्टूडियो Odoo क्लाउड प्लेटफ़ॉर्म
  • इंडस्ट्री
    रीटेल
    • बुक स्टोर
    • क्लोदिंग स्टोर
    • फ़र्नीचर स्टोर
    • ग्रॉसरी स्टोर
    • हार्डवेयर स्टोर
    • टॉय स्टोर
    Food & Hospitality
    • बार और पब
    • रेस्टोरेंट
    • फ़ास्ट फ़ूड
    • Guest House
    • बेवरिज डिस्ट्रीब्यूटर
    • होटल
    रियल एस्टेट
    • Real Estate Agency
    • आर्किटेक्चर फ़र्म
    • कंसट्रक्शन
    • एस्टेट मैनेजमेंट
    • गार्ड्निंग
    • प्रॉपर्टी ओनर असोसिएशन
    कंसल्टिंग
    • अकाउंटिंग फ़र्म
    • Odoo पार्टनर
    • मार्केटिंग एजेंसी
    • लॉ फ़र्म
    • टैलेंट ऐक्विज़िशन
    • ऑडिट & सर्टिफ़िकेशन
    मैन्युफ़ैक्चरिंग
    • टेक्सटाइल
    • Metal
    • फ़र्नीचर
    • फ़ूड
    • Brewery
    • कॉर्पोरेट गिफ़्ट
    हेल्थ & फिटनेस
    • स्पोर्ट्स क्लब
    • आईवियर स्टोर
    • फिटनेस सेंटर
    • वेलनेस प्रैक्टिशनर
    • फॉर्मेसी
    • हेयर सैलून
    Trades
    • Handyman
    • आईटी हॉर्डवेयर और सपोर्ट
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    अन्य
    • Nonprofit Organization
    • एन्वायरमेंटल एजेंसी
    • बिलबोर्ड रेंटल
    • फ़ोटोग्राफी
    • बाइक लीजिंग
    • सॉफ़्टवेयर रीसेलर
    Browse all Industries
  • कम्यूनिटी
    सीखें
    • ट्यूटोरियल्स
    • दस्तावेज़
    • सर्टिफ़िकेशन
    • ट्रेनिंग
    • ब्लॉग
    • पॉडकास्ट
    शिक्षा को बढ़ावा दें
    • एजुकेशन प्रोग्राम
    • स्केल अप! बिजनेस गेम
    • 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:

  • सीआरएम
  • e-Commerce
  • लेखांकन
  • इन्वेंटरी
  • PoS
  • प्रोजेक्ट
  • MRP
All apps
You need to be registered to interact with the community.
All Posts People Badges
टैग (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
टैग (View all)
odoo accounting v14 pos v15
About this forum
Help

How to override onchange old api vs new ?

Subscribe

Get notified when there's activity on this post

This question has been flagged
v7apionchangeoverridev8.0
7 Replies
15903 Views
Avatar
Temur

Need to override onchange function from old v7 API, like this one:

Python (v7 API):

...
def onchange_field_a(self, cr, uid, ids, field_a, field_b, field_c, context=None):
    vals = {'value':{} }
    #
    # A huge code here to be executed on field_a changes...
    #
    return vals
...

XML (v7 API):

...
    <field name="field_a" on_change="onchange_field_a(field_a, field_b, field_c)"
...

v7 onchange function said to be incompatible with the new v8 api. here is related posts on this forum that I've found for now:

https://www.odoo.com/forum/help-1/question/75299 

https://www.odoo.com/forum/help-1/question/73893 

- however, we'd like to override onchange_field_a function using new v8.0 API and 1) we do not want to rewrite a huge code written in v7 onchange function, which is well tested and working in the parent model and 2) we do not want to copy-paste it either. Beside that it's bad practice to have copy of a same code in several places, it should be harder to maintain such a copy, as it's likely to receive further bugfixes and improvements (if any) in the same v7 implementation and the same place where it's defined. So, we need to reuse existing v7 onchange_field_a function code defined in the superclass by calling it from overridden v8 onchange_field_a function and add our additional code afterwards (or before,depending on case). 

1
Avatar
Discard
Avatar
Temur
Author Best Answer

right question to ask here is what it makes incompatible onchange v7 vs v8? and can we overcome this incompatibility in order to reuse existing code? Actually it's possible by applying quite simple workaround to the onchange v7 vs v8 incompatibility:

Python (v8 API):

...
@api.onchange("field_a")
@api.depends("field_b", "field_c", "custom_field_in_my_class")
def onchange_field_a(self):

### section 1. get result of original onchange_field_a from superclass:
orig_result = super(my_class,self).onchange_field_a(self.field_a, self.field_b, self.field_c)

### section 2. workaround for api incompatibility:
if type(orig_result) is dict and orig_result.has_key('value'):
for field, value in orig_result.get('value').items():
if hasattr(self, field):
setattr(self, field, value)


### section 3. your additional code, for example:
if self.field_c:
self.custom_field_in_my_class = True
...

Old api way was to return value dictionary for changed fields, whereas new api way is to assign changes directly to fields of virtual record inside the onchange function, so in the "section 2" we turn value return through dictionary into direct assignments to fields. that's it, api incompatibility is handled by the "section 2".

Note:
field's "on_change" property in XML is no more necessary in v8 

2
Avatar
Discard
Temur
Author
XML part: we can just ignore XML part in this case. it'll work with or without removing on_change property from corresponding XML record, this record just become redundant, but do not interfere normal execution of this overridden function.
Temur
Author
Note for Relational Fields: if any field from @api.onchange or @api.depends lists are relational fields, then in "section1" you have to use self.field_name.id or self.field_name.ids respectively for many2one and x2many fields. for example, if field_a has a type Many2one and field_b has a type one2many or many2many, then instead of:
orig_result = super(my_class,self).onchange_field_a(self.field_a, self.field_b, self.field_c)
we'll have:
orig_result = super(my_class,self).onchange_field_a(self.field_a.id, self.field_b.ids, self.field_c)
Temur
Author
Return Value: as it's v8.0 style onchange function (@api.onchange), we do NOT need to return anything. the "orig_result" result of call parent function is just used in the "section 2", where it's turned into direct assignments. No need to return anything, "section 3" is just normal v8.0 @api.onchange code with direct assignments to fields of "self"
Gavin Yap

Hi Temur, I've tried to over the onchange methood fo hr.payslip

 
    @api.onchange("contract_id")
    @api.depends( "date_from", "date_to", "employee_id", "contract_id")
    def onchange_field_a(self):
        print "do something"
it doesn't work for contract_id. Can you advise?
Temur
Author

if there is already a XML entry with on_change in a corresponding form view, then it may require to be replaced with on_change="1", Try to add attribute directly: <field name="contract_id" position="attributes"> <atribute name="on_change" >1</attribute></field>, if it does not work then you can simply replace entire contract_id field with itself, but with on_change="1" (pay attention to other properties in field definition as well, if there is any, in order to preserve them by the way)

Temur
Author

Here is original definition of contract_id in it's view:

<field name="contract_id" domain="[('employee_id','=',employee_id),('date_start','&lt;=',date_to),'|',('date_end','&gt;=',date_from),('date_end','=',False)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
There is "domain" and "context" attributes as well, most probably you'll need to preserve them, but change the existing "on_change" property, in order to have the on_change="1" record in it's place. There is a few ways to do so. Here is one of the options, inherit the view and replace on_change property of contract_id (Note: please try the "attribute" way described in the previous comment first, it's interesting if that one will work), by replacing an entire field with itself, like:
<field name="contract_id" position="replace" >
<field name="contract_id" domain="[('employee_id','=',employee_id),('date_start','&lt;=',date_to),'|',('date_end','&gt;=',date_from),('date_end','=',False)]" on_change="1" context="{'default_employee_id': employee_id}" />
</field>
Enjoying the discussion? Don't just read, join in!

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

Sign up
Related Posts Replies Views Activity
Override Onchange Method : onchange_partner_id on account_voucher [v7]
v7 method onchange override
Avatar
Avatar
Avatar
5
अप्रैल 17
8327
How to override the onchange_product_tmpl_id with new api?
api inherit onchange override
Avatar
Avatar
Avatar
Avatar
3
नव॰ 15
7978
API 8.0 onchange() and depends() decorators only work for UI changes and 1 record only?
api onchange
Avatar
Avatar
1
जून 15
5943
Is there a v7 API guide? Solved
v7 api
Avatar
Avatar
1
मार्च 15
4953
Preventing On change recursion
v7 onchange
Avatar
1
मार्च 15
6286
कम्यूनिटी
  • ट्यूटोरियल्स
  • दस्तावेज़
  • फ़ोरम
ओपन सोर्स
  • डाउनलोड
  • Github
  • रनबॉट
  • अनुवाद
सेवाएं
  • Odoo.sh Hosting
  • सहायता
  • अपग्रेड
  • कस्टम डेवलपमेंट्स
  • शिक्षा
  • अकाउंटेंट खोजें
  • पार्टनर ढूंढें
  • पार्टनर बनें
हमारे बारे में
  • हमारी कंपनी
  • ब्रांड ऐसेट
  • संपर्क करें
  • नौकरियां
  • इवेंट
  • पॉडकास्ट
  • ब्लॉग
  • ग्राहक
  • लीगल • गोपनीयता
  • सुरक्षा
الْعَرَبيّة 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, बिज़नेस से जुड़े ऐप्लिकेशन का एक कलेक्शन है जो ओपन सोर्स पर आधारित है. इसमें आपकी कंपनी की हर ज़रूरत के लिए ऐप्लिकेशन हैं. जैसे, सीआरएम, ई-कॉमर्स, अकाउंटिंग, इन्वेंट्री, पॉइंट ऑफ़ सेल, प्रोजेक्ट मैनेजमेंट वगैरह.

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