Modelos/vistas de OpenERP: objeto relacionado en línea

He instalado el crm incorporado en el módulo de OpenERP 6.1.

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

Me gustaría editar este objeto/vista para mostrar la dirección de facturación del socio.

Como quiero hacer esto en el formulario Opporunities, ya hay un partner_id.

Copiando otro módulo, definí mi nuevo módulo así:

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'])]"),
    }

Y cambié mi update_xml a:

    
        Opportunity form (inherit)
        crm.lead
        
        
            
                
                
                    
                        
                        
                    
                    
                        
                        
                    
                
            
        
    

El problema es que el objeto relacionado muestra todos los campos relacionados (como supongo que se esperaría). En particular, muestra los campos partner_id y company, que me gustaría ocultar, ya que deberían ser/heredar de forma predeterminada de esta oportunidad (o del socio vinculado).

¿Cómo puedo ocultar estos campos? No puedo simplemente agregar un grupo de campos 'relacionados', ya que hay potencialmente más de una dirección de facturación.

¡Gracias por la ayuda!


Editar: para ser más claros, una oportunidad solo debe tener una única dirección de facturación elegida, elegida entre las direcciones de facturación/predeterminadas del socio. Debe mostrarse en línea para permitir una fácil edición.

0

4 Respuestas

Hay un par de maneras de especificar el ver para campos relacionados como este. Puedes usar el contexto de esta manera:


También puede especificar la vista completa para el registro secundario como una subvista dentro de la vista principal como esta:

    <!-- <=== order_line is a one2many field -->
    
        <form>
            
            ...
        </form>
        <tree>
            
            ...
        
    
0
agregado
Eso es extraño, @CB. Usualmente uso el cliente GTK, así que no sabía acerca del problema del cliente web con las subvistas. ¿El cliente web usa la subvista que vio definida en res_partner?
agregado el autor Don Kirkby, fuente
No es crm_lead.billing_address_id un campo one2many, @CB. ? Pensé que definirías una subvista en ese campo. ¿Dónde lo defines? ¿La vista res_partner usa el widget one2many_list?
agregado el autor Don Kirkby, fuente
Probé el segundo método (subvistas) después de escribir la pregunta, ya que parece exactamente lo que quiero. De hecho, la vista res_partner usa subvistas para este efecto. Sin embargo, copiarlo en mi update_xml no funciona, todavía obtengo el mismo widget desplegable. Voy a probar con el primer método pronto. ¿Estás seguro de que OpenERP admite subvistas en arquitecturas de vistas heredadas?
agregado el autor EB., fuente
Establecí algunos puntos de interrupción en field_views_get y noté que mientras el contenido de mi subvista se evalúa en __view_look_dom_arch, no se devuelve en la forma final (justo antes del cálculo de la barra de herramientas). ¿Algunas ideas?
agregado el autor EB., fuente
Más pruebas indican que los subcampos definidos (¿correctamente?) Aparecen como xfields ['billing_address_id'] ['views'] ['form'] y xfields ['billing_address_id'] ['views'] ['tree'], pero el el cliente web se niega a mostrarlos.
agregado el autor EB., fuente
Las pruebas posteriores parecen culpar al cliente web, que parece no admitir subvistas para muchos campos de one2. Todavía lo estoy buscando.
agregado el autor EB., fuente
Sí, esto parece ser cierto. ¿Consideras esto un error? La web JS nunca llama a self.set_embedded_view. Gracias por el consejo sobre las subvistas. Marcado aceptado ya que es correcto, pero OpenERP está equivocado.
agregado el autor EB., fuente
Sí, lo hace, ya que es un one2many.
agregado el autor EB., fuente
Copié la definición de crm_lead.billing_address_id de crm_lead.partner_address_id , que se define como 'partner_address_id': fields.many2one ('res.partner.address', ... . La razón por la que estos son campos m2o es porque le piden al usuario que "elija uno"; en otras palabras, que haga una clave externa en el modelo crm_lead . res_partner.addresses es un one2many (como un socio puede tener muchos destinatarios), por lo que la subvista funciona. billing_address_id (mía) y partner_addre
agregado el autor EB., fuente
Hasta donde puedo ver, el atributo widget no tiene importancia una vez que una vista incrustada (subvista) está en su lugar. Además, res_partner no especifica ningún atributo de widget para su campo de dirección.
agregado el autor EB., fuente
Además, no puedo convertir estos campos en one2many ya que la clave foránea requerida no existiría en el modelo res.partner.address . Asumiendo que agregué eso a res.partner.address , este campo me permitiría cambiar el tipo de campo a one2many, lo que permitiría la subvista, pero no permitiría que el usuario final haga una "elección". Básicamente, creo que necesitaría crear un nuevo widget OpenERP para permitir el comportamiento deseado de "editar en línea y elegir uno".
agregado el autor EB., fuente

OK, estaba un poco confundido porque pones un widget one2many en un campo many2one.

Si desea controlar cómo se muestra un campo one2many, use la subvista o los métodos de contexto que mencioné en mi otra respuesta .

Si desea controlar cómo se muestra un campo many2one, es posible que pueda usar campos relacionados que extraigan campos del registro que seleccionó, pero lo dudo. La opción de solo lectura podría funcionar, pero no creo que tenga sentido editar múltiples campos relacionados y poder cambiar el registro seleccionado. Es posible que pueda hackear juntos algunos campos de función con una función de tienda que le permite volver a escribir en el registro relacionado, pero parece que realmente podría confundir a los usuarios.

0
agregado
Sí, puedo ver por qué mi pregunta inicial podría ser algo confusa. Creo que, en última instancia, la forma más "limpia" de hacerlo sería crear una nueva vista de widgets y formularios (muy similar al widget one2many existente cuando está en modo formulario) que guardará el objeto extraño actualmente visible en el campo local many2one fk en el DB, mientras que también guarda el objeto relacionado remoto. Pero, no parece que valga la pena el esfuerzo en este momento :) Gracias de nuevo por su ayuda.
agregado el autor EB., fuente
Sí, la forma más limpia de agregar un nuevo widget que sea la mejor manera de hacerlo a su manera. :)
agregado el autor Jedi Shadow, fuente

En cualquier campo de relación OE puede definir la vista intencional 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 esto te ayudará,.

0
agregado
Gracias, Don Kirkby ya mencionó las subvistas, y estos ejemplos también están en campos one2many, no en muchos campos, por lo que no resuelve mi nuevo problema.
agregado el autor EB., fuente
ok CB obtuvo el punto, en el campo m2o quieres mostrar algunos valores según tu chouce
agregado el autor Jedi Shadow, fuente

Ahora, si quieres añadir detalles específicos a tu archivo m2o, también tenemos una forma opcional en la que tienes que sobre el def name_get de tu modelo relacional, namge get look like:

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.

Entonces, aquí en este método puedes decidir qué cadena quieres que muestre tu campo relacional. Ejemplo

Esto arreglará tu problema parcialmente, supongo.

0
agregado