diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index 73811d5ba71..6176b2804f3 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -1060,6 +1060,37 @@ rule or repeating pattern of time to exclude from the recurring rule."), 'recurrency': fields.boolean('Recurrent', help="Recurrent Meeting"), } + def create_attendees(self, cr, uid, ids, context): + att_obj = self.pool.get('calendar.attendee') + user_obj = self.pool.get('res.users') + current_user = user_obj.browse(cr, uid, uid, context=context) + for event in self.browse(cr, uid, ids, context): + attendees = {} + for att in event.attendee_ids: + attendees[att.partner_id.id] = True + new_attendees = [] + mail_to = [] + for partner in event.partner_ids: + if partner.id in attendees: + continue + att_id = self.pool.get('calendar.attendee').create(cr, uid, { + 'partner_id': partner.id, + 'user_id': partner.user_ids and partner.user_ids[0].id or False, + 'ref': self._name+','+str(event.id), + 'email': partner.email + }, context=context) + if partner.email: + mail_to.append(partner.email) + self.write(cr, uid, [event.id], { + 'attendee_ids': [(4, att_id)] + }, context=context) + new_attendees.append(att_id) + + if mail_to and current_user.email: + att_obj._send_mail(cr, uid, new_attendees, mail_to, + email_from = current_user.email) + return True + def default_organizer(self, cr, uid, context=None): user_pool = self.pool.get('res.users') user = user_pool.browse(cr, uid, uid, context=context) @@ -1366,6 +1397,8 @@ rule or repeating pattern of time to exclude from the recurring rule."), vals['vtimezone'] = vals['vtimezone'][40:] res = super(calendar_event, self).write(cr, uid, ids, vals, context=context) + if vals.get('partner_ids', False): + self.create_attendees(cr, uid, ids, context) if ('alarm_id' in vals or 'base_calendar_alarm_id' in vals)\ or ('date' in vals or 'duration' in vals or 'date_deadline' in vals): @@ -1489,17 +1522,10 @@ rule or repeating pattern of time to exclude from the recurring rule."), if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'): vals['vtimezone'] = vals['vtimezone'][40:] - #updated_vals = self.onchange_dates(cr, uid, [], - # vals.get('date', False), - # vals.get('duration', False), - # vals.get('date_deadline', False), - # vals.get('allday', False), - # context=context) - #vals.update(updated_vals.get('value', {})) - res = super(calendar_event, self).create(cr, uid, vals, context) alarm_obj = self.pool.get('res.alarm') alarm_obj.do_alarm_create(cr, uid, [res], self._name, 'date', context=context) + self.create_attendees(cr, uid, [res], context) return res def do_tentative(self, cr, uid, ids, context=None, *args): diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py index 0ee23ed1d0f..b87114f3a66 100644 --- a/addons/base_calendar/crm_meeting.py +++ b/addons/base_calendar/crm_meeting.py @@ -71,6 +71,34 @@ class crm_meeting(base_state, osv.Model): default['attendee_ids'] = False return super(crm_meeting, self).copy(cr, uid, id, default, context) + def onchange_partner_ids(self, cr, uid, ids, value, context=None): + """ The basic purpose of this method is to check that destination partners + effectively have email addresses. Otherwise a warning is thrown. + :param value: value format: [[6, 0, [3, 4]]] + """ + res = {'value': {}} + if not value or not value[0] or not value[0][0] == 6: + return + res.update(self.check_partners_email(cr, uid, value[0][2], context=context)) + return res + + def check_partners_email(self, cr, uid, partner_ids, context=None): + """ Verify that selected partner_ids have an email_address defined. + Otherwise throw a warning. """ + partner_wo_email_lst = [] + for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context): + if not partner.email: + partner_wo_email_lst.append(partner) + if not partner_wo_email_lst: + return {} + warning_msg = _('The following contacts have no email address :') + for partner in partner_wo_email_lst: + warning_msg += '\n- %s' % (partner.name) + return {'warning': { + 'title': _('Email addresses not found'), + 'message': warning_msg, + } + } # ---------------------------------------- # OpenChatter # ---------------------------------------- @@ -80,7 +108,7 @@ class crm_meeting(base_state, osv.Model): return [('date','<=',time.strftime('%Y-%M-%D 23:59:59')), ('date_deadline','>=', time.strftime('%Y-%M-%D 00:00:00')), ('user_id','=',uid)] def case_get_note_msg_prefix(self, cr, uid, id, context=None): - return 'Meeting' + return _('Meeting') def case_open_send_note(self, cr, uid, ids, context=None): return self.message_post(cr, uid, ids, body=_("Meeting confirmed."), context=context) diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml index 4b165c1d495..2da18447820 100644 --- a/addons/base_calendar/crm_meeting_view.xml +++ b/addons/base_calendar/crm_meeting_view.xml @@ -80,7 +80,9 @@