Skip to Content
Meniu
Trebuie să fiți înregistrat pentru a interacționa cu comunitatea.
Această întrebare a fost marcată
1 Răspunde
895 Vizualizări
I want to bring the following custom functionality to my CRM.

I have created a new model called crm.presales.value, which has

lead_id = fields.Many2one('crm.lead', string="Opportunity")
user_id = fields.Many2one('res.users', string="User")
team_id = fields.Many2one('crm.team', string='Presales Team')
value = fields.Float()

among other fields and functions.

I have inherited the crm.lead model to include

presales_ids = fields.One2many('crm.presales.value', 'lead_id', string="Presales")
presales_team_ids = fields.Many2many('crm.team', string="Presales Teams",

compute='_compute_presales_team_ids', store=True)

In my crm.lead form view,

  • I want checkboxes to select presales teams.
  • When a team is selected, I want a separate inline list view to appear (for each team), which allows me to add the user and other required info.
  • When saving the form, if any list is empty I want that team to be unchecked.

How can I implement this dynamically? (using xml or qweb templates)


Odoo v18 Community edition

Imagine profil
Abandonează
Cel mai bun răspuns

Dear Shreya,

Here's how to implement your custom presales team functionality without OWL directives:

Solution Approach

We'll use a combination of:

  1. Standard many2many_tags widget for team selection
  2. Conditional visibility for team sections
  3. Onchange methods to handle team toggling
  4. Server-side validation

Implementation Steps

1. Model Enhancements

python

# Add to your crm.lead model
from odoo import api, fields, models

class CrmLead(models.Model):
    _inherit = 'crm.lead'
    
    presales_team_ids = fields.Many2many(
        'crm.team', 
        string="Presales Teams",
        compute='_compute_presales_team_ids',
        store=True
    )
    
    @api.depends('presales_ids.team_id')
    def _compute_presales_team_ids(self):
        for lead in self:
            lead.presales_team_ids = lead.presales_ids.mapped('team_id')
2. Form View Implementation

xml

<record id="view_crm_lead_presales_form" model="ir.ui.view">
    <field name="name">crm.lead.form.presales</field>
    <field name="model">crm.lead</field>
    <field name="inherit_id" ref="crm.view_crm_lead_form"/>
    <field name="arch" type="xml">
        <!-- Add team selection field -->
        <xpath expr="//field[@name='team_id']" position="after">
            <field name="presales_team_ids" widget="many2many_tags"/>
        </xpath>
        
        <!-- Add dynamic sections for each team -->
        <xpath expr="//sheet" position="inside">
            <div class="oe_title">
                <h2>Presales Assignments</h2>
            </div>
            <div t-foreach="record.presales_team_ids.raw_value" t-as="team">
                <group string="Presales Team: {{ team[1] }}" attrs="{'invisible': [('id', '=', False)]}">
                    <field name="presales_ids" context="{'default_team_id': team[0]}">
                        <tree editable="bottom">
                            <field name="user_id"/>
                            <field name="value"/>
                            <field name="team_id" invisible="1"/>
                        </tree>
                    </field>
                </group>
            </div>
        </xpath>
    </field>
</record>
3. Add Validation Logic

python

# Add to your crm.lead model
@api.constrains('presales_ids', 'presales_team_ids')
def _check_presales_teams(self):
    for lead in self:
        # Get teams with no entries
        empty_teams = lead.presales_team_ids - lead.presales_ids.mapped('team_id')
        if empty_teams:
            lead.write({'presales_team_ids': [(3, team.id) for team in empty_teams]})
4. Optional: Add Onchange for Better UX

python

@api.onchange('presales_team_ids')
def _onchange_presales_teams(self):
    # Remove presales entries for deselected teams
    if self.presales_ids:
        to_remove = self.presales_ids.filtered(
            lambda x: x.team_id not in self.presales_team_ids
        )
        if to_remove:
            self.presales_ids = [(3, entry.id) for entry in to_remove]
Key Features of This Implementation
  1. Dynamic Team Sections: Only shows sections for selected teams
  2. Automatic Team Management: Teams are automatically (un)checked based on presales entries
  3. Contextual Defaults: New presales entries automatically get the correct team
  4. Validation: Empty teams are automatically unchecked on save
Limitations in Community Edition

Since OWL directives aren't allowed in XML:

  • We use t-foreach for dynamic sections
  • Visibility is controlled through standard attrs

The UI updates require a save/reload (not fully dynamic)

🚀 Did This Solve Your Problem?

If this answer helped you save time, money, or frustration, consider:

✅ Upvoting (👍) to help others find it faster

✅ Marking as "Best Answer" if it resolved your issue

Your feedback keeps the Odoo community strong! 💪

(Need further customization? Drop a comment—I’m happy to refine the solution!)

Imagine profil
Abandonează
Autor

OWL directives are not allowed in XML arch definitions

Check now I have edited my answer

Related Posts Răspunsuri Vizualizări Activitate
2
iun. 25
732
2
oct. 20
3113
1
aug. 19
10505
1
iun. 25
605
1
iun. 25
748