Reputation: 1
i am trying to custom the crm module in odoo 16 where a user can't save a lead/opportunity unless he schedules a certain amount of activities (for exemple 3) the activity logique is working where you can schedule activities by clicking a button and a window will appear where we can schedule activities
here is the saving function :
class CrmLead2_0ActivityScheduler(models.TransientModel):
_name = 'crm.lead.activity.scheduler'
_description = 'CRM 2.0 Activity Scheduler'
lead_id = fields.Many2one('crm.lead', string='Lead', required=True)
activity_lines = fields.One2many('crm.lead.activity.scheduler.line', 'scheduler_id', string='Activities')
def action_schedule_activities(self):
activities = []
for line in self.activity_lines:
activities.append({
'activity_type': line.activity_type,
'summary': line.summary,
'start_datetime': line.start_datetime,
'duration': line.duration,
})
self.lead_id.create_activities_from_scheduler(activities)
return {'type': 'ir.actions.act_window_close'}
fields for the activity :
class CrmLead2_0ActivitySchedulerLine(models.TransientModel):
_name = 'crm.lead.activity.scheduler.line'
_description = 'CRM 2.0 Activity Scheduler Line'
scheduler_id = fields.Many2one('crm.lead.activity.scheduler', string='Scheduler')
activity_type = fields.Char(string='Activity Type', required=True)
summary = fields.Char(string='Summary', required=True)
start_datetime = fields.Datetime(string='Due Date', required=True)
duration = fields.Float(string='Duration (Hours)', required=True)
main class of lead :
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from datetime import timedelta
class CrmLead2_0(models.Model):
_inherit = 'crm.lead' # Inherit from the original CRM model
activity_ids = fields.One2many('mail.activity', 'res_id', string='Activities')
scheduled_activities = fields.Integer(string='Scheduled Activities', compute='_compute_scheduled_activities', store=True, readonly=True)
activities_required = fields.Integer(string='Activities Required', default=3, readonly=True)
# Compute the number of scheduled activities
@api.depends('activity_ids')
def _compute_scheduled_activities(self):
for lead in self:
lead.scheduled_activities = len(lead.activity_ids)
# Action to open the activity scheduling form
def action_open_activity_scheduler(self):
return {
'type': 'ir.actions.act_window',
'name': 'Schedule Activities',
'res_model': 'crm.lead.activity.scheduler',
'view_mode': 'form',
'target': 'new',
'context': {'default_lead_id': self.id,},
}
# Method to create activities from the scheduler
def create_activities_from_scheduler(self, activities):
for activity in activities:
activity_type = self.env['mail.activity.type'].search([('name', '=', activity['activity_type'])], limit=1)
if not activity_type:
activity_type = self.env['mail.activity.type'].create({'name': activity['activity_type']})
#datetime of the start of the activity
start_date = activity['start_datetime']
#datetime of the end of the activity
duration = activity.get('duration', 1)
stop_datetime = start_date + timedelta(hours=duration)
stop_date = stop_datetime.date()
mail_activity = self.env['mail.activity'].create({
'activity_type_id': activity_type.id,
'summary': activity['summary'],
'date_deadline': stop_date,
'user_id': self.user_id.id,
'res_id': self.id,
'res_model_id': self.env['ir.model']._get('crm.lead').id,
})
self.env['calendar.event'].create({
'activity_ids': [(4, mail_activity.id)],
'name': activity['summary'],
'start': start_date,
'stop': stop_datetime,
'duration': activity['duration'],
'user_id': self.user_id.id,
})
here is how i check for the activity count :
@api.constrains('scheduled_activities')
def _check_activities_condition(self):
if not self.env.context.get('skip_activity_validation'):
for lead in self:
if lead.scheduled_activities < lead.activities_required:
raise ValidationError(_("You must schedule at least %s activities before saving this lead.") % lead.activities_required)
so i tried but whenever i click on the button "Schedule Activities" the error that i should schedule activities appears before even scheduling them any ideas how can i do that :
i tried to override create and write methods still not working
Upvotes: 0
Views: 20