Domain dinamis tidak berfungsi dengan baik di odoo9

Di Odoo9 saya memerlukan domain dinamis yang bergantung pada bidang many2one pada wizard. Dengan menggunakan berbagai contoh saya membuatnya berfungsi, tetapi nilai yang difilter selalu valid untuk opsi sebelumnya. Atau valid jika saya memilih opsi (tidak valid) dari domain yang difilter.

Detail:

Di akhir alur kerja peluang, seorang salesman seharusnya mengevaluasi peluang di mana dia memilih kemungkinan keberhasilan. Ada beberapa level yang harus dipilih dalam wizard khusus ("100% yakin", "tidak yakin", "mungkin" dll). Saya menggunakan fields.Selection untuk ini. Lalu saya memperkenalkan jenis peluang baru (retensi) yang seharusnya hanya tersedia 100% dan 0%. Jadi saya membuat model baru evaluation_option, mengganti fields.Selection dengan fields.Many2one dan dari nilai-nilai ini saya memfilter opsi yang diizinkan (dengan retention=True).

Ini adalah model penyihir saya:

class evaluation_wizard(models.TransientModel):
    _name = 'evaluation.wizard'
    _description = 'Wizard to evaluate opportunity'

    lead_id = fields.Many2one('crm.lead')
    evaluation_option_id = fields.Many2one('evaluation.option')

    def get_object(self, model, fieldname):
        ids = self._context.get(fieldname)
        if ids is None:
            ids = self._context.get('default_' + fieldname)
        return self.env[model].browse(ids)

    @api.onchange('lead_id')
    def _onchange_lead_id(self):
        # I check the context to get lead_id
        lead_id = self.lead_id if self else self.get_object('crm.lead', 'lead_id')
        dom = [('retention', '=', True)] if lead_id.retention else []
        return {'domain': {'evaluation_option_id': dom}}

dan ini adalah penyihir sebenarnya

    <record id="evaluation_wizard_view" model="ir.ui.view">
        <field name="name">evaluation.wizard.view</field>
        <field name="model">evaluation.wizard</field>
        <field name="arch" type="xml">
            <form string="Evaluate opportunity">
                <sheet class="row">
                    <group>
                        <group>
                            <field name="lead_id" invisible="False"/>
                            <field name="evaluation_option_id" required="True"
                                   create="False" edit="False" widget="radio"
                            />
                        </group>
                    </group>
                    <footer>
                        <button name="evaluate"
                                type="object"
                                string="Confirm"
                                class="oe_highlight"
                                context="{'lead_id': default_lead_id,
                                          'active_id': default_lead_id,
                                          'evaluation_option_id': evaluation_option_id}"/>
                    </footer>
                </sheet>
            </form>
        </field>
    </record>

Saya membuat metode onchange untuk perubahan domain secara dinamis, seperti yang ditunjukkan di atas. Saya juga mencoba menghitung domain seperti ini: evaluation_option_id = fields.Many2one('evaluation.option', domain=_compute_domain) di mana compute_domain adalah metode yang sama seperti untuk onchange tetapi dihiasi dengan api.depends. Tidak ada satu pun metode yang berhasil seperti yang diharapkan.

Saya menggunakan model sementara dengan nilai (misalnya lead_id) yang diisi sebelumnya dengan nilai default (default_lead_id) melalui tombol konteks.

Apa pun yang saya coba, ketika saya membuat domain benar-benar berfungsi, ia menyaring nilainya, tetapi selalu valid untuk pilihan sebelumnya. Artinya jika saya memilih peluang retensi, saya mendapatkan semua opsi, jika saya memilih peluang normal, saya mendapatkan opsi retensi. Jika peluang berikutnya adalah peluang reguler, opsinya benar. Namun, jika saya memilih peluang retensi (dan opsi yang tidak valid ditampilkan) lalu saya memilih opsi yang tidak valid, opsi yang tidak valid akan tersaring secara tiba-tiba. Saya tidak yakin, tetapi menurut saya masalah yang sama disebutkan di sini: filter domain untuk banyak2satu bidang di odoo? di komentar terakhir dari jawaban yang diterima.

Dapatkah Anda melihat kesalahan yang jelas atau Anda tahu cara lain cara mengubah domain secara dinamis?

-- Sunting:

Saya akhirnya berhasil membuatnya berhasil. Saya tidak ingat apa sebenarnya yang telah saya lakukan setahun yang lalu tetapi perbandingan antara versi lama dan versi kode saat ini menunjukkan hal ini:

1) Saya memperbarui metode get_object untuk mendapatkan lead_id langsung dari formulir dan kemudian jika tidak berhasil, coba gali dari konteksnya.

def get_object(self, model, fieldname):
    value = getattr(self, fieldname, None)
    if value is not None:
        return value
    ids = self._context.get(fieldname, None)
    if ids is None:
        ids = self._context.get('default_' + fieldname)
    ids = [] if ids is None else ids
    return self.env[model].browse(ids)


@api.onchange('lead_id')
def _onchange_lead_id(self):
    lead_id = self.get_object('crm.lead', 'lead_id')
    dom = [('retention', '=', True)] if lead_id.is_retention_opp else []
    return {'domain': {'evaluation_option_id': dom}}

2) perubahan lainnya ada di xml - readonly lead_id (sehingga hanya dipanggil sekali saat merender wizard) dan menghapus widget radio dari evaluation_option_id:

<group>
    <field name="lead_id" invisible="True" readonly="True"/>
    <field name="evaluation_option_id" required="True"
           options="{'no_create': True}"/>
</group>

Semoga ini bisa membantu seseorang.


person Juraj Bezručka    schedule 16.07.2018    source sumber
comment
Hai, tolong beri tahu saya jika Anda punya jawaban, saya punya masalah yang sama.   -  person Gabriel Asqui    schedule 15.07.2019
comment
@GabrielAsqui saat ini sepertinya berfungsi dengan benar. Sejujurnya, saya tidak tahu apa yang sebenarnya berhasil bagi saya karena masalah ini sudah berumur satu tahun. Namun, saya membandingkan kode yang dikirimkan dengan versi saat ini dan menurut saya satu-satunya perbedaan yang relevan adalah saya membuat lead_id tidak terlihat & hanya dapat dibaca (sehingga onchange dipanggil saat merender wizard) dan menghapus widget radio dari bidang kedua. Saya meletakkan perubahan saya di bawah pertanyaan awal.   -  person Juraj Bezručka    schedule 16.07.2019