You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							7.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							163 lines
						
					
					
						
							7.5 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###############################################################################
							 | 
						|
								#
							 | 
						|
								#  Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#  Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#  Author: Anusha C (odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#  You can modify it under the terms of the GNU LESSER
							 | 
						|
								#  GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#  This program is distributed in the hope that it will be useful,
							 | 
						|
								#  but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
							 | 
						|
								#  GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#  You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#  (LGPL v3) along with this program.
							 | 
						|
								#  If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								###############################################################################
							 | 
						|
								# -*- coding: utf-8 -*-
							 | 
						|
								import base64
							 | 
						|
								import logging
							 | 
						|
								import pytz
							 | 
						|
								from datetime import timedelta
							 | 
						|
								from odoo import fields, models, _
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								from odoo.tools import is_html_empty, html2plaintext
							 | 
						|
								
							 | 
						|
								_logger = logging.getLogger(__name__)
							 | 
						|
								try:
							 | 
						|
								    import vobject
							 | 
						|
								except ImportError:
							 | 
						|
								    _logger.warning(
							 | 
						|
								        "`vobject` Python module not found, iCal file generation disabled. "
							 | 
						|
								        "Consider installing this module if you want to generate iCal files")
							 | 
						|
								    vobject = None
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class Meeting(models.Model):
							 | 
						|
								    """This class is to inherit calendar event model redefine mail button
							 | 
						|
								    function and adding an extra button action."""
							 | 
						|
								    _inherit = 'calendar.event'
							 | 
						|
								
							 | 
						|
								    def action_send_ics(self):
							 | 
						|
								        """This function is for sending mail invitations to attendees with
							 | 
						|
								        attached ics file of that event."""
							 | 
						|
								        print(self._get_ics_file().get(self.id))
							 | 
						|
								        attachment_values = {'name': 'Event.ics',
							 | 
						|
								                             'type': 'binary',
							 | 
						|
								                             'datas': base64.b64encode(
							 | 
						|
								                                 self._get_ics_file().get(self.id)),
							 | 
						|
								                             'mimetype': 'text/calendar',
							 | 
						|
								                             'res_model': 'calendar.event',
							 | 
						|
								                             'res_id': self.id}
							 | 
						|
								        attachment = self.env['ir.attachment'].sudo().create(attachment_values)
							 | 
						|
								        email_template = self.env.ref('odoo_icalendar.event_ics_email_template')
							 | 
						|
								        email_values = {'email_to': ', '.join(
							 | 
						|
								            attendee.email for attendee in self.partner_ids),
							 | 
						|
								            'attachment_ids': [(4, attachment.id)]}
							 | 
						|
								        email_template.send_mail(
							 | 
						|
								            self.id, email_values=email_values, force_send=True)
							 | 
						|
								        email_template.attachment_ids = [(5, 0, 0)]
							 | 
						|
								
							 | 
						|
								    def action_send_attendee_ics_file(self):
							 | 
						|
								        """Button action to send an ics file attached to mail of the
							 | 
						|
								        attendees."""
							 | 
						|
								        result = {}
							 | 
						|
								
							 | 
						|
								        def ics_datetime(idate, allday=False):
							 | 
						|
								            """Format a date and time as an iCalendar-compatible string.
							 | 
						|
								               :param idate: The input date and time.
							 | 
						|
								               :type idate: datetime.datetime
							 | 
						|
								               :param allday: Flag indicating if the event is an all-day event
							 | 
						|
								               (default is False).
							 | 
						|
								               :type allday: bool
							 | 
						|
								               :return: The formatted date and time as a string in the iCalendar
							 | 
						|
								                format.
							 | 
						|
								               :rtype: str or False if idate is None."""
							 | 
						|
								            if idate:
							 | 
						|
								                if allday:
							 | 
						|
								                    return idate
							 | 
						|
								                return idate.replace(tzinfo=pytz.timezone('UTC'))
							 | 
						|
								            return False
							 | 
						|
								
							 | 
						|
								        if not vobject:
							 | 
						|
								            return result
							 | 
						|
								        attendee_events = {}
							 | 
						|
								        meeting_obj = []
							 | 
						|
								        for meeting in self:
							 | 
						|
								            meeting_obj = meeting
							 | 
						|
								            for attendee in meeting.partner_ids:
							 | 
						|
								                if attendee.id not in attendee_events:
							 | 
						|
								                    attendee_events[attendee.id] = vobject.iCalendar()
							 | 
						|
								                cal = attendee_events[attendee.id]
							 | 
						|
								                event = cal.add('vevent')
							 | 
						|
								                if not meeting.start or not meeting.stop:
							 | 
						|
								                    raise UserError(
							 | 
						|
								                        _("First you have to specify the date of the "
							 | 
						|
								                          "invitation."))
							 | 
						|
								                event.add('created').value = ics_datetime(fields.Datetime.now())
							 | 
						|
								                event.add('dtstart').value = ics_datetime(meeting.start,
							 | 
						|
								                                                          meeting.allday)
							 | 
						|
								                event.add('dtend').value = ics_datetime(meeting.stop,
							 | 
						|
								                                                        meeting.allday)
							 | 
						|
								                event.add('summary').value = meeting.name
							 | 
						|
								                if not is_html_empty(meeting.description):
							 | 
						|
								                    if 'appointment_type_id' in meeting._fields and \
							 | 
						|
								                            self.appointment_type_id:
							 | 
						|
								                        event.add(
							 | 
						|
								                            'description').value = self. \
							 | 
						|
								                            convert_online_event_desc_to_text(
							 | 
						|
								                            meeting.description)
							 | 
						|
								                    else:
							 | 
						|
								                        event.add('description').value = html2plaintext(
							 | 
						|
								                            meeting.description)
							 | 
						|
								                if meeting.location:
							 | 
						|
								                    event.add('location').value = meeting.location
							 | 
						|
								                if meeting.rrule:
							 | 
						|
								                    event.add('rrule').value = meeting.rrule
							 | 
						|
								                if meeting.alarm_ids:
							 | 
						|
								                    for alarm in meeting.alarm_ids:
							 | 
						|
								                        valarm = event.add('valarm')
							 | 
						|
								                        interval = alarm.interval
							 | 
						|
								                        duration = alarm.duration
							 | 
						|
								                        trigger = valarm.add('TRIGGER')
							 | 
						|
								                        trigger.params['related'] = ["START"]
							 | 
						|
								                        delta = ''
							 | 
						|
								                        if interval == 'days':
							 | 
						|
								                            delta = timedelta(days=duration)
							 | 
						|
								                        elif interval == 'hours':
							 | 
						|
								                            delta = timedelta(hours=duration)
							 | 
						|
								                        elif interval == 'minutes':
							 | 
						|
								                            delta = timedelta(minutes=duration)
							 | 
						|
								                        trigger.value = delta
							 | 
						|
								                        valarm.add('DESCRIPTION').value = alarm.name or 'Odoo'
							 | 
						|
								                attendee_add = event.add('attendee')
							 | 
						|
								                attendee_add.value = 'MAILTO:' + (attendee.email or '')
							 | 
						|
								        for attendee_id, cal in attendee_events.items():
							 | 
						|
								            attendee = self.env['res.partner'].browse(attendee_id)
							 | 
						|
								            attachment_values = {'name': 'All_Events.ics',
							 | 
						|
								                                 'type': 'binary',
							 | 
						|
								                                 'datas': base64.b64encode(
							 | 
						|
								                                     cal.serialize().encode('utf-8')),
							 | 
						|
								                                 'mimetype': 'text/calendar',
							 | 
						|
								                                 'res_model': 'calendar.event',
							 | 
						|
								                                 'res_id': attendee.id}
							 | 
						|
								            attachment = self.env['ir.attachment'].sudo().create(
							 | 
						|
								                attachment_values)
							 | 
						|
								            email_template = self.env.ref(
							 | 
						|
								                'odoo_icalendar.odoo_icalendar_email_template')
							 | 
						|
								            email_values = {'email_to': attendee.email,
							 | 
						|
								                            'email_cc': False,
							 | 
						|
								                            'scheduled_date': False,
							 | 
						|
								                            'recipient_ids': [],
							 | 
						|
								                            'partner_ids': [],
							 | 
						|
								                            'auto_delete': True,
							 | 
						|
								                            'attachment_ids': [(4, attachment.id)]}
							 | 
						|
								            email_template.send_mail(meeting_obj[0].id,
							 | 
						|
								                                     email_values=email_values,
							 | 
						|
								                                     force_send=True)
							 | 
						|
								            email_template.attachment_ids = [(5, 0, 0)]
							 | 
						|
								
							 |