İç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

Update siblings in a tree view

Abone Ol

Get notified when there's activity on this post

Bu soru işaretlendi
one2manytreesiblingsodoo10
1 Cevapla
4698 Görünümler
Avatar
Ruben Valls Blasco

Hi, I have a model which contains a parent and several children.

The parent has a computed field "product_remaining", which is updated from the modification of a different field in any of the children ("lot_qty").

The field "product_remaining" is shown in a tree for all children, using a "related" field in the children's model.

Everything is working fine, except that the tree only updates the "product_remaining" field in the row for which the modification has been done, and it does not update any other line.

Furthermore, if I click to modify a line which has not been updated by a previous change, and leave without modify it, the line gets updated correctly.


Is any way to update/refresh all the affected lines in the tree view, and not only the one where the change has been made?


I am using Odoo v10.

Here is the relevant code:


Python:

class Te2PackLotOperation(models.TransientModel):
    _name = 'te2.pack.lot.operation'
    parent_id = fields.Many2one('te2.pack.product.operation', readonly=True, ondelete='cascade')
    product_id = fields.Many2one('product.product', 'Product', related='parent_id.product_id')
    product_qty = fields.Float('Total', readonly=True, related='parent_id.product_qty')
    product_remaining = fields.Float('Remaining', readonly=True, related='parent_id.product_remaining')
    lot_id = fields.Many2one('stock.production.lot')
    lot_qty = fields.Float('Done')
    packing = fields.Char('Packing')
    @api.onchange('lot_qty')
    def onchange_lot_qty(self):
        rec = self._origin
        rec.write({'lot_qty': self.lot_qty})

class Te2PackProductOperation(models.TransientModel):
    _name = 'te2.pack.product.operation'
    product_id = fields.Many2one('product.product', 'Product', readonly=True)
    product_qty = fields.Float('Total', readonly=True)
    product_remaining = fields.Float('Remaining', readonly=True, compute='_product_remaining_get')
    lot_ids = fields.One2many('te2.pack.lot.operation', 'parent_id')
    @api.one
    @api.depends('lot_ids', 'lot_ids.lot_qty')
    def _product_remaining_get(self):
        already_done = 0
        for lot in self.lot_ids:
            already_done += lot.lot_qty
        self.product_remaining = self.product_qty - already_done


XML:

        <record id="te2_stock_picking_advanced_view_form" model="ir.ui.view">
            <field name="name">te2.pack.operation.form</field>
            <field name="model">te2.pack.product.operation</field>
            <field name="arch" type="xml">
                <form string="Advanced Stock Picking">
                    <field name="lot_ids">
                        <tree editable="bottom" create="false" delete="false"
                              decoration-danger="product_remaining!=0" decoration-success="product_remaining==0"
                              default_order="product_id">
                            <field name="product_id"/>
                            <field name="product_qty"/>
                            <field name="product_remaining"/>
                            <field name="lot_id"
                                   domain="[('product_id','=', product_id)]"
                            />
                            <field name="use_date"/>
                            <field name="lot_qty"/>
                            <field name="packing"/>
                            <button name="add_lot" string="Lot Split" type="object" icon="fa-list"/>
                        </tree>
                    </field>
                    <footer>
                        <button name="save" string="Save" type="object" class="oe_highlight" />
                        <button string="Cancel" class="oe_link" special="cancel"/>
                    </footer>
                </form>
            </field>
        </record>


0
Avatar
Vazgeç
Avatar
Ruben Valls Blasco
Üretici En İyi Yanıt

Ok, after some digging, I have managed to solve the issue by extending the JavaScript classes.

If somebody is interested, the code is as follows:


odoo.define('te2_base', function(require) {
"use strict";

var core = require('web.core');

//The ListView. This view is used by the one2many field (see below)
var One2ManyUpdateAllListView = core.one2many_view_registry.get('list').extend({
init: function(viewmanager) {
var result = this._super.apply(this, arguments);
//Register to the save event
this.on("save:after", this, this.reload_all_records);
return result;
},

//Similar to "reload_record" from "list_view.js", but supporting an array of records, and moving the
//100ms delay to the end of the operation, instead of one delay per record.
reload_records: function (records, options={}) {
var self = this;
var fields = this.fields_view.fields;

if (!options || !options.do_not_evict) {
//This is from "form_relational_widgets.js".
// Evict records from cache to ensure it will be reloaded correctly
records.each( function (record) {
self.dataset.evict_record(record.get('id'));
})
}

return this.dataset.read_ids(
records.map(function (record) {return record.get('id')}),
_.pluck(_(this.columns).filter(function (r) {
return r.tag === 'field';
}), 'name'),
{check_access_rule: true}
).then(function (upd_records) {
records.each(function (record) {
var values = upd_records.find(function (upd_r) {return upd_r['id'] == record.get('id')});
if (values == undefined) {
self.records.remove(record);
} else {
// _.each is broken if a field "length" is present
for (var key in values) {
if (fields[key] && fields[key].type === 'many2many')
record.set(key + '__display', false, {silent: true});
record.set(key, values[key], {silent: true});
}
record.trigger('change', record);
}
});

var def = $.Deferred();
setTimeout(function() {
def.resolve();
}, 100);
return def;
});
},
reload_all_records: function () {
return this.reload_records(this.records);
},
});

//The Field. We should override the listview used by the field, so it uses our custom view.
var FieldOne2ManyUpdateAll = core.form_widget_registry.get('one2many').extend({
init: function() {
var result = this._super.apply(this, arguments);
this.x2many_views.list=One2ManyUpdateAllListView;
return result;
}
});

//Register the new field, so we can use it from our XML files
core.form_widget_registry.add('te2_tree_update_all', FieldOne2ManyUpdateAll);

//Make the classes available for other modules.
return {
One2ManyUpdateAllListView: One2ManyUpdateAllListView,
FieldOne2ManyUpdateAll: FieldOne2ManyUpdateAll
};
});


And it can be used just by adding the widget attribute to the field tag (note: it should be added to the "field" tag, not to the "tree" tag):


<field name="lot_op_ids" options='{"always_reload": True}' widget="te2_tree_update_all">


Best regards,

Ruben

0
Avatar
Vazgeç
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
One2many field odoo version 10
one2many odoo10
Avatar
Avatar
1
Eyl 22
2967
One2many fields in tree views Çözüldü
one2many tree
Avatar
Avatar
Avatar
2
Kas 20
19105
"RuntimeError: maximum recursion depth exceeded in cmp" problem
one2many odoo10
Avatar
Avatar
Avatar
Avatar
4
May 18
12279
Values has false in one2many field when changing the customer in Sale Order ODOO 10
one2many sale.order.line odoo10
Avatar
0
Mar 23
6218
Prevent create and delete on a One2many tree view Çözüldü
treeview one2many odoo10
Avatar
1
Tem 20
9649
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