OpenERP modelagem/views: objeto relacionado inline

Eu instalei o construído em OpenERP 6.1 module crm.

As a result, I now have res.lead active and visible at "Sales->Opportunities".

Gostaria de editar este objeto/visualização para mostrar o endereço de cobrança do parceiro.

Como quero fazer isso no formulário Oportunidades, já existe um partner_id.

Copiando outro módulo, eu defini meu novo módulo assim:

class crm_lead(osv.osv):
    _name = _inherit = 'crm.lead'
    _columns = {
    'billing_address_id': fields.many2one('res.partner.address', 'Partner Billing Address', domain="[('partner_id','=',partner_id),('type','in',['invoice', 'default'])]"),
    }

E mudei meu update_xml para:

    
        Opportunity form (inherit)
        crm.lead
        
        
            
                
                
                    
                        
                        
                    
                    
                        
                        
                    
                
            
        
    

O problema é que o objeto relacionado mostra todos os campos relacionados (como seria de se esperar). Em particular, ele mostra os campos partner_id e company, que gostaria de ocultar, pois eles devem usar o padrão/herdar dessa oportunidade (ou do parceiro vinculado).

Como posso ocultar esses campos? Não posso simplesmente adicionar vários campos "relacionados", pois há mais de um endereço de faturamento.

Obrigado pela ajuda!


Editar: para ser mais claro, uma oportunidade deve ter apenas um endereço de faturamento escolhido, escolhido na fatura/endereço padrão do parceiro. Deve ser exibido em linha para facilitar a edição.

0
adicionado editado
Visualizações: 1

4 Respostas

Existem algumas maneiras de especificar o ver para campos relacionados como este. Você pode usar o contexto como este:


Você também pode especificar toda a visualização do registro filho como uma subvisualização dentro da vista principal como esta:

    <!-- <=== order_line is a one2many field -->
    
        <form>
            
            ...
        </form>
        <tree>
            
            ...
        
    
0
adicionado
Isso é estranho, @CB. Eu costumo usar o cliente GTK, então eu não sabia sobre o problema do cliente web com subvisualizações. O cliente da Web usa a subvisualização que você viu definida em res_partner?
adicionado o autor Don Kirkby, fonte
Não é crm_lead.billing_address_id um campo one2many, @CB. ? Eu pensei que você fosse definir uma subvisão nesse campo. Onde você está definindo isso? A visualização res_partner usa o widget one2many_list?
adicionado o autor Don Kirkby, fonte
Eu tentei o segundo método (subviews) depois de escrever a pergunta, como parece exatamente o que eu quero. Na verdade, a visualização res_partner usa subvisualizações para esse efeito. No entanto, copiá-lo para o meu update_xml não funciona - ainda recebo o mesmo widget suspenso. Vou testar com o primeiro método em breve. Tem certeza de que o OpenERP suporta subvisualizações em arquiteturas de visualização herdada?
adicionado o autor EB., fonte
Eu configurei alguns pontos de interrupção em field_views_get e notei que enquanto o conteúdo da minha subvisualização é avaliado em __view_look_dom_arch, ele não é retornado no formulário final (logo antes do cálculo da barra de ferramentas). Alguma ideia?
adicionado o autor EB., fonte
Mais testes indicam que os subcampos definidos (corretamente?) Aparecem como xfields ['billing_address_id'] ['views'] ['form'] e xfields ['billing_address_id'] ['views'] ['tree'], mas o o cliente da web se recusa a mostrá-los.
adicionado o autor EB., fonte
Outros testes parecem culpar o cliente web, que parece não suportar subviews para muitos campos. Ainda olhando para ele.
adicionado o autor EB., fonte
Sim, isso parece ser verdade. Você consideraria isso um bug? A web JS nunca chama self.set_embedded_view. Obrigado pela dica sobre subvisualizações. Marcação aceita desde que você esteja correto, mas o OpenERP está errado.
adicionado o autor EB., fonte
Sim, pois é um one2many.
adicionado o autor EB., fonte
Eu copiei a definição de crm_lead.billing_address_id de crm_lead.partner_address_id , que é definida como 'partner_address_id': fields.many2one ('res.partner.address', ... A razão pela qual estes são campos m2o é porque eles estão pedindo ao usuário para "escolher um" - em outras palavras, para fazer uma chave estrangeira no modelo crm_lead . > res_partner.addresses é um one2many (como um parceiro pode ter muitos endereçados), é por isso que a subview funciona. billing_address_id (meu) e par
adicionado o autor EB., fonte
Tanto quanto eu posso ver, o atributo widget é inconsequente quando uma visão incorporada (subview) está no lugar. Além disso, res_partner não especifica nenhum atributo do widget para seu campo de endereço.
adicionado o autor EB., fonte
Além disso, não posso colocar esses campos como one2many, pois a chave estrangeira requerida não existiria no modelo res.partner.address . Assumindo que eu adicionei isso a res.partner.address , este campo me permitiria mudar o tipo de campo para one2many, o que permitiria a subvisualização, mas não permitiria que o usuário final fizesse uma "escolha". Essencialmente eu acho que eu preciso fazer um novo widget OpenERP para permitir o meu desejado "editar inline e escolher um" comportamento.
adicionado o autor EB., fonte

OK, fiquei um pouco confuso porque você colocou um widget one2many em um campo many2one.

Se você quiser controlar como um campo one2many é exibido, use os métodos de subvisualização ou contexto que mencionei na minha outra resposta .

Se você quiser controlar como um campo many2one é exibido, poderá usar campos relacionados que extraem campos do registro selecionado, mas duvido. Somente leitura pode funcionar, mas não acho que faça sentido editar vários campos relacionados e poder alterar o registro selecionado. Você pode ser capaz de hackear alguns campos de função com uma função de armazenamento que permite que você grave de volta no registro relacionado, mas parece que realmente confundiria seus usuários.

0
adicionado
Sim, eu posso ver porque minha pergunta inicial pode ser um pouco confusa. Em última análise, acho que a maneira mais "limpa" de fazer isso seria criar um novo widget e uma visualização de formulário (como o widget one2many existente quando está no modo de formulário) que salvaria o objeto estranho atualmente visível no campo many2one fk local o banco de dados, ao mesmo tempo, salvando o objeto relacionado remoto. Mas, isso não parece valer a pena o esforço agora :) Obrigado novamente por sua ajuda.
adicionado o autor EB., fonte
Sim CB maneira mais limpa para adicionar novo Widget que será melhor maneira você pode fazer isso pelo seu caminho. :)
adicionado o autor Jedi Shadow, fonte

Em qualquer campo de Relação OE, você pode definir a Visualização Intenal como:

  
        <!--Internal tree view for your Relation field model-->
        <tree>
        

        <!--Internal Form view for your Relation field model-->
        <form>
        </form>
  

Example Under Addons 1 Click to Example 2 Click to See Example

Espero que isso ajude você.

0
adicionado
Obrigado, usar subvisualizações já foi mencionado por Don Kirkby, e esses exemplos também estão em campos únicos, não em um campo many2one, então isso não resolve meu novo problema.
adicionado o autor EB., fonte
ok CB tem ele ponto, no campo m2o vc quer mostrar alguns valores conforme seu chouce
adicionado o autor Jedi Shadow, fonte

Agora, se você quiser dar detalhes específicos em seu arquivo m2o, então nós temos alguma forma opcional também onde você tem que usar o def name_get do seu modelo relacional, o nome do nam se parece com:

name_get(cr, user, ids, context=None)
   Returns the preferred display value (text representation) for the records with 
   the given ids. By default this will be the value of the name column, unless the
   model implements a custom behavior. Can sometimes be seen as the inverse function
   of name_search(), but it is not guaranteed to be.

   Rtype :  list(tuple)
   Return : list of pairs (id,text_repr) for all records with the given ids.

Então, neste método, você pode decidir qual string deseja exibir em seu campo relacional. Exemplo

Isso consertará seu problema parcialmente, eu acho.

0
adicionado