148 lines
5.9 KiB
Python
148 lines
5.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright 2017 Fabien Bourgeois <fabien@yaltik.com>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
""" CRM Action """
|
|
|
|
from datetime import timedelta
|
|
from odoo import models, fields, api, _
|
|
|
|
|
|
class CrmAction(models.Model):
|
|
""" CRM Action """
|
|
_name = 'crm.action'
|
|
_description = 'CRM Action'
|
|
_rec_name = 'display_name'
|
|
|
|
display_name = fields.Char(compute='_compute_display_name', store=True)
|
|
|
|
state = fields.Selection([('draft', 'Todo'), ('done', 'Done'),
|
|
('cancel', 'Canceled')], string='Status',
|
|
required=True, default='draft')
|
|
priority = fields.Selection([('0', 'Not evaluated'), ('1', 'Low'),
|
|
('2', 'Medium'), ('3', 'High'),
|
|
('4', 'Urgent')],
|
|
default='0', index=True)
|
|
details = fields.Text()
|
|
|
|
partner_id = fields.Many2one('res.partner', string='Customer', index=True)
|
|
date = fields.Datetime(required=True, default=fields.Date.context_today)
|
|
user_id = fields.Many2one('res.users', string='User', required=True,
|
|
default=lambda self: self.env.user)
|
|
lead_id = fields.Many2one('crm.lead', string='Lead', ondelete='cascade')
|
|
event_id = fields.Many2one('calendar.event', 'Calendar event', ondelete='cascade')
|
|
action_type_id = fields.Many2one(
|
|
'crm.action.type', string='Type', required=True,
|
|
default=lambda self: self.env['crm.action.type'].search([], limit=1))
|
|
action_type_name = fields.Char(related='action_type_id.name')
|
|
|
|
@api.onchange('lead_id')
|
|
def onchange_lead(self):
|
|
""" If lead change, adapts partner """
|
|
for action in self:
|
|
if action.lead_id and action.lead_id.partner_id:
|
|
action.partner_id = action.lead_id.partner_id
|
|
|
|
@api.onchange('partner_id')
|
|
def onchange_partner(self):
|
|
""" If partner changes, adapts lead to False """
|
|
for action in self:
|
|
if action.partner_id and action.lead_id:
|
|
if action.lead_id.partner_id != action.partner_id:
|
|
action.lead_id = False
|
|
|
|
|
|
@api.depends('action_type_id.name', 'details')
|
|
def _compute_display_name(self):
|
|
for action in self:
|
|
details = u'...'
|
|
if action.details:
|
|
details = u' '.join(action.details.split()[:5]) + details
|
|
action.display_name = u'[{}]{}'.format(action.action_type_name,
|
|
details)
|
|
@api.multi
|
|
def set_to_draft(self):
|
|
""" Set actions to draft """
|
|
self.write({'state': 'draft'})
|
|
|
|
@api.multi
|
|
def set_to_done(self):
|
|
""" Set actions to done """
|
|
self.write({'state': 'done'})
|
|
|
|
@api.multi
|
|
def create_linked_event(self):
|
|
""" Creates a linked event """
|
|
for action in self:
|
|
if not action.event_id:
|
|
attendees = [action.user_id.partner_id.id]
|
|
if action.partner_id:
|
|
attendees.append(action.partner_id.id)
|
|
data = {'start': action.date,
|
|
'stop': action.date,
|
|
'duration': 1.0,
|
|
'allday': False,
|
|
'name': action.display_name,
|
|
'description': action.details,
|
|
'privacy': 'confidential',
|
|
'partner_ids': [(6, False, attendees)],
|
|
'partner_location_id': action.partner_id.id or False}
|
|
action.event_id = self.env['calendar.event'].create(data)
|
|
return {'type': 'ir.actions.act_window',
|
|
'name': _('Linked event'),
|
|
'res_model': 'calendar.event',
|
|
'res_id': action.event_id.id,
|
|
'view_mode': 'form',
|
|
'view_type': 'form',
|
|
'flags': {'initial_mode': 'edit'}}
|
|
|
|
@api.multi
|
|
def remove_linked_event(self):
|
|
""" Removes linked event and deletes it """
|
|
for action in self:
|
|
if action.event_id:
|
|
event = action.event_id
|
|
action.event_id = False
|
|
event.unlink()
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
""" Ensures date event and basic partner_id coherence """
|
|
super(CrmAction, self).write(vals)
|
|
for action in self:
|
|
if action.event_id:
|
|
if action.event_id.start != action.date:
|
|
stop = fields.Datetime.from_string(action.date) + \
|
|
timedelta(hours=action.event_id.duration)
|
|
action.event_id.write({'start': action.date,
|
|
'stop': fields.Datetime.to_string(stop)})
|
|
if action.partner_id and \
|
|
action.partner_id not in action.event_id.partner_ids:
|
|
action.event_id.partner_ids |= action.partner_id
|
|
return True
|
|
|
|
|
|
class CrmActionType(models.Model):
|
|
""" CRM Action Type """
|
|
_name = 'crm.action.type'
|
|
_description = 'CRM Action Type'
|
|
_order = 'priority'
|
|
|
|
name = fields.Char(required=True)
|
|
priority = fields.Integer(required=True, default=0)
|
|
active = fields.Boolean(default=True)
|