diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 5cd47b96f83..d033a750ed2 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -63,8 +63,12 @@ class Lead(models.Model): self._table, ['create_date', 'team_id']) return res + def _default_team_id(self, user_id): + domain = [('use_leads', '=', True)] if self._context.get('default_type') == "lead" or self.type == 'lead' else [('use_opportunities', '=', True)] + return self.env['crm.team']._get_default_team_id(user_id=user_id, domain=domain) + def _default_stage_id(self): - team = self.env['crm.team'].sudo()._get_default_team_id(user_id=self.env.uid) + team = self._default_team_id(user_id=self.env.uid) return self._stage_find(team_id=team.id, domain=[('fold', '=', False)]).id name = fields.Char('Opportunity', required=True, index=True) @@ -74,7 +78,7 @@ class Lead(models.Model): date_action_last = fields.Datetime('Last Action', readonly=True) email_from = fields.Char('Email', help="Email address of the contact", tracking=40, index=True) website = fields.Char('Website', index=True, help="Website of the contact") - team_id = fields.Many2one('crm.team', string='Sales Team', oldname='section_id', default=lambda self: self.env['crm.team'].sudo()._get_default_team_id(user_id=self.env.uid), + team_id = fields.Many2one('crm.team', string='Sales Team', oldname='section_id', default=lambda self: self._default_team_id(self.env.uid), index=True, tracking=True, help='When sending mails, the default email address is taken from the Sales Team.') kanban_state = fields.Selection([('grey', 'No next activity planned'), ('red', 'Next activity late'), ('green', 'Next activity is planned')], string='Kanban State', compute='_compute_kanban_state') @@ -280,7 +284,7 @@ class Lead(models.Model): team = self.env['crm.team'].browse(self._context['team_id']) if user_id in team.member_ids.ids or user_id == team.user_id.id: return {} - team_id = self.env['crm.team']._get_default_team_id(user_id=user_id) + team_id = self._default_team_id(user_id) return {'team_id': team_id} @api.onchange('user_id') diff --git a/addons/sales_team/data/sales_team_data.xml b/addons/sales_team/data/sales_team_data.xml index 6863a00e153..cf007fd3f25 100644 --- a/addons/sales_team/data/sales_team_data.xml +++ b/addons/sales_team/data/sales_team_data.xml @@ -3,6 +3,7 @@ Sales + 0 @@ -12,7 +13,7 @@ - + Point of Sale @@ -28,7 +29,7 @@ ref('sales_team.team_sales_department'), ref('sales_team.salesteam_website_sales'), ref('sales_team.ebay_sales_team'), - ref('sales_team.pos_sales_team')], + ref('sales_team.pos_sales_team')], [ref('base.partner_root')]"/> diff --git a/addons/sales_team/models/crm_team.py b/addons/sales_team/models/crm_team.py index 26700b547ba..a763067d9da 100644 --- a/addons/sales_team/models/crm_team.py +++ b/addons/sales_team/models/crm_team.py @@ -17,35 +17,30 @@ class CrmTeam(models.Model): _name = "crm.team" _inherit = ['mail.thread'] _description = "Sales Team" - _order = "name" + _order = "sequence" @api.model @api.returns('self', lambda value: value.id if value else False) - def _get_default_team_id(self, user_id=None): + def _get_default_team_id(self, user_id=None, domain=None): if not user_id: user_id = self.env.uid - team_id = self.env['crm.team'].sudo().search([ + team_id = self.env['crm.team'].search([ '|', ('user_id', '=', user_id), ('member_ids', '=', user_id), '|', ('company_id', '=', False), ('company_id', '=', self.env.company.id) ], limit=1) if not team_id and 'default_team_id' in self.env.context: team_id = self.env['crm.team'].browse(self.env.context.get('default_team_id')) if not team_id: - default_team_id = self.env.ref('sales_team.team_sales_department', raise_if_not_found=False) - if default_team_id: - try: - default_team_id.check_access_rule('read') - except AccessError: - return self.env['crm.team'] - if self.env.context.get('default_type') != 'lead' and default_team_id.active: - team_id = default_team_id + team_domain = domain or [] + default_team_id = self.env['crm.team'].search(team_domain, limit=1) + return default_team_id or self.env['crm.team'] return team_id - def _get_default_favorite_user_ids(self): return [(6, 0, [self.env.uid])] name = fields.Char('Sales Team', required=True, translate=True) + sequence = fields.Integer('Sequence', default=10) active = fields.Boolean(default=True, help="If the active field is set to false, it will allow you to hide the Sales Team without removing it.") company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company) @@ -65,7 +60,7 @@ class CrmTeam(models.Model): color = fields.Integer(string='Color Index', help="The color of the channel") dashboard_button_name = fields.Char(string="Dashboard Button", compute='_compute_dashboard_button_name') dashboard_graph_data = fields.Text(compute='_compute_dashboard_graph') - + def _compute_dashboard_graph(self): for team in self: team.dashboard_graph_data = json.dumps(team._get_graph()) @@ -85,7 +80,6 @@ class CrmTeam(models.Model): """ skeleton function defined here because it'll be called by crm and/or sale """ raise UserError(_('Undefined graph model for Sales Team: %s') % self.name) - def _graph_get_dates(self, today): """ return a coherent start and end date for the dashboard graph covering a month period grouped by week. @@ -129,7 +123,7 @@ class CrmTeam(models.Model): GROUP BY x_value;""" # apply rules - dashboard_graph_model = self._graph_get_model() + dashboard_graph_model = self._graph_get_model() GraphModel = self.env[dashboard_graph_model] graph_table = GraphModel._table extra_conditions = self._extra_sql_conditions() @@ -149,7 +143,7 @@ class CrmTeam(models.Model): 'end_date': "%s", 'extra_conditions': extra_conditions } - + self._cr.execute(query, [self.id, start_date, end_date] + where_clause_params) return self.env.cr.dictfetchall() @@ -177,7 +171,7 @@ class CrmTeam(models.Model): # generate all required x_fields and update the y_values where we have data for them locale = self._context.get('lang') or 'en_US' - + weeks_in_start_year = int(date(start_date.year, 12, 28).isocalendar()[1]) # This date is always in the last week of ISO years for week in range(0, (end_date.isocalendar()[1] - start_date.isocalendar()[1]) % weeks_in_start_year + 1): short_name = get_week_name(start_date + relativedelta(days=7 * week), locale) diff --git a/addons/sales_team/tests/test_default_team.py b/addons/sales_team/tests/test_default_team.py index 1dd1c39beb1..8d7b24d0357 100644 --- a/addons/sales_team/tests/test_default_team.py +++ b/addons/sales_team/tests/test_default_team.py @@ -25,6 +25,11 @@ class TestDefaultTeam(common.SavepointCase): }) # Europe Team (fall back team) cls.team_2 = cls.env.ref('sales_team.team_sales_department') + cls.team_3 = cls.env['crm.team'].create({ + 'name': 'Team 3', + 'sequence': 2, + 'company_id': False + }) def test_01_user_team(self): """Get default team, when user belongs to one.""" @@ -42,7 +47,7 @@ class TestDefaultTeam(common.SavepointCase): # Case 1. team = self.CrmTeam.with_user(self.user)._get_default_team_id() self.assertEqual(team, self.team_2) - # Case 2. + # Case 2. If default team is not active, fall back is the next team with the higher sequence self.team_2.active = False team = self.CrmTeam.with_user(self.user)._get_default_team_id() - self.assertEqual(team, self.CrmTeam) + self.assertEqual(team, self.team_3) diff --git a/addons/sales_team/views/crm_team_views.xml b/addons/sales_team/views/crm_team_views.xml index e22144cbf24..7d60b8f3e26 100644 --- a/addons/sales_team/views/crm_team_views.xml +++ b/addons/sales_team/views/crm_team_views.xml @@ -115,6 +115,7 @@ child_ids +