53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, models
|
|
from odoo.tools.intervals import Intervals
|
|
from odoo.tools.date_utils import localized
|
|
|
|
|
|
class CalendarEvent(models.Model):
|
|
_inherit = "calendar.event"
|
|
|
|
@api.model
|
|
def _gantt_unavailability(self, field, res_ids, start, stop, scale):
|
|
result = super()._gantt_unavailability(field, res_ids, start, stop, scale)
|
|
|
|
# skip if not dealing with appointments
|
|
if field != 'partner_ids':
|
|
return result
|
|
|
|
start = localized(start)
|
|
stop = localized(stop)
|
|
|
|
partners = self.env['res.partner'].browse(res_ids)
|
|
users = partners.user_ids
|
|
users_from_partner_id = users.grouped(lambda user: user.partner_id.id)
|
|
|
|
calendars = users.employee_id.resource_calendar_id
|
|
employee_by_calendar = users.employee_id.grouped('resource_calendar_id')
|
|
unavailabilities_by_calendar = {
|
|
calendar: calendar._unavailable_intervals_batch(
|
|
start, stop,
|
|
resources=employee_by_calendar[calendar].resource_id
|
|
) for calendar in calendars
|
|
}
|
|
|
|
event_unavailabilities = self._gantt_unavailabilities_events(start, stop, partners)
|
|
|
|
for partner_id in res_ids:
|
|
attendee_users = users_from_partner_id.get(partner_id, self.env['res.users'])
|
|
attendee = partners.filtered(lambda partner: partner.id == partner_id)
|
|
|
|
# calendar leaves
|
|
unavailabilities = Intervals([
|
|
(unavailability['start'], unavailability['stop'], self.env['res.partner'])
|
|
for unavailability in result.get(partner_id, [])
|
|
])
|
|
unavailabilities |= event_unavailabilities.get(attendee.id, Intervals([]))
|
|
for user in attendee_users.filtered('employee_resource_calendar_id'):
|
|
calendar_leaves = unavailabilities_by_calendar[user.employee_resource_calendar_id]
|
|
unavailabilities |= Intervals([
|
|
(start, end, attendee)
|
|
for start, end in calendar_leaves.get(user.employee_id.resource_id.id, [])])
|
|
result[partner_id] = [{'start': start, 'stop': stop} for start, stop, _ in unavailabilities]
|
|
return result
|