Forum

Benvenuto!

Questo è il forum ufficiale dell'Associazione Odoo Italia. Dopo esserti registrato potrai partecipare ponendo domande o rispondendo a quelle esistenti. Non scordarti di compilare il tuo profilo e consultare le linee guida prima di iniziare a scrivere.

0

Mostrare un campo appartenente ad un altro modulo

Avatar
Walter Bates

Salve a tutti,

Vorrei che nella vista sale.view_order_form sia visibile un campo da me creato con le informazioni riguardanti il cliente scelto, similmente a quanto accade con il campo già esistente Termini di Pagamento (payment_term_id).

Ho creato il campo fido_field e l'ho reso visibile nella vista base.view_partner_form

partner.py

class ResPartner(models.Model):
    _inherit = 'res.partner'
    
    fido_field = fields.Integer(string='Fido associato')

partner_view.xml
<odoo>
    <record id="view_category_property_form" model="ir.ui.view">
        <field name="name">partner.fido.limit.form.inherit</field>
        <field name="model">res.partner</field>
        <field name="inherit_id" ref="base.view_partner_form"/>
        <field name="arch" type="xml">
            <xpath expr="//field[@name='vat']" position="after">
                    <field name='fido_field'/>
            </xpath>
        </field>
    </record>
</odoo>


Ho quindi creato il campo relazionale fido_sale_field e l'ho reso disponibile nella vista sale.view_order_form

sale.py

class SaleOrder(models.Model):
    _inherit = "sale.order"
    fido_sale_field = fields.Many2one('res.partner', 'fido_field')

sale_view.xml
<odoo>
<data>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">view.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="after">
  <field name='fido_sale_field'/>
</xpath>
</field>
</record>
</data>
</odoo>


Quello che vorrei dunque accadesse è che nella vista di creazione del preventivo, dopo aver selezionato un cliente dalla lista dei clienti, si caricasse in automatico il valore di fido_field in fido_sale_field.

Dopo aver visionato il codice sale.py del modulo base 'sale' penso sia necessario utilizzare le seguenti api:

@api.onchange('partner_id')
    def onchange_partner_id(self):

e

@api.multi
    def _prepare_invoice(self):

Purtroppo seguendo il codice già presente e la documentazione non sono riuscito in nessun modo. Qualcuno ha un suggerimento da darmi?

Sapreste inoltre dirmi se è necessario indicare la relazione in entrambi i campi fido_field e fido_sale_field

Vi ringrazio anticipatamente.

Avatar
Abbandona
4 Risposte
2
Avatar
Alex Comba
Migliore risposta

Buongiorno,

il campo related sul Sale Order deve essere definito come segue:

fido_sale_field = fields.Many2one(related="partner_id.fido_field")
Di default non è storato, per renderlo tale devi aggiungere store=True. Per ulteriori info puoi fare riferimento a https://www.odoo.com/documentation/14.0/reference/orm.html#related-fields.
Avatar
Abbandona
0
Avatar
Walter Bates
Migliore risposta

Salve, grazie per la risposta.

Ho seguito il tuo consiglio modificando come segue sale.py e partner.py:

partner.py

from odoo import models, fields, api
class ResPartner(models.Model):
    _inherit = 'res.partner'
    fido_field = fields.Integer(string = 'Fido Accordato')

sale.py

from odoo import models, fields, api
class SaleOrder(models.Model):
    _inherit = 'sale.order'
    fido_sale_field = fields.Many2one(related="partner_id.fido_field", store = True)

Purtroppo all'installazione del modulo ottengo il seguente errore.

Traceback (most recent call last):  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 656, in _handle_exception    return super(JsonRequest, self)._handle_exception(exception)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 314, in _handle_exception    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\tools\pycompat.py", line 87, in reraise    raise value  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 698, in dispatch    result = self._call_function(**self.params)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 346, in _call_function    return checked_call(self.db, *args, **kwargs)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\service\model.py", line 98, in wrapper    return f(dbname, *args, **kwargs)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 339, in checked_call    result = self.endpoint(*a, **kw)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 941, in __call__    return self.method(*args, **kw)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\http.py", line 519, in response_wrap    response = f(*args, **kw)  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 967, in call_button    action = self._call_kw(model, method, args, {})  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\web\controllers\main.py", line 955, in _call_kw    return call_kw(request.env[model], method, args, kwargs)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 759, in call_kw    return _call_kw_multi(method, model, args, kwargs)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\api.py", line 746, in _call_kw_multi    result = method(recs, *args, **kwargs)  File "<decorator-gen-61>", line 2, in button_immediate_install  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 74, in check_and_log    return method(self, *args, **kwargs)  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 445, in button_immediate_install    return self._button_immediate_function(type(self).button_install)  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\base\models\ir_module.py", line 561, in _button_immediate_function    modules.registry.Registry.new(self._cr.dbname, update_module=True)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\registry.py", line 86, in new    odoo.modules.load_modules(registry._db, force_demo, status, update_module)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 421, in load_modules    loaded_modules, update_module, models_to_check)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 313, in load_marked_modules    perform_checks=perform_checks, models_to_check=models_to_check  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\loading.py", line 179, in load_module_graph    load_openerp_module(package.name)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\module.py", line 368, in load_openerp_module    __import__('odoo.addons.' + module_name)  File "C:\Program Files (x86)\Odoo 12.0\server\odoo\modules\module.py", line 82, in load_module    exec(open(modfile, 'rb').read(), new_mod.__dict__)  File "<string>", line 4, in <module>  File "c:\program files (x86)\odoo 12.0\server\odoo\addons\my_module\models\__init__.py", line 3, in <module>    from . import modelsImportError: cannot import name 'models'


Avatar
Abbandona
1
Avatar
Alex Comba
Migliore risposta

Il file __init__.py lo devi spostare nella root del modulo. Il tuo modulo dovrà avere la seg. struttura:

my_module:
   __init__.py: 
  models
     __init.py:
partner.py     sale.py
dove i due __init__ file contengono rispettivamente:

from . import models

from . import partner
from . import sale
Avatar
Abbandona
1
Avatar
Davide Corio
Migliore risposta

Ciao,

nel caso in cui non lo sapessi, ci sono alcuni moduli OCA per la gestione dei fidi, del rischio, etc...

Li trovi qui:

https://github.com/OCA/credit-control/

Avatar
Abbandona