Pular para o conteúdo
Odoo Menu
  • Entrar
  • Experimente grátis
  • Aplicativos
    Finanças
    • Financeiro
    • Faturamento
    • Despesas
    • Planilhas (BI)
    • Documentos
    • Assinar Documentos
    Vendas
    • CRM
    • Vendas
    • PDV Loja
    • PDV Restaurantes
    • Assinaturas
    • Locação
    Websites
    • Criador de Sites
    • e-Commerce
    • Blog
    • Fórum
    • Chat ao Vivo
    • e-Learning
    Cadeia de mantimentos
    • Inventário
    • Fabricação
    • PLM - Ciclo de Vida do Produto
    • Compras
    • Manutenção
    • Qualidade
    Recursos Humanos
    • Funcionários
    • Recrutamento
    • Folgas
    • Avaliações
    • Indicações
    • Frota
    Marketing
    • Redes Sociais
    • Marketing por E-mail
    • Marketing por SMS
    • Eventos
    • Automação de Marketing
    • Pesquisas
    Serviços
    • Projeto
    • Planilhas de Horas
    • Serviço de Campo
    • Central de Ajuda
    • Planejamento
    • Compromissos
    Produtividade
    • Mensagens
    • Inteligência Artificial
    • Internet das Coisas
    • VoIP
    • Conhecimento
    • WhatsApp
    Aplicativos de terceiros Odoo Studio Plataforma Odoo Cloud
  • Setores
    Varejo
    • Loja de livros
    • Loja de roupas
    • Loja de móveis
    • Mercearia
    • Loja de ferramentas
    • Loja de brinquedos
    Comida e hospitalidade
    • Bar e Pub
    • Restaurante
    • Fast Food
    • Hospedagem
    • Distribuidor de bebidas
    • Hotel
    Imóveis
    • Imobiliária
    • Escritório de arquitetura
    • Construção
    • Gestão de Imóveis
    • Jardinagem
    • Associação de proprietários de imóveis
    Consultoria
    • Escritório de Contabilidade
    • Parceiro Odoo
    • Agência de marketing
    • Escritório de advocacia
    • Aquisição de talentos
    • Auditoria e Certificação
    Fabricação
    • Têxtil
    • Metal
    • Móveis
    • Alimentação
    • Cervejaria
    • Presentes corporativos
    Saúde e Boa forma
    • Clube esportivo
    • Loja de óculos
    • Academia
    • Profissionais de bem-estar
    • Farmácia
    • Salão de cabeleireiro
    Comércio
    • Handyman
    • Hardware e Suporte de TI
    • Sistemas de energia solar
    • Sapataria
    • Serviços de limpeza
    • Serviços de climatização
    Outros
    • Organização sem fins lucrativos
    • Agência Ambiental
    • Aluguel de outdoors
    • Fotografia
    • Aluguel de bicicletas
    • Revendedor de software
    Navegar por todos os setores
  • Comunidade
    Aprenda
    • Tutoriais
    • Documentação
    • Certificações
    • Treinamento
    • Blog
    • Podcast
    Empodere a Educação
    • Programa de educação
    • Scale Up! Jogo de Negócios
    • Visite a Odoo
    Obtenha o Software
    • Baixar
    • Comparar edições
    • Releases
    Colaborar
    • Github
    • Fórum
    • Eventos
    • Traduções
    • Torne-se um parceiro
    • Serviços para parceiros
    • Cadastre seu escritório contábil
    Obtenha os serviços
    • Encontre um parceiro
    • Encontre um Contador
    • Agende uma Demonstração
    • Serviços de Implementação
    • Referências de Clientes
    • Suporte
    • Upgrades
    Github YouTube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Faça uma demonstração
  • Preços
  • Ajuda
É necessário estar registrado para interagir com a comunidade.
Todas as publicações Pessoas Emblemas
Marcadores (Ver tudo)
odoo accounting v14 pos v15
Sobre este fórum
É necessário estar registrado para interagir com a comunidade.
Todas as publicações Pessoas Emblemas
Marcadores (Ver tudo)
odoo accounting v14 pos v15
Sobre este fórum
Ajuda

Update siblings in a tree view

Inscrever

Seja notificado quando houver atividade nesta publicação

Esta pergunta foi sinalizada
one2manytreeodoo10
1 Responder
5656 Visualizações
Avatar
VENTAS DIRECTAS VALLS, S.L., 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
Cancelar
Avatar
VENTAS DIRECTAS VALLS, S.L., Ruben Valls Blasco
Autor Melhor resposta

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
Cancelar
Está gostando da discussão? Não fique apenas lendo, participe!

Crie uma conta hoje mesmo para aproveitar os recursos exclusivos e interagir com nossa incrível comunidade!

Inscrever-se
Publicações relacionadas Respostas Visualizações Atividade
One2many field odoo version 10
one2many odoo10
Avatar
Avatar
1
set. 22
3743
One2many fields in tree views Resolvido
one2many tree
Avatar
Avatar
Avatar
2
nov. 20
20437
"RuntimeError: maximum recursion depth exceeded in cmp" problem
one2many odoo10
Avatar
Avatar
Avatar
Avatar
4
mai. 18
13573
Values has false in one2many field when changing the customer in Sale Order ODOO 10
one2many sale.order.line odoo10
Avatar
0
mar. 23
7238
Prevent create and delete on a One2many tree view Resolvido
treeview one2many odoo10
Avatar
1
jul. 20
11008
Comunidade
  • Tutoriais
  • Documentação
  • Fórum
Open Source
  • Baixar
  • Github
  • Runbot
  • Traduções
Serviços
  • Odoo.sh Hosting
  • Suporte
  • Upgrade
  • Desenvolvimentos personalizados
  • Educação
  • Encontre um Contador
  • Encontre um parceiro
  • Torne-se um parceiro
Sobre nós
  • Nossa empresa
  • Ativos da marca
  • Contato
  • Empregos
  • Eventos
  • Podcast
  • Blog
  • Clientes
  • Legal • Privacidade
  • Segurança
الْعَرَبيّة 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 Svenska ภาษาไทย Türkçe українська Tiếng Việt

Odoo é um conjunto de aplicativos de negócios em código aberto que cobre todas as necessidades de sua empresa: CRM, comércio eletrônico, contabilidade, estoque, ponto de venda, gerenciamento de projetos, etc.

A proposta de valor exclusiva Odoo é ser, ao mesmo tempo, muito fácil de usar e totalmente integrado.

Site feito com

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