Dear Shreya,
Here's how to implement your custom presales team functionality without OWL directives:
Solution Approach
We'll use a combination of:
- Standard many2many_tags widget for team selection
- Conditional visibility for team sections
- Onchange methods to handle team toggling
- 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
- Dynamic Team Sections: Only shows sections for selected teams
- Automatic Team Management: Teams are automatically (un)checked based on presales entries
- Contextual Defaults: New presales entries automatically get the correct team
- 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!)