You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
5.0 KiB
119 lines
5.0 KiB
# -*- coding: utf-8 -*-
|
|
# Copyright 2016 Odoo SA <https://www.odoo.com>
|
|
# Copyright 2018 Eficent <http://www.eficent.com>
|
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
|
|
from openerp import api, models, fields
|
|
|
|
|
|
class CalendarEvent(models.Model):
|
|
_inherit = "calendar.event"
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
if self.env.context.get('default_res_model') and not \
|
|
self.env.context.get('default_res_model_id'):
|
|
self = self.with_context(
|
|
default_res_model_id=self.env['ir.model'].sudo().search([
|
|
('model', '=', self.env.context['default_res_model'])
|
|
], limit=1).id
|
|
)
|
|
defaults = super(CalendarEvent, self).default_get(fields)
|
|
|
|
# support active_model / active_id as replacement of
|
|
# default_* if not already given
|
|
if 'res_model_id' not in defaults and 'res_model_id' in fields and \
|
|
self.env.context.get('active_model') and \
|
|
self.env.context['active_model'] != 'calendar.event':
|
|
defaults['res_model_id'] = self.env['ir.model'].sudo().search(
|
|
[('model', '=', self.env.context['active_model'])],
|
|
limit=1).id
|
|
if 'res_id' not in defaults and 'res_id' in fields and \
|
|
defaults.get(
|
|
'res_model_id') and self.env.context.get('active_id'):
|
|
defaults['res_id'] = self.env.context['active_id']
|
|
|
|
return defaults
|
|
|
|
# linked document
|
|
res_id = fields.Integer('Document ID')
|
|
res_model_id = fields.Many2one('ir.model',
|
|
'Document Model', ondelete='cascade')
|
|
res_model = fields.Char('Document Model Name',
|
|
related='res_model_id.model', readonly=True,
|
|
store=True)
|
|
activity_ids = fields.One2many('mail.activity', 'calendar_event_id',
|
|
string='Activities')
|
|
|
|
@api.model
|
|
def create(self, values):
|
|
# created from calendar: try to create an activity
|
|
# on the related record
|
|
if not values.get('activity_ids'):
|
|
defaults = self.default_get(['activity_ids',
|
|
'res_model_id', 'res_id', 'user_id'])
|
|
res_model_id = values.get('res_model_id', defaults.get(
|
|
'res_model_id'))
|
|
res_id = values.get('res_id', defaults.get('res_id'))
|
|
user_id = values.get('user_id', defaults.get('user_id'))
|
|
if not defaults.get('activity_ids') and res_model_id and res_id:
|
|
if hasattr(self.env[self.env['ir.model'].sudo().browse(
|
|
res_model_id).model], 'activity_ids'):
|
|
meeting_activity_type = \
|
|
self.env['mail.activity.type'].search(
|
|
[('category', '=', 'meeting')], limit=1)
|
|
if meeting_activity_type:
|
|
activity_vals = {
|
|
'res_model_id': res_model_id,
|
|
'res_id': res_id,
|
|
'activity_type_id': meeting_activity_type.id,
|
|
}
|
|
if user_id:
|
|
activity_vals['user_id'] = user_id
|
|
values['activity_ids'] = [(0, 0, activity_vals)]
|
|
|
|
meeting = super(CalendarEvent, self).create(values)
|
|
meeting._sync_activities(values)
|
|
return meeting
|
|
|
|
@api.multi
|
|
def write(self, values):
|
|
# compute duration, only if start and stop are modified
|
|
if 'duration' not in values and 'start' in values and 'stop' in values:
|
|
values['duration'] = self._get_duration(values['start'],
|
|
values['stop'])
|
|
|
|
self._sync_activities(values)
|
|
return super(CalendarEvent, self).write(values)
|
|
|
|
@api.multi
|
|
def action_close_dialog(self):
|
|
return {'type': 'ir.actions.act_window_close'}
|
|
|
|
@api.multi
|
|
def action_done(self):
|
|
for rec in self:
|
|
rec.activity_ids.action_feedback()
|
|
return {'type': 'ir.actions.act_window_close'}
|
|
|
|
@api.multi
|
|
def action_open_calendar_event(self):
|
|
if self.res_model and self.res_id:
|
|
return self.env[self.res_model].browse(
|
|
self.res_id).get_formview_action()[0]
|
|
return False
|
|
|
|
def _sync_activities(self, values):
|
|
# update activities
|
|
if self.mapped('activity_ids'):
|
|
activity_values = {}
|
|
if values.get('name'):
|
|
activity_values['summary'] = values['name']
|
|
if values.get('description'):
|
|
activity_values['note'] = values['description']
|
|
if values.get('start'):
|
|
activity_values['date_deadline'] = \
|
|
fields.Datetime.from_string(values['start']).date()
|
|
if values.get('user_id'):
|
|
activity_values['user_id'] = values['user_id']
|
|
if activity_values.keys():
|
|
self.mapped('activity_ids').write(activity_values)
|