Skip to content
Extraits de code Groupes Projets
Valider a316de6a rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[fix] transfert lignes de temps pour recurring events

parent 9d906da5
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter