19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:34 +01:00
parent 5faf7397c5
commit 2696f14ed7
721 changed files with 220375 additions and 91221 deletions

View file

@ -1,12 +1,13 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from datetime import datetime
from odoo import api, fields, models
from odoo import _, api, fields, models
from odoo.tools import SQL
class Partner(models.Model):
class ResPartner(models.Model):
_inherit = 'res.partner'
meeting_count = fields.Integer("# Meetings", compute='_compute_meeting_count')
@ -23,20 +24,21 @@ class Partner(models.Model):
def _compute_meeting(self):
if self.ids:
all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)])
# prefetch 'parent_id'
all_partners = self.with_context(active_test=False).search_fetch(
[('id', 'child_of', self.ids)], ['parent_id'],
)
event_id = self.env['calendar.event']._search([]) # ir.rules will be applied
subquery_string, subquery_params = event_id.select()
subquery = self.env.cr.mogrify(subquery_string, subquery_params).decode()
self.env.cr.execute("""
query = self.env['calendar.event']._search([]) # ir.rules will be applied
meeting_data = self.env.execute_query(SQL("""
SELECT res_partner_id, calendar_event_id, count(1)
FROM calendar_event_res_partner_rel
WHERE res_partner_id IN %s AND calendar_event_id IN ({})
WHERE res_partner_id IN %s AND calendar_event_id IN %s
GROUP BY res_partner_id, calendar_event_id
""".format(subquery), [tuple(p["id"] for p in all_partners)])
meeting_data = self.env.cr.fetchall()
""",
all_partners._ids,
query.subselect(),
))
# Create a dict {partner_id: event_ids} and fill with events linked to the partner
meetings = {}
@ -44,20 +46,28 @@ class Partner(models.Model):
meetings.setdefault(p_id, set()).add(m_id)
# Add the events linked to the children of the partner
for meeting_pid in set(meetings):
partner = self.browse(meeting_pid)
while partner:
for p in self.browse(meetings.keys()):
partner = p
while partner.parent_id:
partner = partner.parent_id
if partner in self:
meetings[partner.id] = meetings.get(partner.id, set()) | meetings[meeting_pid]
meetings[partner.id] = meetings.get(partner.id, set()) | meetings[p.id]
return {p_id: list(meetings.get(p_id, set())) for p_id in self.ids}
return {}
def _compute_application_statistics_hook(self):
data_list = super()._compute_application_statistics_hook()
for partner in self.filtered('meeting_count'):
stat_info = {'iconClass': 'fa-calendar', 'value': partner.meeting_count, 'label': _('Meetings'), 'tagClass': 'o_tag_color_3'}
data_list[partner.id].append(stat_info)
return data_list
def get_attendee_detail(self, meeting_ids):
""" Return a list of dict of the given meetings with the attendees details
Used by:
- base_calendar.js : Many2ManyAttendee
- calendar_model.js (calendar.CalendarModel)
- many2many_attendee.js: Many2ManyAttendee
- calendar_model.js (calendar.CalendarModel)
"""
attendees_details = []
meetings = self.env['calendar.event'].browse(meeting_ids)
@ -92,3 +102,21 @@ class Partner(models.Model):
}
action['domain'] = ['|', ('id', 'in', self._compute_meeting()[self.id]), ('partner_ids', 'in', self.ids)]
return action
def _get_busy_calendar_events(self, start_datetime, end_datetime):
"""Get a mapping from partner id to attended events intersecting with the time interval.
:rtype: dict[int, <calendar.event>]
"""
events = self.env['calendar.event'].search([
('stop', '>=', start_datetime.replace(tzinfo=None)),
('start', '<=', end_datetime.replace(tzinfo=None)),
('partner_ids', 'in', self.ids),
('show_as', '=', 'busy'),
])
event_by_partner_id = defaultdict(lambda: self.env['calendar.event'])
for event in events:
for partner in event.partner_ids:
event_by_partner_id[partner.id] |= event
return dict(event_by_partner_id)