diff --git a/models/calendar.py b/models/calendar.py index 0e67bfb27ba10cfee2ce75056058881318c01862..e394c9ef37f0831e89960fa0e82e5c6ed6ff54e5 100644 --- a/models/calendar.py +++ b/models/calendar.py @@ -5,8 +5,12 @@ import pytz from datetime import timedelta from odoo import models, fields, api +from odoo.fields import Date +from odoo.tools import pycompat from odoo.exceptions import UserError, ValidationError +from odoo.addons.calendar.models.calendar import calendar_id2real_id + class CGScopAttendee(models.Model): _inherit = 'calendar.attendee' @@ -340,3 +344,90 @@ class CGScopCalendar(models.Model): 'default_ur_financial_system_id': event.ur_financial_system_id.id, }, } + + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + @api.multi + def read(self, fields=None, load='_classic_read'): + """ Surcharge la fonction read de calendar pour gérer le transfert des + lignes de temps sur les virtual events. + + Ajoute le calcul de la valeur du champs 'is_tansfered' dans la + boucle 'for calendar_id, real_id in select' + """ + + if not fields: + fields = list(self._fields) + fields2 = fields and fields[:] + EXTRAFIELDS = ('privacy', 'user_id', 'duration', 'allday', 'start', 'rrule') + for f in EXTRAFIELDS: + if fields and (f not in fields): + fields2.append(f) + + select = [(x, calendar_id2real_id(x)) for x in self.ids] + real_events = self.browse([real_id for calendar_id, real_id in select]) + real_data = super(CGScopCalendar, real_events).read(fields=fields2, load=load) + real_data = dict((d['id'], d) for d in real_data) + # print("real_data") + # print(real_data) + # print(real_events) + # print(select) + result = [] + for calendar_id, real_id in select: + if not real_data.get(real_id): + continue + res = real_data[real_id].copy() + ls = calendar_id2real_id(calendar_id, with_date=res and res.get('duration', 0) > 0 and res.get('duration') or 1) + if not isinstance(ls, (pycompat.string_types, pycompat.integer_types)) and len(ls) >= 2: + res['start'] = ls[1] + res['stop'] = ls[2] + + if res['allday']: + res['start_date'] = ls[1] + res['stop_date'] = ls[2] + else: + res['start_datetime'] = ls[1] + res['stop_datetime'] = ls[2] + + if 'display_time' in fields: + res['display_time'] = self._get_display_time(ls[1], ls[2], res['duration'], res['allday']) + + attendee = self.env['calendar.attendee'].search([ + ('event_id', '=', ls[0]), + ('partner_id', '=', self.env.user.partner_id.id)]) + # l'attendee a des feuilles de temps liées à la même date + if (attendee.timesheet_ids + and attendee.timesheet_ids.filtered( + lambda t: t.date == Date.to_date(ls[1]))): + res['is_transfered'] = True + else: + res['is_transfered'] = False + + res['id'] = calendar_id + result.append(res) + + for r in result: + if r['user_id']: + user_id = type(r['user_id']) in (tuple, list) and r['user_id'][0] or r['user_id'] + partner_id = self.env.user.partner_id.id + if user_id == self.env.user.id or partner_id in r.get("partner_ids", []): + continue + if r['privacy'] == 'private': + for f in r: + recurrent_fields = self._get_recurrent_fields() + public_fields = list(set(recurrent_fields + ['id', 'allday', 'start', 'stop', 'display_start', 'display_stop', 'duration', 'user_id', 'state', 'interval', 'count', 'recurrent_id_date', 'rrule'])) + if f not in public_fields: + if isinstance(r[f], list): + r[f] = [] + else: + r[f] = False + if f == 'name': + r[f] = _('Busy') + + for r in result: + for k in EXTRAFIELDS: + if (k in r) and (fields and (k not in fields)): + del r[k] + + return result